💾 Бэкапы БД Capital и восстановление
Схема (интерим до pgBackRest/PITR)
- Где снимается: capital-prod,
~/bin/capital-backup.sh, cron 15 */6 * * *.
pg_dump -Fc → шифрование age (публичным ключом) → ~/capital-backups/, ретеншн 14 дней.
- Off-site: cc-host,
~/bin/capital-backup-pull.sh, cron 45 */6 * * * →
~/backups/capital-offsite/, ретеншн 30 дней, freshness-чек <7ч.
- Ключ расшифровки (age, приватный): только на cc-host
~/.config/age/capital-backup.key
- копия у CEO. На prod-сервере ключа НЕТ - бэкапы там расшифровать нельзя.
Восстановление (проверено 15.09.2026: 32 таблицы, operators, tariffs, alembic head)
# на cc-host:
L=$(ls -t ~/backups/capital-offsite/capital-*.dump.age | head -1)
age -d -i ~/.config/age/capital-backup.key "$L" > /tmp/r.dump
# доставить на целевой сервер и:
docker compose cp /tmp/r.dump db:/tmp/r.dump
docker compose exec -T db pg_restore -U capital -d capital /tmp/r.dump
# проверка:
docker compose exec -T db psql -U capital -d capital -c "SELECT count(*) FROM information_schema.tables WHERE table_schema='public'"
Правила
- Бэкап без регулярного restore-теста - не бэкап.
- Перед любой миграцией/деплоем с риском - внеочередной
~/bin/capital-backup.sh.
- Целевое состояние: pgBackRest + WAL-архивация (RPO ≤ 5 мин) → B2 + Storage Box.