Skip to content

Runbook — Clone DB na pg-alfa (prod → dev/hub)

Kdy: dev/hub agent potřebuje testovat migrace / debug na reálných datech → zkopíruj prod DB do dev/hub DB.

Kdo: sentinel (mám SU na pg-alfa — viz postgres.md, je to moje infra).

Přístup (SU)

ssh root@100.125.3.121          # pg-alfa, sentinel má root SSH
sudo -u postgres psql           # peer auth → PostgreSQL superuser

⚠️ Dumpy zapisuj do postgres-writable dir: /var/lib/postgresql/... (NE /root → permission denied, pg_dump běží jako OS user postgres).

Postup (příklad billit prod → dev, ověřeno 2026-06-28)

TS=$(date -u +%Y%m%d-%H%M%S); DIR=/var/lib/postgresql/<svc>-clone-$TS
sudo -u postgres mkdir -p "$DIR"

# 1) BACKUP cílové (dev) DB — pojistka
sudo -u postgres pg_dump -Fc <svc>_dev   -f "$DIR/dev-pre-clone.dump"

# 2) DUMP zdrojové (prod) DB
sudo -u postgres pg_dump -Fc <svc>_prod  -f "$DIR/prod.dump"
#   → ověř velikost (>100 KB) PŘED destruktivním krokem 3

# 3) RECREATE cílové DB (drop + create se správným ownerem)
sudo -u postgres psql -v ON_ERROR_STOP=1 <<SQL
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='<svc>_dev' AND pid<>pg_backend_pid();
DROP DATABASE IF EXISTS <svc>_dev;
CREATE DATABASE <svc>_dev OWNER <svc>_dev_user;
SQL

# 4) RESTORE prod → dev jako dev_user (objekty vlastní dev_user → migrace mají ALTER práva)
sudo -u postgres pg_restore --no-owner --no-acl --role=<svc>_dev_user -d <svc>_dev "$DIR/prod.dump"
#   --role: objekty vlastní dev_user | --no-acl: nepřenášet GRANTy na prod-only role
#   trusted extensions (uuid-ossp) vytvoří dev_user jako owner DB; netrusted → pre-create jako postgres

Verifikace (POVINNÁ)

-- table count prod == dev
SELECT count(*) FROM information_schema.tables WHERE table_schema='public';   -- na obou DB
-- row counts klíčových tabulek sedí (invoices, atd.)
-- ownership: VŠECHNY tabulky vlastní dev_user (jinak migrace selžou na permissions)
SELECT count(*) FILTER (WHERE tableowner='<svc>_dev_user')||'/'||count(*) FROM pg_tables WHERE schemaname='public';

⚠️ Bezpečnost — sensitive data v clonu

Prod DB může nést live credentials (billit: bank_accounts.fio_api_token — funkční bank API tokeny, inbound_email_token). Full clone je zkopíruje do dev. - pg-alfa je UFW-locked (Tailscale + cerebro/cortex/fess) → ne internet-exposed. - Pro test migrací nejsou tokeny potřeba → na vyžádání / jako default zvážit scrub: UPDATE bank_accounts SET fio_api_token=NULL, inbound_email_token=NULL;. - Vždy flagnout Liborovi přítomnost live secrets před/po clonu.

Rollback cílové DB

sudo -u postgres psql -c "DROP DATABASE <svc>_dev;"
sudo -u postgres psql -c "CREATE DATABASE <svc>_dev OWNER <svc>_dev_user;"
sudo -u postgres pg_restore --no-owner --no-acl --role=<svc>_dev_user -d <svc>_dev "$DIR/dev-pre-clone.dump"