Ricette: Uptime Kuma e Vaultwarden
Modulo 9: Docker e docker compose · Tempo di lettura: 13 minuti
Obiettivo della lezione: Dopo questa lezione Lei sarà in grado di eseguire Uptime Kuma e Vaultwarden con docker compose dietro Caddy, con https, registrazione chiusa, backup dei volumi e una procedura fissa di aggiornamento.
Concetti chiave: container reverse proxy, Caddyfile, https automatico, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websocket, backup dei volumi, docker compose pull, header personalizzato
Che cosa costruiamo
Due servizi utili sul Suo server, ciascuno su un proprio sottodominio:
- Uptime Kuma su
status.example.com: un programma di monitoraggio con interfaccia web che tiene d'occhio i Suoi siti web, le porte e i certificati e Le invia una notifica quando qualcosa smette di funzionare (lezione 8.3). Attenzione: un monitoraggio che gira sullo stesso server che sorveglia non si accorge se l'intero server va giù. Lo usi quindi per gli altri Suoi siti e servizi, oppure lo installi su un secondo server. - Vaultwarden su
kluis.example.com: una versione server leggera e indipendente che funziona con le app e le estensioni per browser di Bitwarden. Una cassaforte per password è un software delicato: lo faccia solo se è disposto a mantenerla con cura e a farne il backup. Va benissimo anche usare semplicemente un gestore di password di un fornitore.
Davanti mettiamo Caddy in un container: riceve il traffico sulle porte 80 e 443, gestisce da solo i certificati di Let's Encrypt (lezioni 7.3 e 7.4) e inoltra il traffico al container giusto. Uptime Kuma e Vaultwarden non pubblicano porte proprie (lezione 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Prerequisiti
- Docker Engine con il plug-in compose (lezione 9.2).
- Due record DNS che puntano al Suo server, A e AAAA (lezione 7.1):
status.example.comekluis.example.com. - Le porte 80 e 443 libere sul server. Se su queste porte gira già un nginx o un Caddy di sistema, il container Caddy non può usarle. In tal caso scelga: o ferma il server web di sistema, oppure lascia a lui il lavoro di proxy e pubblica i container su
127.0.0.1(lezione 9.3). In questa ricetta se ne occupa il container Caddy. - In ufw aprire 80/tcp, 443/tcp e, per HTTP/3, anche 443/udp (lezione 5.2). A rigore Docker aggira ufw, ma così la panoramica del Suo firewall corrisponde alla realtà.
I file
Tutto va in un'unica cartella, /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:Prima di iniziare verifichi quale sia la versione più recente di Vaultwarden (le release su GitHub) e la inserisca nel tag. Solo Caddy pubblica porte, e queste devono essere pubbliche. I volumi caddy-data (certificati), uptime-kuma e la cartella vw-data contengono tutto ciò che deve conservare.
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 ottiene automaticamente un certificato per entrambi i nomi e reindirizza http verso https. uptime-kuma e vaultwarden sono i nomi dei servizi del file compose: Caddy li trova sulla rete interna. Il blocco header aggiunge un header in più a ogni risposta di status.example.com; nell'esercizio Lei lo userà come prova che il Suo container proxy è in esecuzione. Con defer l'header viene impostato dopo che il servizio retrostante ha fornito la sua risposta. Se desidera anche HSTS e gli altri header di sicurezza della lezione 7.4, li inserisca nello stesso blocco.
Configurare Vaultwarden in modo sicuro
Quattro aspetti fanno la differenza tra una cassaforte sicura e una pericolosa.
Uno: solo tramite https. La cassaforte web di Bitwarden utilizza la crittografia del browser, e i browser la rendono disponibile solo sulle pagine https. Senza https quindi non funziona bene, ed è giusto così. La documentazione di Vaultwarden consiglia un reverse proxy per https, come Caddy in questo caso. Imposti DOMAIN sull'indirizzo https completo.
Due: registrazione chiusa. Con SIGNUPS_ALLOWED: "true" chiunque trovi la pagina può creare un account sul Suo server. Avvii quindi il servizio, crei subito il Suo account (o i Suoi account), imposti il valore su "false" ed esegua di nuovo docker compose up -d. Se in seguito desidera aggiungere qualcuno, usi la funzione di invito nella pagina di amministrazione.
Tre: un token di amministrazione con hash. La pagina di amministrazione (/admin) è protetta con ADMIN_TOKEN. Non inserisca lì una password leggibile, ma un hash Argon2. Lo crea con Vaultwarden stesso:
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$...'Inserisca quella riga in .env (quindi VW_ADMIN_TOKEN='$argon2id$...', con apici singoli) e renda il file leggibile solo da root: sudo chmod 600 .env. In un file .env non è necessario raddoppiare i caratteri $; se invece inserisce l'hash direttamente sotto environment: nel file compose, deve farlo (ogni $ diventa $$), altrimenti Compose cerca di interpretarli come variabili. Per accedere a /admin usi la password che ha digitato, non l'hash. Attenzione: le impostazioni che salva nella pagina di amministrazione finiscono in vw-data/config.json e hanno quindi la precedenza sulle variabili d'ambiente.
Quattro: backup e ripristino. Tutto si trova in vw-data: il database, gli allegati e le chiavi. Includa questa cartella nel Suo backup con restic (lezione 8.2) e, per il database, segua le istruzioni di backup del wiki di Vaultwarden, in modo da non copiare un file scritto a metà. Verifichi il ripristino (esercizio O8.2): una cassaforte senza un backup funzionante è un rischio per tutte le Sue password.
Le notifiche tra dispositivi (websocket) passano, nelle versioni recenti di Vaultwarden, sulla stessa porta; Caddy le inoltra senza impostazioni aggiuntive.
Configurare Uptime Kuma
Dopo docker compose up -d apra https://status.example.com. Alla prima visita Uptime Kuma Le chiede di creare un account amministratore. Lo faccia subito: finché quell'account non esiste, chiunque trovi la pagina può crearlo. Se non vuole correre affatto questo rischio, tolga prima il blocco status dal Caddyfile, crei l'account tramite un tunnel SSH (lezione 2.3) e poi rimetta il blocco.
Successivamente aggiunga i monitor: un monitor HTTP per il Suo sito web, un monitor TCP per una porta, un avviso sui certificati e un canale di notifica (e-mail, un programma di chat o un servizio push). Attivi anche la verifica in due passaggi nelle impostazioni di Uptime Kuma.
Avviare e 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-opdrachtSolo Caddy ha porte. Se il certificato non viene emesso, i log di Caddy ne indicano il motivo: di solito il DNS non punta ancora al server, oppure la porta 80 non è raggiungibile (lezione 7.3).
Aggiornare
Un container non viene aggiornato da unattended-upgrades (lezione 4.2). Ne faccia un appuntamento fisso, per esempio ogni due settimane:
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 scarica le immagini più recenti all'interno del tag che ha scelto (quindi caddy:2 resta nella versione 2). Per Vaultwarden con un numero di versione, aggiorni prima il tag dopo aver letto le note di rilascio. In caso di una nuova versione principale legga sempre le note di rilascio: a volte occorre modificare qualcosa nelle impostazioni. Prima di un aggiornamento importante faccia un backup dei volumi.
Segua anche gli avvisi di sicurezza degli sviluppatori. Una vulnerabilità in Vaultwarden o Caddy viene risolta solo quando Lei scarica la nuova versione.
Nella pratica
Questa ricetta funziona su qualsiasi VPS con Docker, presso WebOké o presso un altro fornitore. Si tratta di fai da te: il fornitore del Suo VPS non gestisce nulla all'interno dei Suoi container. Crei uno snapshot prima della prima installazione: così potrà sperimentare in tutta tranquillità.
Riepilogo
- Un unico file compose con Caddy come container reverse proxy; solo Caddy pubblica le porte 80 e 443, i servizi nessuna.
- Caddy gestisce automaticamente certificati e https e con
headerpuò impostare header personalizzati. - Vaultwarden: https obbligatorio,
DOMAINsull'indirizzo https, registrazione chiusa dopo il Suo account,ADMIN_TOKENcome hash Argon2 in un.envcon permessi 600. - Uptime Kuma: creare subito l'account amministratore e attivare la verifica in due passaggi; lo usi soprattutto per sorvegliare altri server e siti.
- Faccia il backup dei volumi e della cartella
vw-data, e aggiorni condocker compose pulleup -da scadenza fissa.
Quiz
Esercizio
Esercizio Z9.4: Dimostri che il Suo container è in esecuzione. Nell'esercizio recuperi il Suo codice personale e lo inserisca nel Caddyfile del Suo container Caddy come header X-Weboke-Cursus per un Suo sottodominio (come status.<jouwdomein>). Ricarichi Caddy e inserisca il nome host. Il programma recupera https://<hostnaam>/ e verifica che il certificato sia valido e che l'header contenga esattamente il Suo codice. Incolli inoltre l'output di docker compose ps e indichi quale servizio è l'unico a pubblicare porte.
Per approfondire
- Gestore delle password e passkey: così gestisce il Suo accesso in modo sicuro
- Uptime Kuma (installazione con Docker): https://github.com/louislam/uptime-kuma
- Wiki di Vaultwarden, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Wiki di Vaultwarden, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Wiki di Vaultwarden, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Documentazione di Caddy, header: https://caddyserver.com/docs/caddyfile/directives/header
