Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Sicherheit & Datenschutz 12.06.2026 · 11 min Lesezeit

Passbolt mit Docker installieren: Team-Passwortmanager mit Ende-zu-Ende-Verschlüsselung

Passbolt Community Edition ist der einzige vollständige Open-Source-Passwortmanager für Teams mit echter PGP-basierter Ende-zu-Ende-Verschlüsselung. Diese Anleitung zeigt, wie du den DSGVO-konformen Team-Passwort-Safe in 30 Minuten mit Docker Compose auf jedem Linux-Host selbst hostest.

Hero Bild zu Passbolt mit Docker als Team Passwortmanager mit Ende zu Ende Verschlüsselung auf einem NAS und moderner Weboberfläche.

Passbolt Community Edition ist der einzige vollständige Open-Source-Passwortmanager für Teams, der auf PGP-basierter Ende-zu-Ende-Verschlüsselung setzt: Der private Schlüssel des Nutzers verlässt nie den Browser — der Server sieht ausschließlich verschlüsselte Chiffretexte. Für KMU, DevOps-Teams und DSGVO-pflichtige Organisationen ist das ein entscheidender Unterschied gegenüber Cloud-Lösungen, bei denen der Betreiber theoretisch Zugriff auf entschlüsselte Passwörter hat. Mit Funktionen wie granularen Rollen (read-only, update, owner), vollständigem Audit-Log, MFA (TOTP, YubiKey, Duo), Browser-Extension für Chrome/Firefox/Edge/Brave und einer REST-API ist Passbolt eine ernst zu nehmende Enterprise-Alternative — kostenlos und selbst gehostet.

Voraussetzungen

  1. Docker Engine >= 20.10 und Docker Compose v2 (Plugin oder Standalone) auf einem Linux-Host, einer VM oder einem NAS mit Docker-Unterstützung — siehe Docker und Docker Compose auf Linux installieren
  2. Mindestens 1 GB RAM (empfohlen: 2 GB), 2 vCPUs, 10 GB freier Speicherplatz
  3. Eigene Domain oder DNS-Eintrag für APP_FULL_BASE_URL — ohne passende URL verweigert die Browser-Extension die Verbindung
  4. SMTP-Server oder SMTP-Relay (z. B. Brevo, SendGrid oder eigener Postfix) — ohne SMTP können keine Nutzer eingeladen werden
  5. SSL-Zertifikat: Passbolt besteht auf HTTPS. Für Produktion empfiehlt sich ein Reverse Proxy (Traefik oder Nginx) mit Let's Encrypt; für Tests ist ein self-signed Zertifikat möglich
  6. Passbolt Browser-Extension (Chrome, Firefox, Edge oder Brave) — ohne Extension ist kein Login möglich
  7. openssl auf dem Host für die Generierung des Security-Salts

Eckdaten auf einen Blick

EigenschaftWert
Image (App)passbolt/passbolt:5.13.0-1-ce (oder latest-ce)
Image (DB)mariadb:10.11
Ports80 (HTTP→HTTPS-Redirect), 443 (HTTPS/UI/API)
Architekturlinux/amd64, linux/arm64
Volumes (Pflicht)database_volume, gpg_volume, jwt_volume
LizenzAGPL v3, kostenlos (CE)
Einrichtungszeitca. 30 Minuten

Schritt 1: Projektordner und Verzeichnisstruktur anlegen

Erstelle einen dedizierten Ordner für den Passbolt-Stack. Alle weiteren Dateien kommen dort hinein:

mkdir -p /opt/passbolt
cd /opt/passbolt

Optional, wenn du ein eigenes SSL-Zertifikat einbinden möchtest:

mkdir -p /opt/passbolt/certs

Verifizieren: ls /opt/passbolt zeigt den leeren (oder nur certs/ enthaltenden) Ordner. Kein Fehler, kein Permission-Problem.

Schritt 2: .env-Datei mit Secrets anlegen

