Audit infrastruttura 2026-07-01
Audit a 360 gradi di obelica-prod e roadmap di miglioramento per infrastruttura clienti dedicata
Audit eseguito il 2026-07-01 su obelica-prod in modalita read-only.
Scopo: capire quanto l'infrastruttura e' pronta a sostituire progressivamente Vercel, Neon e servizi esterni simili per i progetti cliente, e quali interventi rendono Obelica una piattaforma dedicata affidabile.
Perimetro
Controlli eseguiti senza stampare valori segreti:
- host, OS, disco, memoria, pacchetti e reboot richiesto;
- Docker, Compose, container, reti, immagini e build cache;
- Traefik, porte pubbliche, router e domini production/staging;
- Forgejo, runner, docs e repository locali;
- backup locale/offsite e stato ultimo job;
- crontab, cron applicativi, monitoraggio e log principali;
- inventario env solo per nomi/categorie di provider, non valori;
- validita della documentazione Fumadocs e navigazione
meta.json.
Non sono stati cambiati DNS, database, backup, servizi systemd o segreti.
Stato sintetico
| Area | Stato | Note |
|---|---|---|
| Host | Buono | Ubuntu 24.04.4 LTS, uptime circa 15 giorni, load basso |
| Risorse | Buono con margine limitato | 4 GB RAM, root 77 GB al 46%, swap usata circa 1 GB |
| Docker | Buono | 21 container running, Docker 29.6.0, Compose 5.1.4 |
| Staging app | Buono | smoke globale 96 OK, 0 WARN, 0 UNKNOWN, 0 FAIL |
| Produzione VPS | In corso | tulpastudio.com e otticastyleorsola.it gia instradati sul VPS |
| Sicurezza host | Parziale | porte corrette, ma Cloud Firewall/UFW/fail2ban non verificati in modo probante dalla shell |
| Backup | Buono | ultimo backup locale/offsite 20260630-040001 verificato |
| Database | Intermedio | app DB su DigitalOcean Managed Postgres, non Neon; non ancora piattaforma DB proprietaria self-hosted |
| Cron | Attivo ma da governare | cron applicativi attivi; docs precedenti li dichiaravano in pausa |
| Osservabilita | Base | health + Telegram + bot, ma niente metriche storiche/SLO/log centralizzati |
| CI/CD | Parziale | deploy centralizzato Rust e runner docs; app clienti ancora senza pipeline standard completa |
| Documentazione | Buona ma non allineata | snapshot principali datati 2026-06-24, alcune pagine nascoste da meta.json |
Valutazione globale attuale: 78/100.
L'infrastruttura e' gia utilizzabile per migrazioni controllate app per app. Non e' ancora una piattaforma pienamente autonoma e ripetibile per sostituire Vercel/Neon su scala clienti senza ulteriori hardening.
Evidenze principali
Host e risorse
- Provider: DigitalOcean Droplet in FRA1.
- OS: Ubuntu 24.04.4 LTS, kernel
6.8.0-124-generic. - Disco root: 77 GB, circa 35 GB usati, 42 GB liberi, 46%.
- RAM: 3.8 GiB totali, circa 2.4 GiB disponibili al momento dell'audit.
- Swap: 2.0 GiB totali, circa 965 MiB usati.
- Pacchetti aggiornabili presenti: Docker 29.6.1/Compose 5.2.0 e update security
libnss3,libsqlite3-0. - Nessun reboot richiesto.
Docker runtime
- Container running: 21.
- Immagini: 12.95 GB, reclaimable 4.826 GB.
- Build cache: 2.377 GB.
- Solo
forgejo-dbha healthcheck Docker nativo. - I container usano
restart: unless-stopped, ma non hanno limitimemory,cpus,pids_limitoread_only. - Forgejo e' il container piu pesante: circa 1.6 GiB al momento dell'audit.
Routing e domini
- Porte pubbliche attese:
22,80,443. - Dashboard Traefik:
127.0.0.1:8080. - Forgejo:
127.0.0.1:3333. - Docs:
127.0.0.1:3334. - Tutti i domini staging
*.vps.obelica.comcontrollati dallo smoke test sono verdi. - Router production gia presenti su Traefik:
tulpastudio.com,www.tulpastudio.com;otticastyleorsola.it,www.otticastyleorsola.it.
Backup
- Ultimo backup locale:
/opt/obelica/backups/auto/20260630-040001. - Stato: OK.
- Manifest offsite verificato su Spaces.
- Retention locale: 1 snapshot.
- Gap residui gia noti:
- definire retention remota su Spaces;
- cifrare anche
repos.tar.zst, oggi non cifrato.
Database e dipendenze esterne
Classificazione senza stampare URL o credenziali:
| App/env | DB | Storage/dipendenze rilevate |
|---|---|---|
alessandro-zucchini | DigitalOcean Managed Postgres | Cloudinary, SDK S3 presente |
macelleria | DigitalOcean Managed Postgres | nessuno storage dedicato rilevato |
sonja-trekking | DigitalOcean Managed Postgres | token Vercel Blob ancora presente, Cloudinary, SDK S3 |
tulpa-studio | DigitalOcean Managed Postgres | Spaces in production env, token Vercel Blob ancora presente |
wash-dog-ferrara | DigitalOcean Managed Postgres | dipendenza codice @neondatabase/serverless ancora presente |
| app statiche/siti senza DB | nessun DB rilevato | env Vercel residue diffuse |
Conclusione: la migrazione fuori da Neon e' in gran parte gia avvenuta verso DigitalOcean Managed Postgres, ma questo non equivale ancora a una piattaforma database personale. Se l'obiettivo e' ridurre anche il managed DB, serve un progetto Postgres proprietario con ruoli, backup, PITR, pooling, restore e monitoraggio.
Cron e automazioni
Crontab reale al momento dell'audit:
- backup giornaliero alle 04:00;
- health check ogni 5 minuti;
- cron applicativi Wash Dog alle 05:00, 09:00, 10:00, 11:00;
- cron Tulpa mensile;
- cron Sonja giornaliero con
|| trueper tollerare timeout SMTP; - Docker cleanup alle 02:00.
Gap: la pagina operations/cron-jobs dichiarava i cron applicativi in pausa. Lo stato reale e' diverso e va governato come produzione.
Monitoraggio
Presente:
- health check Bash ogni 5 minuti;
- alert Telegram con deduplicazione;
- bot Telegram interattivo;
- smoke test staging globale;
- log rotation Docker.
Gap:
- nessuna serie storica di metriche;
- nessun SLO/uptime per app cliente;
- nessun alert per singolo cron fallito se l'output non viene trasformato in stato;
monitor.logmostra righe duplicate, probabilmente per uso combinato ditee -anello script e redirection crontab sullo stesso file.
Sicurezza
Punti positivi:
- SSH password login e root login disabilitati nella config leggibile;
- servizi admin su loopback;
- secret principali con permessi corretti;
- Traefik
exposedbydefault=false; - Forgejo e docs privati via tunnel.
Punti da chiudere:
doctlnon disponibile sul server, quindi Cloud Firewall non verificato da CLI;- UFW/fail2ban/effective
sshd -Trichiedono sudo o verifica manuale; - utente
bonanel gruppodocker, quindi root-equivalent; - Traefik legge il Docker socket host;
- runner Forgejo docs monta
/opt/obelica, da trattare come componente privilegiato; - nessun hardening container con filesystem read-only o limiti risorse.
Repository e documentazione
Repo locali:
- tutte le app principali risultano pulite tranne
ottica-stylecon 1 modifica non committata; obelica-docsha modifiche non committate e due nuove pagine migrazione gia presenti;obelica-docse' la fonte di verita, ma molte pagine snapshot sono ferme al 2026-06-24.
Problemi documentali rilevati:
current-statenon riflette pienamente cron attivi, cutover Ottica e stato 2026-07-01;services/appsdescrive tutte le app come candidate staging e alcuni DB come DigitalOcean anche per app senza DB;operations/cron-jobsnon rispecchia il crontab reale;- alcune pagine esistenti non erano presenti nei rispettivi
meta.jsone quindi rischiavano di non comparire in navigazione:monitoring,cron-jobs,autodeploy,cutover-tulpastudio,obelica-backup,certificates.
Rischi critici
-
Single droplet senza piano HA Backup e restore sono buoni, ma un incidente sul droplet richiede ricostruzione manuale. Per clienti production serve almeno runbook di rebuild e obiettivo RTO/RPO esplicito.
-
Piattaforma DB non ancora proprietaria L'uscita da Neon e' quasi completata verso DigitalOcean Managed Postgres, ma il requisito strategico e' infrastruttura personale. La decisione va formalizzata: managed DO come compromesso accettato oppure Postgres self-hosted con oneri operativi completi.
-
Verifica sicurezza non probante La shell conferma poche superfici pubbliche, ma non prova Cloud Firewall, UFW, fail2ban e configurazione SSH effettiva. Va creato un comando/procedura che produca evidenza ripetibile.
-
Cron production attivi ma governance incompleta I cron applicativi sono attivi e scrivono log, ma manca stato per-job, alert per fallimento e documentazione allineata.
-
Container senza healthcheck e resource policy Un container puo essere
runningma non sano. Inoltre un'app o Forgejo possono consumare RAM senza limiti e degradare le altre app. -
Osservabilita insufficiente per molti clienti Health check e Telegram bastano per bootstrap, non per capire trend, saturazione, errori applicativi, cron falliti e incidenti post-migrazione.
Rischi non critici ma importanti
- residui Vercel env diffusi in quasi tutti gli env app;
- token Vercel Blob ancora presenti in app gia parzialmente migrate a Spaces;
- dipendenza
@neondatabase/serverlessancora presente in Wash Dog; - production router misti staging/production da documentare app per app;
- pagine Fumadocs non sempre indicizzate nei
meta.json; - update Docker/security disponibili ma non urgenti;
repos.tar.zstbackup non cifrato;monitor.logduplicato;- assenza di registry immagini e release artifact versionati.
Priorita consigliata
P0 - Entro 24 ore
- Allineare documentazione navigabile: audit, roadmap, cron reali e production router attivi.
- Verificare Cloud Firewall DigitalOcean da pannello o workstation con
doctl. - Decidere se i cron applicativi attuali sono production-intent o vanno sospesi fino a governance completa.
- Documentare stato cutover per
tulpastudio.comeotticastyleorsola.it. - Aggiornare
current-statedopo il cutover Ottica e l'audit.
P1 - Entro 7 giorni
- Aggiungere health endpoint e Docker healthcheck alle app dinamiche.
- Aggiungere limiti risorse minimi ai container piu importanti.
- Creare
obelica cron statuscon stato ultimo run per job. - Ripulire env Vercel residue o classificarle come compatibilita intenzionale.
- Definire policy DB: Managed Postgres accettato o Postgres self-hosted.
P2 - Entro 30 giorni
- Standardizzare CI/CD Forgejo per tutte le app.
- Creare registry o naming release immagini con rollback rapido.
- Aggiungere metriche storiche e dashboard privata.
- Implementare retention remota backup e cifratura
repos.tar.zst. - Eseguire drill restore periodico documentato.
P3 - Entro 90 giorni
- Separare staging e production in modo piu netto.
- Valutare secondo droplet o standby restore per clienti critici.
- Introdurre socket proxy Docker e hardening container.
- Portare ogni app a scheda production completa con RTO/RPO, domini, DB, storage, cron e rollback.
Esito
Obelica e' gia oltre il semplice VPS artigianale: ha Traefik, Forgejo, backup offsite, smoke test, deploy Rust, docs e monitoraggio. Il salto successivo non e' installare altri tool a caso, ma trasformare questi pezzi in un contratto operativo ripetibile per ogni cliente: app contract, DB contract, cron contract, deploy contract, backup/restore contract e observability contract.