Readiness audit 2026-06-24
Check a 360 gradi del droplet prima delle migrazioni production
Audit eseguito il 2026-06-24 su obelica-prod.
Scopo: verificare se la VPS e' pronta a sostenere le prime migrazioni production app per app, senza modifiche distruttive e senza toccare database managed o Spaces di produzione.
Esito sintetico
| Ambito | Punteggio | Stato |
|---|---|---|
| Stato generale droplet | 88/100 | buono |
| Runtime Docker e container | 90/100 | buono |
| Routing, TLS e Traefik | 88/100 | buono |
| Sicurezza host e superfici pubbliche | 82/100 | buono, con verifiche root/Cloud Firewall manuali |
| Backup e restore | 86/100 | solido, manca restore su droplet separato |
| Storage e dati esterni | 88/100 | buono |
| Disco e capacita | 84/100 | buono, da monitorare |
| Cron e automazioni | 74/100 | parziale |
| CI/CD e Forgejo | 78/100 | funzionante per docs, da estendere |
| Osservabilita e alert | 62/100 | base |
| Documentazione operativa | 90/100 | buona |
| Readiness migrazione production | 82/100 | pronta per pilota controllato |
Valutazione globale: 84/100.
Check eseguiti
Comandi principali:
obelica health
obelica backup status
obelica backup verify-offsite
bash infra/scripts/check-security.sh
docker ps
docker stats --no-stream
docker system df
curl -k https://<host>
openssl s_client -servername <host> -connect <host>:443Risultati
Host
- Ubuntu 24.04 LTS su DigitalOcean, regione FRA1.
- Uptime: oltre 8 giorni.
- Load basso.
- RAM disponibile: circa 2.4 GiB.
- Swap in uso: circa 1.1 GiB su 2.0 GiB.
- Nessun reboot richiesto.
- Update Docker/containerd applicato dopo il readiness check.
- Nessun reboot richiesto dopo l'update.
Disco
- Root filesystem: circa 31 GiB usati su 77 GiB, ~40%.
/opt/obelica: circa 9.2 GiB./opt/obelica/backups: circa 3.7 GiB, 1 snapshot locale./opt/obelica/repos: circa 3.8 GiB./opt/obelica/data: circa 1.8 GiB, quasi tutto Forgejo.
Nota: docker builder prune non ha liberato ulteriore spazio perche' i layer residui risultano ancora riferiti da BuildKit.
Docker
Tutti i container attesi risultano running:
traefik;whoami;forgejo;forgejo-db;forgejo-runner-obelica-docs;obelica-docs;- tutte le app cliente candidate su
*.vps.obelica.com; tulpa-studioanche sutulpastudio.comewww.tulpastudio.com.
Uso memoria container nella norma. Forgejo e Traefik sono i servizi piu' attivi, ma non mostrano pressione anomala.
Routing e TLS
Endpoint verificati:
test.obelica.com: 200;vps.obelica.com: 200;- app
*.vps.obelica.com: 200 o redirect applicativo verso 200; tulpastudio.com: redirect versowww.tulpastudio.com, finale 200;www.tulpastudio.com: 200.
Certificati Let's Encrypt validi sui domini controllati. vps.obelica.com e' coperto via SAN insieme a test.obelica.com.
Sicurezza
Confermato:
- SSH password login disabilitato nella config leggibile;
- root login SSH disabilitato nella config leggibile;
- Forgejo HTTP bindato su
127.0.0.1:3333; - Obelica Docs bindato su
127.0.0.1:3334; - Traefik dashboard bindata su
127.0.0.1:8080; - porte pubbliche attese:
22,80,443; ufw,fail2ban,sshedockerattivi;- permessi secret principali corretti: directory
700, file env600,acme.json600.
Limiti del check:
- l'utente operativo non ha
sudo -n, quindi le regole dettagliate UFW e lo stato jail Fail2ban richiedono verifica manuale o sessione con password; - il DigitalOcean Cloud Firewall resta il controllo principale per limitare SSH a IP fidati e va verificato periodicamente dal pannello DO.
Backup
Stato verificato:
- ultimo backup locale:
/opt/obelica/backups/auto/20260624-013111; - 1 snapshot locale;
- dimensione snapshot: circa 3.95 GB;
- manifest offsite presente e verificato su
obelica-backups-prod; - cron giornaliero: backup, sync offsite, verifica offsite, prune locale a 1 snapshot.
Gap:
- restore test logico gia' fatto;
- manca ancora restore completo su droplet temporaneo separato.
Logs
Log recenti:
- molte righe nginx sono probe esterni su path inesistenti (
/.env,phpinfo.php,wp-json, ecc.); - alcune app Next.js registrano richieste a Server Action non piu' valide dopo deploy, compatibili con client/browser su versioni vecchie;
- Traefik ha una riga ACME
missing tokenisolata da controllare se ricompare.
Non sono emersi crash o container in restart loop.
Cron
Attivo:
- backup giornaliero alle 04:00.
Non attivi:
- cron applicativi Wash Dog, Tulpa e Sonja sono commentati come staging.
Questo e' corretto per non far partire automazioni non validate, ma resta il principale gap prima di migrare app che dipendono da scheduler.
Repo
Repo principali puliti (dirty=0):
- app cliente;
obelica-docs;obelica-tools.
Preparativi applicati
Eseguito tentativo di prune BuildKit:
docker builder prune -af --filter until=24hRisultato: nessuno spazio liberato perche' i layer erano ancora riferiti. Non e' stato eseguito docker image prune -a per evitare rimozioni inutilmente aggressive su una macchina gia' in produzione.
Rischi residui
- Monitoring e alert insufficienti: oggi i check sono manuali/CLI.
- Cron applicativi non ancora orchestrati production-ready: serve policy per riattivarli app per app.
- Restore completo non provato su droplet separato: il backup e' verificato, ma manca prova end-to-end infrastrutturale.
- Verifica UFW/Fail2ban dettagliata richiede sudo: il check non puo' leggere tutto senza password.
- Single droplet: non c'e' alta disponibilita.
Maintenance Docker 2026-06-24
Dopo il readiness audit e' stato applicato l'update Docker/containerd in maintenance leggera.
Pacchetti aggiornati:
containerd.io:2.2.5;docker-ce:29.6.0;docker-ce-cli:29.6.0;docker-ce-rootless-extras:29.6.0;docker-model-plugin:1.2.4.
Esito:
- nessun reboot richiesto;
- Docker service attivo;
- tutti i container sono ripartiti;
forgejo-dbhealthy;obelica health: OK 15, WARN 0, UNKNOWN 0, FAIL 0;obelica backup status: OK;obelica backup verify-offsite: OK;- smoke test HTTPS pubblico: tutti gli host controllati hanno risposto 200.
Host smoke testati:
test.obelica.com;vps.obelica.com;- tutte le app
*.vps.obelica.com; tulpastudio.com;www.tulpastudio.com.
Update Ubuntu completati successivamente nella stessa giornata:
kpartx;multipath-tools.
Post-check dopo tutti gli update:
apt list --upgradable: nessun pacchetto residuo;no-reboot-required;obelica health: OK 15, WARN 0, UNKNOWN 0, FAIL 0;- ultimo backup locale:
/opt/obelica/backups/auto/20260624-040001; obelica backup verify-offsite: manifest offsite verificato;- smoke test HTTPS completo: tutti gli host controllati hanno risposto 200.
Restore test completo su droplet temporaneo (2026-06-26)
Eseguito restore test end-to-end sul droplet obelica-restore-test (Ubuntu 24.04,
FRA1, stesso VPC di produzione) usando lo snapshot 20260626-040002.
Provisioning:
apt-get install -y zstd docker.io docker-compose-v2 git curl wget jq postgresql-client
systemctl enable --now dockerAzioni svolte:
- copia di
/opt/obelica/infra/tools/obelica-backupe di.backup-passphrasedal server produzione; - trasferimento dello snapshot cifrato via
rsync; - decifratura di
config.tar.zst.enc,secrets.tar.zst.enc,forgejo-app-data.tar.zst.ence di tutti i dump SQL; - verifica
gzip -tsui dump SQL; - estrazione config, secrets, app-data Forgejo e Git bundle;
- restore dei dump in container Postgres locale e conteggio tabelle/dati;
- verifica Git bundle con
git bundle list-headse clone campione; - smoke test: build e avvio di
obelica-docsdal bundle ripristinato, risposta HTTP 200 suhttp://127.0.0.1:3334/; - cleanup di tutti i dati, container e chiavi temporanee.
Esito: superato. I dati sono ripristinabili e l'applicazione docs e'
ricostruibile dal backup. Gli unici errori rilevati sono stati ROLE does not exist
non fatali dovuti al container Postgres locale privo dei ruoli managed DB.
Raccomandazione
La VPS e' pronta per proseguire con una migrazione pilota controllata (tulpa-studio) mantenendo rollback DNS e Vercel attivi.
Prima di migrare app con automazioni reali:
- definire e testare i cron in Rust/control plane;
- aggiungere un check/alert minimo su disco, backup e container;
fare almeno un restore completo su droplet temporaneofatto il 2026-06-26;- verificare da pannello DigitalOcean che SSH sia limitato a IP fidati.