Dolibarr mit Docker Compose installieren

Eine vollständige docker-compose.yml für Dolibarr 24 und MariaDB, von Anfang bis Ende getestet. Mit dem offiziellen Beispiel werden Passwörter als MD5 mit einer Klartext-Kopie gespeichert, und geplante Jobs laufen nie: So vermeiden Sie alle drei Fallen.

Betroffene Versionen
Offizielles Image dolibarr/dolibarr 24.0.1 (neuestes veröffentlichtes Image am 13.10.2026), MariaDB 11.4; alle drei Fallen stammen aus dem Startskript, das alle Versionen des Images gemeinsam haben
Was geprüft wurde
Startskript des Images gelesen (docker-run.sh, Repository Dolibarr/dolibarr-docker am 13.10.2026), ebenso der Code von Dolibarr 24.0.1 (dol_hash, dol_verifyHash, install/step5.php, cron_run_jobs.php). Drei Neuinstallationen am 13.10.2026 mit Docker 28: Konfiguration des offiziellen Beispiels, korrigierte Konfiguration, dann die Dateien dieser Seite unverändert übernommen. Geprüft: Anmeldung, Passwort-Hashes in der Datenbank, Cron-Lauf, Stoppen und Neustarten, Datensicherung über die Oberfläche, Upload einer 5-MB-Datei vor und nach dem Anheben des Dolibarr-Limits. Am 14.10.2026: User::setPassword() und admin/security.php gelesen, dann zwei weitere Neuinstallationen (Dateien dieser Seite ohne, dann mit der Zeile DATABASE_PWD_ENCRYPTED): Spalte llx_user.pass nach einer Passwortänderung, Schaltfläche „Aktivieren“ der Sicherheitsseite, Anmeldung nach dem Löschen der Klartext-Kopien.

Das offizielle Image dolibarr/dolibarr installiert Dolibarr beim ersten Start selbst: eine Datei docker-compose.yml, ein Befehl, und eine Minute später erscheint die Anmeldeseite. Diese Seite liefert eine vollständige Konfiguration, getestet am 13. Oktober 2026 mit Dolibarr 24.0.1 und MariaDB 11.4.

Sie behebt außerdem drei Mängel der automatischen Installation, die das Beispiel der offiziellen Dokumentation nicht erwähnt und die wir auf einer Neuinstallation festgestellt haben:

  • die Passwörter der Benutzer werden als MD5 ohne Salt gespeichert, während eine normale Installation sie mit password_hash schützt;
  • geplante Jobs laufen nie: Der Cron-Container scheitert alle fünf Minuten an einem Schlüsselfehler, der nur in seinen Logs sichtbar ist;
  • eine Klartext-Kopie der Passwörter bleibt in der Datenbank: Jedes in der Oberfläche geänderte Passwort wird zusätzlich lesbar gespeichert, neben seiner verschlüsselten Fassung.

Was Sie brauchen

Docker mit dem Compose-Plugin: docker compose version muss antworten. Die Befehle unten gelten für Linux und macOS. Die gesamte Installation liegt in einem Ordner, zum Beispiel ~/dolibarr: Konfiguration, Datenbank, Dokumente und externe Module.

mkdir -p ~/dolibarr/docker-init.d && cd ~/dolibarr

1. Die Datei docker-compose.yml

