Kapitel 6/Tutorial.md aktualisiert

This commit is contained in:
2025-08-20 10:53:45 +00:00
parent 0e0bcaeb26
commit fbe90750ec

View File

@@ -1,160 +1,79 @@
📝 Kapitel 6 Vaultwarden (ohne Docker, systemd) 🛠️ 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.
## 🎯 Was wir bauen (in Klartext) Voraussetzungen (siehe Readme dieses Kapitels)
Wir richten **Vaultwarden** als PasswortTresor ein. Das ist die kompatible ServerVariante zu Bitwarden. Du bekommst: * LXC existiert (Specs lt. Readme). SSH/Grundsetup siehe Grundkapitel „Erster LXC Grundsetup & SSH“.
* NPM läuft, Subdomain z.B. `pass.DEINEDOMAIN.tld` zeigt auf NPM.
* eine **WebOberfläche** zum Verwalten deiner Passwörter und TOTPCodes, Platzhalter
* **sichere Anmeldung** (AdminToken, Registrierungen aus),
* **HTTPS** über den Nginx Proxy Manager (NPM) und
* **LiveSync** dank WebSockets.
Wir betreiben Vaultwarden **ohne Docker** (direkt als Programm), damit es **möglichst wenig RAM** verbraucht. * `<VW_IP>` = IP des VaultwardenLXC, z.B. `10.0.0.16`
* `DEINE-DOMAIN.tld` = deine echte Domain
--- — — —
## ✅ Voraussetzungen (kurz & klar) 1⃣ System vorbereiten
Wir aktualisieren das System und installieren BasisTools.
* LXCContainer: **Debian 12 (Bookworm)** erstellt nach dem Grundkapitel *Erster LXC Grundsetup & SSH*. (Hier nicht wiederholt.)
* **LXCSpezifikation für dieses Kapitel:** 1 vCPU · 256MB RAM · 4GB Disk · statische IPv4 (z.B. `10.0.0.16/24`). IPv6 optional (SLAAC oder None). DNS wie im Netz üblich.
* Nginx Proxy Manager läuft (eigenes Kapitel), Domain vorhanden (z.B. `pass.DEINE-DOMAIN.tld`).
**Platzhalter, die du gleich ersetzt:**
* `<VW_IP>` → IP deines VaultwardenLXC, z.B. `10.0.0.16`
* `DEINE-DOMAIN.tld` → deine echte Domain
---
## 1) System vorbereiten
Wir aktualisieren das System, installieren Werkzeuge und richten einen **eigenen DienstBenutzer** ein.
> **Warum ein eigener DienstBenutzer?**
> Dieser Benutzer ist **nur** für den VaultwardenDienst da (kein normales Login). Dadurch sind die TresorDateien vor anderen Diensten geschützt. In früheren DockerKapiteln war diese Trennung im Container bereits vorhanden **jetzt** übernehmen wir sie auf Systemebene.
```bash ```bash
apt update && apt upgrade -y apt update && apt upgrade -y
apt install -y ca-certificates curl unzip openssl apt install -y ca-certificates curl gnupg lsb-release
# Dienstnutzer ohne Login anlegen (nur für den Dienst, zur Absicherung)
useradd --system --home /var/lib/vaultwarden --shell /usr/sbin/nologin vaultwarden || true
# Arbeits- und Datenordner anlegen
mkdir -p /opt/vaultwarden
mkdir -p /var/lib/vaultwarden/data
# Eigentum der Daten an den Dienstbenutzer übergeben (Schutz der Tresor-Daten)
chown -R vaultwarden:vaultwarden /var/lib/vaultwarden
``` ```
**So prüfst du das Ergebnis:** **Warum?**
* `ca-certificates`/`curl`/`gnupg` brauchen wir für das DockerRepository.
— — —
2⃣ Docker & Compose installieren
Wir richten die offizielle DockerQuelle ein und installieren Engine + ComposePlugin.
```bash ```bash
id vaultwarden mkdir -p /etc/apt/keyrings
ls -ld /opt/vaultwarden /var/lib/vaultwarden /var/lib/vaultwarden/data 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
``` ```
Du siehst den Benutzer `vaultwarden` und die Ordner existieren. **Prüfen:**
---
## 2) Vaultwarden herunterladen (einfach & stabil)
### Architektur ermitteln (falls unklar)
So findest du heraus, welche der drei DownloadZeilen du brauchst.
**Im Container:**
```bash ```bash
uname -m # liefert z. B. x86_64, aarch64, armv7l docker --version
dpkg --print-architecture # liefert z. B. amd64, arm64, armhf docker compose version
``` ```
**Vom ProxmoxHost (ohne in den CT zu gehen):** **Warum?**
```bash * So bekommst du reproduzierbar die offiziellen Pakete; Compose ist als Plugin integriert.
# CTID aus der GUI (z. B. 106)
pct exec <CTID> -- uname -m — — —
pct exec <CTID> -- dpkg --print-architecture
``` 3⃣ Projekt anlegen & **.env** erstellen
Wir legen das Arbeitsverzeichnis an, erzeugen ein **sicheres AdminToken** und tragen die Einstellungen in **.env** ein.
**Zuordnung:**
* `x86_64` / `amd64` → AMD64Zeile verwenden
* `aarch64` / `arm64` → ARM64Zeile verwenden
* `armv7l` / `armhf` → ARMv7Zeile verwenden
Wir nutzen die offizielle **`releases/latest/download`**Adresse von GitHub. Wähle **genau eine** der folgenden Zeilen passend zu deiner CPU und führe sie aus. Keine Variablen, kein jq.
**AMD64 / x86\_64 (typisch Proxmox/Debian auf Intel/AMD):**
```bash
curl -fL https://github.com/dani-garcia/vaultwarden/releases/latest/download/vaultwarden-x86_64-unknown-linux-gnu.tar.gz -o /tmp/vaultwarden.tar.gz
```
**ARM64 (z.B. Raspberry Pi 4/5):**
```bash
curl -fL https://github.com/dani-garcia/vaultwarden/releases/latest/download/vaultwarden-aarch64-unknown-linux-gnu.tar.gz -o /tmp/vaultwarden.tar.gz
```
**ARMv7:**
```bash
curl -fL https://github.com/dani-garcia/vaultwarden/releases/latest/download/vaultwarden-armv7-unknown-linux-gnueabihf.tar.gz -o /tmp/vaultwarden.tar.gz
```
**Entpacken & installieren:**
```bash
mkdir -p /tmp/vw
# Wenn der Download fehlschlug, zeigt die nächste Zeile eine Fehlermeldung dann die passende curl-Zeile oben erneut ausführen
.tar -xzf /tmp/vaultwarden.tar.gz -C /tmp/vw 2>/dev/null || echo "Download prüfen: /tmp/vaultwarden.tar.gz fehlt oder ist beschädigt"
install -m 0755 /tmp/vw/vaultwarden /opt/vaultwarden/vaultwarden
/opt/vaultwarden/vaultwarden --version
```
> Hinweis: Falls GitHub kurzzeitig begrenzt, warte 12 Minuten und wiederhole **nur** die `curl`Zeile.
---
## 3) Konfigurationsdatei mit **Nano** erstellen
Wir hinterlegen **Domain**, **AdminToken**, **Ports** und **WebSockets** in einer `.env`Datei. Diese Datei liest der Dienst später automatisch ein.
1. **Sicheres AdminToken erzeugen** (kopieren, wir fügen es gleich ein):
```bash ```bash
mkdir -p /opt/vaultwarden && cd /opt/vaultwarden
mkdir -p data
openssl rand -base64 48 openssl rand -base64 48
# Ausgabe kopieren (TOKEN) und im nächsten Schritt einfügen
nano .env
``` ```
2. **Datei mit Nano öffnen:** **Inhalt für `.env` einfügen (Platzhalter ersetzen):**
```bash
nano /etc/vaultwarden.env
```
3. **Folgenden Inhalt einfügen** und **Platzhalter ersetzen**:
``` ```
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
WEBSOCKET_ENABLED=true # optional: SMTP, falls Mails gewünscht sind (Verifizierung/Reset)
# Der Dienst lauscht auf der IP deines LXC (so erreicht NPM ihn)
ROCKET_ADDRESS=<VW_IP>
ROCKET_PORT=8000
# WebSocket-Endpunkt für Live-Sync
WEBSOCKET_ADDRESS=<VW_IP>
WEBSOCKET_PORT=3012
# Optional: nur wenn du E-Mails (z. B. Verifizierung/Reset) willst
# 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
@@ -163,168 +82,129 @@ WEBSOCKET_PORT=3012
# SMTP_PASSWORD=deinPasswort # SMTP_PASSWORD=deinPasswort
``` ```
4. **Speichern in Nano:** `Strg+O` `Enter`**Beenden:** `Strg+X`. **Speichern in Nano:** `Strg+O`, `Enter`**Beenden:** `Strg+X`.
5. **Datei schützen** (damit nur root und der Dienst lesen dürfen):
```bash
chown root:vaultwarden /etc/vaultwarden.env
chmod 0640 /etc/vaultwarden.env
```
**Kurz erklärt:**
* `DOMAIN` braucht **https**, damit Links/Icons korrekt sind.
* `ADMIN_TOKEN` schützt das **AdminBackend** (ohne Token kommt man nicht rein).
* `SIGNUPS_ALLOWED=false` verhindert **offene Registrierungen**.
* `ROCKET_*` und `WEBSOCKET_*` sorgen dafür, dass der Dienst auf deiner **LXCIP** erreichbar ist und LiveSync funktioniert.
---
## 4) Dienstdatei (systemd) anlegen
Die Dienstdatei sagt Linux: *„So startest du Vaultwarden und bitte automatisch beim Booten.“*
1. **Datei öffnen:**
```bash
nano /etc/systemd/system/vaultwarden.service
```
2. **Inhalt einfügen:**
```
[Unit]
Description=Vaultwarden (Bitwarden-compatible) native
After=network.target
[Service]
User=vaultwarden
Group=vaultwarden
EnvironmentFile=/etc/vaultwarden.env
ExecStart=/opt/vaultwarden/vaultwarden
WorkingDirectory=/var/lib/vaultwarden
# Sicherheit (Dienst hat nur, was er braucht)
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
```
3. **Speichern & schließen:** `Strg+O``Enter``Strg+X`.
4. **Dienst laden, aktivieren und starten:**
```bash
systemctl daemon-reload
systemctl enable --now vaultwarden
systemctl status vaultwarden --no-pager
```
**Woran erkenne ich Erfolg?**
* Status zeigt **active (running)**.
* Optional: Ports prüfen
```bash
ss -tulpn | grep -E ':8000|:3012'
```
**Was haben wir gerade gemacht?**
* Den Dienst **systemweit registriert** und **dauerhaft** aktiviert.
* Vaultwarden läuft jetzt im Hintergrund automatisch auch nach Neustarts.
---
## 5) NPM einrichten (Proxy, WebSockets, Zertifikat)
So wird deine Instanz über **HTTPS** erreichbar und **LiveSync** funktioniert.
1. **Proxy Host anlegen**
* **Domain Names:** `pass.DEINE-DOMAIN.tld`
* **Scheme:** `http`
* **Forward Hostname / IP:** `<VW_IP>`
* **Forward Port:** `8000`
* **Block Common Exploits:** ✔️
* **Websockets Support:** ✔️
2. **Custom Location hinzufügen**
* **Location:** `/notifications/hub`
* **Forward Hostname / IP:** `<VW_IP>`
* **Forward Port:** `3012`
* **Websockets Support:** ✔️
3. **SSL aktivieren (Lets Encrypt)**
* **Request a new SSL Certificate**
* **Force SSL**, **HTTP/2**, **HSTS**: ✔️
**Test:** Rufe `https://pass.DEINE-DOMAIN.tld` im Browser auf → Loginseite sichtbar.
**Was passiert hier?**
* NPM nimmt Anfragen aus dem Internet an (443) und leitet sie an deinen Dienst weiter.
* Die **Custom Location** sorgt dafür, dass der **WebSocketKanal** (LiveSync) funktioniert.
---
## 6) Erstkonfiguration im Browser
1. **AdminBackend öffnen**: `https://pass.DEINE-DOMAIN.tld/admin`**AdminToken** eingeben.
2. **Registrierung prüfen**: „Signups allowed“ ist **aus** (kommt aus deiner `.env`).
3. **Optional SMTP** eintragen und **Testmail** senden.
4. **Erstes Benutzerkonto** anlegen und **2FA (TOTP oder FIDO2)** aktivieren.
**Warum?** **Warum?**
* So bleibt der Server **privat** (nur du legst Accounts an). * `DOMAIN` muss **https** sein (sonst fehlerhafte Assets/Links).
* 2FA schützt deinen Tresor zusätzlich. * `ADMIN_TOKEN` schützt das AdminBackend.
* `SIGNUPS_ALLOWED=false` verhindert offene Registrierungen.
--- — — —
## 7) Backup (Basis, schnell & sicher) 4`docker-compose.yml` schreiben
Wir definieren den Container, die Ports und das DatenVolume.
Wir sichern den **Datenordner**. Damit kannst du den Tresor später wiederherstellen.
```bash ```bash
# Für maximale Konsistenz könntest du kurz stoppen (optional) nano docker-compose.yml
# systemctl stop vaultwarden ```
tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz -C /var/lib vaultwarden **Inhalt einfügen:**
# systemctl start vaultwarden
```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:** `<VW_IP>`
* **Forward Port:** `8000`
* **Block Common Exploits:** ✔️ · **Websockets Support:** ✔️
**Custom Location hinzufügen:**
* **Location:** `/notifications/hub`
* **Forward Hostname / IP:** `<VW_IP>`
* **Forward Port:** `3012`
* **Websockets Support:** ✔️
**SSL aktivieren:**
* **Request a new SSL Certificate (Lets Encrypt)**
* **Force SSL**, **HTTP/2**, **HSTS**: ✔️
**Test:** `https://pass.DEINE-DOMAIN.tld` → Loginseite sichtbar; nach Login LiveÄnderung zwischen zwei Clients testen.
**Warum?**
* Die CustomLocation leitet den WebSocketKanal korrekt weiter (LiveSync/Push).
— — —
7⃣ AdminBackend & Sicherheit
* AdminSeite: `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 ls -lh /root/vaultwarden-backup-*.tar.gz
``` ```
**Wichtig:** Plane das als **CronJob** ein und teste gelegentlich das **Restore** auf einer TestVM. **Warum?**
--- * Ein TarArchiv lässt sich leicht versionieren/auslagern; regelmäßige CronJobs sind schnell eingerichtet.
## 🛠️ Wenn etwas nicht klappt — — —
* **Seite lädt, aber kein LiveSync:** In NPM die **Custom Location** `/notifications/hub` prüfen (Port **3012**, WebSockets ✔️). 🛠️ Fehlerhilfe (kurz)
* **Icons/Links seltsam:** In `/etc/vaultwarden.env` muss `DOMAIN` mit **https** beginnen.
* **Ich komme nicht ins AdminBackend:** Stimmt das **ADMIN\_TOKEN** noch? (Zur Not neues Token in der `.env` setzen und `systemctl restart vaultwarden`.)
* **Dienst startet nicht:**
```bash * **502 / kein LiveSync:** In NPM die **Custom Location** `/notifications/hub` → Port **3012** + **Websockets** prüfen.
journalctl -u vaultwarden -b --no-pager | tail -n 50 * **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`.
* **LetsEncryptFehler:** DomainDNS prüfen; RateLimit beachten; später erneut anfordern.
Die letzten Zeilen zeigen meistens den Fehler (z.B. Tippfehler in der `.env`). ✅ Ergebnis
--- * Vaultwarden läuft hinter NPM mit gültigem **HTTPS**, **LiveSync** funktioniert.
## ✅ Ergebnis
* Deine Instanz ist über `https://pass.DEINE-DOMAIN.tld` erreichbar.
* **Registrierungen sind aus**, AdminBackend ist durch **Token** geschützt. * **Registrierungen sind aus**, AdminBackend ist durch **Token** geschützt.
* **WebSockets** funktionieren (LiveSync zwischen Geräten). * Deine Daten liegen persistent unter `/opt/vaultwarden/data` und werden gesichert.
* **Backups** sind eingerichtet.
> **Du hast jetzt einen schlanken, eigenen PasswortServer ohne DockerOverhead, mit klaren Sicherungen und Updates.**