Database
Gestione database su Obelica
Provider
Le app candidate/migrate usano DigitalOcean managed PostgreSQL.
Neon non e' piu' usato in nessun progetto.
Forgejo continua a usare il proprio PostgreSQL locale in Docker (forgejo-db).
Struttura
| DB | Host | Uso |
|---|---|---|
| PostgreSQL app | db-pgsql-fra1-78926-do-user-23557928-0.d.db.ondigitalocean.com | database applicativi |
| PostgreSQL Forgejo | container forgejo-db | dati Forgejo |
Cluster app:
| Campo | Valore |
|---|---|
| Nome DigitalOcean | db-pgsql-fra1-78926 |
| Region | FRA1 |
| Engine | PostgreSQL 18 |
| Piano | 1 GB RAM / 20 GiB Disk |
| Modalita' | primary only |
Connection string
Le app leggono DATABASE_URL dall'env file in /opt/obelica/secrets/apps/<app>.env.
Esempio pattern:
postgresql://<user>:<pass>@<host>:<port>/<db>?sslmode=requirePer DigitalOcean:
- porta pooled:
25061; - porta unpooled:
25060; - il backup usa la connessione unpooled per evitare problemi con PgBouncer.
SSL
DigitalOcean richiede SSL. Se sslmode=require manca, l'app ottiene errore SSL required.
Alessandro Zucchini
Risolto il 2026-06-19:
DATABASE_URLaggiornata a DigitalOcean unpooled consslmode=require;POSTGRES_PRISMA_URLaggiornata allo stesso endpoint.
Backup
I database sono inclusi nel backup automatico obelica-backup.
Audit privilegi 2026-06-22
Audit read-only eseguito con psql usando doadmin. Nessuna modifica applicata.
Risultati:
- ruoli rilevati: 20;
- database rilevati: 13;
- database interno
_dodbnon scansionabile da fuori, comportamento atteso su DigitalOcean Managed PostgreSQL; - database production con tabelle:
alessandro_zucchini_db,la_bosca_db,obelica_db,sonja_trekking_db,tulpa_studio_db,wash_dog_db; - database staging presenti:
alessandro_zucchini_db_staging,la_bosca_db_staging,sonja_trekking_db_staging,tulpa_studio_db_staging,wash_dog_db_staging; - nessun privilegio tabella cross-app o cross-env rilevato per utenti applicativi;
- molti utenti applicativi hanno
CONNECTsu database non propri eUSAGEsullo schemapublic.
Interpretazione:
- non risultano privilegi di lettura/scrittura dati fuori target;
- l'isolamento non e' ancora pulito a livello database/schema;
- prima di usare staging seriamente, preparare e testare un hardening dei privilegi.
Policy target:
| App | Production DB | Production user | Staging DB | Staging user |
|---|---|---|---|---|
| Alessandro Zucchini | alessandro_zucchini_db | alessandro_zucchini_user | alessandro_zucchini_db_staging | alessandro_zucchini_staging_user |
| La Bosca | la_bosca_db | la_bosca_user | la_bosca_db_staging | la_bosca_staging_user |
| Sonja Trekking | sonja_trekking_db | sonja_trekking_user | sonja_trekking_db_staging | sonja_trekking_staging_user |
| Tulpa Studio | tulpa_studio_db | tulpa_studio_user | tulpa_studio_db_staging | tulpa_studio_staging_user |
| Wash Dog | wash_dog_db | wash_dog_user | wash_dog_db_staging | wash_dog_staging_user |
| Obelica | obelica_db | obelica_user | da decidere | da decidere |
Hardening da testare prima su staging/non critico:
REVOKE CONNECT ON DATABASE <db> FROM PUBLIC;
GRANT CONNECT ON DATABASE <db> TO doadmin;
GRANT CONNECT ON DATABASE <db> TO <app_user>;Poi, dentro il database:
REVOKE ALL ON SCHEMA public FROM PUBLIC;
GRANT USAGE, CREATE ON SCHEMA public TO <app_user>;Non toccare manualmente _dodb o ruoli interni DigitalOcean.
Operazioni
Dump manuale di un'app
docker run --rm -e PGPASSWORD=<pass> -e PGSSLMODE=require postgres:18-alpine \
pg_dump -h <host> -p <port> -U <user> -d <db> | gzip > app.sql.gzRestore manuale
gunzip -c app.sql.gz | psql "<DATABASE_URL>"Note
- Non commettere mai connection string complete nei repo.
- I secret vivono solo in
/opt/obelica/secrets/apps/.