services:
  db:
    image: mariadb:11.4
    restart: unless-stopped
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MARIADB_DATABASE: dolibarr
      MARIADB_USER: dolibarr
      MARIADB_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./data/mariadb:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  web:
    image: dolibarr/dolibarr:24.0.1
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment: &dolibarr-env
      DOLI_DB_HOST: db
      DOLI_DB_NAME: dolibarr
      DOLI_DB_USER: dolibarr
      DOLI_DB_PASSWORD: ${DB_PASSWORD}
      DOLI_URL_ROOT: ${DOLI_URL_ROOT}
      DOLI_ADMIN_LOGIN: ${ADMIN_LOGIN}
      DOLI_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      DOLI_INSTANCE_UNIQUE_ID: ${INSTANCE_UNIQUE_ID}
      DOLI_COMPANY_NAME: ${COMPANY_NAME}
      DOLI_COMPANY_COUNTRYCODE: DE
      DOLI_ENABLE_MODULES: Cron
      DOLI_CRON_KEY: ${CRON_KEY}
      DOLI_CRON_USER: ${ADMIN_LOGIN}
      PHP_INI_DATE_TIMEZONE: Europe/Berlin
    ports:
      - "8080:80"
    volumes:
      - ./data/documents:/var/www/documents
      - ./data/custom:/var/www/html/custom
      - ./docker-init.d:/var/www/scripts/docker-init.d

  cron:
    image: dolibarr/dolibarr:24.0.1
    restart: unless-stopped
    depends_on:
      - web
    environment:
      <<: *dolibarr-env
      DOLI_CRON: 1
    volumes:
      - ./data/documents:/var/www/documents
      - ./data/custom:/var/www/html/custom

In Österreich oder der Schweiz setzen Sie AT bzw. CH und die passende Zeitzone. Worauf es ankommt:

  • Feste Versionen, niemals latest. Das offizielle Beispiel verwendet dolibarr/dolibarr:latest und mariadb:latest: Ein einfaches docker compose pull kann Sie dann auf eine neue Hauptversion bringen, ohne dass Sie das entschieden haben. Am 13. Oktober 2026 ist 24.0.1 das neueste veröffentlichte Image; 24.0.2 ist erschienen, aber das Image ist noch nicht auf Docker Hub.
  • Der Healthcheck von MariaDB lässt Dolibarr warten, bis die Datenbank bereit ist.
  • DOLI_ENABLE_MODULES: Cron aktiviert das Modul für geplante Jobs während der Installation, bevor das Image den Cron-Schlüssel speichert. Das ist die Lösung für die zweite Falle, weiter unten erklärt. Sie können weitere Module durch Kommas getrennt ergänzen (Societe,Facture,Cron).
  • Der Dienst cron nutzt dasselbe Image mit DOLI_CRON: 1: Er startet die geplanten Jobs alle fünf Minuten. Über &dolibarr-env übernimmt er alle Variablen des Dienstes web.
  • Die Daten bleiben im Ordner data/: Datenbank, Dokumente, externe Module. Zusammen mit .env sind das die einzigen Dateien, die gesichert werden müssen.

2. Die Datei .env, mit echten Passwörtern

Ohne Änderung behält das offizielle Beispiel admin/admin für Dolibarr und root für die Datenbank. Dieser Befehl erzeugt die Datei .env mit Zufallswerten:

cat > .env <<EOF
DOLI_URL_ROOT=http://localhost:8080
ADMIN_LOGIN=admin
ADMIN_PASSWORD=$(openssl rand -hex 12)
DB_PASSWORD=$(openssl rand -hex 16)
DB_ROOT_PASSWORD=$(openssl rand -hex 16)
INSTANCE_UNIQUE_ID=$(openssl rand -hex 32)
CRON_KEY=$(openssl rand -hex 16)
COMPANY_NAME="Meine Firma GmbH"
EOF
chmod 600 .env

DOLI_URL_ROOT ist die Adresse, unter der Sie Dolibarr öffnen. INSTANCE_UNIQUE_ID dient als Schlüssel für die Verschlüsselung einiger Einstellungen: Fehlt er, schreibt das Image einen festen Wert, für alle derselbe. Ändern Sie ihn nach der Installation nicht mehr, sonst werden diese Einstellungen unlesbar.

3. Das Skript, das die Passwörter schützt

Legen Sie die Datei docker-init.d/passwort-hash.sql an. Das Image führt die Skripte dieses Ordners einmal aus, am Ende der Installation:

