9 modulis · 9.4
Receptai: Uptime Kuma ir Vaultwarden
9 modulis: Docker ir docker compose · Skaitymo laikas: 13 min.
Mokymosi tikslas: Po šios pamokos galėsite paleisti Uptime Kuma ir Vaultwarden su docker compose už Caddy, su https, uždara registracija, tomų atsarginėmis kopijomis ir nuolatiniu atnaujinimo būdu.
Pagrindinės sąvokos: atvirkštinio tarpinio serverio (reverse proxy) konteineris, Caddyfile, automatinis https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, tomų atsarginės kopijos, docker compose pull, nuosava antraštė
Ką sukursime
Dvi naudingas paslaugas Jūsų serveryje, kiekvieną savo subdomene:
- Uptime Kuma adresu
status.example.com: stebėsenos programa su žiniatinklio sąsaja, kuri stebi Jūsų svetaines, prievadus ir sertifikatus bei siunčia Jums pranešimą, kai kas nors nustoja veikti (pamoka 8.3). Atkreipkite dėmesį: stebėsena, veikianti tame pačiame serveryje kaip ir tai, ką ji stebi, nepastebės, kad sutriko visas serveris. Todėl naudokite ją kitoms savo svetainėms ir paslaugoms arba įdiekite ją antrame serveryje. - Vaultwarden adresu
kluis.example.com: lengva, nepriklausoma serverio versija, veikianti su Bitwarden programėlėmis ir naršyklės plėtiniais. Slaptažodžių saugykla yra jautri programinė įranga: imkitės jos tik tada, jei esate pasirengę ją tinkamai prižiūrėti ir daryti jos atsargines kopijas. Visiškai tinka ir paprasčiausiai naudoti paslaugų teikėjo slaptažodžių tvarkyklę.
Priešais jas konteineryje paleisime Caddy: jis priima 80 ir 443 prievadus, pats tvarko Let's Encrypt sertifikatus (pamokos 7.3 ir 7.4) ir nukreipia srautą į reikiamą konteinerį. Uptime Kuma ir Vaultwarden patys neskelbia jokių prievadų (pamoka 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Prieš pradedant
- Docker Engine su compose papildiniu (pamoka 9.2).
- Du DNS įrašai, nukreipti į Jūsų serverį, A ir AAAA (pamoka 7.1):
status.example.comirkluis.example.com. - Laisvi 80 ir 443 prievadai serveryje. Jei tuose prievaduose jau veikia sistemos nginx arba Caddy, Caddy konteineris negalės jų naudoti. Tada pasirinkite: arba sustabdote sistemos žiniatinklio serverį, arba leidžiate jam atlikti tarpinio serverio darbą ir skelbiate konteinerius adresu
127.0.0.1(pamoka 9.3). Šiame recepte tai atlieka Caddy konteineris. - Atidarykite ufw prievadus 80/tcp, 443/tcp, o HTTP/3 atveju ir 443/udp (pamoka 5.2). Griežtai kalbant, Docker apeina ufw, tačiau taip Jūsų užkardos apžvalga atitiks tikrovę.
Failai
Viskas dedama į vieną katalogą, /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:Prieš pradėdami patikrinkite, kuri Vaultwarden versija yra naujausia (leidimai GitHub), ir įrašykite ją į žymą (tag). Prievadus skelbia tik Caddy; jie turi būti vieši. Tomuose caddy-data (sertifikatai), uptime-kuma ir kataloge vw-data yra viskas, ką turite išsaugoti.
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 savaime gauna sertifikatą abiem pavadinimams ir nukreipia http į https. uptime-kuma ir vaultwarden yra paslaugų pavadinimai iš compose failo: Caddy jas randa vidiniame tinkle. Blokas header prideda papildomą antraštės eilutę prie kiekvieno status.example.com atsakymo; ją užduotyje naudosite kaip įrodymą, kad veikia būtent Jūsų tarpinio serverio konteineris. Su defer antraštė nustatoma po to, kai užpakalinė paslauga pateikia savo atsakymą. Jei norite ir HSTS bei kitų saugumo antraščių iš pamokos 7.4, įrašykite jas į tą patį bloką.
Saugus Vaultwarden nustatymas
Keturi dalykai lemia skirtumą tarp saugios ir pavojingos saugyklos.
Pirma: tik per https. Bitwarden žiniatinklio saugykla naudoja naršyklės kriptografiją, o naršyklės ją suteikia tik https puslapiuose. Todėl be https ji tinkamai neveikia, ir tai tik į gera. Vaultwarden dokumentacija https užtikrinti rekomenduoja atvirkštinį tarpinį serverį, pavyzdžiui, kaip čia, Caddy. Nustatykite DOMAIN į visą https adresą.
Antra: uždaryta registracija. Su SIGNUPS_ALLOWED: "true" bet kas, radęs puslapį, gali susikurti paskyrą Jūsų serveryje. Todėl paleiskite, iš karto susikurkite savo paskyrą (-as), nustatykite reikšmę į "false" ir dar kartą įvykdykite docker compose up -d. Jei vėliau norėsite ką nors pridėti, naudokite kvietimo funkciją administravimo lange.
Trečia: maišos funkcija apsaugotas administravimo raktas. Administravimo langas (/admin) apsaugotas su ADMIN_TOKEN. Neįrašykite ten skaitomo slaptažodžio, o Argon2 maišą (hash). Ją sukursite pačiu 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$...'Įrašykite šią eilutę į .env (t. y. VW_ADMIN_TOKEN='$argon2id$...', su viengubomis kabutėmis) ir padarykite failą skaitomą tik root: sudo chmod 600 .env. Faile .env ženklų $ dvigubinti nereikia; jei maišą įrašote tiesiai po environment: compose faile, tada reikia (kiekvienas $ tampa $$), kitaip Compose bandys juos pakeisti kaip kintamuosius. Prisijungiate prie /admin su slaptažodžiu, kurį įvedėte, o ne su maiša. Atkreipkite dėmesį: nustatymai, kuriuos išsaugote administravimo lange, patenka į vw-data/config.json ir tada turi pirmenybę prieš aplinkos kintamuosius.
Ketvirta: atsarginė kopija ir atkūrimas. Viskas yra kataloge vw-data: duomenų bazė, priedai ir raktai. Įtraukite šį katalogą į savo restic atsarginę kopiją (pamoka 8.2), o duomenų bazei laikykitės Vaultwarden wiki pateiktų atsarginių kopijų nurodymų, kad nenukopijuotumėte pusiau įrašyto failo. Išbandykite atkūrimą (užduotis O8.2): saugykla be veikiančios atsarginės kopijos kelia riziką visiems Jūsų slaptažodžiams.
Pranešimai tarp įrenginių (websockets) naujausiose Vaultwarden versijose veikia per tą patį prievadą; Caddy juos perduoda be papildomų nustatymų.
Uptime Kuma nustatymas
Po docker compose up -d atidarykite https://status.example.com. Pirmojo apsilankymo metu Uptime Kuma paprašys sukurti administratoriaus paskyrą. Padarykite tai iš karto: kol tokios paskyros nėra, ją gali sukurti bet kas, radęs puslapį. Jei visai nenorite šios rizikos, iš pradžių pašalinkite bloką status iš Caddyfile, sukurkite paskyrą per SSH tunelį (pamoka 2.3) ir tada grąžinkite bloką atgal.
Tada pridėkite stebėjimo taškus (monitors): HTTP stebėjimą savo svetainei, TCP stebėjimą prievadui, sertifikato įspėjimą ir pranešimų kanalą (el. paštą, pokalbių programą arba tiesioginių pranešimų paslaugą). Taip pat įjunkite dviejų veiksnių autentifikavimą Uptime Kuma nustatymuose.
Paleidimas ir patikra
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-opdrachtPrievadus turi tik Caddy. Jei sertifikato gauti nepavyksta, Caddy žurnaluose nurodyta priežastis: dažniausiai DNS dar nenukreiptas į serverį arba 80 prievadas nepasiekiamas (pamoka 7.3).
Atnaujinimas
Konteinerio unattended-upgrades neatnaujina (pamoka 4.2). Nustatykite tam pastovų laiką, pavyzdžiui, kas dvi savaites:
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 parsiunčia naujausius atvaizdus pagal Jūsų pasirinktą žymą (taigi caddy:2 lieka 2 versijos ribose). Vaultwarden su versijos numeriu atveju pirmiausia, perskaitę leidimo pastabas (release notes), pakeiskite žymą. Išleidus naują pagrindinę versiją, visada perskaitykite leidimo pastabas: kartais reikia ką nors pakeisti Jūsų nustatymuose. Prieš didelį atnaujinimą padarykite tomų atsarginę kopiją.
Taip pat sekite kūrėjų saugumo pranešimus. Vaultwarden arba Caddy pažeidžiamumas bus ištaisytas tik tada, kai parsisiųsite naują versiją.
Praktikoje
Šis receptas veikia bet kuriame VPS su Docker, WebOké ar kitame paslaugų teikėjo serveryje. Tai savipagalba: Jūsų VPS paslaugų teikėjas nieko nevaldo Jūsų konteinerių viduje. Prieš diegdami pirmą kartą, padarykite momentinę kopiją (snapshot), tada galėsite ramiai eksperimentuoti.
Santrauka
- Vienas compose failas su Caddy kaip atvirkštinio tarpinio serverio konteineriu; tik Caddy skelbia 80 ir 443 prievadus, paslaugos nieko neskelbia.
- Caddy automatiškai tvarko sertifikatus ir https, o su
headergali nustatyti nuosavas antraštės eilutes. - Vaultwarden: https privalomas,
DOMAINnustatytas į https adresą, registracija uždaroma susikūrus savo paskyrą,ADMIN_TOKENkaip Argon2 maiša faile.envsu teisėmis 600. - Uptime Kuma: iš karto sukurkite administratoriaus paskyrą ir įjunkite dviejų veiksnių autentifikavimą; ja daugiausia stebėkite kitus serverius ir svetaines.
- Darykite tomų ir katalogo
vw-dataatsargines kopijas, o atnaujinkite sudocker compose pullirup -dpastoviu laiku.
Testas (quiz)
Užduotis
Užduotis Z9.4: Įrodykite, kad Jūsų konteineris veikia. Užduotyje gaukite savo asmeninį kodą ir įrašykite jį į savo Caddy konteinerio Caddyfile kaip antraštę X-Weboke-Cursus vienam savo subdomenui (pavyzdžiui, status.<jouwdomein>). Iš naujo įkelkite Caddy ir įveskite serverio vardą. Programa atsisiunčia https://<hostnaam>/ ir patikrina, ar sertifikatas galioja ir ar antraštėje yra būtent Jūsų kodas. Be to, įklijuokite docker compose ps išvestį ir atsakykite, kuri paslauga vienintelė skelbia prievadus.
Skaitykite daugiau
- Slaptažodžių tvarkyklė ir prieigos raktai: taip saugiai sutvarkysite savo prisijungimą
- Uptime Kuma (diegimas su 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 dokumentacija, header: https://caddyserver.com/docs/caddyfile/directives/header
