20 KiB
Kapitel 5 – Vaultwarden (Passwörter, 2FA)
Einleitung
Zugangsdaten gehören zu den sensibelsten Informationen im digitalen Alltag.
Ob Streaming-Tools, Creator-Plattformen, E-Mail-Konten, Domains oder Selfhosting-Dienste – jeder Dienst hat sein eigenes Passwort, manche erfordern zusätzlich Zwei-Faktor-Codes (2FA).
Das Problem mit Passwörtern im Alltag
Oft landen Passwörter:
- in Browsern, die ohne Hauptkennwort speichern,
- in Textdateien auf dem Desktop,
- oder werden für mehrere Konten wiederverwendet.
Zwei-Faktor-Codes liegen dann verstreut in Authenticator-Apps auf dem Handy – ohne Backup und nicht synchronisierbar.
Warning
Wer 2FA-Codes verliert, verliert oft dauerhaft den Zugriff.
Viele Dienste bieten keinen Wiederherstellungsprozess ohne die Codes.
Vaultwarden als Lösung
Vaultwarden ist ein selbst gehosteter Passwort-Manager.
Er speichert Passwörter und 2FA-Codes verschlüsselt auf dem eigenen Server – vollständig kompatibel mit den offiziellen Bitwarden-Apps für Browser, Desktop und Mobilgeräte.
Der Zugriff erfolgt über eine zentrale Weboberfläche, erreichbar unter einer eigenen Domain wie https://pass.DEINE-DOMAIN.tld, mit gültigem SSL-Zertifikat und WebSocket-Sync.
Tip
Vaultwarden ist die leichtgewichtige, Docker-basierte Variante von Bitwarden – ohne Cloud, ohne Abo, ohne Datenweitergabe.
Ziel dieses Kapitels
Wir richten Vaultwarden in einem eigenen Debian‑12‑LXC per Docker Compose ein und machen ihn per Nginx Proxy Manager erreichbar.
Dabei setzen wir auf verschlüsselte Kommunikation (HTTPS), geschützte WebSocket-Verbindung und ein gehärtetes Admin-Backend mit Hash-Login.
Am Ende des Kapitels steht ein voll einsatzfähiger Passwort-Manager:
- auf eigener Hardware,
- mit geschlossener Registrierung,
- sicher erreichbar von jedem Gerät.
Voraussetzungen & Ressourcen
Vaultwarden wird in einem eigenen LXC-Container unter Debian 12 betrieben.
Ein LXC ist ein leichtgewichtiger Container unter Proxmox – ideal für einzelne Dienste wie diesen. Die Einrichtung haben wir bereits in Kapitel 1 Schritt für Schritt gezeigt.
Anforderungen an den Container
- Betriebssystem: Debian 12
- CPU: 1 Kern
- RAM: 512 MB
- Festplatte: 8 GB
- IP-Adresse: 192.168.1.50 (per DHCP-Reservierung im Router fest zugewiesen)
- Internetverbindung: erforderlich für Paketinstallation und Docker-Download
Tip
Vergib die IP-Adresse über eine DHCP-Reservierung im Router, nicht außerhalb des DHCP-Bereichs.
So stellst du sicher, dass die Adresse dauerhaft erhalten bleibt – ohne Konflikte mit anderen Geräten.
👉 Screenshot geeignet: Proxmox – LXC erstellen → Allgemeine Einstellungen mit Hostname „vaultwarden“
Subdomain & Reverse Proxy
Damit Vaultwarden später über eine Webadresse erreichbar ist, benötigen wir:
- Eine Subdomain wie
pass.meinedomain.de - Einen laufenden Nginx Proxy Manager (siehe Kapitel 3), der HTTPS-Anfragen an den Vaultwarden-Container weiterleiten kann
Note
Du kannst auch eine kostenlose DynDNS-Adresse verwenden – z. B. über DuckDNS.
Wichtig ist nur, dass der Proxy Manager Anfragen zuverlässig an die IP192.168.1.50weiterleitet.
👉 Screenshot geeignet: DuckDNS-Dashboard mit Subdomain + NPM-Dashboard mit Proxy Host
Schritt-für-Schritt-Anleitung
System vorbereiten
Wir starten im frisch erstellten LXC-Container.
Öffne in Proxmox den Container vaultwarden und klicke im Menü auf Konsole.
Zuerst bringen wir das System auf den aktuellen Stand und installieren die benötigten Hilfspakete.
Diese sorgen dafür, dass externe Paketquellen sicher eingebunden und später Docker korrekt installiert werden kann.
apt update
apt upgrade -y
apt install -y ca-certificates curl gnupg lsb-release
Note
Diese Pakete ermöglichen verschlüsselte Verbindungen, das Verifizieren von Signaturen und das Erkennen der verwendeten Systemversion.
👉 Screenshot geeignet: Proxmox-Konsole mit apt upgrade und Paketinstallation
Docker und Compose installieren
Vaultwarden wird als Docker-Anwendung betrieben.
Dafür installieren wir die aktuelle Docker Engine und das dazugehörige Compose-Plugin direkt aus dem offiziellen Repository.
-
Verzeichnis für den Signaturschlüssel anlegen:
mkdir -p /etc/apt/keyrings
-
Docker-Signaturschlüssel herunterladen und abspeichern:
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
-
Docker-Repository hinzufügen:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian
$(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list -
Paketlisten aktualisieren und Docker installieren:
apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
Docker beim Systemstart automatisch aktivieren:
systemctl enable --now docker
Tip
Prüfe die Installation mit folgenden Befehlen:
docker --version
docker compose version
👉 Screenshot geeignet: Terminalausgabe mit Docker- und Compose-Version
Warning
Falls Docker im Container nicht startet:
In Proxmox → Container auswählen → Reiter „Optionen“ → Haken bei „Nesting“ und „keyctl“ setzen → Container neu starten.
👉 Screenshot geeignet: Proxmox → CT-Optionen mit aktivierten Haken
Projektstruktur & .env-Datei
Wir legen jetzt die Verzeichnisstruktur für Vaultwarden an und erstellen eine Konfigurationsdatei .env.
Diese Datei enthält später wichtige Einstellungen wie die Adresse des Dienstes und (optional) SMTP-Daten für Mailversand.
Öffne die Konsole des Containers und gib folgende Befehle ein:
mkdir -p /opt/vaultwarden/data
cd /opt/vaultwarden
nano .env
Es öffnet sich der Nano-Editor. Trage hier Folgendes ein:
DOMAIN=https://pass.DEINE-DOMAIN.tld
SIGNUPS_ALLOWED=false
# Optional: SMTP für Verifizierung und Passwort-Reset
# SMTP_HOST=smtp.example.com
# SMTP_FROM=pass@example.com
# SMTP_PORT=587
# SMTP_SECURITY=starttls
# SMTP_USERNAME=nutzername
# SMTP_PASSWORD=deinSMTPpasswort
Tip
Trage die Domain unbedingt mit https:// ein.
Ohne Protokollangabe können später Links in Mails oder der Weboberfläche fehlerhaft sein.
Note
Die Option
SIGNUPS_ALLOWED=falsedeaktiviert die offene Registrierung.
Du aktivierst sie später kurzzeitig manuell, um deinen ersten Nutzer anzulegen.
Speichern mit:
Strg + O → Enter → Strg + X
👉 Screenshot geeignet: Nano-Editor mit ausgefüllter .env-Datei
docker-compose.yml erstellen
Vaultwarden wird über Docker Compose gestartet.
Dazu legen wir eine Datei namens docker-compose.yml an, die beschreibt, welches Image verwendet wird, auf welchen Ports der Dienst erreichbar ist und wo die Daten gespeichert werden.
Gib in der Konsole ein:
nano docker-compose.yml
Füge folgenden Inhalt ein:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
environment:
- DOMAIN=${DOMAIN}
volumes:
- ./data:/data
ports:
- "8000:80"
- "3012:3012"
Note
Port 8000 wird später im Nginx Proxy Manager als Weiterleitungsziel eingetragen.
Port 3012 ist für WebSockets zuständig – ohne ihn funktioniert der Live-Sync zwischen Geräten nicht.
Speichern mit:
Strg + O → Enter → Strg + X
👉 Screenshot geeignet: docker-compose.yml im Nano-Editor mit vollständigem Inhalt
Container starten & Logs prüfen
Sobald alle Dateien angelegt sind, starten wir Vaultwarden zum ersten Mal.
Dabei wird das Docker-Image heruntergeladen, der Container erstellt und im Hintergrund ausgeführt.
Gib in der Konsole ein:
docker compose up -d
Tip
Der Parameter
-dsorgt dafür, dass der Container im Hintergrund („detached“) läuft.
Prüfe danach, ob der Container fehlerfrei gestartet wurde:
docker compose logs -f --tail=80 vaultwarden
Wenn alles korrekt eingerichtet ist, erscheint nach einigen Sekunden die Meldung:
Rocket has launched from http://0.0.0.0:80
Das bedeutet, dass Vaultwarden intern erfolgreich auf Port 80 gestartet wurde.
Note
Wenn stattdessen Fehlermeldungen wie „permission denied“ oder „/data not writable“ auftauchen,
überprüfe die Rechte des Datenordners oder lösche einen fehlerhaften Container mit:
docker compose down
docker compose up -d
👉 Screenshot geeignet: Terminal mit „Rocket has launched...“-Ausgabe im Log
Veröffentlichung im Nginx Proxy Manager
Vaultwarden läuft nun intern auf Port 8000 des Containers.
Damit der Dienst auch von außen über eine Domain wie https://pass.DEINE-DOMAIN.tld erreichbar ist, richten wir ihn im Nginx Proxy Manager (NPM) als neuen Proxy Host ein.
Öffne die NPM-Weboberfläche:
http://:81
Note
Die Einrichtung von NPM haben wir ausführlich in Kapitel 3 gezeigt.
Falls du dir nicht sicher bist, wie du einen Proxy Host anlegst, sieh dir das dortige Beispiel erneut an.
Proxy Host hinzufügen
- Gehe auf Hosts → Proxy Hosts
- Klicke auf Add Proxy Host
Fülle die Felder wie folgt aus:
- Domain Names:
pass.DEINE-DOMAIN.tld - Scheme:
http - Forward Hostname / IP:
192.168.1.50 - Forward Port:
8000 - Block Common Exploits: aktivieren
- Websockets Support: aktivieren
👉 Screenshot geeignet: Proxy Host Maske mit IP 192.168.1.50 und Port 8000
WebSocket-Weiterleitung hinzufügen
Vaultwarden nutzt WebSockets für den Live-Sync zwischen Geräten.
Dafür muss eine spezielle Weiterleitung für den Pfad /notifications/hub eingerichtet werden.
- Klicke im Proxy Host auf den Reiter Custom Locations
- Wähle Add Location
Trage ein:
- Location:
/notifications/hub - Forward Hostname / IP:
192.168.1.50 - Forward Port:
3012 - Websockets Support: aktivieren
Speichern und zurück zum Hauptfenster des Proxy Hosts.
👉 Screenshot geeignet: Custom Location mit WebSocket-Port 3012
SSL-Zertifikat erstellen
Wechsle in den Reiter SSL und richte ein gültiges HTTPS-Zertifikat ein:
- SSL Certificate: Request a new SSL Certificate
- Force SSL: aktivieren
- HTTP/2 Support: aktivieren
- HSTS Enabled: aktivieren
- Agree to terms: Haken setzen
Tip
Achte darauf, dass die Domain bereits auf deinen Server zeigt.
Die Validierung von Let’s Encrypt funktioniert nur, wenn die Ports 80 und 443 korrekt weitergeleitet wurden.
Speichern. Der Proxy Host wird nun aktiv.
Rufe im Browser https://pass.DEINE-DOMAIN.tld auf.
Die Login-Seite von Vaultwarden sollte jetzt erscheinen.
👉 Screenshot geeignet: Browseransicht mit Vaultwarden-Loginmaske unter HTTPS-Adresse
Admin-Absicherung & Benutzer anlegen
Vaultwarden besitzt ein separates Admin-Interface unter:
https://pass.DEINE-DOMAIN.tld/admin
Beim ersten Aufruf erscheint ein Warnhinweis:
Die Nutzung eines einfachen Admin-Tokens in Klartext ist unsicher.
Stattdessen hinterlegen wir einen verschlüsselten Zugriffscode im Format Argon2 PHC.
Sicheren Admin-Token erzeugen
Vaultwarden enthält ein eingebautes Werkzeug zum Erzeugen dieses Hashes.
Gib in der Konsole des Containers ein:
docker exec -it vaultwarden /vaultwarden hash --preset owasp
Du wirst zweimal nach dem gewünschten Admin-Passwort gefragt.
Am Ende erscheint ein langer Code, der mit $argon2id$ beginnt.
Diesen komplett kopieren – er wird später im Adminbereich eingetragen.
Note
Dieser Code ist nicht das Passwort selbst, sondern ein sicherer Rechenwert daraus.
Du verwendest weiterhin das eingegebene Passwort, nicht den Hash zum Login.
👉 Screenshot geeignet: Konsole mit Ausgabe des Argon2-Hashes
Hash im Webinterface eintragen
- Öffne
https://pass.DEINE-DOMAIN.tld/admin - Logge dich mit dem neuen Passwort ein
- Gehe zu Settings → General
- Trage den kopierten Hash in das Feld Admin Token / Argon2 PHC ein
- Speichern
Ab jetzt ist der Adminbereich mit dem sicheren Hash geschützt.
Der alte Klartext-Eintrag darf entfernt werden.
Tip
Öffne die
.env-Datei und lösche die Zeile mitADMIN_TOKEN=
Danach den Container neu starten:
sed -i '/^ADMIN_TOKEN=/d' /opt/vaultwarden/.env
cd /opt/vaultwarden && docker compose restart vaultwarden
👉 Screenshot geeignet: Adminbereich mit gespeichertem Hash + Login-Maske
Ersten Benutzer anlegen
Vaultwarden lässt keine offenen Registrierungen zu – genau das haben wir in der .env vorher deaktiviert.
Um den ersten Benutzer anzulegen, aktivieren wir die Anmeldung kurzzeitig manuell:
- Adminbereich öffnen → Settings → General
- Option Allow new signups aktivieren → Speichern
- In einem zweiten Tab
https://pass.DEINE-DOMAIN.tld/#/registeröffnen - Benutzer registrieren
- Danach Anmeldung testen und die Registrierung wieder deaktivieren
Tip
Alternativ kannst du Nutzer auch über Users → Invitations per E-Mail einladen, wenn SMTP korrekt konfiguriert ist.
👉 Screenshot geeignet: Registrierung und späterer Login im Tresor
Backups & Wiederherstellung
Vaultwarden speichert alle Daten in einem lokalen Ordner – das betrifft sowohl Passwörter, Benutzer, Konfigurationen als auch Anhänge und TOTP-Codes.
Wichtig:
Nicht der Docker-Container ist relevant, sondern der Ordner /opt/vaultwarden/data.
Nur dieser Ordner muss regelmäßig gesichert werden.
Manuelles Backup erstellen
Ein manuelles Backup kannst du direkt im Container-Terminal erstellen:
cd /opt/vaultwarden
tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz data
Tip
Wenn du maximale Datensicherheit willst, kannst du Vaultwarden vor dem Backup kurz stoppen:
docker compose stop vaultwarden
Note
Für kleine Setups ist ein Online-Backup im laufenden Betrieb meist ausreichend.
Nach dem Backup startest du den Container bei Bedarf wieder:
docker compose start vaultwarden
Die Backup-Datei liegt danach unter /root/ und heißt z. B. vaultwarden-backup-2025-10-04.tar.gz
👉 Screenshot geeignet: Terminalausgabe nach erfolgreicher Archivierung
Wiederherstellung
Falls du Vaultwarden auf einem neuen System wiederherstellen musst:
-
Neue Instanz bis zur
docker-compose.ymleinrichten -
Backup-Datei nach
/opt/vaultwarden/kopieren -
Archiv entpacken:
tar -xzf vaultwarden-backup-2025-10-04.tar.gz
-
Container starten:
docker compose up -d
Das System ist danach wieder wie vorher nutzbar – inklusive aller Benutzer, Einstellungen und Daten.
Warning
Stelle sicher, dass die Zugriffsrechte auf den Ordner
dataerhalten bleiben.
Andernfalls kann Vaultwarden die Datenbank nicht korrekt öffnen.
Troubleshooting & Tipps
Vaultwarden lädt nicht im Browser
Wenn sich die Seite https://pass.DEINE-DOMAIN.tld nicht öffnet:
-
Öffne in Proxmox den Container
vaultwarden -
Klicke auf Konsole
-
Gib ein:
docker compose ps
In der Spalte „State“ muss „running“ stehen.
Falls nicht, starte den Container erneut:
docker compose up -d
👉 Screenshot geeignet: Ausgabe von docker compose ps mit Status „running“
Tip
Du kannst auch testen, ob Vaultwarden intern erreichbar ist:
Öffnehttp://192.168.1.50:8000im Browser.
Wenn dort die Login-Maske erscheint, funktioniert Vaultwarden – das Problem liegt am Proxy.
Die Domain funktioniert, aber es erscheint keine Login-Maske
Öffne den Nginx Proxy Manager und gehe wie folgt vor:
- Klicke auf den Proxy Host für
pass.DEINE-DOMAIN.tld - Prüfe:
- IP-Adresse:
192.168.1.50 - Port:
8000 - Haken bei „Block Common Exploits“ und „Websockets Support“
- IP-Adresse:
👉 Screenshot geeignet: Proxy Host Übersicht mit richtiger IP und Port
- Wechsle in den Reiter Custom Locations
- Prüfe:
- Location:
/notifications/hub - Ziel-Port:
3012 - WebSocket-Support: aktiviert
- Location:
👉 Screenshot geeignet: Custom Location mit aktivem Websocket-Haken
Tip
Änderungen speichern, Proxy Host kurz deaktivieren und wieder aktivieren.
Die Seite lädt, aber nichts funktioniert richtig
Wenn z. B. das Design fehlt oder Buttons nicht reagieren:
-
Öffne die
.env-Datei mit:nano /opt/vaultwarden/.env
-
Prüfe, ob die Domain mit
https://eingetragen ist:
Fehlt das https://, tragen wir es nach und starten neu:
docker compose restart vaultwarden
👉 Screenshot geeignet: Nano-Editor mit korrigierter DOMAIN-Zeile
Ich kann mich nicht im Adminbereich anmelden
- Rufe
https://pass.DEINE-DOMAIN.tld/adminauf - Gib das Passwort ein, das du beim Erzeugen des Hashs vergeben hast
Note
Der Admin-Login funktioniert nicht mit dem Hash, sondern mit dem dazugehörigen Passwort.
Wenn du keinen Zugriff mehr hast:
-
Neuen Hash erzeugen:
docker exec -it vaultwarden /vaultwarden hash --preset owasp
-
Hash im Adminbereich unter Settings → General → Admin Token einfügen
-
Container neu starten
👉 Screenshot geeignet: Adminbereich mit Argon2 PHC Feld
Warning
Falls nichts mehr geht:
VorübergehendADMIN_TOKEN=deinPasswortin.envsetzen → dann zurück auf Hash wechseln.
Keine Live-Synchronisation zwischen Geräten
Wenn du Vaultwarden auf zwei Geräten gleichzeitig geöffnet hast und eine Änderung (z. B. ein neues Passwort) nicht automatisch auf dem anderen Gerät erscheint, liegt das fast immer an einer fehlenden WebSocket-Verbindung.
Vaultwarden verwendet WebSockets, um Änderungen sofort an alle verbundenen Geräte zu übertragen – ohne Neuladen.
Damit das funktioniert, muss im Nginx Proxy Manager eine zusätzliche Weiterleitung eingerichtet sein.
Öffne den Proxy Host in NPM, der auf pass.DEINE-DOMAIN.tld zeigt:
- Wechsle in den Reiter Custom Locations
- Stelle sicher, dass dort eine Weiterleitung für
/notifications/hubeingerichtet ist - Die Ziel-IP ist wie beim Haupt-Proxy
192.168.1.50, aber der Port ist3012 - Aktiviere auch hier den Haken „Websockets Support“
Tip
Diese Weiterleitung ist zwingend erforderlich – ohne sie funktioniert die automatische Aktualisierung nicht.
Du musst dann manuell die Seite neu laden, um Änderungen zu sehen.
👉 Screenshot geeignet: Custom Location mit Pfad /notifications/hub, Port 3012 und aktivem WebSocket-Haken
Zusammenfassung & Nächste Schritte
Mit Vaultwarden hast du jetzt einen vollwertigen Passwort-Manager im eigenen Homelab eingerichtet – sicher, unabhängig und kompatibel mit allen offiziellen Bitwarden-Apps.
Was du jetzt erreicht hast:
- Vaultwarden läuft als Docker-Anwendung in einem eigenen Debian-LXC
- Der Dienst ist über
https://pass.DEINE-DOMAIN.tlderreichbar - Das Admin-Interface ist mit einem sicheren Hash-Zugang geschützt
- Die WebSocket-Verbindung sorgt für Live-Synchronisierung
- Backups sind eingerichtet und schnell wiederherstellbar
👉 Screenshot geeignet: Loginmaske in Browser + aktiver Proxy Host in NPM
Tip
Wenn du den Tresor auch unterwegs nutzen willst, installiere die Bitwarden-App auf deinem Smartphone
und stelle unter „Server-URL“ deine eigene Adresse ein:
https://pass.DEINE-DOMAIN.tld
Note
Du kannst Vaultwarden jetzt direkt im Alltag nutzen – zum Speichern von Passwörtern, Anlegen von Ordnern, Hinterlegen von TOTP-Codes und für sicheren Zugriff von überall.