Alle sensiblen Werte kommen in eine .env-Datei, die niemals ins Git-Repository eingecheckt werden sollte. Besonders wichtig: Den SECURITY_SALT einmal zufällig generieren und danach nie mehr ändern — eine nachträgliche Änderung sperrt alle Nutzer sofort aus.

Generiere zunächst sichere Zufallswerte:

# Sicheres Datenbankpasswort (32 Bytes, Base64)
openssl rand -base64 32

# Security Salt für CakePHP (mindestens 32 Zeichen)
openssl rand -base64 32

Lege dann die .env-Datei an und trage die generierten Werte ein:

# /opt/passbolt/.env
# Datenbankpasswort (für MariaDB und Passbolt-App identisch!)
DB_PASSWORD=HIER_ZUFALLSPASSWORT_EINTRAGEN

# Vollständige URL inkl. https://, KEIN trailing slash
APP_FULL_BASE_URL=https://passbolt.example.com

# SMTP-Konfiguration (ohne SMTP können keine Nutzer eingeladen werden)
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=user@example.com
SMTP_PASSWORD=SMTP_PASSWORT_HIER
EMAIL_FROM=no-reply@example.com

# Security Salt — EINMAL setzen, NIE mehr ändern!
SECURITY_SALT=HIER_ZUFALLS_SALT_EINTRAGEN

Dateiberechtigungen einschränken, damit der Salt nicht im Klartext für andere Nutzer lesbar ist:

chmod 600 /opt/passbolt/.env

Verifizieren: ls -la /opt/passbolt/.env zeigt Rechte -rw-------. Die Datei enthält keine Leerzeilen vor Variablennamen und keine Anführungszeichen um Werte mit Sonderzeichen (Docker Compose liest die Werte direkt).

Schritt 3: compose.yaml erstellen

Lege die Compose-Datei in /opt/passbolt/compose.yaml an. Der Stack besteht aus exakt zwei Services: MariaDB als Datenbankbackend und der Passbolt-App. Das eingebaute wait-for.sh-Skript stellt sicher, dass Passbolt erst startet, wenn die Datenbank auf Port 3306 erreichbar ist. Für reproduzierbare Deployments wird ein fixer Versions-Tag statt latest-ce empfohlen:

services:
  db:
    image: mariadb:10.11
    restart: unless-stopped
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "true"
      MYSQL_DATABASE: "passbolt"
      MYSQL_USER: "passbolt"
      MYSQL_PASSWORD: "${DB_PASSWORD}"
    volumes:
      - database_volume:/var/lib/mysql

  passbolt:
    image: passbolt/passbolt:5.13.0-1-ce
    # Rootless-Variante (erhöhte Sicherheit, Ports dann 8080/4433):
    # image: passbolt/passbolt:5.13.0-1-ce-non-root
    restart: unless-stopped
    depends_on:
      - db
    environment:
      APP_FULL_BASE_URL: "${APP_FULL_BASE_URL:-https://passbolt.local}"
      DATASOURCES_DEFAULT_HOST: "db"
      DATASOURCES_DEFAULT_USERNAME: "passbolt"
      DATASOURCES_DEFAULT_PASSWORD: "${DB_PASSWORD}"
      DATASOURCES_DEFAULT_DATABASE: "passbolt"
      EMAIL_TRANSPORT_DEFAULT_HOST: "${SMTP_HOST}"
      EMAIL_TRANSPORT_DEFAULT_PORT: "${SMTP_PORT:-587}"
      EMAIL_TRANSPORT_DEFAULT_USERNAME: "${SMTP_USER}"
      EMAIL_TRANSPORT_DEFAULT_PASSWORD: "${SMTP_PASSWORD}"
      EMAIL_TRANSPORT_DEFAULT_TLS: "true"
      EMAIL_DEFAULT_FROM: "${EMAIL_FROM}"
      EMAIL_DEFAULT_FROM_NAME: "Passbolt"
      SECURITY_SALT: "${SECURITY_SALT}"
      PASSBOLT_SSL_FORCE: "true"
      PASSBOLT_PLUGINS_SELF_REGISTRATION_ENABLED: "false"
      DEBUG: "false"
    volumes:
      - gpg_volume:/etc/passbolt/gpg
      - jwt_volume:/etc/passbolt/jwt
      # Eigenes SSL-Zertifikat (optional, sonst self-signed):
      # - ./certs/certificate.crt:/etc/passbolt/certs/certificate.crt:ro
      # - ./certs/certificate.key:/etc/passbolt/certs/certificate.key:ro
    command:
      [
        "/usr/bin/wait-for.sh",
        "-t",
        "0",
        "db:3306",
        "--",
        "/docker-entrypoint.sh",
      ]
    ports:
      - "80:80"
      - "443:443"
      # Für non-root-Image stattdessen:
      # - "80:8080"
      # - "443:4433"

