Kapitel 6/Tutorial.md aktualisiert
This commit is contained in:
@@ -1,35 +1,42 @@
|
|||||||
🛠️ Kapitel 6 – Vaultwarden (Docker, Debian‑12‑LXC) – Tutorial
|
🛠️ 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.
|
🎯 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.
|
||||||
|
|
||||||
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.DEINE‑DOMAIN.tld` zeigt auf NPM.
|
* **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)
|
||||||
|
|
||||||
Platzhalter
|
✅ Voraussetzungen (konkret)
|
||||||
|
|
||||||
* `<VW_IP>` = IP des Vaultwarden‑LXC, z. B. `10.0.0.16`
|
* **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
|
||||||
|
|
||||||
|
* `<VW_IP>` = IP des Vaultwarden‑LXC (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 Basis‑Tools.
|
|
||||||
|
|
||||||
```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 Docker‑Repo benötigt.
|
||||||
|
|
||||||
* `ca-certificates`/`curl`/`gnupg` brauchen wir für das Docker‑Repository.
|
|
||||||
|
|
||||||
— — —
|
— — —
|
||||||
|
|
||||||
2️⃣ Docker & Compose installieren
|
2️⃣ Docker & Compose installieren
|
||||||
Wir richten die offizielle Docker‑Quelle ein und installieren Engine + Compose‑Plugin.
|
|
||||||
|
|
||||||
```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 Admin‑Token** 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 Admin‑Backend.
|
|
||||||
* `SIGNUPS_ALLOWED=false` verhindert offene Registrierungen.
|
|
||||||
|
|
||||||
— — —
|
— — —
|
||||||
|
|
||||||
4️⃣ `docker-compose.yml` schreiben
|
4️⃣ `docker-compose.yml` schreiben
|
||||||
Wir definieren den Container, die Ports und das Daten‑Volume.
|
|
||||||
|
|
||||||
```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:**
|
**SSL‑Tab:**
|
||||||
|
|
||||||
* **Request a new SSL Certificate (Let’s Encrypt)**
|
* **Request a new SSL Certificate (Let’s 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 Custom‑Location leitet den WebSocket‑Kanal (Live‑Sync) korrekt weiter.
|
||||||
|
|
||||||
* Die Custom‑Location leitet den WebSocket‑Kanal korrekt weiter (Live‑Sync/Push).
|
|
||||||
|
|
||||||
— — —
|
— — —
|
||||||
|
|
||||||
7️⃣ Admin‑Backend & Sicherheit
|
7️⃣ Admin‑Backend & Sicherheit
|
||||||
|
|
||||||
* Admin‑Seite: `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 Tar‑Archiv lässt sich leicht versionieren/auslagern; regelmäßige Cron‑Jobs sind schnell eingerichtet.
|
|
||||||
|
|
||||||
— — —
|
— — —
|
||||||
|
|
||||||
🛠️ Fehlerhilfe (kurz)
|
🛠️ Fehlerhilfe (kurz)
|
||||||
|
|
||||||
* **502 / kein Live‑Sync:** In NPM die **Custom Location** `/notifications/hub` → Port **3012** + **Websockets** prüfen.
|
* **Kein Live‑Sync / 502:** NPM‑Location `/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`
|
||||||
* **Let’s‑Encrypt‑Fehler:** Domain‑DNS prüfen; Rate‑Limit beachten; später erneut anfordern.
|
* **Let’s‑Encrypt‑Fehler:** DNS‑Eintrag prüfen; Rate‑Limit abwarten
|
||||||
|
|
||||||
✅ Ergebnis
|
✅ Ergebnis
|
||||||
|
|
||||||
* Vaultwarden läuft hinter NPM mit gültigem **HTTPS**, **Live‑Sync** funktioniert.
|
* Vaultwarden läuft hinter NPM mit **HTTPS**; **WebSockets** funktionieren
|
||||||
* **Registrierungen sind aus**, Admin‑Backend ist durch **Token** geschützt.
|
* **Registrierungen aus**, Admin‑Backend 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
|
||||||
|
|||||||
Reference in New Issue
Block a user