Modul 9 · 9.4
Recepti: Uptime Kuma in Vaultwarden
Modul 9: Docker in docker compose · Čas branja: 13 minut
Učni cilj: Po tej lekciji boste znali z docker compose zagnati Uptime Kuma in Vaultwarden za Caddy, s https, zaprto registracijo, varnostno kopijo nosilcev (volumes) in ustaljenim načinom posodabljanja.
Ključni pojmi: vsebnik obratnega posrednika (reverse proxy), Caddyfile, samodejni https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websocketi, varnostno kopiranje nosilcev, docker compose pull, lastna glava
Kaj bomo zgradili
Dve uporabni storitvi na Vašem lastnem strežniku, vsaka na svoji poddomeni:
- Uptime Kuma na
status.example.com: program za nadzor s spletnim vmesnikom, ki spremlja Vaša spletna mesta, vrata in certifikate ter Vam pošlje obvestilo, ko kaj izpade (lekcija 8.3). Pozor: nadzor, ki teče na istem strežniku kot to, kar nadzira, ne opazi, da je izpadel celoten strežnik. Uporabljajte ga torej za svoja druga spletna mesta in storitve ali pa ga namestite na drug strežnik. - Vaultwarden na
kluis.example.com: lahka, neodvisna strežniška različica, ki deluje z aplikacijami in razširitvami brskalnika Bitwarden. Trezor gesel je občutljiva programska oprema: lotite se ga le, če ste ga pripravljeni skrbno vzdrževati in varnostno kopirati. Povsem v redu je tudi, če preprosto uporabljate upravitelja gesel ponudnika.
Pred njiju postavimo Caddy v vsebniku: ta sprejema promet na vratih 80 in 443, sam ureja certifikate Let's Encrypt (lekciji 7.3 in 7.4) in promet posreduje pravemu vsebniku. Uptime Kuma in Vaultwarden sama ne objavljata nobenih vrat (lekcija 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Predpogoji
- Docker Engine z vtičnikom compose (lekcija 9.2).
- Dva zapisa DNS, ki kažeta na Vaš strežnik, A in AAAA (lekcija 7.1):
status.example.cominkluis.example.com. - Prosta vrata 80 in 443 na strežniku. Če na teh vratih že teče sistemski nginx ali Caddy, ju vsebnik Caddy ne more uporabiti. V tem primeru izberite: ali ustavite sistemski spletni strežnik ali pa mu prepustite delo posrednika in vsebnike objavite na
127.0.0.1(lekcija 9.3). V tem receptu delo opravi vsebnik Caddy. - V ufw odprite 80/tcp, 443/tcp in za HTTP/3 tudi 443/udp (lekcija 5.2). Strogo vzeto Docker obide ufw, a tako se pregled Vašega požarnega zidu ujema z dejanskim stanjem.
Datoteke
Vse gre v eno mapo, /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:Preden začnete, preverite, katera različica Vaultwardna je najnovejša (izdaje na GitHubu), in jo vpišite v oznako (tag). Vrata objavlja le Caddy; ta morajo biti javna. Nosilca caddy-data (certifikati), uptime-kuma in mapa vw-data vsebujejo vse, kar morate shraniti.
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 za obe imeni samodejno pridobi certifikat in http preusmeri na https. uptime-kuma in vaultwarden sta imeni storitev iz datoteke compose: Caddy ju najde v notranjem omrežju. Blok header doda dodatno glavo v vsak odgovor z status.example.com; to boste v nalogi uporabili kot dokaz, da Vaš vsebnik posrednika deluje. Z defer se glava nastavi, ko je storitev v ozadju že vrnila svoj odgovor. Če želite tudi HSTS in druge varnostne glave iz lekcije 7.4, jih dodajte v isti blok.
Varna nastavitev Vaultwardna
Štiri stvari ločijo varen trezor od nevarnega.
Prvič: samo prek https. Spletni trezor Bitwarden uporablja kriptografijo brskalnika, brskalniki pa jo omogočijo le na straneh https. Brez https torej ne deluje pravilno, in to je tudi prav. Dokumentacija Vaultwardna za https priporoča obratni posrednik, kot je tukaj Caddy. DOMAIN nastavite na celoten naslov https.
Drugič: zaprta registracija. Z SIGNUPS_ALLOWED: "true" lahko vsak, ki najde stran, ustvari račun na Vašem strežniku. Zato zaženite, takoj ustvarite svoj račun oziroma račune, vrednost nastavite na "false" in znova izvedite docker compose up -d. Če želite pozneje koga dodati, uporabite funkcijo povabila v skrbniškem zaslonu.
Tretjič: zgoščeni skrbniški žeton. Skrbniški zaslon (/admin) je zaščiten z ADMIN_TOKEN. Vanj ne vpišite berljivega gesla, temveč zgoščeno vrednost Argon2. To ustvarite kar z Vaultwardnom:
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$...'To vrstico vpišite v .env (torej VW_ADMIN_TOKEN='$argon2id$...', z enojnimi narekovaji) in datoteko naredite berljivo samo za root: sudo chmod 600 .env. V datoteki .env znakov $ ni treba podvojiti; če pa zgoščeno vrednost vpišete neposredno pod environment: v datoteko compose, jih morate (vsak $ postane $$), sicer jih Compose skuša zapolniti kot spremenljivke. Na /admin se prijavite z geslom, ki ste ga vtipkali, ne z zgoščeno vrednostjo. Pozor: nastavitve, ki jih shranite v skrbniškem zaslonu, se zapišejo v vw-data/config.json in imajo nato prednost pred okoljskimi spremenljivkami.
Četrtič: varnostna kopija in obnovitev. Vse je v vw-data: podatkovna baza, priloge in ključi. To mapo vključite v svojo varnostno kopijo restic (lekcija 8.2), za podatkovno bazo pa upoštevajte navodila za varnostno kopiranje v wikiju Vaultwardna, da ne skopirate napol zapisane datoteke. Preizkusite obnovitev (naloga O8.2): trezor brez delujoče varnostne kopije je tveganje za vsa Vaša gesla.
Obvestila med napravami (websocketi) pri novejših različicah Vaultwardna delujejo prek istih vrat; Caddy jih posreduje brez dodatnih nastavitev.
Nastavitev Uptime Kuma
Po docker compose up -d odprite https://status.example.com. Ob prvem obisku Vas Uptime Kuma prosi, da ustvarite skrbniški račun. To storite takoj: dokler tega računa ni, ga lahko ustvari vsak, ki najde stran. Če tega tveganja sploh ne želite, iz datoteke Caddyfile najprej odstranite blok status, račun ustvarite prek tunela SSH (lekcija 2.3) in blok nato vrnite.
Nato dodajte nadzornike (monitors): nadzornik HTTP za svoje spletno mesto, nadzornik TCP za vrata, opozorilo za certifikat in kanal za obvestila (e-pošta, program za klepet ali storitev potisnih obvestil). V nastavitvah Uptime Kuma vklopite tudi dvostopenjsko preverjanje.
Zagon in preverjanje
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-opdrachtVrata ima samo Caddy. Če pridobitev certifikata ne uspe, je razlog zapisan v dnevnikih Caddyja: najpogosteje DNS še ne kaže na strežnik ali vrata 80 niso dosegljiva (lekcija 7.3).
Posodabljanje
Vsebnika unattended-upgrades ne posodobi (lekcija 4.2). Določite si stalen termin, na primer vsaka dva tedna:
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 prenese najnovejše slike znotraj oznake, ki ste jo izbrali (torej caddy:2 ostane znotraj različice 2). Pri Vaultwardnu s številko različice najprej preberite opombe ob izdaji (release notes) in nato prilagodite oznako. Pri novi glavni različici vedno preberite opombe ob izdaji: včasih je treba kaj spremeniti v nastavitvah. Pred večjo posodobitvijo naredite varnostno kopijo nosilcev.
Spremljajte tudi varnostna obvestila razvijalcev. Ranljivost v Vaultwardnu ali Caddyju je odpravljena šele, ko sami prenesete novo različico.
V praksi
Ta recept deluje na vsakem VPS z Dockerjem, pri WebOké ali pri drugem ponudniku. Gre za samopomoč: ponudnik Vašega VPS ne upravlja ničesar znotraj Vaših vsebnikov. Preden ga prvič postavite, naredite posnetek stanja (snapshot), tako boste lahko brez skrbi preizkušali.
Povzetek
- Ena datoteka compose s Caddyjem kot vsebnikom obratnega posrednika; vrata 80 in 443 objavlja samo Caddy, storitve nobenih.
- Caddy samodejno ureja certifikate in https ter lahko z
headernastavi lastne glave. - Vaultwarden: https obvezen,
DOMAINna naslovu https, registracija zaprta po ustvarjanju lastnega računa,ADMIN_TOKENkot zgoščena vrednost Argon2 v.envs pravicami 600. - Uptime Kuma: takoj ustvarite skrbniški račun in vklopite dvostopenjsko preverjanje; z njim nadzirajte predvsem druge strežnike in spletna mesta.
- Varnostno kopirajte nosilce in mapo
vw-datater posodabljajte zdocker compose pullinup -dob stalnem terminu.
Kviz
Naloga
Naloga Z9.4: Dokažite, da Vaš vsebnik deluje. V nalogi pridobite svojo osebno kodo in jo v datoteko Caddyfile svojega vsebnika Caddy vpišite kot glavo X-Weboke-Cursus za eno od svojih poddomen (na primer status.<jouwdomein>). Znova naložite Caddy in vpišite ime gostitelja. Program prenese https://<hostnaam>/ in preveri, ali je certifikat veljaven in ali glava vsebuje natanko Vašo kodo. Poleg tega prilepite izpis ukaza docker compose ps in odgovorite, katera storitev edina objavlja vrata.
Za nadaljnje branje
- Upravitelj gesel in passkeys: tako varno uredite prijavo
- Uptime Kuma (namestitev z Dockerjem): https://github.com/louislam/uptime-kuma
- Wiki Vaultwardna, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Wiki Vaultwardna, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Wiki Vaultwardna, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Dokumentacija Caddy, header: https://caddyserver.com/docs/caddyfile/directives/header
