Direkt zum Inhalt

Cookie-Einstellungen

Wählen Sie, welche Arten von Cookies Sie erlauben. Sie können Ihre Auswahl jederzeit über Cookie-Einstellungen unten auf jeder Seite ändern. Datenschutzerklärung

Notwendig

Immer aktiv

Nötig zum Einloggen, für Ihren Warenkorb und um Ihre Auswahl zu speichern. Diese sind immer aktiv.

Welche Cookies?
  • weboke_sessie, weboke_klant, weboke_remember: Ihre Sitzung und eingeloggt bleiben
  • weboke_basket: Ihr Warenkorb
  • wkBtwIncl: Preise mit oder ohne MwSt. anzeigen
  • wok_cookies: Ihre Cookie-Auswahl, 12 Monate

Misst, welche Anzeige zu einem Besuch oder einer Bestellung führt, damit wir nicht für Anzeigen zahlen, die nichts bringen.

Welche Cookies?
  • Google Ads über Google Tag Manager (_gcl_au, _gcl_aw), bis zu 90 Tage
  • OpenAI Ads, Anzeigen in ChatGPT
  • wok_aff: über welchen Partner Sie zu uns kamen (Partnerprogramm), 60 Tage

4,6

Land und Sprache

Jedes Land hat seine eigene Website, mit Preisen und MwSt. dieses Landes.

Anzeigen

Modul 9 · 9.4

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:80

Voraussetzungen

  1. Docker Engine mit dem Compose-Plug-in (Lektion 9.2).
  2. Zwei DNS-Einträge, die auf Ihren Server zeigen, A und AAAA (Lektion 7.1): status.example.com und kluis.example.com.
  3. 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.
  4. 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
└── .env

compose.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-opdracht

Nur 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 prune

pull 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 header eigene Kopfzeilen setzen.
  • Vaultwarden: https ist Pflicht, DOMAIN auf die https-Adresse, Registrierung nach Ihrem eigenen Konto schließen, ADMIN_TOKEN als Argon2-Hash in einer .env mit 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 mit docker compose pull und up -d zu einem festen Zeitpunkt.

Quiz

1. Warum veröffentlichen Uptime Kuma und Vaultwarden in diesem Rezept selbst keine Ports?



2. Warum funktioniert der Web-Tresor von Vaultwarden über einfaches http nicht richtig?



3. Sie haben Ihr eigenes Vaultwarden-Konto angelegt. Was ist der nächste Schritt?



4. Sie setzen den Argon2-Hash des Admin-Tokens direkt unter environment: in compose.yaml und erhalten Warnungen über unbekannte Variablen. Warum?



5. Wie aktualisieren Sie diese Dienste?



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.

Aufgabe Z9.4: Weisen Sie nach, dass Ihr Container läuft

Klicken Sie auf "Meinen Code anzeigen" und setzen Sie die Kopfzeile X-Weboke-Cursus mit diesem Code in Ihr Caddyfile, zum Beispiel: header { X-Weboke-Cursus "<code>" }. Von außen ist nicht zu erkennen, ob etwas in einem Container läuft; deshalb fügen Sie auch die Ausgabe von docker compose ps ein (diese speichern wir nicht).




Was Sie eingeben und was wir finden, speichern wir nicht. Ihr Browser merkt sich Ihre Antworten und ob Sie die Aufgabe bestanden haben. Sind Sie angemeldet, speichern wir in Meine Kurse nur, dass Sie die Aufgabe (fast) richtig hatten; auch das können Sie dort löschen.

Weiterführende Informationen

Einen Moment bitte…

Richten Sie Ihre Domains ein

Legen Sie für jede Domain die Nameserver, die Verknüpfung mit Ihrem Hosting und den künftigen Inhaber fest.

Ihre Domains werden geladen…