cat > docker-init.d/passwort-hash.sql <<'EOF'
INSERT INTO llx_const (name, value, type, visible, note, entity) VALUES ('MAIN_SECURITY_HASH_ALGO', 'password_hash', 'chaine', 0, '', 0);
INSERT INTO llx_const (name, value, type, visible, note, entity) VALUES ('DATABASE_PWD_ENCRYPTED', '1', 'chaine', 0, '', 0);
EOF

Schreiben Sie keine Kommentare hinein: Das Image entfernt Zeilen, die mit -- beginnen, und schreibt die Datei dabei neu.

Die erste Zeile behebt Falle 1 (MD5-Passwörter), die zweite Falle 3 (Klartext-Kopie), beide weiter unten beschrieben.

4. Starten

docker compose up -d
docker compose logs -f web

Warten Sie auf die Meldung „You can connect to the running Dolibarr web application“ (etwa eine Minute in unserem Test) und verlassen Sie die Logs mit Strg+C. Öffnen Sie http://localhost:8080 und melden Sie sich mit admin und dem Passwort an, das grep ADMIN_PASSWORD .env anzeigt.

5. Direkt nach der ersten Anmeldung: Admin-Passwort ändern

Das Admin-Konto wird angelegt, bevor das Skript aus Schritt 3 läuft: Sein Passwort ist also noch MD5. Öffnen Sie Benutzer und Gruppen, den Benutzer admin, Ändern, und geben Sie ein neues Passwort ein. Es wird dann mit password_hash gespeichert, und Dolibarr fordert Sie auf, sich neu anzumelden.

ADMIN_PASSWORD wird nur beim allerersten Start verwendet: Eine spätere Änderung in .env bewirkt nichts, auch nicht nach dem Neuerstellen der Container. Wir haben es geprüft.

Falle 1: Passwörter als MD5

Bei der Installation über den Web-Assistenten speichert Dolibarr MAIN_SECURITY_HASH_ALGO = password_hash (Datei install/step5.php). Die automatische Installation des Docker-Images überspringt diesen Schritt: Die Zeile, die das erledigen sollte, ist in docker-run.sh auskommentiert. Ohne diese Einstellung hasht Dolibarr alle Passwörter als MD5 ohne Salt, auch die, die Sie später in der Oberfläche ändern. Auf unserer Neuinstallation war ein in der Benutzerkarte geändertes Passwort in der Datenbank weiterhin 32 Zeichen lang, das Kennzeichen eines MD5.