volumes:
  database_volume:
  gpg_volume:
  jwt_volume:

Wichtig: SELF_REGISTRATION_ENABLED: "false" stellt sicher, dass sich niemand selbst registrieren kann — nur explizit eingeladene Nutzer erhalten Zugang. Das ist für geschlossene Teams und DSGVO-konforme Deployments der richtige Standardwert.

Verifizieren: docker compose -f /opt/passbolt/compose.yaml config darf keinen Syntaxfehler ausgeben und muss alle Umgebungsvariablen aus der .env-Datei korrekt interpolieren (d. h. keine ${VAR}-Platzhalter mehr in der Ausgabe, sondern echte Werte).

Schritt 4: Stack starten

Starte den Stack aus dem Projektordner heraus:

cd /opt/passbolt
docker compose up -d

Beim ersten Start passiert folgendes automatisch im Hintergrund: MariaDB initialisiert die Datenbank und den Nutzer, Passbolt wartet auf Port 3306, migriert danach das Datenbankschema und generiert den GPG-Serverschlüssel sowie die JWT-Keys. Das dauert typischerweise 60–90 Sekunden.

Verfolge den Startvorgang in Echtzeit:

docker compose logs -f passbolt

Den Log-Stream beendest du mit Strg+C. Warte, bis keine neuen Zeilen mehr erscheinen und kein ERROR sichtbar ist.

Verifizieren:

docker compose ps

Erwartete Ausgabe (beide Container Up, kein Restarting):

NAME                IMAGE                           STATUS
passbolt-db-1       mariadb:10.11                   Up X minutes
passbolt-passbolt-1 passbolt/passbolt:5.13.0-1-ce   Up X minutes

Zusätzlich den Health-Check-Endpunkt prüfen (self-signed Zertifikat mit -k übergehen):

curl -sk https://localhost/healthcheck/status.json

Erwartete Antwort: {"body":{"isHealthy":true}}

Schritt 5: Ersten Admin-Benutzer anlegen

Passbolt hat keinen Web-Installer — der erste Admin wird per CLI-Befehl im laufenden Container angelegt. Der Befehl muss zwingend als Nutzer www-data ausgeführt werden, sonst entstehen falsche Dateiberechtigungen in den GPG-Verzeichnissen:

docker compose exec passbolt su -m -c \
  'bin/cake passbolt register_user \
  -u admin@example.com \
  -f Vorname \
  -l Nachname \
  -r admin' \
  -s /bin/sh www-data

Ersetze admin@example.com, Vorname und Nachname durch echte Werte. Der Befehl gibt eine Einladungs-URL aus, zum Beispiel:

The user has been registered successfully.
To complete the setup, follow the link provided below.
https://passbolt.example.com/setup/install/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Öffne diese URL im Browser — mit installierter Passbolt Browser-Extension. Der Setup-Wizard führt dich durch die Erstellung deines persönlichen PGP-Schlüsselpaars und die Sicherung des privaten Schlüssels. Ohne diesen Schritt ist kein Login möglich.

