11 KiB
🎬 Bratonien Tech – Kapitel 6: Vaultwarden (Self‑Hosted mit Docker)
🎵 Intro
Szene: Talking Head (du oder Barney), Bratonien‑Tech‑Logo. Voiceover / Gesprochen: „Hallo und herzlich willkommen bei Bratonien Tech. Ich bin [dein Name oder Barney] von Bratonien Cosplay. In dieser Reihe bauen wir aus einem alten Office‑PC ein komplettes Homelab – oder wie ich es nenne: Bratoniens Kontrollzentrum. Heute sichern wir unsere Zugänge und Geheimnisse: Wir richten Vaultwarden ein – Bitwarden‑kompatibel, schlank, selbst gehostet und voll unter unserer Kontrolle.“
Warum Vaultwarden?
Szene: Vergleichsfolie: Passwort‑Chaos vs. Vaultwarden‑Logo + Browser‑Add‑on. Voiceover: „Passwörter im Kopf, in Textdateien oder in der Cloud anderer Anbieter? Muss nicht sein. Vaultwarden läuft im eigenen Homelab, spricht mit den Bitwarden‑Apps und Browser‑Erweiterungen und synchronisiert in Echtzeit. So behalten wir die Hoheit über unsere Daten – und alle Geräte bleiben bequem angebunden.“
Voraussetzungen
Szene: Textfolie (Specs + Verweise auf Grundkapitel).
Voiceover:
„Wir arbeiten in einem Debian‑12‑LXC: eine vCPU, 512 MB bis 1 GB RAM und 4–8 GB Speicher reichen. Nginx Proxy Manager läuft in einem separaten LXC, die Subdomain pass.DEINE‑DOMAIN.tld zeigt bereits auf NPM. Grundlagen wie LXC‑Anlage, SSH und die Bedienung von Nano haben wir in den Basis‑Kapiteln gezeigt – hier bauen wir darauf auf.“
Einblendung:
- LXC: Debian 12 · 1 vCPU · 512 MB–1 GB RAM · 4–8 GB Disk · statische IPv4 (z. B. 10.0.0.16)
- NPM & DynDNS vorhanden; DNS A/AAAA → NPM
Plan
Szene: Ablaufgrafik. Voiceover: „Der Fahrplan: Docker installieren, Projekt anlegen, Compose schreiben, starten, NPM per GUI einrichten, Admin‑Token auf Argon2 absichern, ersten Benutzer anlegen, Backup – und am Ende zeigen wir kurz die wichtigsten Alltagsfunktionen.“
Container vorbereiten
Szene: Terminalaufnahme (Großaufnahme, lesbare Schrift). Voiceover: „Wir beginnen mit Updates und richten die offizielle Docker‑Quelle ein. Das ist sicher und gut wartbar – keine intransparenten Einzeiler.“ Befehle im Bild:
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
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
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
# Check
docker --version && docker compose version
On‑Screen‑Hinweis: „Wenn Docker im LXC nicht startet: Proxmox → CT → Options → Features: nesting + keyctl aktivieren; CT neu starten.“
Projektdateien anlegen
Szene: Terminal → /opt/vaultwarden, Nano‑Editor.
Voiceover:
„Wir legen das Projektverzeichnis an. Die Konfiguration kommt in eine .env – getrennt von der Compose‑Datei. Wichtig: Die Domain mit https, damit Assets und Links stimmen.“
Befehle im Bild:
mkdir -p /opt/vaultwarden && cd /opt/vaultwarden
mkdir -p data
nano .env
Einblendung .env:
DOMAIN=https://pass.DEINE-DOMAIN.tld
# Start mit geschlossener Registrierung – öffnen wir gleich kurz für den ersten Account
SIGNUPS_ALLOWED=false
# Optional für Mails (Verifizierung/Reset)
# SMTP_HOST=smtp.example.com
# SMTP_FROM=pass@example.com
# SMTP_PORT=587
# SMTP_SECURITY=starttls
# SMTP_USERNAME=user
# SMTP_PASSWORD=deinPasswort
Voiceover‑Ergänzung: „Speichern mit Strg+O, Enter, Strg+X.“
Compose‑Datei schreiben
Szene: Nano‑Editor mit docker-compose.yml.
Voiceover:
„Compose beschreibt Image, Daten‑Volume und Ports. Port 3012 ist der WebSocket‑Kanal für Live‑Sync zwischen Geräten.“
Einblendung docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
environment:
- DOMAIN=${DOMAIN}
volumes:
- ./data:/data
ports:
- "8000:80" # Web / API
- "3012:3012" # WebSocket (Live Sync)
Container starten & prüfen
Szene: Terminal mit Live‑Logs. Voiceover: „Wir starten im Hintergrund und schauen sofort in die Logs – so sehen wir Fehler, bevor wir veröffentlichen.“ Befehle im Bild:
docker compose up -d
docker compose logs -f --tail=80 vaultwarden
On‑Screen‑Check: „Erwartet: ‚Rocket has launched …‘; keine Fehler zu /data.“
Proxy Host im NPM (GUI)
Szene: NPM‑Oberfläche, klare Zooms auf die Felder.
Voiceover:
„In NPM legen wir einen neuen Proxy Host an. Domain: pass.DEINE‑DOMAIN.tld. Scheme: http. Als Ziel nehmen wir die LXC‑IP <VW_IP> mit Port 8000. Wir aktivieren ‚Block Common Exploits‘ und ‚Websockets Support‘.“
Einblendung (Zoom): Domain, Scheme, Forward Host/IP, Port 8000, Toggles aktiv.
Voiceover:
„Jetzt die Custom Location: Pfad /notifications/hub. Ziel wieder <VW_IP>, aber Port 3012, WebSockets an. Das ist der Live‑Kanal.“
Einblendung: Custom Location → /notifications/hub → 3012 → WebSockets an.
Voiceover:
„Im Reiter SSL fordern wir das Let’s‑Encrypt‑Zertifikat an und setzen Force SSL, HTTP/2 und HSTS.“
Check: Browser ruft https://pass.DEINE‑DOMAIN.tld auf – Login‑Seite erscheint.
On‑Screen‑Warnung (gelb): „Ohne Custom Location /3012 → kein Live‑Sync!“
Admin‑Backend absichern (Argon2‑PHC) & erster Nutzer
Szene: Split‑Screen Terminal/GUI.
Voiceover:
„Beim Admin‑Backend warnt Vaultwarden gern vor einem Klartext‑Token – zu Recht. Wir stellen auf Argon2‑PHC um. Erst erzeugen wir den Hash, dann tragen wir ihn in der GUI ein und entfernen den Klartext‑Eintrag aus .env.“
Befehle im Bild:
docker exec -it vaultwarden /vaultwarden hash --preset owasp
Voiceover:
„Kopiere den kompletten String ab $argon2id$…. In der Admin‑GUI unter Settings → General fügst du ihn im Feld ‚Admin token / Argon2 PHC‘ ein und speicherst. Ab jetzt meldest du dich mit dem Passwort an, das du beim Hashen eingegeben hast – nicht mit dem Hash.“
Befehle im Bild (Aufräumen):
sed -i '/^ADMIN_TOKEN=/d' /opt/vaultwarden/.env
cd /opt/vaultwarden && docker compose restart vaultwarden
Voiceover:
„Für deinen ersten Benutzer öffnen wir die Registrierung kurz: Settings → General → Allow new signups einschalten, speichern, in einem neuen Tab https://pass.DEINE‑DOMAIN.tld/#/register aufrufen, Konto anlegen, einmal anmelden – und danach die Registrierungen wieder schließen. Mit SMTP ginge es alternativ über Users → Invitations per Mail.“
Voiceover (Sicherheit): „Im Benutzerkonto aktivierst du unter Settings → Security die Zwei‑Faktor‑Anmeldung (TOTP oder FIDO2/YubiKey).“
Arbeiten mit Vaultwarden (Standard‑Anwendungen)
Szene: Browser‑Add‑on + Web‑UI im Wechsel, klare Mauswege.
Voiceover:
„Für den Alltag verbindest du die Bitwarden‑Erweiterung im Browser: In den Einstellungen stellst du Server auf https://pass.DEINE‑DOMAIN.tld. Danach siehst du denselben Tresor wie im Web. Einen ersten Login legst du über Neu → Anmeldung an – Name, Benutzername/E‑Mail, mit dem Generator erzeugtes langes Passwort, Ziel‑URL. Mit Ordnern schaffst du Struktur, etwa ‚Streaming‘ oder ‚Server‘.“
Voiceover: „Import geht in der Web‑Oberfläche unter Werkzeuge → Importieren. Ich empfehle, alles zunächst in einen Ordner ‚Eingang‘ zu importieren und anschließend aufzuräumen: Dubletten löschen, Spezialfälle prüfen, dann in die endgültige Struktur verschieben.“
Voiceover: „Aktivierst du bei einem Dienst 2FA, bekommst du einen QR‑Code oder einen Base32‑Schlüssel. Im Tresor fügst du im passenden Eintrag das Feld ‚Authenticator‑Schlüssel (TOTP)‘ hinzu. Ab dann liefert der Eintrag die sechsstelligen Codes, die du beim Login brauchst – auch direkt in der Browser‑Erweiterung.“
Voiceover: „Zum gelegentlichen sicheren Teilen gibt es Send: Text oder Datei, Ablaufdatum, maximale Abrufe, optionales Kennwort – so landen sensible Infos nicht in E‑Mails oder Chats.“
Voiceover (Team‑Hinweis): „Für Zusammenarbeit richtest du Organisationen und Sammlungen ein. Einträge, die geteilt werden sollen, verschiebst du in die passende Sammlung und vergibst Rechte pro Mitglied. Einladungen funktionieren komfortabel, sobald SMTP eingerichtet ist.“
Backup (kurz & wichtig)
Szene: Terminal + kurze Grafik „Container ≠ Daten“.
Voiceover:
„Wichtig ist nicht der Container, sondern der Datenordner auf dem Host: /opt/vaultwarden/data. Den sicherst du regelmäßig als Archiv – auf Wunsch mit kurzem Stopp für maximale Konsistenz.“
Befehle im Bild:
cd /opt/vaultwarden
# optional: docker compose stop vaultwarden
tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz data
# docker compose start vaultwarden
ls -lh /root/vaultwarden-backup-*.tar.gz
Voiceover:
„Wiederherstellen ist genauso einfach: neue Instanz bis Compose, Archiv an den Ort, entpacken, docker compose up -d – fertig.“
Fehlerbehebung (kurz)
Szene: Terminal‑Split mit Logs und NPM‑Maske.
Voiceover:
„Kein Live‑Sync? In NPM die Custom Location /notifications/hub auf Port 3012 mit aktiviertem WebSocket prüfen. Icons fehlen oder Links wirken seltsam? In der .env muss DOMAIN https enthalten; danach docker compose restart. Wenn der Container zickt, zeigen die Logs den Weg: docker compose logs --tail=200 vaultwarden. Und bei Zertifikatsproblemen hilft ein Blick auf DNS‑Einträge und die Let’s‑Encrypt‑Hinweise in NPM.“
Fazit & Ausblick
Szene: Vaultwarden‑Dashboard, Browser‑Add‑on zeigt Sync. Voiceover: „Vaultwarden läuft jetzt unter eurer eigenen Domain, mit gültigem TLS, Live‑Sync und gehärtetem Admin‑Backend. Registrierungen sind zu, der erste Benutzer ist angelegt, Backups sind eingerichtet. In den Ergänzungsvideos vertiefen wir Import‑Strategien, TOTP‑Best‑Practices, Team‑Sharing und praktische Browser‑Tipps.“
🎵 Outro
Szene: Bratonien‑Tech‑Outro / Logo. Voiceover: „Das war Kapitel 6 – Vaultwarden. Wenn dir dieses Video gefallen hat, abonniere Bratonien Tech und schau dir die anderen Kapitel an. Bis zum nächsten Mal – in Bratonien!“