🐳 Docker

Souveräne Passwortverwaltung: Dein eigener Vaultwarden Server

Souveräne Passwortverwaltung: Dein eigener Vaultwarden Server
⚠️ Hinweis: Alle Guides auf smoth.me dienen ausschließlich zu Informations- und Lernzwecken. Die Umsetzung erfolgt auf eigene Gefahr. Wir übernehmen keine Haftung für Schäden, Datenverluste oder Systemausfälle, die durch die Anwendung dieser Anleitungen entstehen können. → Vollständiger Haftungsausschluss

Servus, Homelab-Kollegen!

Das Thema Passwörter in der Cloud, insbesondere bei US-Anbietern, beschäftigt uns ja immer wieder. Die c't uplink hat das kürzlich wieder aufgegriffen, und ich kann das nur unterstreichen: Wer seine Passwörter wirklich souverän verwalten will, kommt um eine eigene Lösung nicht herum. Als alter Hase im Homelab und bekennender Fan von Selbsthosting-Lösungen habe ich mir da natürlich längst meine Gedanken gemacht und auch schon einige Setups durchprobiert. Mein Fazit? Für die meisten von uns ist Vaultwarden (ehemals Bitwarden_RS) die ideale Lösung.

Warum Vaultwarden? Ganz einfach: Es ist eine extrem ressourcenschonende, in Rust geschriebene Alternative zum offiziellen Bitwarden-Server, die voll kompatibel mit allen Bitwarden-Clients ist. Das bedeutet, du hast alle Vorteile eines modernen Passwortmanagers – Browser-Extensions, Mobile Apps, Desktop-Clients – aber die Kontrolle über deine Daten bleibt komplett bei dir. Kein US-Cloud-Anbieter, keine potenziellen Datenlecks bei Dritten, einfach nur du und dein Server.

In diesem Guide zeige ich dir, wie du Vaultwarden mit Docker Compose auf deinem eigenen Server einrichtest. Das ist meiner Erfahrung nach der schnellste, sauberste und wartungsfreundlichste Weg.

1. Voraussetzungen schaffen

Bevor wir uns in die Konsole stürzen, lass uns kurz checken, ob dein System bereit ist. Wer das zum ersten Mal einrichtet, stolpert oft über Kleinigkeiten, die man im Eifer des Gefechts übersieht.

  • Ein Linux-Server: Das kann eine virtuelle Maschine (VM) auf deinem Proxmox-Server sein, ein LXC-Container (Achtung, Docker in LXC braucht spezielle Konfigurationen!), ein Raspberry Pi oder jeder andere Rechner mit einer aktuellen Linux-Distribution (z.B. Debian, Ubuntu, CentOS). In meiner Erfahrung funktioniert eine dedizierte kleine VM am besten, um Abhängigkeiten zu isolieren.
  • Docker und Docker Compose: Diese beiden Tools sind das Herzstück unserer Installation. Sie müssen auf deinem Server installiert sein. Wenn nicht, keine Sorge, ich gebe dir einen kurzen Tipp, wie du das schnell erledigen kannst.
  • Grundkenntnisse der Linux-Kommandozeile (CLI): Du solltest dich auf der Konsole wohlfühlen, wissen, wie man Dateien editiert (z.B. mit nano oder vim) und grundlegende Befehle nutzt.
  • Freie Ports: Standardmäßig wird Vaultwarden intern auf Port 8000 laufen. Wenn du einen Reverse Proxy nutzt (was ich dringend empfehle!), brauchst du zusätzlich Port 80 und 443, die von außen erreichbar sein müssen.
  • Optional, aber sehr empfohlen: Eigene Domain und Reverse Proxy: Um Vaultwarden sicher über HTTPS und mit einem schönen Domainnamen zu erreichen (z.B. passwoerter.dein-homelab.de), ist ein Reverse Proxy (wie Nginx Proxy Manager, Traefik oder Caddy) mit Let's Encrypt-Zertifikaten essenziell.

