🛠️ Kapitel 6 – Vaultwarden (Docker, Debian‑12‑LXC) – Tutorial Ziel: Vaultwarden in einem Debian‑12‑LXC per **Docker + Compose** bereitstellen, hinter **Nginx Proxy Manager** (NPM) mit **HTTPS** und **WebSockets** veröffentlichen; **Registrierungen deaktivieren**, **Admin‑Token** setzen, **Backup** einrichten. Voraussetzungen (siehe Readme dieses Kapitels) * LXC existiert (Specs lt. Readme). SSH/Grundsetup siehe Grundkapitel „Erster LXC – Grundsetup & SSH“. * NPM läuft, Subdomain z. B. `pass.DEINE‑DOMAIN.tld` zeigt auf NPM. Platzhalter * `` = IP des Vaultwarden‑LXC, z. B. `10.0.0.16` * `DEINE-DOMAIN.tld` = deine echte Domain — — — 1️⃣ System vorbereiten Wir aktualisieren das System und installieren Basis‑Tools. ```bash apt update && apt upgrade -y apt install -y ca-certificates curl gnupg lsb-release ``` **Warum?** * `ca-certificates`/`curl`/`gnupg` brauchen wir für das Docker‑Repository. — — — 2️⃣ Docker & Compose installieren Wir richten die offizielle Docker‑Quelle ein und installieren Engine + Compose‑Plugin. ```bash 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 ``` **Prüfen:** ```bash docker --version docker compose version ``` **Warum?** * So bekommst du reproduzierbar die offiziellen Pakete; Compose ist als Plugin integriert. — — — 3️⃣ Projekt anlegen & **.env** erstellen Wir legen das Arbeitsverzeichnis an, erzeugen ein **sicheres Admin‑Token** und tragen die Einstellungen in **.env** ein. ```bash mkdir -p /opt/vaultwarden && cd /opt/vaultwarden mkdir -p data openssl rand -base64 48 # Ausgabe kopieren (TOKEN) und im nächsten Schritt einfügen nano .env ``` **Inhalt für `.env` einfügen (Platzhalter ersetzen):** ``` DOMAIN=https://pass.DEINE-DOMAIN.tld ADMIN_TOKEN=HIER_DEIN_ERZEUGTES_TOKEN_EINFÜGEN SIGNUPS_ALLOWED=false # optional: SMTP, falls Mails gewünscht sind (Verifizierung/Reset) # SMTP_HOST=smtp.example.com # SMTP_FROM=pass@example.com # SMTP_PORT=587 # SMTP_SECURITY=starttls # SMTP_USERNAME=user # SMTP_PASSWORD=deinPasswort ``` **Speichern in Nano:** `Strg+O`, `Enter` → **Beenden:** `Strg+X`. **Warum?** * `DOMAIN` muss **https** sein (sonst fehlerhafte Assets/Links). * `ADMIN_TOKEN` schützt das Admin‑Backend. * `SIGNUPS_ALLOWED=false` verhindert offene Registrierungen. — — — 4️⃣ `docker-compose.yml` schreiben Wir definieren den Container, die Ports und das Daten‑Volume. ```bash nano docker-compose.yml ``` **Inhalt einfügen:** ```yaml 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) ``` **Speichern:** `Strg+O`, `Enter` → `Strg+X`. **Warum?** * `./data:/data` sorgt für **Persistenz** auf dem Host (`/opt/vaultwarden/data`). * Port **8000** für Web/API und **3012** für WebSockets. — — — 5️⃣ Container starten & prüfen ```bash docker compose up -d docker compose logs -f --tail=50 vaultwarden ``` **Erwartet:** Meldungen wie `Rocket has launched from http://0.0.0.0:80`. **Warum?** * So siehst du direkt, ob der Start sauber war, bevor wir NPM konfigurieren. — — — 6️⃣ NPM einrichten (Proxy, WebSockets, SSL) **Proxy Host anlegen:** * **Domain Names:** `pass.DEINE-DOMAIN.tld` * **Scheme:** `http` * **Forward Hostname / IP:** `` * **Forward Port:** `8000` * **Block Common Exploits:** ✔️ · **Websockets Support:** ✔️ **Custom Location hinzufügen:** * **Location:** `/notifications/hub` * **Forward Hostname / IP:** `` * **Forward Port:** `3012` * **Websockets Support:** ✔️ **SSL aktivieren:** * **Request a new SSL Certificate (Let’s Encrypt)** * **Force SSL**, **HTTP/2**, **HSTS**: ✔️ **Test:** `https://pass.DEINE-DOMAIN.tld` → Loginseite sichtbar; nach Login Live‑Änderung zwischen zwei Clients testen. **Warum?** * Die Custom‑Location leitet den WebSocket‑Kanal korrekt weiter (Live‑Sync/Push). — — — 7️⃣ Admin‑Backend & Sicherheit * Admin‑Seite: `https://pass.DEINE-DOMAIN.tld/admin` → **ADMIN\_TOKEN** eingeben. * **Registrierung** prüfen: ist **aus** (kommt aus `.env`). * Optional **SMTP** setzen und **Testmail** senden. * **Erstes Benutzerkonto** anlegen; **2FA** (TOTP oder FIDO2/YubiKey) aktivieren. **Warum?** * So bleibt die Instanz privat und zusätzlich abgesichert. — — — 8️⃣ Backup (Basis) Daten liegen auf dem Host in `/opt/vaultwarden/data`. ```bash cd /opt/vaultwarden # optional für maximale Konsistenz kurz stoppen # 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 ``` **Warum?** * Ein Tar‑Archiv lässt sich leicht versionieren/auslagern; regelmäßige Cron‑Jobs sind schnell eingerichtet. — — — 🛠️ Fehlerhilfe (kurz) * **502 / kein Live‑Sync:** In NPM die **Custom Location** `/notifications/hub` → Port **3012** + **Websockets** prüfen. * **Seite ohne Styles/Icons:** In `.env` muss `DOMAIN` **https** enthalten; danach `docker compose restart vaultwarden`. * **Container nicht da:** `docker ps` prüfen; Logs: `docker compose logs --tail=200 vaultwarden`. * **Let’s‑Encrypt‑Fehler:** Domain‑DNS prüfen; Rate‑Limit beachten; später erneut anfordern. ✅ Ergebnis * Vaultwarden läuft hinter NPM mit gültigem **HTTPS**, **Live‑Sync** funktioniert. * **Registrierungen sind aus**, Admin‑Backend ist durch **Token** geschützt. * Deine Daten liegen persistent unter `/opt/vaultwarden/data` und werden gesichert.