Modulul 9 · 9.4
Rețete: Uptime Kuma și Vaultwarden
Modulul 9: Docker și docker compose · Timp de citire: 13 minute
Obiectivul lecției: După această lecție veți putea rula Uptime Kuma și Vaultwarden cu docker compose în spatele Caddy, cu https, înregistrare închisă, backup pentru volume și o metodă fixă de actualizare.
Noțiuni cheie: container reverse proxy, Caddyfile, https automat, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, backup pentru volume, docker compose pull, antet propriu
Ce construim
Două servicii utile pe propriul dumneavoastră server, fiecare pe un subdomeniu propriu:
- Uptime Kuma pe
status.example.com: un program de monitorizare cu interfață web care urmărește site-urile, porturile și certificatele dumneavoastră și vă trimite o notificare când ceva cade (lecția 8.3). Atenție: o monitorizare care rulează pe același server ca ceea ce monitorizează nu observă când întregul server cade. Folosiți-o deci pentru celelalte site-uri și servicii ale dumneavoastră sau instalați-o pe un al doilea server. - Vaultwarden pe
kluis.example.com: o versiune de server ușoară și independentă, care funcționează cu aplicațiile și extensiile de browser Bitwarden. Un seif de parole este un software sensibil: faceți acest lucru doar dacă sunteți dispus să îl întrețineți bine și să îi faceți backup. Este de asemenea perfect în regulă să folosiți pur și simplu managerul de parole al unui furnizor.
În fața lor punem Caddy într-un container: acesta preia porturile 80 și 443, se ocupă singur de certificatele Let's Encrypt (lecțiile 7.3 și 7.4) și trimite traficul mai departe către containerul potrivit. Uptime Kuma și Vaultwarden nu publică ele însele porturi (lecția 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Înainte de a începe
- Docker Engine cu plug-in-ul compose (lecția 9.2).
- Două înregistrări DNS care indică spre serverul dumneavoastră, A și AAAA (lecția 7.1):
status.example.comșikluis.example.com. - Porturile 80 și 443 libere pe server. Dacă pe aceste porturi rulează deja un nginx sau un Caddy al sistemului, containerul Caddy nu le poate folosi. Alegeți atunci: fie opriți serverul web al sistemului, fie îl lăsați pe acesta să facă munca de proxy și publicați containerele pe
127.0.0.1(lecția 9.3). În această rețetă se ocupă containerul Caddy. - În ufw deschideți 80/tcp, 443/tcp și, pentru HTTP/3, și 443/udp (lecția 5.2). Strict vorbind, Docker ocolește ufw, dar așa prezentarea firewall-ului dumneavoastră corespunde realității.
Fișierele
Totul se află într-un singur director, /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:Înainte de a începe, verificați care este cea mai nouă versiune Vaultwarden (versiunile publicate pe GitHub) și treceți-o în tag. Doar Caddy publică porturi; acestea trebuie să fie publice. Volumele caddy-data (certificate), uptime-kuma și directorul vw-data conțin tot ce trebuie să păstrați.
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 obține automat un certificat pentru ambele nume și redirecționează http către https. uptime-kuma și vaultwarden sunt numele serviciilor din fișierul compose: Caddy le găsește în rețeaua internă. Blocul header adaugă un antet suplimentar în fiecare răspuns de la status.example.com; îl folosiți în exercițiu ca dovadă că rulează containerul dumneavoastră proxy. Cu defer, antetul este setat după ce serviciul din spate și-a dat răspunsul. Dacă doriți și HSTS și celelalte antete de securitate din lecția 7.4, puneți-le în același bloc.
Configurarea sigură a Vaultwarden
Patru lucruri fac diferența între un seif sigur și unul periculos.
Unu: doar prin https. Seiful web Bitwarden folosește criptografia browserului, iar browserele o pun la dispoziție doar pe paginile https. Fără https nu funcționează deci corect, și e bine că este așa. Documentația Vaultwarden recomandă un reverse proxy pentru https, cum este Caddy aici. Setați DOMAIN la adresa https completă.
Doi: înregistrarea închisă. Cu SIGNUPS_ALLOWED: "true", oricine găsește pagina poate crea un cont pe serverul dumneavoastră. Porniți deci serviciul, creați imediat propriul cont (propriile conturi), setați valoarea la "false" și rulați din nou docker compose up -d. Dacă doriți mai târziu să adăugați pe cineva, folosiți funcția de invitație din pagina de administrare.
Trei: un token de administrare hash-uit. Pagina de administrare (/admin) este protejată cu ADMIN_TOKEN. Nu puneți acolo o parolă lizibilă, ci un hash Argon2. Îl generați cu Vaultwarden însuși:
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$...'Puneți acel rând în .env (adică VW_ADMIN_TOKEN='$argon2id$...', cu ghilimele simple) și faceți fișierul lizibil doar pentru root: sudo chmod 600 .env. Într-un fișier .env nu trebuie să dublați caracterele $; dacă puneți hash-ul direct sub environment: în fișierul compose, atunci da (fiecare $ devine $$), altfel Compose încearcă să le completeze ca variabile. Autentificarea pe /admin se face cu parola pe care ați tastat-o, nu cu hash-ul. Atenție: setările pe care le salvați în pagina de administrare ajung în vw-data/config.json și au apoi prioritate față de variabilele de mediu.
Patru: backup și restaurare. Totul se află în vw-data: baza de date, atașamentele și cheile. Includeți acest director în backupul restic (lecția 8.2) și, pentru baza de date, urmați instrucțiunile de backup din wiki-ul Vaultwarden, ca să nu copiați un fișier scris pe jumătate. Testați restaurarea (exercițiul O8.2): un seif fără un backup funcțional este un risc pentru toate parolele dumneavoastră.
Notificările între dispozitive (websockets) funcționează în versiunile recente ale Vaultwarden prin același port; Caddy le transmite fără nicio setare suplimentară.
Configurarea Uptime Kuma
După docker compose up -d deschideți https://status.example.com. La prima vizită, Uptime Kuma vă cere să creați un cont de administrator. Faceți acest lucru imediat: cât timp acel cont nu există, oricine găsește pagina îl poate crea. Dacă nu doriți deloc acest risc, scoateți mai întâi blocul status din Caddyfile, creați contul printr-un tunel SSH (lecția 2.3) și apoi puneți blocul înapoi.
Apoi adăugați monitoare: un monitor HTTP pentru site-ul dumneavoastră, un monitor TCP pentru un port, o avertizare pentru certificate și un canal de notificare (e-mail, un program de chat sau un serviciu push). Activați de asemenea autentificarea în doi pași în setările Uptime Kuma.
Pornire și verificare
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-opdrachtDoar Caddy are porturi. Dacă certificatul nu reușește, în jurnalele Caddy scrie de ce: de obicei DNS-ul nu indică încă spre server sau portul 80 nu este accesibil (lecția 7.3).
Actualizare
Un container nu este actualizat de unattended-upgrades (lecția 4.2). Stabiliți un moment fix, de exemplu la fiecare două săptămâni:
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 descarcă cele mai noi imagini în cadrul tagului ales (deci caddy:2 rămâne în cadrul versiunii 2). Pentru Vaultwarden cu număr de versiune, modificați mai întâi tagul, după ce ați citit notele de versiune. La o nouă versiune majoră citiți întotdeauna notele de versiune: uneori trebuie schimbat ceva în setările dumneavoastră. Înainte de o actualizare mare, faceți un backup al volumelor.
Urmăriți și anunțurile de securitate ale dezvoltatorilor. O vulnerabilitate în Vaultwarden sau Caddy este remediată doar dacă descărcați dumneavoastră noua versiune.
În practică
Această rețetă funcționează pe orice VPS cu Docker, la WebOké sau la alt furnizor. Este autoajutorare: furnizorul VPS-ului dumneavoastră nu administrează nimic în interiorul containerelor dumneavoastră. Faceți un snapshot înainte de prima configurare, astfel puteți experimenta liniștit.
Rezumat
- Un singur fișier compose cu Caddy drept container reverse proxy; doar Caddy publică porturile 80 și 443, serviciile nimic.
- Caddy se ocupă automat de certificate și https și poate seta antete proprii cu
header. - Vaultwarden: https obligatoriu,
DOMAINla adresa https, înregistrarea închisă după crearea propriului cont,ADMIN_TOKENca hash Argon2 într-un.envcu permisiuni 600. - Uptime Kuma: creați imediat contul de administrator și activați autentificarea în doi pași; monitorizați cu el mai ales alte servere și site-uri.
- Faceți backup pentru volume și pentru directorul
vw-datași actualizați cudocker compose pullșiup -dla un moment fix.
Test (quiz)
Exercițiu
Exercițiul Z9.4: Dovediți că containerul dumneavoastră rulează. Obțineți în exercițiu codul dumneavoastră personal și puneți-l în Caddyfile-ul containerului Caddy ca antet X-Weboke-Cursus pentru un subdomeniu al dumneavoastră (de exemplu status.<jouwdomein>). Reîncărcați Caddy și completați numele de gazdă. Programul descarcă https://<hostnaam>/ și verifică dacă certificatul este valid și dacă antetul conține exact codul dumneavoastră. În plus, lipiți rezultatul comenzii docker compose ps și răspundeți care serviciu este singurul care publică porturi.
Lecturi suplimentare
- Manager de parole și passkeys: cum vă gestionați autentificarea în siguranță
- Uptime Kuma (instalare cu Docker): 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
- Documentația Caddy, header: https://caddyserver.com/docs/caddyfile/directives/header
- VPS: de la prima autentificare la un server securizat 7.1: Uptime Kuma: monitorizarea site-urilor și a serverului dvs.
- VPS: de la prima autentificare la un server securizat 7.2: Vaultwarden: propriul dvs. seif de parole
- Managerul de parole în practică 1.4: Toți managerii de parole cunoscuți comparați: țară, opțiuni, recenzii și scoruri
- Curs gratuit Siguranță online pentru antreprenori 2.2: Alegerea și utilizarea managerilor de parole