1.1 Docker und Docker Compose installieren (falls noch nicht geschehen)

Falls du Docker und Docker Compose noch nicht am Start hast, hier die Kurzfassung für Debian/Ubuntu. Für andere Distributionen schau am besten in die offizielle Docker-Dokumentation.

# System aktualisieren
sudo apt update && sudo apt upgrade -y

# Notwendige Pakete installieren
sudo apt install ca-certificates curl gnupg lsb-release -y

# Docker GPG-Schlüssel hinzufügen
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Docker APT-Repository hinzufügen
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Aktuellen Benutzer zur Docker-Gruppe hinzufügen (damit sudo nicht immer nötig ist)
sudo usermod -aG docker $USER

# Wichtig: Melde dich einmal ab und wieder an, damit die Gruppenänderung wirksam wird!
# Oder führe `newgrp docker` aus.

Nach der Installation und dem Re-Login kannst du mit docker run hello-world testen, ob Docker korrekt läuft.

2. Vaultwarden einrichten – Schritt für Schritt

Jetzt geht's ans Eingemachte! Wir legen die Ordnerstruktur an und erstellen unsere docker-compose.yml.

2.1 Ordnerstruktur anlegen

Ich persönlich bevorzuge es, alle Docker-bezogenen Daten unter /opt/ zu speichern. Das hält das System sauber und organisiert.

sudo mkdir -p /opt/vaultwarden/data
sudo chown -R $USER:$USER /opt/vaultwarden

Der data-Ordner ist wichtig, denn dort speichert Vaultwarden seine Datenbank und alle Konfigurationsdateien. Dieser Ordner muss regelmäßig gesichert werden!

2.2 Die docker-compose.yml erstellen

Dies ist die zentrale Konfigurationsdatei für unseren Vaultwarden-Container. Öffne deinen bevorzugten Editor:

nano /opt/vaultwarden/docker-compose.yml

Füge den folgenden Inhalt ein. Ich habe Kommentare hinzugefügt, damit du verstehst, was jede Zeile bewirkt. Achte besonders auf die Umgebungsvariablen!

version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    ports:
      - "8000:80" # ACHTUNG: Nur für direkten Zugriff. Bei Reverse Proxy kann dies entfallen oder auf einen internen Port gemappt werden.
                 # Wenn du einen Reverse Proxy nutzt, reicht oft `- "127.0.0.1:8000:80"` damit der Port nur lokal erreichbar ist.
    volumes:
      - /opt/vaultwarden/data:/data # Hier werden die persistenten Daten gespeichert. UNBEDINGT SICHERN!
    environment:
      # Allgemeine Einstellungen
      - TZ=Europe/Berlin # Zeitzone anpassen
      - DOMAIN=https://passwoerter.dein-homelab.de # Wichtig, wenn du einen Reverse Proxy nutzt. Ersetze mit deiner Domain!
      - WEBSOCKET_ENABLED=true # Für Push-Benachrichtigungen und Sync der Clients. Dringend empfohlen.

      # Registrierung und Admin-Panel
      - SIGNUPS_ALLOWED=true # Erlaube neuen Benutzern, sich zu registrieren.
                             # WICHTIG: Nach der ersten Registrierung auf 'false' setzen, um offene Registrierungen zu verhindern!
      - ADMIN_TOKEN=DEIN_SICHERES_ADMIN_TOKEN # Ein langes, komplexes Token für den Zugriff auf das Admin-Panel (/admin).
                                             # Generiere es z.B. mit `openssl rand -base64 48`.
      # Optional: E-Mail-Einstellungen (für 2FA, Passwort-Reset etc.)
      # - SMTP_HOST=smtp.dein-mail-anbieter.de
      # - SMTP_PORT=587
      # - SMTP_FROM=vaultwarden@dein-homelab.de
      # - SMTP_USERNAME=dein-mail-user
      # - SMTP_PASSWORD=dein-mail-passwort
      # - SMTP_SSL=true
      # - SMTP_TLS=true
      # - SMTP_ACCEPT_INVALID_CERTS=false # Auf 'true' setzen, wenn du selbstsignierte Zertifikate verwendest (nicht empfohlen für produktive Umgebungen)

      # Weitere Sicherheitseinstellungen (optional, aber empfohlen)
      - ROCKET_LIMITS='{json: 10485760}' # Erhöht das Limit für JSON-Uploads, nützlich für große Anhänge
      - LOG_FILE=/data/vaultwarden.log # Log-Datei, wenn gewünscht
      - LOG_LEVEL=warn # Log-Level anpassen (info, warn, error, debug, trace)

