🛠️ 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 und **Backups** ermöglichen. 🧩 Was wir aufbauen * **Image:** `vaultwarden/server:latest` * **Ports:** `8000:80` (Web/API), `3012:3012` (WebSocket/Live‑Sync) * **Persistenz:** `./data:/data` → Hostpfad `/opt/vaultwarden/data` * **Konfig per `.env`:** `DOMAIN`, `ADMIN_TOKEN`, `SIGNUPS_ALLOWED=false` (+ optional `SMTP_*`) * **Reverse‑Proxy (NPM):** Proxy Host für `pass.DEINE‑DOMAIN.tld`, Custom Location `/notifications/hub → 3012`, SSL (Let’s Encrypt) ✅ Voraussetzungen (konkret) * **LXC:** Debian 12 (Bookworm) – erstellt nach Grundkapitel *Erster LXC – Grundsetup & SSH* (hier nur Verweis) * **Specs:** 1 vCPU · **512 MB–1 GB RAM** (512 MB empfohlen) · **4–8 GB Disk** · **statische IPv4** (z. B. `10.0.0.16/24`), IPv6 optional * **NPM** läuft (separater LXC), **Subdomain** `pass.DEINE‑DOMAIN.tld` zeigt auf NPM (DNS A/AAAA gesetzt) * **Outbound‑Internet** im LXC erreichbar; **Hostports 8000/3012** frei 🔁 Platzhalter * `` = IP des Vaultwarden‑LXC (z. B. `10.0.0.16`) * `DEINE-DOMAIN.tld` = deine echte Domain — — — 1️⃣ System vorbereiten ```bash apt update && apt upgrade -y apt install -y ca-certificates curl gnupg lsb-release ``` 👉 `ca-certificates`/`curl`/`gnupg` werden für das Docker‑Repo benötigt. — — — 2️⃣ Docker & Compose installieren ```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 ``` 👉 Offizielle Pakete, Compose als Plugin integriert. — — — 3️⃣ Projekt anlegen & `.env` erstellen ```bash mkdir -p /opt/vaultwarden && cd /opt/vaultwarden mkdir -p data openssl rand -base64 48 # Token erzeugen und kopieren nano .env ``` **Inhalt (`.env`) – Platzhalter ersetzen, Token einfügen:** ``` DOMAIN=https://pass.DEINE-DOMAIN.tld ADMIN_TOKEN=HIER_DEIN_ERZEUGTES_TOKEN_EINFÜGEN SIGNUPS_ALLOWED=false # Optional SMTP (nur falls Mailversand gewünscht) # SMTP_HOST=smtp.example.com # SMTP_FROM=pass@example.com # SMTP_PORT=587 # SMTP_SECURITY=starttls # SMTP_USERNAME=user # SMTP_PASSWORD=deinPasswort ``` **Speichern:** `Strg+O`, `Enter` → Beenden: `Strg+X`. 👉 `DOMAIN` zwingend **https**; `ADMIN_TOKEN` schützt `/admin`; Signups sind zu. — — — 4️⃣ `docker-compose.yml` schreiben ```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`. 👉 `./data:/data` = Persistenz auf dem Host. — — — 5️⃣ Container starten & Logs prüfen ```bash docker compose up -d docker compose logs -f --tail=50 vaultwarden ``` Erwartet: Meldungen wie `Rocket has launched…`. 👉 Erst prüfen, dann veröffentlichen. — — — 6️⃣ NPM einrichten (Proxy, WebSockets, SSL) **Proxy Host:** * **Domain Names:** `pass.DEINE-DOMAIN.tld` * **Scheme:** `http` * **Forward Host/IP:** `` * **Forward Port:** `8000` * **Block Common Exploits:** ✔️ · **Websockets Support:** ✔️ **Custom Location:** * **Location:** `/notifications/hub` * **Forward Host/IP:** `` * **Forward Port:** `3012` * **Websockets Support:** ✔️ **SSL‑Tab:** * **Request a new SSL Certificate (Let’s Encrypt)** * **Force SSL**, **HTTP/2**, **HSTS**: ✔️ **Test:** `https://pass.DEINE-DOMAIN.tld` → Loginseite sichtbar; Live‑Änderung zwischen zwei Clients testen. 👉 Die Custom‑Location leitet den WebSocket‑Kanal (Live‑Sync) korrekt weiter. — — — 7️⃣ Admin‑Backend & Sicherheit * `https://pass.DEINE-DOMAIN.tld/admin` → **ADMIN\_TOKEN** eingeben * **Registrierung** prüfen: **aus** * Optional **SMTP** eintragen und **Testmail** senden * **Erstes Benutzerkonto** anlegen; **2FA** (TOTP/FIDO2) aktivieren 👉 Privat, sicher, sofort nutzbar. — — — 8️⃣ Backup (Basis) ```bash cd /opt/vaultwarden # optional: kurz stoppen für maximale Konsistenz # 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 ``` 👉 Ein Tar reicht als Grundlage; regelmäßig per Cron sichern. — — — 🛠️ Fehlerhilfe (kurz) * **Kein Live‑Sync / 502:** NPM‑Location `/notifications/hub` → Port **3012** + **Websockets** ✔️ * **Icons/Links fehlen:** In `.env` `DOMAIN` = **https**; dann `docker compose restart vaultwarden` * **Container startet nicht:** `docker compose logs --tail=200 vaultwarden` * **Let’s‑Encrypt‑Fehler:** DNS‑Eintrag prüfen; Rate‑Limit abwarten ✅ Ergebnis * Vaultwarden läuft hinter NPM mit **HTTPS**; **WebSockets** funktionieren * **Registrierungen aus**, Admin‑Backend per **Token** geschützt * Daten persistent unter `/opt/vaultwarden/data` und per Tar gesichert