Die Browser-Extension installierst du direkt aus dem jeweiligen Extension-Store (Chrome Web Store, Firefox Add-ons, Microsoft Edge Add-ons).

Verifizieren: Nach Abschluss des Setup-Wizards kannst du dich unter https://passbolt.example.com mit der Browser-Extension anmelden. Das Admin-Dashboard zeigt dich als einzigen Nutzer mit der Rolle „Admin".

Schritt 6: SMTP testen und weitere Nutzer einladen

Bevor du Kollegen einlädst, prüfe ob der SMTP-Versand funktioniert — sonst erhalten Nutzer keine Aktivierungs-E-Mail und der Einladungsprozess schlägt still fehl:

docker compose exec passbolt su -m -c \
  'bin/cake passbolt send_test_email \
  --recipient=deine@email.de' \
  -s /bin/sh www-data

Weitere Nutzer lädst du über die Passbolt-Weboberfläche ein: Benutzer → Neuer Benutzer. Passbolt sendet eine Einladungs-E-Mail mit einem Setup-Link. Jeder neue Nutzer muss ebenfalls die Browser-Extension installieren und beim ersten Login sein eigenes PGP-Schlüsselpaar erzeugen.

Für die Teamorganisation nutzt du Gruppen: Passwörter können gezielt mit einzelnen Nutzern oder ganzen Gruppen geteilt werden, mit konfigurierbaren Rechten (can-read, can-update, is-owner).

Verifizieren: Der Test-E-Mail-Befehl gibt The email was sent successfully. aus. Im Posteingang der Empfänger-Adresse erscheint eine Test-E-Mail von Passbolt. Neue Nutzer erhalten nach der Einladung eine E-Mail mit Aktivierungslink.

Schritt 7: Vollständigen Healthcheck ausführen

Passbolt bietet einen integrierten Diagnosebefehl, der alle Systemkomponenten prüft — Datenbankverbindung, GPG-Konfiguration, SMTP, SSL und mehr:

docker compose exec passbolt su -m -c \
  'bin/cake passbolt healthcheck' \
  -s /bin/sh www-data

Ein gesunder Stack gibt für alle Prüfpunkte grüne Häkchen aus. Warnungen zu self-signed Zertifikaten sind im Testbetrieb akzeptabel, sollten in der Produktion aber durch ein gültiges Zertifikat behoben werden.

Verifizieren: Die Ausgabe zeigt keine Fail-Zeilen. Zeilen wie SSL peer certificate or SSH remote key was not OK sind bei self-signed Zertifikaten erwartet und nur eine Warnung, kein Fehler.

Schritt 8: Updates und Backups

Für Details zur allgemeinen Docker-Volume-Backup-Strategie und zum 3-2-1-Prinzip lies 3-2-1-Backup-Strategie umsetzen. Für Passbolt gilt darüber hinaus: Verlust von gpg_volume oder jwt_volume bedeutet vollständigen Datenverlust — alle verschlüsselten Passwörter sind ohne den GPG-Serverschlüssel unwiederbringlich verloren.

Datenbank sichern:

docker compose exec db mysqldump \
  -u passbolt -p"${DB_PASSWORD}" passbolt \
  > /opt/passbolt/backup_$(date +%Y%m%d).sql

GPG-Volume sichern:

docker run --rm \
  -v passbolt_gpg_volume:/data \
  -v /opt/passbolt:/backup \
  alpine tar czf /backup/gpg_backup_$(date +%Y%m%d).tar.gz /data

Update durchführen: Image-Tag in compose.yaml auf die neue Version setzen, dann:

cd /opt/passbolt
docker compose pull
docker compose up -d

Passbolt führt Datenbankmigrationen beim Start automatisch aus. Vor jedem Update Backup erstellen und niemals docker compose down -v in der Produktion ausführen — das -v-Flag löscht die Named Volumes unwiederbringlich.

