Recepty: Uptime Kuma a Vaultwarden
Modul 9: Docker a docker compose · Doba čtení: 13 min.
Cíl lekce: Po této lekci dokážete provozovat Uptime Kuma a Vaultwarden pomocí docker compose za Caddy, s https, uzavřenou registrací, zálohou svazků a pevně daným způsobem aktualizací.
Klíčové pojmy: kontejner s reverzní proxy, Caddyfile, automatické https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockety, zálohování svazků, docker compose pull, vlastní hlavička
Co budeme stavět
Dvě užitečné služby na Vašem vlastním serveru, každá na vlastní subdoméně:
- Uptime Kuma na
status.example.com: monitorovací program s webovým rozhraním, který hlídá Vaše weby, porty a certifikáty a pošle Vám upozornění, když něco vypadne (lekce 8.3). Pozor: monitoring, který běží na stejném serveru jako to, co hlídá, nepozná, když vypadne celý server. Používejte ho tedy pro své ostatní weby a služby, nebo ho umístěte na druhý server. - Vaultwarden na
kluis.example.com: odlehčená, nezávislá serverová verze, která funguje s aplikacemi a rozšířeními prohlížeče od Bitwardenu. Trezor hesel je citlivý software: pouštějte se do toho, jen pokud jste ochotni ho pečlivě udržovat a zálohovat. Je také naprosto v pořádku používat obyčejného správce hesel od poskytovatele.
Před ně postavíme Caddy v kontejneru: ten přijímá provoz na portech 80 a 443, sám si zařizuje certifikáty od Let's Encrypt (lekce 7.3 a 7.4) a přeposílá provoz do správného kontejneru. Uptime Kuma a Vaultwarden samy nepublikují žádné porty (lekce 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Předpoklady
- Docker Engine s pluginem compose (lekce 9.2).
- Dva DNS záznamy, které ukazují na Váš server, A a AAAA (lekce 7.1):
status.example.comakluis.example.com. - Volné porty 80 a 443 na serveru. Pokud na těchto portech už běží systémový nginx nebo Caddy, kontejner s Caddy je nemůže použít. Pak si vyberte: buď systémový webový server zastavíte, nebo mu necháte práci proxy a kontejnery publikujete na
127.0.0.1(lekce 9.3). V tomto receptu tuto práci dělá kontejner s Caddy. - V ufw otevřete 80/tcp, 443/tcp a pro HTTP/3 také 443/udp (lekce 5.2). Přesně vzato Docker ufw obchází, ale takto bude přehled Vašeho firewallu odpovídat skutečnosti.
Soubory
Vše patří do jedné složky, /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:Než začnete, zjistěte, která verze Vaultwardenu je nejnovější (releases na GitHubu), a uveďte ji v tagu. Porty publikuje jen Caddy; ty musí být veřejné. Svazky caddy-data (certifikáty), uptime-kuma a složka vw-data obsahují vše, co musíte uchovat.
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 si pro oba názvy sám získá certifikát a přesměruje http na https. uptime-kuma a vaultwarden jsou názvy služeb ze souboru compose: Caddy je najde ve vnitřní síti. Blok header přidá do každé odpovědi z status.example.com hlavičku navíc; tu v úkolu použijete jako důkaz, že Váš kontejner s proxy běží. Díky defer se hlavička nastaví až poté, co služba v pozadí vrátí svou odpověď. Chcete-li také HSTS a další bezpečnostní hlavičky z lekce 7.4, vložte je do stejného bloku.
Bezpečné nastavení Vaultwardenu
Rozdíl mezi bezpečným a nebezpečným trezorem dělají čtyři věci.
Za prvé: pouze přes https. Webový trezor Bitwardenu využívá kryptografii prohlížeče a prohlížeče ji zpřístupňují jen na stránkách s https. Bez https tedy nefunguje správně, a to je jen dobře. Dokumentace Vaultwardenu doporučuje pro https reverzní proxy, jako je zde Caddy. Nastavte DOMAIN na úplnou https adresu.
Za druhé: uzavřená registrace. S SIGNUPS_ALLOWED: "true" si může na Vašem serveru založit účet kdokoli, kdo stránku najde. Spusťte tedy službu, hned si založte vlastní účet (účty), nastavte hodnotu na "false" a znovu spusťte docker compose up -d. Pokud budete chtít později někoho přidat, použijte funkci pozvánek v administraci.
Za třetí: hashovaný administrátorský token. Administrace (/admin) je chráněna pomocí ADMIN_TOKEN. Nevkládejte do ní čitelné heslo, ale hash Argon2. Ten vytvoříte přímo pomocí Vaultwardenu:
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$...'Tento řádek vložte do .env (tedy VW_ADMIN_TOKEN='$argon2id$...', s jednoduchými uvozovkami) a nastavte soubor tak, aby ho mohl číst jen root: sudo chmod 600 .env. V souboru .env nemusíte znaky $ zdvojovat; pokud ale hash vložíte přímo pod environment: v souboru compose, musíte (každý $ se změní na $$), jinak se je Compose pokusí doplnit jako proměnné. Do /admin se přihlašujete heslem, které jste zadali, nikoli hashem. Pozor: nastavení, která uložíte v administraci, se zapíší do vw-data/config.json a pak mají přednost před proměnnými prostředí.
Za čtvrté: záloha a obnova. Vše je uloženo v vw-data: databáze, přílohy a klíče. Zahrňte tuto složku do své zálohy restic (lekce 8.2) a u databáze se řiďte pokyny k zálohování ve wiki Vaultwardenu, abyste nekopírovali napůl zapsaný soubor. Obnovu vyzkoušejte (úkol O8.2): trezor bez funkční zálohy je riziko pro všechna Vaše hesla.
Oznámení mezi zařízeními (websockety) fungují v novějších verzích Vaultwardenu přes stejný port; Caddy je předá bez dalšího nastavení.
Nastavení Uptime Kuma
Po docker compose up -d otevřete https://status.example.com. Při první návštěvě Vás Uptime Kuma vyzve k vytvoření administrátorského účtu. Udělejte to hned: dokud tento účet neexistuje, může ho vytvořit kdokoli, kdo stránku najde. Pokud nechcete podstoupit ani toto riziko, vynechejte nejprve blok status z Caddyfile, vytvořte účet přes SSH tunel (lekce 2.3) a blok potom vraťte zpět.
Poté přidáte monitory: HTTP monitor pro svůj web, TCP monitor pro port, upozornění na certifikát a kanál pro oznámení (e-mail, chatovací aplikace nebo push služba). V nastavení Uptime Kuma také zapněte dvoufázové ověření.
Spuštění a kontrola
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 má jen Caddy. Pokud se nepodaří získat certifikát, najdete důvod v lozích Caddy: nejčastěji DNS ještě neukazuje na server, nebo není dostupný port 80 (lekce 7.3).
Aktualizace
Kontejner se pomocí unattended-upgrades neaktualizuje (lekce 4.2). Udělejte si z toho pravidelný termín, například každé dva týdny:
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 stáhne nejnovější image v rámci zvoleného tagu (takže caddy:2 zůstane u verze 2). U Vaultwardenu s číslem verze nejprve po přečtení release notes upravte tag. U nové hlavní verze vždy čtěte release notes: někdy je třeba něco změnit ve Vašem nastavení. Před velkou aktualizací zazálohujte svazky.
Sledujte také bezpečnostní oznámení autorů. Zranitelnost ve Vaultwardenu nebo v Caddy se odstraní, jen když si novou verzi stáhnete.
V praxi
Tento recept funguje na každém VPS s Dockerem, u WebOké i u jiného poskytovatele. Jde o svépomoc: poskytovatel Vašeho VPS uvnitř Vašich kontejnerů nic nespravuje. Než recept poprvé nasadíte, vytvořte snapshot, pak můžete experimentovat s klidným svědomím.
Shrnutí
- Jeden soubor compose s Caddy jako kontejnerem s reverzní proxy; porty 80 a 443 publikuje jen Caddy, služby nepublikují nic.
- Caddy automaticky zařizuje certifikáty a https a pomocí
headerumí nastavit vlastní hlavičky. - Vaultwarden: https povinné,
DOMAINna https adresu, registrace po založení vlastního účtu uzavřená,ADMIN_TOKENjako hash Argon2 v.envs oprávněním 600. - Uptime Kuma: hned vytvořit administrátorský účet a zapnout dvoufázové ověření; hlídejte jím hlavně jiné servery a weby.
- Zálohujte svazky a složku
vw-dataa aktualizujte pomocídocker compose pullaup -dv pravidelném termínu.
Kvíz
Úkol
Úkol Z9.4: Prokažte, že Váš kontejner běží. V úkolu si vyzvedněte svůj osobní kód a vložte ho do Caddyfile svého kontejneru s Caddy jako hlavičku X-Weboke-Cursus pro některou ze svých subdomén (například status.<jouwdomein>). Znovu načtěte Caddy a vyplňte název hostitele. Program stáhne https://<hostnaam>/ a ověří, že certifikát je platný a že hlavička obsahuje přesně Váš kód. Kromě toho vložte výstup příkazu docker compose ps a odpovězte, která služba jako jediná publikuje porty.
Doporučujeme k přečtení
- Správce hesel a přístupové klíče (passkeys): jak si bezpečně zajistit přihlašování
- Uptime Kuma (instalace pomocí Dockeru): https://github.com/louislam/uptime-kuma
- Wiki Vaultwardenu, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Wiki Vaultwardenu, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Wiki Vaultwardenu, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Dokumentace Caddy, header: https://caddyserver.com/docs/caddyfile/directives/header