Das passende Ticket im Repository des Images (#14) wurde im Mai 2026 geschlossen, aber das Image 24.0.1, am 13. Oktober 2026 neu installiert, hat den Mangel weiterhin.

Ob Ihre Instanz betroffen ist, sehen Sie unter Admin-Tools › Sicherheitsbericht. Steht in der Zeile „Algorithmus für Passwörter“ „Nicht definiert (If unset: ‘md5’)“, ist sie es.

So beheben Sie es auf einer bestehenden Instanz:

  1. als Administrator angemeldet, öffnen Sie Einstellungen › Erweiterte Einstellungen und fügen die Konstante MAIN_SECURITY_HASH_ALGO mit dem Wert password_hash hinzu;
  2. ohne sich abzumelden, ändern Sie Ihr eigenes Passwort in Ihrer Benutzerkarte;
  3. lassen Sie jeden anderen Benutzer sein Passwort ändern.

Die Sicherheitsseite von Dolibarr warnt, dass nach dieser Änderung alle bestehenden Passwörter ungültig werden. In 24.0.1 stimmt das nicht mehr: Wir haben geprüft, dass sich ein Benutzer mit MD5-Passwort weiterhin anmelden kann. Sein Passwort wird aber erst umgestellt, wenn er es ändert. Daher Schritt 3.

Falle 2: ein Cron, der nie läuft

Mit der Konfiguration des offiziellen Beispiels (DOLI_CRON_KEY ohne DOLI_ENABLE_MODULES) meldet der Cron-Container alle fünf Minuten:

Error: securitykey provided xxxxx... does not match securitykey in setup.

In Dolibarr ist davon nichts zu sehen: Nur docker compose logs cron zeigt es. Die Ursache: Beim ersten Start schreibt das Image Ihren Schlüssel, indem es die Zeile CRON_KEY in der Datenbank aktualisiert. Diese Zeile existiert aber erst, wenn das Modul für geplante Jobs aktiviert ist. Die Aktualisierung trifft keine Zeile, und der Schlüssel wird nie gespeichert. Das Modul nachträglich zu aktivieren reicht nicht: Der Schlüssel bleibt leer.

Bei einer Neuinstallation löst DOLI_ENABLE_MODULES: Cron das Problem: Das Modul wird aktiviert, bevor der Schlüssel geschrieben wird. Das ist die Konfiguration dieser Seite.

Bei einer bestehenden Instanz aktivieren Sie das Modul Geplante Jobs, öffnen seine Einstellungen und tragen in „Sicherheitsschlüssel für URL zum Starten von Cron-Jobs“ den Wert von CRON_KEY aus Ihrer Datei .env ein. Zur sofortigen Prüfung:

docker compose exec cron /bin/su www-data -s /bin/sh -c "/var/www/scripts/cron/cron_run_jobs.php $(grep '^CRON_KEY=' .env | cut -d= -f2) admin"

Die Ausgabe muss die Jobs mit „Result of run_jobs OK“ auflisten, nicht mehr den Schlüsselfehler.

Falle 3: eine Klartext-Kopie der Passwörter

Bei der Installation über den Web-Assistenten speichert Dolibarr außerdem DATABASE_PWD_ENCRYPTED = 1 (dieselbe Datei install/step5.php): Diese Einstellung verbietet ihm, eine Klartext-Kopie der Passwörter aufzubewahren. Die automatische Installation des Images setzt sie nicht, docker-run.sh erwähnt sie nirgends. Ohne sie wird jedes in der Oberfläche eingegebene Passwort doppelt gespeichert: verschlüsselt in pass_crypted und im Klartext in der Spalte pass der Tabelle llx_user. Falle 1 ändert daran nichts: Mit password_hash ist die verschlüsselte Fassung richtig, die Klartext-Kopie bleibt aber da.

Auf unserer Neuinstallation nur mit der Zeile MAIN_SECURITY_HASH_ALGO war das in Schritt 5 geänderte Admin-Passwort unverändert in der Datenbank zu lesen. Es stand auch im HTML-Quelltext der Benutzerkarte im Bearbeitungsmodus. Mit der zweiten Zeile des Skripts aus Schritt 3 bleibt die Spalte leer: Wir haben es auf einer weiteren Neuinstallation geprüft.

Ob Ihre Instanz betroffen ist, sehen Sie unter Admin-Tools › Sicherheitsbericht. Zeigt die Zeile „In der Datenbank gespeicherte Passwörter verschlüsseln“ „Nein“, ist sie es. Dieser Befehl listet die Konten, deren Passwort im Klartext vorliegt:

docker compose exec -T db sh -c 'mariadb -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" "$MARIADB_DATABASE" -e "SELECT login FROM llx_user WHERE LENGTH(pass) > 0"'

So beheben Sie es auf einer bestehenden Instanz:

  1. als Administrator angemeldet, öffnen Sie Start › Einstellungen › Sicherheit, Reiter Passwörter, und klicken Sie neben „In der Datenbank gespeicherte Passwörter verschlüsseln“ auf Aktivieren. Dolibarr speichert die Einstellung und löscht die Klartext-Kopien, aber nur die mit weniger als 32 Zeichen: Längere hält es für alte MD5-Hashes und lässt sie stehen;
  2. löschen Sie die übrigen:
docker compose exec -T db sh -c 'mariadb -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" "$MARIADB_DATABASE" -e "UPDATE llx_user SET pass = NULL WHERE LENGTH(pass) > 0 AND LENGTH(pass_crypted) > 0"'

Die Anmeldung nutzt nur die verschlüsselte Fassung: In unserem Test meldet sich ein Konto, dessen Klartext-Kopie gelöscht wurde, weiterhin an. Die Passwörter müssen also nicht geändert werden. Führen Sie den Prüfbefehl erneut aus: Er darf nichts mehr ausgeben. Ein weiterhin aufgeführtes Konto hat keine verschlüsselte Fassung, und der Befehl verschont es, um es nicht auszusperren: Lassen Sie diesen Benutzer sein Passwort ändern.

Was das Image sonst noch tut

  • conf.php wird bei jedem Neuerstellen des Containers neu geschrieben, aus den Umgebungsvariablen. DOLI_URL_ROOT in .env ändern und docker compose up -d ausführen genügt also, um die Adresse zu ändern, aber jede manuelle Änderung an conf.php geht verloren.
  • Sitzungen gehen bei jedem Neuerstellen verloren: Nach einem Image-Update muss sich jeder neu anmelden.
  • Datei-Uploads sind auf 2 MB begrenzt, obwohl PHP 20 MB erlaubt. Das Image stellt PHP zwar auf 20 MB ein (seine Dokumentation nennt fälschlich 2 MB), aber Dolibarr wendet ein eigenes Limit an, das bei der Installation auf 2.048 KB gesetzt wird. In unserem Test wird eine 5-MB-Datei mit „Die Dateigröße ist zu groß oder die Datei wurde nicht bereitgestellt“ abgelehnt. Zum Anheben öffnen Sie Start › Einstellungen › Sicherheit, Reiter Dateien, und ändern „Maximale Größe für Dateiuploads“ (in KB: 20480 für 20 MB). Über 20 MB ergänzen Sie zusätzlich PHP_INI_UPLOAD_MAX_FILESIZE und PHP_INI_POST_MAX_SIZE in den Variablen.
  • Der Name des Datenbankdienstes muss DOLI_DB_HOST entsprechen. Ohne diese Variable sucht das Image einen Server namens mysql, und der Web-Container wartet endlos.

Zugriff aus dem Internet

Veröffentlichen Sie Port 8080 nicht direkt. Stellen Sie einen Proxy mit HTTPS vor Dolibarr (Caddy, Traefik, Nginx), tragen Sie die https://-Adresse in DOLI_URL_ROOT ein und starten Sie mit docker compose up -d neu. Läuft der Proxy auf derselben Maschine, veröffentlichen Sie den Port nur lokal ("127.0.0.1:8080:80"), damit niemand den Proxy umgehen kann.

Datensicherung

Die Datensicherung über die Oberfläche funktioniert mit dieser Konfiguration (Admin-Tools › Datensicherung): Die Datei landet in data/documents/admin/backup/. Auf der Kommandozeile ist der sicherste Weg, die Datenbank aus dem MariaDB-Container zu exportieren und dann die Ordner data/documents und data/custom zusammen mit der Datei .env zu kopieren:

docker compose exec -T db sh -c 'mariadb-dump -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" "$MARIADB_DATABASE"' > sicherung.sql

Die Datei ist vollständig, wenn sie mit „– Dump completed“ endet.

Später aktualisieren

Ändern Sie die Version des Images immer nur um eine Hauptversion, nie direkt von 20 auf 24: Das Image würde Migrationen überspringen, ohne es zu melden. Der vollständige, getestete Ablauf steht in Dolibarr unter Docker aktualisieren.

Wenn Sie das lieber abgeben möchten: Das Paket Installation und Einrichtung geht von dieser Konfiguration aus.

Siehe auch

DolibarrDockerdocker composeInstallationMariaDBCronPasswort