Verifizieren: Nach dem Update docker compose ps und erneut curl -sk https://localhost/healthcheck/status.json ausführen. Das Admin-Dashboard zeigt die neue Versionsnummer unter Administration → Server Info.

Troubleshooting / Typische Fehler

  1. „SQLSTATE[HY000] [1045] Access denied" in docker compose logs passbolt: Das Datenbankpasswort in MYSQL_PASSWORD (db-Service) stimmt nicht mit DATASOURCES_DEFAULT_PASSWORD (passbolt-Service) überein. Lösung: Beide Services teilen sich die ${DB_PASSWORD}-Variable aus der .env-Datei — Wert prüfen und docker compose up -d neu starten.
  2. Container startet in Restart-Loop: Häufigste Ursache ist ein noch nicht bereiter Datenbankserver. In den Logs auf waiting for db:3306 achten. MariaDB benötigt nach dem TCP-Listen noch einige Sekunden für die Initialisierung. Normalerweise löst wait-for.sh das automatisch — wenn nicht, hilft ein manuelles docker compose restart passbolt nach 30 Sekunden.
  3. Browser-Extension: „domain mismatch": APP_FULL_BASE_URL stimmt nicht exakt mit der URL im Browser überein. Die URL muss https:// enthalten, darf keinen abschließenden Schrägstrich haben und muss DNS-auflösbar sein. Für lokale Tests /etc/hosts anpassen: 127.0.0.1 passbolt.local.
  4. SMTP-Test schlägt fehl / Nutzer erhalten keine E-Mail: SMTP_HOST, SMTP_PORT und Zugangsdaten prüfen. Für Port 587 muss EMAIL_TRANSPORT_DEFAULT_TLS=true gesetzt sein. Den Test-Befehl aus Schritt 6 nutzen um SMTP direkt zu debuggen.
  5. register_user-Befehl schlägt mit Permission-Fehler fehl: Der Befehl wurde nicht als www-data ausgeführt. Immer die vollständige Syntax mit su -m -c '...' -s /bin/sh www-data verwenden — niemals direkt als root.
  6. SECURITY_SALT nachträglich geändert: Invalidiert sofort alle Sessions, MFA-Tokens und Auth-Tokens. Nutzer werden ausgesperrt. Einzige Lösung: Salt auf den ursprünglichen Wert zurücksetzen (aus Backup der .env) und Stack neu starten.
  7. self-signed Zertifikat: Browser-Extension gibt Warnung: Für den Produktivbetrieb einen Reverse Proxy mit Let's Encrypt vorschalten (z. B. Traefik oder Nginx Proxy Manager). Eigenes Zertifikat per Bind-Mount in ./certs/ einbinden und in compose.yaml die auskommentierten Volume-Zeilen aktivieren.

Häufige Fragen

Kann ich Passbolt hinter einem Reverse Proxy (Traefik/Nginx) betreiben?

Ja, das ist sogar der empfohlene Weg für die Produktion. Traefik oder Nginx als SSL-Terminator vorschalten, Port 80 und 443 weiterleiten und zusätzlich PASSBOLT_SECURITY_PROXIES_ACTIVE=true in der Umgebung setzen. APP_FULL_BASE_URL muss die öffentliche HTTPS-URL des Reverse Proxy sein. Wie du Traefik als Docker-Reverse-Proxy einrichtest, erklärt die gleichnamige Anleitung.

Was ist der Unterschied zwischen CE und Pro?

Die Community Edition ist vollständig kostenlos, Open Source (AGPL v3) und enthält alle Kernfunktionen: unbegrenzte Nutzer, unbegrenzte Gruppen, vollständiges Audit-Log, MFA, Browser-Extension, REST-API und Import/Export. Die Pro-Edition ergänzt Active-Directory-Synchronisation, erweiterten Support mit SLA und einige administrative Komfort-Features. Für die meisten KMU ist die CE vollständig ausreichend.