Wichtige Hinweise zur Konfiguration:

  • ports: Wenn du direkt auf Port 8000 zugreifen willst, lass es so. Wenn du einen Reverse Proxy nutzt, ändere es auf - "127.0.0.1:8000:80". So ist Vaultwarden nur über den Proxy erreichbar, was sicherer ist.
  • SIGNUPS_ALLOWED=true: Ganz wichtig! Setze dies auf false, sobald du deinen ersten Admin-Benutzer registriert hast. Sonst kann sich jeder, der die IP/Domain deines Servers kennt, einen Account erstellen.
  • ADMIN_TOKEN: Generiere hierfür unbedingt ein sehr langes und zufälliges Token. Das ist dein Generalschlüssel zum Admin-Panel. Ein Beispielbefehl dafür: openssl rand -base64 48.
  • DOMAIN: Wenn du einen Reverse Proxy nutzt, trage hier die komplette HTTPS-URL ein, unter der Vaultwarden erreichbar sein wird.

2.3 Vaultwarden starten

Speichere die docker-compose.yml-Datei und starte den Container:

cd /opt/vaultwarden
docker compose up -d

Der Befehl docker compose up -d startet den Container im Hintergrund (-d für "detached"). Es dauert einen Moment, bis das Image heruntergeladen und der Container gestartet ist.

Um zu prüfen, ob alles läuft, kannst du die Logs verfolgen:

docker compose logs -f vaultwarden

Du solltest Meldungen sehen, die darauf hindeuten, dass der Server gestartet ist und auf Verbindungen wartet.

2.4 Erster Zugriff und Konfiguration

Wenn alles geklappt hat, kannst du Vaultwarden jetzt im Browser aufrufen:

  • Ohne Reverse Proxy: http://DEINE_SERVER_IP:8000
  • Mit Reverse Proxy: https://passwoerter.dein-homelab.de (oder deine gewählte Domain)

Registriere deinen ersten Benutzer. Das wird dein Haupt-Admin-Account für Vaultwarden. Merke dir das Master-Passwort gut und sichere es extern (z.B. auf einem USB-Stick in einem Safe).

Sobald der erste Benutzer registriert ist, bearbeite deine docker-compose.yml und setze SIGNUPS_ALLOWED=false. Starte den Container dann neu:

nano /opt/vaultwarden/docker-compose.yml # SIGNUPS_ALLOWED auf false setzen
docker compose down
docker compose up -d

Jetzt kannst du auch das Admin-Panel aufrufen unter http://DEINE_SERVER_IP:8000/admin (oder https://deine-domain.de/admin) und dich mit deinem ADMIN_TOKEN anmelden. Hier kannst du Benutzer verwalten, globale Einstellungen ändern und vieles mehr. Spiel dich ein wenig damit!

2.5 (Dringend empfohlen) Reverse Proxy und SSL

Vaultwarden direkt über Port 8000 und HTTP zu betreiben ist für ein Homelab okay, aber sobald du von außen zugreifen oder es professioneller betreiben willst, ist HTTPS mit einem Reverse Proxy Pflicht. Die Kommunikation zwischen den Clients und deinem Vaultwarden-Server muss verschlüsselt sein.

Ich empfehle hierfür Nginx Proxy Manager (NPM) oder Traefik. Beide lassen sich wunderbar mit Docker Compose betreiben und automatisieren die Let's Encrypt Zertifikatserstellung.

