Obelica Docs
Audit

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

AmbitoPunteggioStato
Stato generale droplet88/100buono
Runtime Docker e container90/100buono
Routing, TLS e Traefik88/100buono
Sicurezza host e superfici pubbliche82/100buono, con verifiche root/Cloud Firewall manuali
Backup e restore86/100solido, manca restore su droplet separato
Storage e dati esterni88/100buono
Disco e capacita84/100buono, da monitorare
Cron e automazioni74/100parziale
CI/CD e Forgejo78/100funzionante per docs, da estendere
Osservabilita e alert62/100base
Documentazione operativa90/100buona
Readiness migrazione production82/100pronta 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>:443

Risultati

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-studio anche su tulpastudio.com e www.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 verso www.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, ssh e docker attivi;
  • permessi secret principali corretti: directory 700, file env 600, acme.json 600.

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 token isolata 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=24h

Risultato: 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

  1. Monitoring e alert insufficienti: oggi i check sono manuali/CLI.
  2. Cron applicativi non ancora orchestrati production-ready: serve policy per riattivarli app per app.
  3. Restore completo non provato su droplet separato: il backup e' verificato, ma manca prova end-to-end infrastrutturale.
  4. Verifica UFW/Fail2ban dettagliata richiede sudo: il check non puo' leggere tutto senza password.
  5. 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-db healthy;
  • 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 docker

Azioni svolte:

  • copia di /opt/obelica/infra/tools/obelica-backup e di .backup-passphrase dal server produzione;
  • trasferimento dello snapshot cifrato via rsync;
  • decifratura di config.tar.zst.enc, secrets.tar.zst.enc, forgejo-app-data.tar.zst.enc e di tutti i dump SQL;
  • verifica gzip -t sui 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-heads e clone campione;
  • smoke test: build e avvio di obelica-docs dal bundle ripristinato, risposta HTTP 200 su http://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:

  1. definire e testare i cron in Rust/control plane;
  2. aggiungere un check/alert minimo su disco, backup e container;
  3. fare almeno un restore completo su droplet temporaneo fatto il 2026-06-26;
  4. verificare da pannello DigitalOcean che SSH sia limitato a IP fidati.

On this page