Kapitel 6/Tutorial.md aktualisiert

This commit is contained in:
2025-08-20 11:01:12 +00:00
parent fbe90750ec
commit c729895e8c

View File

@@ -1,35 +1,42 @@
🛠️ Kapitel 6 Vaultwarden (Docker, Debian12LXC) Tutorial 🛠️ Kapitel 6 Vaultwarden (Docker, Debian12LXC) Tutorial
Ziel: Vaultwarden in einem Debian12LXC per **Docker + Compose** bereitstellen, hinter **Nginx Proxy Manager** (NPM) mit **HTTPS** und **WebSockets** veröffentlichen; **Registrierungen deaktivieren**, **AdminToken** setzen, **Backup** einrichten. 🎯 Ziel
Vaultwarden in einem Debian12LXC per **Docker + Compose** bereitstellen, hinter **Nginx Proxy Manager** (NPM) mit **HTTPS** und **WebSockets** veröffentlichen; **Registrierungen deaktivieren**, **AdminToken** setzen und **Backups** ermöglichen.
Voraussetzungen (siehe Readme dieses Kapitels) 🧩 Was wir aufbauen
* LXC existiert (Specs lt. Readme). SSH/Grundsetup siehe Grundkapitel „Erster LXC Grundsetup & SSH“. * **Image:** `vaultwarden/server:latest`
* NPM läuft, Subdomain z.B. `pass.DEINEDOMAIN.tld` zeigt auf NPM. * **Ports:** `8000:80` (Web/API), `3012:3012` (WebSocket/LiveSync)
* **Persistenz:** `./data:/data` → Hostpfad `/opt/vaultwarden/data`
* **Konfig per `.env`:** `DOMAIN`, `ADMIN_TOKEN`, `SIGNUPS_ALLOWED=false` (+ optional `SMTP_*`)
* **ReverseProxy (NPM):** Proxy Host für `pass.DEINEDOMAIN.tld`, Custom Location `/notifications/hub → 3012`, SSL (Lets Encrypt)
Platzhalter ✅ Voraussetzungen (konkret)
* `<VW_IP>` = IP des VaultwardenLXC, z.B. `10.0.0.16` * **LXC:** Debian 12 (Bookworm) erstellt nach Grundkapitel *Erster LXC Grundsetup & SSH* (hier nur Verweis)
* **Specs:** 1 vCPU · **512MB1GB RAM** (512MB empfohlen) · **48GB Disk** · **statische IPv4** (z.B. `10.0.0.16/24`), IPv6 optional
* **NPM** läuft (separater LXC), **Subdomain** `pass.DEINEDOMAIN.tld` zeigt auf NPM (DNS A/AAAA gesetzt)
* **OutboundInternet** im LXC erreichbar; **Hostports 8000/3012** frei
🔁 Platzhalter
* `<VW_IP>` = IP des VaultwardenLXC (z.B. `10.0.0.16`)
* `DEINE-DOMAIN.tld` = deine echte Domain * `DEINE-DOMAIN.tld` = deine echte Domain
— — — — — —
1⃣ System vorbereiten 1⃣ System vorbereiten
Wir aktualisieren das System und installieren BasisTools.
```bash ```bash
apt update && apt upgrade -y apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg lsb-release apt install -y ca-certificates curl gnupg lsb-release
``` ```
**Warum?** 👉 `ca-certificates`/`curl`/`gnupg` werden für das DockerRepo benötigt.
* `ca-certificates`/`curl`/`gnupg` brauchen wir für das DockerRepository.
— — — — — —
2⃣ Docker & Compose installieren 2⃣ Docker & Compose installieren
Wir richten die offizielle DockerQuelle ein und installieren Engine + ComposePlugin.
```bash ```bash
mkdir -p /etc/apt/keyrings mkdir -p /etc/apt/keyrings
@@ -46,34 +53,29 @@ systemctl enable --now docker
**Prüfen:** **Prüfen:**
```bash ```bash
docker --version docker --version && docker compose version
docker compose version
``` ```
**Warum?** 👉 Offizielle Pakete, Compose als Plugin integriert.
* So bekommst du reproduzierbar die offiziellen Pakete; Compose ist als Plugin integriert.
— — — — — —
3⃣ Projekt anlegen & **.env** erstellen 3⃣ Projekt anlegen & `.env` erstellen
Wir legen das Arbeitsverzeichnis an, erzeugen ein **sicheres AdminToken** und tragen die Einstellungen in **.env** ein.
```bash ```bash
mkdir -p /opt/vaultwarden && cd /opt/vaultwarden mkdir -p /opt/vaultwarden && cd /opt/vaultwarden
mkdir -p data mkdir -p data
openssl rand -base64 48 openssl rand -base64 48 # Token erzeugen und kopieren
# Ausgabe kopieren (TOKEN) und im nächsten Schritt einfügen
nano .env nano .env
``` ```
**Inhalt für `.env` einfügen (Platzhalter ersetzen):** **Inhalt (`.env`) Platzhalter ersetzen, Token einfügen:**
``` ```
DOMAIN=https://pass.DEINE-DOMAIN.tld DOMAIN=https://pass.DEINE-DOMAIN.tld
ADMIN_TOKEN=HIER_DEIN_ERZEUGTES_TOKEN_EINFÜGEN ADMIN_TOKEN=HIER_DEIN_ERZEUGTES_TOKEN_EINFÜGEN
SIGNUPS_ALLOWED=false SIGNUPS_ALLOWED=false
# optional: SMTP, falls Mails gewünscht sind (Verifizierung/Reset) # Optional SMTP (nur falls Mailversand gewünscht)
# SMTP_HOST=smtp.example.com # SMTP_HOST=smtp.example.com
# SMTP_FROM=pass@example.com # SMTP_FROM=pass@example.com
# SMTP_PORT=587 # SMTP_PORT=587
@@ -82,17 +84,12 @@ SIGNUPS_ALLOWED=false
# SMTP_PASSWORD=deinPasswort # SMTP_PASSWORD=deinPasswort
``` ```
**Speichern in Nano:** `Strg+O`, `Enter`**Beenden:** `Strg+X`. **Speichern:** `Strg+O`, `Enter` → Beenden: `Strg+X`.
**Warum?** 👉 `DOMAIN` zwingend **https**; `ADMIN_TOKEN` schützt `/admin`; Signups sind zu.
* `DOMAIN` muss **https** sein (sonst fehlerhafte Assets/Links).
* `ADMIN_TOKEN` schützt das AdminBackend.
* `SIGNUPS_ALLOWED=false` verhindert offene Registrierungen.
— — — — — —
4`docker-compose.yml` schreiben 4`docker-compose.yml` schreiben
Wir definieren den Container, die Ports und das DatenVolume.
```bash ```bash
nano docker-compose.yml nano docker-compose.yml
@@ -117,72 +114,63 @@ services:
``` ```
**Speichern:** `Strg+O`, `Enter``Strg+X`. **Speichern:** `Strg+O`, `Enter``Strg+X`.
**Warum?** 👉 `./data:/data` = Persistenz auf dem Host.
* `./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 5⃣ Container starten & Logs prüfen
```bash ```bash
docker compose up -d docker compose up -d
docker compose logs -f --tail=50 vaultwarden docker compose logs -f --tail=50 vaultwarden
``` ```
**Erwartet:** Meldungen wie `Rocket has launched from http://0.0.0.0:80`. Erwartet: Meldungen wie `Rocket has launched`.
**Warum?** 👉 Erst prüfen, dann veröffentlichen.
* So siehst du direkt, ob der Start sauber war, bevor wir NPM konfigurieren.
— — — — — —
6⃣ NPM einrichten (Proxy, WebSockets, SSL) 6⃣ NPM einrichten (Proxy, WebSockets, SSL)
**Proxy Host anlegen:** **Proxy Host:**
* **Domain Names:** `pass.DEINE-DOMAIN.tld` * **Domain Names:** `pass.DEINE-DOMAIN.tld`
* **Scheme:** `http` * **Scheme:** `http`
* **Forward Hostname / IP:** `<VW_IP>` * **Forward Host/IP:** `<VW_IP>`
* **Forward Port:** `8000` * **Forward Port:** `8000`
* **Block Common Exploits:** ✔️ · **Websockets Support:** ✔️ * **Block Common Exploits:** ✔️ · **Websockets Support:** ✔️
**Custom Location hinzufügen:** **Custom Location:**
* **Location:** `/notifications/hub` * **Location:** `/notifications/hub`
* **Forward Hostname / IP:** `<VW_IP>` * **Forward Host/IP:** `<VW_IP>`
* **Forward Port:** `3012` * **Forward Port:** `3012`
* **Websockets Support:** ✔️ * **Websockets Support:** ✔️
**SSL aktivieren:** **SSLTab:**
* **Request a new SSL Certificate (Lets Encrypt)** * **Request a new SSL Certificate (Lets Encrypt)**
* **Force SSL**, **HTTP/2**, **HSTS**: ✔️ * **Force SSL**, **HTTP/2**, **HSTS**: ✔️
**Test:** `https://pass.DEINE-DOMAIN.tld` → Loginseite sichtbar; nach Login LiveÄnderung zwischen zwei Clients testen. **Test:** `https://pass.DEINE-DOMAIN.tld` → Loginseite sichtbar; LiveÄnderung zwischen zwei Clients testen.
**Warum?** 👉 Die CustomLocation leitet den WebSocketKanal (LiveSync) korrekt weiter.
* Die CustomLocation leitet den WebSocketKanal korrekt weiter (LiveSync/Push).
— — — — — —
7⃣ AdminBackend & Sicherheit 7⃣ AdminBackend & Sicherheit
* AdminSeite: `https://pass.DEINE-DOMAIN.tld/admin`**ADMIN\_TOKEN** eingeben. * `https://pass.DEINE-DOMAIN.tld/admin`**ADMIN\_TOKEN** eingeben
* **Registrierung** prüfen: ist **aus** (kommt aus `.env`). * **Registrierung** prüfen: **aus**
* Optional **SMTP** setzen und **Testmail** senden. * Optional **SMTP** eintragen und **Testmail** senden
* **Erstes Benutzerkonto** anlegen; **2FA** (TOTP oder FIDO2/YubiKey) aktivieren. * **Erstes Benutzerkonto** anlegen; **2FA** (TOTP/FIDO2) aktivieren
**Warum?** 👉 Privat, sicher, sofort nutzbar.
* So bleibt die Instanz privat und zusätzlich abgesichert.
— — — — — —
8⃣ Backup (Basis) 8⃣ Backup (Basis)
Daten liegen auf dem Host in `/opt/vaultwarden/data`.
```bash ```bash
cd /opt/vaultwarden cd /opt/vaultwarden
# optional für maximale Konsistenz kurz stoppen # optional: kurz stoppen für maximale Konsistenz
# docker compose stop vaultwarden # docker compose stop vaultwarden
tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz data tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz data
@@ -190,21 +178,19 @@ tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz data
ls -lh /root/vaultwarden-backup-*.tar.gz ls -lh /root/vaultwarden-backup-*.tar.gz
``` ```
**Warum?** 👉 Ein Tar reicht als Grundlage; regelmäßig per Cron sichern.
* Ein TarArchiv lässt sich leicht versionieren/auslagern; regelmäßige CronJobs sind schnell eingerichtet.
— — — — — —
🛠️ Fehlerhilfe (kurz) 🛠️ Fehlerhilfe (kurz)
* **502 / kein LiveSync:** In NPM die **Custom Location** `/notifications/hub` → Port **3012** + **Websockets** prüfen. * **Kein LiveSync / 502:** NPMLocation `/notifications/hub` → Port **3012** + **Websockets** ✔️
* **Seite ohne Styles/Icons:** In `.env` muss `DOMAIN` **https** enthalten; danach `docker compose restart vaultwarden`. * **Icons/Links fehlen:** In `.env` `DOMAIN` = **https**; dann `docker compose restart vaultwarden`
* **Container nicht da:** `docker ps` prüfen; Logs: `docker compose logs --tail=200 vaultwarden`. * **Container startet nicht:** `docker compose logs --tail=200 vaultwarden`
* **LetsEncryptFehler:** DomainDNS prüfen; RateLimit beachten; später erneut anfordern. * **LetsEncryptFehler:** DNSEintrag prüfen; RateLimit abwarten
✅ Ergebnis ✅ Ergebnis
* Vaultwarden läuft hinter NPM mit gültigem **HTTPS**, **LiveSync** funktioniert. * Vaultwarden läuft hinter NPM mit **HTTPS**; **WebSockets** funktionieren
* **Registrierungen sind aus**, AdminBackend ist durch **Token** geschützt. * **Registrierungen aus**, AdminBackend per **Token** geschützt
* Deine Daten liegen persistent unter `/opt/vaultwarden/data` und werden gesichert. * Daten persistent unter `/opt/vaultwarden/data` und per Tar gesichert