Modul 9 · 9.4
Deutsch
Rezepte: Uptime Kuma und Vaultwarden
Modul 9: Docker und docker compose · Lesezeit: 13 Minuten
Lernziel: Nach dieser Lektion können Sie Uptime Kuma und Vaultwarden mit docker compose hinter Caddy betreiben, mit https, geschlossener Registrierung, einem Backup der Volumes und einem festen Ablauf für Updates.
Kernbegriffe: Reverse-Proxy-Container, Caddyfile, automatisches https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, Websockets, Volumes sichern, docker compose pull, eigener Header
Was wir bauen
Zwei praktische Dienste auf Ihrem eigenen Server, jeder auf einer eigenen Subdomain:
- Uptime Kuma auf
status.example.com: ein Überwachungsprogramm mit Weboberfläche, das Ihre Websites, Ports und Zertifikate im Blick behält und Sie benachrichtigt, wenn etwas ausfällt (Lektion 8.3). Beachten Sie: Eine Überwachung, die auf demselben Server läuft wie das, was sie überwacht, bemerkt nicht, wenn dieser ganze Server ausfällt. Nutzen Sie sie also für Ihre anderen Websites und Dienste, oder betreiben Sie sie auf einem zweiten Server. - Vaultwarden auf
kluis.example.com: eine schlanke, unabhängige Serverversion, die mit den Apps und Browsererweiterungen von Bitwarden funktioniert. Ein Passworttresor ist sensible Software: Setzen Sie ihn nur ein, wenn Sie bereit sind, ihn sorgfältig zu pflegen und zu sichern. Es ist auch völlig in Ordnung, einfach den Passwortmanager eines Anbieters zu verwenden.
Davor setzen wir Caddy in einem Container: Caddy nimmt Port 80 und 443 an, kümmert sich selbst um die Zertifikate von Let's Encrypt (Lektion 7.3 und 7.4) und leitet den Datenverkehr an den richtigen Container weiter. Uptime Kuma und Vaultwarden veröffentlichen selbst keine Ports (Lektion 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Voraussetzungen
- Docker Engine mit dem Compose-Plug-in (Lektion 9.2).
- Zwei DNS-Einträge, die auf Ihren Server zeigen, A und AAAA (Lektion 7.1):
status.example.comundkluis.example.com. - Port 80 und 443 frei auf dem Server. Läuft auf diesen Ports bereits ein nginx oder Caddy des Systems, kann der Caddy-Container sie nicht nutzen. Entscheiden Sie dann: Entweder stoppen Sie den Webserver des Systems, oder Sie lassen ihn die Proxy-Arbeit übernehmen und veröffentlichen die Container auf
127.0.0.1(Lektion 9.3). In diesem Rezept übernimmt das der Caddy-Container. - In ufw 80/tcp, 443/tcp und für HTTP/3 auch 443/udp öffnen (Lektion 5.2). Streng genommen umgeht Docker ufw, aber so stimmt Ihre Firewall-Übersicht mit der Wirklichkeit überein.
Die Dateien
Alles kommt in einen Ordner, /srv/diensten/:
/srv/diensten/
├── compose.yaml
├── Caddyfile
└── .envcompose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- uptime-kuma:/app/data
vaultwarden:
image: vaultwarden/server:1.37.5
restart: unless-stopped
environment:
DOMAIN: "https://kluis.example.com"
SIGNUPS_ALLOWED: "true"
ADMIN_TOKEN: ${VW_ADMIN_TOKEN}
volumes:
- ./vw-data:/data
volumes:
caddy-data:
caddy-config:
uptime-kuma:Prüfen Sie vor dem Start, welche Version von Vaultwarden die neueste ist (die Releases auf GitHub), und tragen Sie diese im Tag ein. Nur Caddy veröffentlicht Ports, und diese müssen öffentlich sein. Die Volumes caddy-data (Zertifikate), uptime-kuma und der Ordner vw-data enthalten alles, was Sie aufbewahren müssen.
Caddyfile
{
email beheer@example.com
}
status.example.com {
reverse_proxy uptime-kuma:3001
header {
X-Weboke-Cursus "jouw-code-uit-de-opdracht"
defer
}
}
kluis.example.com {
reverse_proxy vaultwarden:80
}Caddy holt für beide Namen automatisch ein Zertifikat und leitet http auf https um. uptime-kuma und vaultwarden sind die Servicenamen aus der Compose-Datei: Caddy findet sie im internen Netzwerk. Der header-Block setzt eine zusätzliche Kopfzeile in jede Antwort von status.example.com; diese verwenden Sie in der Aufgabe als Nachweis, dass Ihr Proxy-Container läuft. Mit defer wird der Header gesetzt, nachdem der dahinterliegende Dienst seine Antwort gegeben hat. Möchten Sie auch HSTS und die anderen Sicherheitsheader aus Lektion 7.4 verwenden, setzen Sie diese in denselben Block.
Vaultwarden sicher einrichten
Vier Dinge machen den Unterschied zwischen einem sicheren und einem gefährlichen Tresor.
Erstens: nur über https. Der Web-Tresor von Bitwarden nutzt die Kryptografie des Browsers, und Browser stellen diese nur auf https-Seiten bereit. Ohne https funktioniert es also nicht richtig, und das ist auch gut so. Die Vaultwarden-Dokumentation empfiehlt für https einen Reverse Proxy, wie hier Caddy. Setzen Sie DOMAIN auf die vollständige https-Adresse.
Zweitens: Registrierung schließen. Mit SIGNUPS_ALLOWED: "true" kann jeder, der die Seite findet, ein Konto auf Ihrem Server anlegen. Starten Sie also, legen Sie sofort Ihr eigenes Konto (oder Ihre eigenen Konten) an, setzen Sie den Wert auf "false" und führen Sie docker compose up -d erneut aus. Möchten Sie später jemanden hinzufügen, verwenden Sie die Einladungsfunktion im Admin-Bereich.
Drittens: ein gehashtes Admin-Token. Der Admin-Bereich (/admin) ist mit ADMIN_TOKEN geschützt. Tragen Sie dort kein lesbares Passwort ein, sondern einen Argon2-Hash. Diesen erzeugen Sie mit Vaultwarden selbst:
anna@web1:/srv/diensten$ sudo docker compose exec vaultwarden /vaultwarden hash
Password:
Confirm Password:
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'Setzen Sie diese Zeile in .env (also VW_ADMIN_TOKEN='$argon2id$...', mit einfachen Anführungszeichen) und machen Sie die Datei nur für root lesbar: sudo chmod 600 .env. In einer .env-Datei müssen Sie die $-Zeichen nicht verdoppeln; setzen Sie den Hash direkt unter environment: in die Compose-Datei, dann schon (jedes $ wird zu $$), sonst versucht Compose, sie als Variablen auszufüllen. Bei /admin melden Sie sich mit dem Passwort an, das Sie eingegeben haben, nicht mit dem Hash. Beachten Sie: Einstellungen, die Sie im Admin-Bereich speichern, landen in vw-data/config.json und haben dann Vorrang vor den Umgebungsvariablen.
Viertens: Backup und Wiederherstellung. Alles liegt in vw-data: die Datenbank, Anhänge und Schlüssel. Nehmen Sie diesen Ordner in Ihr restic-Backup auf (Lektion 8.2) und folgen Sie für die Datenbank den Backup-Hinweisen im Vaultwarden-Wiki, damit Sie keine halb geschriebene Datei kopieren. Testen Sie die Wiederherstellung (Aufgabe O8.2): Ein Tresor ohne funktionierendes Backup ist ein Risiko für alle Ihre Passwörter.
Benachrichtigungen zwischen Geräten (Websockets) laufen bei aktuellen Versionen von Vaultwarden über denselben Port; Caddy reicht sie ohne zusätzliche Einstellung weiter.
Uptime Kuma einrichten
Nach docker compose up -d öffnen Sie https://status.example.com. Beim ersten Besuch fordert Uptime Kuma Sie auf, ein Administratorkonto anzulegen. Tun Sie das sofort: Solange dieses Konto nicht existiert, kann jeder, der die Seite findet, es anlegen. Möchten Sie dieses Risiko ganz vermeiden, lassen Sie den status-Block zunächst aus der Caddyfile weg, legen das Konto über einen SSH-Tunnel an (Lektion 2.3) und setzen den Block danach wieder ein.
Danach fügen Sie Monitore hinzu: einen HTTP-Monitor für Ihre Website, einen TCP-Monitor für einen Port, eine Zertifikatswarnung und einen Benachrichtigungskanal (E-Mail, ein Chatprogramm oder ein Push-Dienst). Aktivieren Sie außerdem die Zwei-Faktor-Authentifizierung in den Einstellungen von Uptime Kuma.
Starten und prüfen
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker compose ps
NAME SERVICE STATUS PORTS
diensten-caddy-1 caddy Up 2 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, ...
diensten-uptime-kuma-1 uptime-kuma Up 2 minutes (healthy)
diensten-vaultwarden-1 vaultwarden Up 2 minutes (healthy)
anna@web1:/srv/diensten$ sudo docker compose logs caddy | grep -i "certificate obtained"
anna@web1:~$ curl -sI https://status.example.com | grep -i x-weboke
x-weboke-cursus: jouw-code-uit-de-opdrachtNur Caddy hat Ports. Klappt das Zertifikat nicht, steht in den Logs von Caddy, warum: Meist zeigt das DNS noch nicht auf den Server, oder Port 80 ist nicht erreichbar (Lektion 7.3).
Aktualisieren
Ein Container wird nicht von unattended-upgrades aktualisiert (Lektion 4.2). Legen Sie dafür einen festen Zeitpunkt fest, zum Beispiel alle zwei Wochen:
anna@web1:/srv/diensten$ sudo docker compose pull
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker image prunepull holt die neuesten Images innerhalb des gewählten Tags (caddy:2 bleibt also innerhalb von Version 2). Für Vaultwarden mit einer Versionsnummer passen Sie zuerst den Tag an, nachdem Sie die Release Notes gelesen haben. Lesen Sie bei einer neuen Hauptversion immer die Release Notes: Manchmal muss etwas an Ihren Einstellungen geändert werden. Erstellen Sie vor einem größeren Update ein Backup der Volumes.
Verfolgen Sie auch die Sicherheitsmeldungen der Entwickler. Eine Schwachstelle in Vaultwarden oder Caddy wird nur behoben, wenn Sie die neue Version holen.
In der Praxis
Dieses Rezept funktioniert auf jedem VPS mit Docker, bei WebOké oder bei einem anderen Anbieter. Es ist Selbsthilfe: Der Anbieter Ihres VPS verwaltet nichts innerhalb Ihrer Container. Erstellen Sie einen Snapshot, bevor Sie es zum ersten Mal einrichten, dann können Sie beruhigt experimentieren.
Zusammenfassung
- Eine Compose-Datei mit Caddy als Reverse-Proxy-Container; nur Caddy veröffentlicht Port 80 und 443, die Dienste gar nichts.
- Caddy kümmert sich automatisch um Zertifikate und https und kann mit
headereigene Kopfzeilen setzen. - Vaultwarden: https ist Pflicht,
DOMAINauf die https-Adresse, Registrierung nach Ihrem eigenen Konto schließen,ADMIN_TOKENals Argon2-Hash in einer.envmit Rechten 600. - Uptime Kuma: sofort das Administratorkonto anlegen und die Zwei-Faktor-Authentifizierung aktivieren; überwachen Sie damit vor allem andere Server und Websites.
- Sichern Sie die Volumes und den Ordner
vw-data, und aktualisieren Sie mitdocker compose pullundup -dzu einem festen Zeitpunkt.
Quiz
Aufgabe
Aufgabe Z9.4: Weisen Sie nach, dass Ihr Container läuft. Rufen Sie in der Aufgabe Ihren persönlichen Code ab und tragen Sie ihn in der Caddyfile Ihres Caddy-Containers als Header X-Weboke-Cursus für eine Ihrer Subdomains ein (zum Beispiel status.<jouwdomein>). Laden Sie Caddy neu und geben Sie den Hostnamen ein. Das Programm ruft https://<hostnaam>/ ab und prüft, ob das Zertifikat gültig ist und der Header genau Ihren Code enthält. Fügen Sie außerdem die Ausgabe von docker compose ps ein und beantworten Sie, welcher Dienst als einziger Ports veröffentlicht.
Weiterführende Informationen
- Passwortmanager und Passkeys: So regeln Sie Ihre Anmeldung sicher
- Uptime Kuma (Installation mit Docker): https://github.com/louislam/uptime-kuma
- Vaultwarden-Wiki, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Vaultwarden-Wiki, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Vaultwarden-Wiki, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Caddy-Dokumentation, header: https://caddyserver.com/docs/caddyfile/directives/header
