Przepisy: Uptime Kuma i Vaultwarden
Moduł 9: Docker i docker compose · Czas czytania: 13 min
Cel lekcji: Po tej lekcji będą Państwo potrafili uruchomić Uptime Kuma i Vaultwarden za pomocą docker compose za Caddy, z https, zamkniętą rejestracją, kopią zapasową wolumenów i stałym sposobem aktualizacji.
Kluczowe pojęcia: kontener reverse proxy, Caddyfile, automatyczne https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockety, kopia zapasowa wolumenów, docker compose pull, własny nagłówek
Co budujemy
Dwie przydatne usługi na Państwa własnym serwerze, każda na osobnej subdomenie:
- Uptime Kuma na
status.example.com: program do monitorowania z interfejsem WWW, który pilnuje Państwa stron, portów i certyfikatów oraz wysyła powiadomienie, gdy coś przestanie działać (lekcja 8.3). Uwaga: monitorowanie działające na tym samym serwerze co monitorowane usługi nie zauważy awarii całego serwera. Proszę więc używać go do innych stron i usług albo umieścić go na drugim serwerze. - Vaultwarden na
kluis.example.com: lekka, niezależna wersja serwerowa, która współpracuje z aplikacjami i rozszerzeniami przeglądarki Bitwarden. Sejf haseł to wrażliwe oprogramowanie: prosimy się na to decydować tylko wtedy, gdy są Państwo gotowi starannie go aktualizować i wykonywać jego kopie zapasowe. Równie dobrym wyborem jest po prostu menedżer haseł od zewnętrznego dostawcy.
Przed nimi umieszczamy Caddy w kontenerze: przyjmuje on ruch na portach 80 i 443, sam zajmuje się certyfikatami Let's Encrypt (lekcja 7.3 i 7.4) i przekazuje ruch do właściwego kontenera. Uptime Kuma i Vaultwarden same nie publikują żadnych portów (lekcja 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Przygotowanie
- Docker Engine z wtyczką compose (lekcja 9.2).
- Dwa rekordy DNS wskazujące na Państwa serwer, A i AAAA (lekcja 7.1):
status.example.comikluis.example.com. - Wolne porty 80 i 443 na serwerze. Jeśli na tych portach działa już systemowy nginx lub Caddy, kontener Caddy nie będzie mógł z nich korzystać. Należy wtedy wybrać: albo zatrzymać systemowy serwer WWW, albo zlecić mu pracę proxy i opublikować kontenery na
127.0.0.1(lekcja 9.3). W tym przepisie zadanie to wykonuje kontener Caddy. - W ufw otwarte 80/tcp, 443/tcp, a dla HTTP/3 także 443/udp (lekcja 5.2). Ściśle rzecz biorąc Docker omija ufw, ale dzięki temu przegląd zapory zgadza się z rzeczywistością.
Pliki
Wszystko trafia do jednego katalogu, /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:Przed rozpoczęciem prosimy sprawdzić, która wersja Vaultwarden jest najnowsza (wydania na GitHubie), i wpisać ją w tagu. Porty publikuje tylko Caddy; one muszą być publiczne. Wolumeny caddy-data (certyfikaty), uptime-kuma oraz katalog vw-data zawierają wszystko, co trzeba zachować.
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 samodzielnie pobiera certyfikat dla obu nazw i przekierowuje http na https. uptime-kuma i vaultwarden to nazwy usług z pliku compose: Caddy znajduje je w sieci wewnętrznej. Blok header dodaje dodatkowy nagłówek do każdej odpowiedzi z status.example.com; wykorzystają go Państwo w zadaniu jako dowód, że Państwa kontener proxy działa. Dzięki defer nagłówek jest ustawiany po tym, jak usługa w tle udzieli odpowiedzi. Jeśli chcą Państwo dodać także HSTS i pozostałe nagłówki bezpieczeństwa z lekcji 7.4, prosimy umieścić je w tym samym bloku.
Bezpieczna konfiguracja Vaultwarden
Cztery rzeczy decydują o tym, czy sejf jest bezpieczny, czy niebezpieczny.
Po pierwsze: tylko przez https. Sejf WWW Bitwarden korzysta z kryptografii przeglądarki, a przeglądarki udostępniają ją wyłącznie na stronach https. Bez https nie działa więc poprawnie, i bardzo dobrze. Dokumentacja Vaultwarden zaleca reverse proxy dla https, taki jak tutaj Caddy. Proszę ustawić DOMAIN na pełny adres https.
Po drugie: zamknięta rejestracja. Przy SIGNUPS_ALLOWED: "true" każdy, kto znajdzie stronę, może założyć konto na Państwa serwerze. Proszę więc uruchomić usługę, od razu założyć własne konto (lub konta), ustawić wartość na "false" i ponownie wykonać docker compose up -d. Jeśli później zechcą Państwo kogoś dodać, prosimy użyć funkcji zaproszeń w panelu administracyjnym.
Po trzecie: zahaszowany token administratora. Panel administracyjny (/admin) jest chroniony przez ADMIN_TOKEN. Proszę nie wpisywać tam czytelnego hasła, lecz hash Argon2. Tworzy się go za pomocą samego Vaultwarden:
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$...'Proszę umieścić ten wiersz w .env (czyli VW_ADMIN_TOKEN='$argon2id$...', w pojedynczych cudzysłowach) i ustawić plik jako czytelny tylko dla root: sudo chmod 600 .env. W pliku .env nie trzeba podwajać znaków $; jeśli jednak wpiszą Państwo hash bezpośrednio pod environment: w pliku compose, to trzeba (każdy $ zamienia się w $$), w przeciwnym razie Compose spróbuje podstawić je jako zmienne. Do /admin logują się Państwo hasłem, które zostało wpisane, a nie hashem. Uwaga: ustawienia zapisane w panelu administracyjnym trafiają do vw-data/config.json i mają wtedy pierwszeństwo przed zmiennymi środowiskowymi.
Po czwarte: kopia zapasowa i przywracanie. Wszystko znajduje się w vw-data: baza danych, załączniki i klucze. Proszę uwzględnić ten katalog w kopii restic (lekcja 8.2), a w przypadku bazy danych postępować zgodnie ze wskazówkami dotyczącymi kopii zapasowych w wiki Vaultwarden, aby nie skopiować w połowie zapisanego pliku. Proszę przetestować przywracanie (zadanie O8.2): sejf bez działającej kopii zapasowej to ryzyko dla wszystkich Państwa haseł.
Powiadomienia między urządzeniami (websockety) w nowszych wersjach Vaultwarden działają przez ten sam port; Caddy przekazuje je bez dodatkowej konfiguracji.
Konfiguracja Uptime Kuma
Po docker compose up -d proszę otworzyć https://status.example.com. Przy pierwszej wizycie Uptime Kuma poprosi o utworzenie konta administratora. Prosimy zrobić to od razu: dopóki takie konto nie istnieje, każdy, kto znajdzie stronę, może je założyć. Jeśli nie chcą Państwo podejmować tego ryzyka, proszę najpierw usunąć blok status z Caddyfile, utworzyć konto przez tunel SSH (lekcja 2.3), a następnie przywrócić blok.
Następnie dodają Państwo monitory: monitor HTTP dla strony internetowej, monitor TCP dla portu, ostrzeżenie o certyfikacie oraz kanał powiadomień (e-mail, komunikator lub usługa push). Prosimy też włączyć weryfikację dwuetapową w ustawieniach Uptime Kuma.
Uruchomienie i sprawdzenie
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-opdrachtPorty ma tylko Caddy. Jeśli pobranie certyfikatu się nie powiedzie, przyczynę znajdą Państwo w logach Caddy: zwykle DNS nie wskazuje jeszcze na serwer albo port 80 jest nieosiągalny (lekcja 7.3).
Aktualizacja
Kontener nie jest aktualizowany przez unattended-upgrades (lekcja 4.2). Proszę ustalić stały termin, na przykład co dwa tygodnie:
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 pobiera najnowsze obrazy w ramach wybranego tagu (czyli caddy:2 pozostaje w wersji 2). W przypadku Vaultwarden z numerem wersji najpierw zmieniają Państwo tag, po przeczytaniu informacji o wydaniu (release notes). Przy nowej wersji głównej zawsze prosimy czytać release notes: czasem trzeba coś zmienić w ustawieniach. Przed dużą aktualizacją proszę wykonać kopię zapasową wolumenów.
Prosimy też śledzić komunikaty bezpieczeństwa twórców. Luka w Vaultwarden lub Caddy zostanie usunięta tylko wtedy, gdy pobiorą Państwo nową wersję.
W praktyce
Ten przepis działa na każdym VPS z Dockerem, w WebOké lub u innego dostawcy. To samodzielne rozwiązanie: dostawca Państwa VPS niczym nie zarządza wewnątrz kontenerów. Przed pierwszą konfiguracją proszę wykonać snapshot, aby móc spokojnie eksperymentować.
Podsumowanie
- Jeden plik compose z Caddy jako kontenerem reverse proxy; tylko Caddy publikuje porty 80 i 443, usługi nie publikują nic.
- Caddy automatycznie obsługuje certyfikaty i https, a za pomocą
headermoże ustawiać własne nagłówki. - Vaultwarden: https obowiązkowo,
DOMAINna adres https, rejestracja zamknięta po założeniu własnego konta,ADMIN_TOKENjako hash Argon2 w.envz uprawnieniami 600. - Uptime Kuma: od razu utworzyć konto administratora i włączyć weryfikację dwuetapową; monitorować nim przede wszystkim inne serwery i strony.
- Kopia zapasowa wolumenów i katalogu
vw-dataoraz aktualizacja za pomocądocker compose pulliup -dw stałym terminie.
Quiz
Zadanie
Zadanie Z9.4: Proszę udowodnić, że Państwa kontener działa. Proszę pobrać w zadaniu swój osobisty kod i wpisać go w Caddyfile kontenera Caddy jako nagłówek X-Weboke-Cursus dla jednej ze swoich subdomen (na przykład status.<jouwdomein>). Następnie proszę przeładować Caddy i podać nazwę hosta. Program pobierze https://<hostnaam>/ i sprawdzi, czy certyfikat jest ważny oraz czy nagłówek zawiera dokładnie Państwa kod. Dodatkowo proszę wkleić wynik docker compose ps i odpowiedzieć, która usługa jako jedyna publikuje porty.
Przeczytaj więcej
- Menedżer haseł i klucze dostępu (passkeys): jak bezpiecznie zorganizować swoje logowanie
- Uptime Kuma (instalacja z Dockerem): https://github.com/louislam/uptime-kuma
- Wiki Vaultwarden, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Wiki Vaultwarden, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Wiki Vaultwarden, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Dokumentacja Caddy, header: https://caddyserver.com/docs/caddyfile/directives/header