Wie sichere ich meine Passbolt-Instanz gegen unbefugten Zugriff ab?

PASSBOLT_PLUGINS_SELF_REGISTRATION_ENABLED=false ist bereits in der Compose-Vorlage gesetzt — nur explizit eingeladene Nutzer können ein Konto erstellen. Zusätzlich empfiehlt sich MFA für alle Nutzer (PASSBOLT_PLUGINS_MFA_PROVIDERS_TOTP=true), ein gehärteter Linux-Host und das Absichern des Docker-Compose-Setups — dazu bietet sich die Anleitung Docker Compose absichern: Secrets, Healthchecks, Non-Root als Ergänzung an.

Welche Architekturen werden unterstützt?

Das offizielle Image ist Multi-Arch und unterstützt linux/amd64 (Standard-Server, VMs) und linux/arm64 (Raspberry Pi 4/5, Apple-M-Chips). ARMv7 (32-Bit) wird nicht offiziell unterstützt.

Wie kann ich Docker Secrets statt Klartext-Passwörter in der .env nutzen?

Alle Passwortvariablen unterstützen ein _FILE-Suffix. Statt DATASOURCES_DEFAULT_PASSWORD=geheim kannst du DATASOURCES_DEFAULT_PASSWORD_FILE=/run/secrets/db_password setzen und das Secret als Docker-Secret-Volume einbinden. Das ist besonders in Umgebungen mit Docker Swarm oder strengeren Compliance-Anforderungen sinnvoll.

Wie lese ich Logs bei Problemen?

Für Anwendungsfehler: docker compose logs passbolt. Für Datenbankprobleme: docker compose logs db. Den integrierten Healthcheck für eine vollständige Systemdiagnose nutzen: docker compose exec passbolt su -m -c 'bin/cake passbolt healthcheck' -s /bin/sh www-data.

Fazit

Passbolt CE ist die überzeugendste Open-Source-Lösung für Teams, die einen Passwortmanager mit echter Ende-zu-Ende-Verschlüsselung selbst hosten wollen. Die PGP-Architektur ist technisch durchdacht: Der Server kann physisch keinen Zugriff auf die Klartextpasswörter erlangen, selbst wenn er kompromittiert wird. Der Docker-Stack ist mit zwei Services überschaubar, die Konfiguration über die .env-Datei klar strukturiert und die Three-Volume-Strategie für Persistenz zuverlässig — solange man die Volumes nie leichtfertig löscht und regelmäßig sichert.

Der wichtigste Einrichtungsschritt, den viele unterschätzen, ist SMTP: Ohne funktionierenden E-Mail-Versand ist der Admin zwar arbeitsfähig, aber kein einziger Kollege kann eingeladen werden. Plane das vor dem ersten docker compose up ein. Wer die Browser-Extension-Pflicht als Einstiegshürde kommuniziert und einen soliden Backup-Prozess für die drei Named Volumes etabliert, betreibt damit einen DSGVO-konformen Unternehmens-Passwort-Safe auf eigener Infrastruktur — ohne monatliche Lizenzkosten und ohne Cloud-Abhängigkeit.

Weiterführende Anleitungen und Quellen

  1. Docker und Docker Compose auf Linux installieren: die Self-Hosting-Grundlage
  2. Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten
  3. Docker Compose absichern: Secrets, Healthchecks, Non-Root und Read-Only für den Produktivbetrieb
  4. 3-2-1-Backup-Strategie umsetzen: Anleitung mit Restic, USB-Disk und S3-Cloud
  5. Vaultwarden produktiv betreiben: Argon2-Admin-Token, Fail2Ban und sicheres Backup

Offizielle Quellen: Passbolt — Install on Docker (offizielle Dokumentation) | passbolt/passbolt_docker auf GitHub | Passbolt Environment Variables Reference | passbolt/passbolt auf Docker Hub