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.