Obelica Docs

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

DBHostUso
PostgreSQL appdb-pgsql-fra1-78926-do-user-23557928-0.d.db.ondigitalocean.comdatabase applicativi
PostgreSQL Forgejocontainer forgejo-dbdati Forgejo

Cluster app:

CampoValore
Nome DigitalOceandb-pgsql-fra1-78926
RegionFRA1
EnginePostgreSQL 18
Piano1 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=require

Per 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_URL aggiornata a DigitalOcean unpooled con sslmode=require;
  • POSTGRES_PRISMA_URL aggiornata 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 _dodb non 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 CONNECT su database non propri e USAGE sullo schema public.

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:

AppProduction DBProduction userStaging DBStaging user
Alessandro Zucchinialessandro_zucchini_dbalessandro_zucchini_useralessandro_zucchini_db_stagingalessandro_zucchini_staging_user
La Boscala_bosca_dbla_bosca_userla_bosca_db_stagingla_bosca_staging_user
Sonja Trekkingsonja_trekking_dbsonja_trekking_usersonja_trekking_db_stagingsonja_trekking_staging_user
Tulpa Studiotulpa_studio_dbtulpa_studio_usertulpa_studio_db_stagingtulpa_studio_staging_user
Wash Dogwash_dog_dbwash_dog_userwash_dog_db_stagingwash_dog_staging_user
Obelicaobelica_dbobelica_userda decidereda 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.gz

Restore 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/.

On this page