Kurzanleitung für Nginx Proxy Manager:

  1. Installiere NPM (oft ebenfalls als Docker-Container).
  2. Erstelle einen neuen Proxy Host in NPM.
  3. Als Domain trägst du deine gewünschte URL ein (z.B. passwoerter.dein-homelab.de).
  4. Als "Forward Hostname / IP" gibst du die IP deines Vaultwarden-Servers an (z.B. 192.168.1.10 oder vaultwarden, wenn beide Container im selben Docker-Netzwerk sind).
  5. Als "Forward Port" gibst du 8000 an (den Port, den Vaultwarden intern exponiert).
  6. Aktiviere SSL und fordere ein Let's Encrypt-Zertifikat an.
  7. Wichtig: Aktiviere "Websockets Support" unter den Advanced-Einstellungen von NPM für diesen Proxy Host!

Wenn du Nginx direkt konfigurieren willst, könnte ein Server-Block so aussehen:

server {
    listen 80;
    server_name passwoerter.dein-homelab.de;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name passwoerter.dein-homelab.de;

    ssl_certificate /etc/letsencrypt/live/passwoerter.dein-homelab.de/fullchain.pem; # Pfad anpassen
    ssl_certificate_key /etc/letsencrypt/live/passwoerter.dein-homelab.de/privkey.pem; # Pfad anpassen

    location / {
        proxy_pass http://127.0.0.1:8000; # Oder die interne IP/Name deines Vaultwarden-Containers
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade"; # Wichtig für WebSockets
    }

    location /admin {
        # Optional: Zusätzlicher Basic Auth Schutz für das Admin-Panel
        # auth_basic "Adminbereich";
        # auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:8000/admin; # Oder die interne IP/Name deines Vaultwarden-Containers
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. Häufige Fehler und Lösungen

Auch wenn Docker vieles vereinfacht, gibt es ein paar Klassiker, über die man stolpern kann. Hier sind die häufigsten Probleme, die mir in meiner Erfahrung begegnet sind:

3.1 Port-Konflikte

Problem: Der Container startet nicht und du siehst Fehlermeldungen wie Error starting userland proxy: listen tcp 0.0.0.0:8000: bind: address already in use in den Docker-Logs.

Lösung: Das bedeutet, ein anderer Dienst auf deinem Server belegt bereits Port 8000. Du hast zwei Optionen:

  1. Anderen Port für Vaultwarden wählen: Ändere den ersten Teil der Port-Definition in deiner docker-compose.yml, z.B. von "8000:80" auf "8080:80".
  2. Den belegenden Prozess finden und stoppen: Finde heraus, welcher Prozess den Port belegt mit:
    sudo lsof -i :8000
    
    Dann kannst du den Prozess entweder stoppen oder den Port dort freigeben.

3.2 Zugriffsfehler nach dem Start (Browser kann Seite nicht erreichen)

Problem: Der Container läuft laut docker ps, aber im Browser ist Vaultwarden nicht erreichbar.

Lösung: Hier gibt es mehrere mögliche Ursachen:

  1. Firewall: Prüfe, ob die Firewall deines Servers den Zugriff auf den Port (8000 oder 80/443, wenn ein Reverse Proxy davor ist) blockiert. Wenn du ufw nutzt:
    sudo ufw status # Status der Firewall prüfen
    sudo ufw allow 8000/tcp # Port 8000 freigeben (falls direkt zugreifst)
    sudo ufw allow 'Nginx Full' # Oder 'Nginx HTTP' / 'Nginx HTTPS' wenn du Nginx nutzt
    sudo ufw reload # Firewall neu laden
    
  2. Falsche IP/Port: Hast du die korrekte IP-Adresse deines Servers und den korrekten Port im Browser eingegeben?
  3. Container-Probleme: Schau in die Logs des Containers: docker compose logs vaultwarden. Vielleicht gibt es interne Fehler, die den Dienst am Start hindern.

3.3 Registrierung nicht möglich / Admin-Panel nicht erreichbar

Problem: Du kannst keinen neuen Benutzer registrieren oder das Admin-Panel unter /admin ist nicht zugänglich oder akzeptiert das Token nicht.

Lösung:

  1. Registrierung: Wenn du keine Benutzer registrieren kannst, prüfe die Variable SIGNUPS_ALLOWED in deiner docker-compose.yml. Sie muss auf true stehen, damit neue Registrierungen möglich sind. Nach der ersten Registrierung solltest du sie wieder auf false setzen und den Container neu starten.
  2. Admin-Panel: Für das Admin-Panel musst du das exakt gleiche ADMIN_TOKEN verwenden, das du in der docker-compose.yml definiert hast. Kopiere es am besten direkt aus der Datei, um Tippfehler zu vermeiden. Auch hier gilt: Nach jeder Änderung der docker-compose.yml den Container neu starten mit docker compose down && docker compose up -d.

4. Fazit und nächste Schritte

Glückwunsch! Du hast jetzt deinen eigenen, souveränen Passwortmanager am Laufen. Das ist ein großer Schritt in Richtung digitaler Unabhängigkeit und Sicherheit. Du bist nicht mehr auf die Gnade einer großen Cloud angewiesen und hast die volle Kontrolle über deine sensiblen Daten.

Aber damit ist die Reise nicht zu Ende. Hier sind ein paar Dinge, die du als Nächstes in Angriff nehmen solltest:

  • Backups, Backups, Backups! Der /opt/vaultwarden/data-Ordner enthält alles. Richte eine automatisierte Backup-Strategie ein, die diesen Ordner regelmäßig sichert. Denk an die 3-2-1-Regel.
  • Regelmäßige Updates: Halte deinen Vaultwarden-Container und dein Host-System aktuell. Ein einfaches docker compose pull && docker compose up -d im /opt/vaultwarden-Verzeichnis aktualisiert deinen Vaultwarden-Container.
  • Clients konfigurieren: Installiere die Bitwarden-Browser-Extensions, Desktop-Apps und Mobile Apps. Verbinde sie mit deinem selbstgehosteten Server, indem du unter "Self-hosting" deine Server-URL (z.B. https://passwoerter.dein-homelab.de) eingibst.
  • Zwei-Faktor-Authentifizierung (2FA): Richte 2FA für deinen Vaultwarden-Account ein. Das ist eine zusätzliche Sicherheitsebene, die ich jedem nur wärmstens empfehlen kann.
  • Härtung des Servers: Wenn dein Server aus dem Internet erreichbar ist, denke über weitere Maßnahmen wie Fail2Ban nach, um Brute-Force-Angriffe abzuwehren.

Mit Vaultwarden hast du eine extrem leistungsfähige und sichere Basis geschaffen. Experimentiere damit, passe es an deine Bedürfnisse an und genieße die Ruhe, die ein selbstgehosteter Dienst mit sich bringt. Bei Fragen oder Problemen – die smoth.me-Community hilft gerne!

Weitere Guides aus "Docker"

Helm im Homelab: Kubernetes-Anwendungen effizient verwalten
Lerne, wie du Kubernetes-Applikationen mit Helm in deinem Homelab oder als Admin effizient verwaltes…
K3s im Homelab: Dein erster Kubernetes-Cluster mit Proxmox
Erfahre, wie du einen schlanken K3s Kubernetes-Cluster in deinem Homelab auf Proxmox-VMs aufsetzt. E…
LGTM im Homelab: Observability mit Grafana, Loki, Tempo, Mimir
Lerne, wie du mit Grafana, Loki, Tempo und Mimir (LGTM) deinen Homelab-Betrieb überwachst, Logs zent…
Super Productivity 18.0 im Homelab mit Docker
Ich zeige dir, wie du Super Productivity 18.0 in deinem Homelab mit Docker betreibst und seine neuen…