fix(ops): бэкап не теряет роли, не глотает ошибки и умеет уезжать с машины (#2203) #3004
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3004
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/backup-hardening-2203"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что чинит (acceptance #2203)
pg_dumpпо определению не включает роли/GRANT— оба скрипта (ops/backup.sh,tradein-mvp/deploy/backup-tradein-db.sh) теперь дополнительно гонятpg_dumpall --globals-onlyв отдельный файл<db>_globals_<ts>.sql.gzрядом с основным дампом, с той же ретенцией (раздельные серии, чтобыgendesign_globals_*не попадал в общий glob сgendesign_*) и той же S3-выгрузкой.pg_dumpбольше не глотаются. Убран2>/dev/nullуpg_dumpв обоих скриптах — текст ошибки теперь идёт в лог, а не исчезает молча (set -o pipefailи раньше ронял пайп при сбое, просто причина была не видна).docker exec) может дать структурно валидный, не крошечный.gz— ни-s, ни существующийMIN_DUMP_BYTESэто не ловят. Добавленаverify_dump_integrity():gzip -t+ проверка, что в распакованном потоке есть трейлер (-- PostgreSQL database dump completeдля основного дампа,-- PostgreSQL database cluster dump completeдля globals — уpg_dumpallон называется иначе). Проверяется черезgunzip -c | tail -N, без распаковки всего файла на диск. При провале любой проверки — файл удаляется, причина логируется, выход ненулевой, ретенция НЕ трогается (инвариант "не затирать хорошие дампы из-за неудачного прогона" сохранён).tradein-mvp/deploy/backup-tradein-db.shраньше вообще не умел выгружать в S3 — добавлен тот же блок, что вops/backup.sh(4 переменные,docker run --rm amazon/aws-cli). Источник переменных:/etc/default/tradein-backup, если файла нет — фолбэк на общий/etc/default/gendesign-backup. Без переменных — поведение прежнее (только локально, лог об этом предупреждает).MIN_DUMP_BYTES, дефолт 10 KiB — там дампы кратно меньше, чем main DB).ops/restore-drill.sh— реальный restore-тест, который НЕ трогает прод. Поднимает одноразовыйpostgis/postgis:16-3.4со случайным именем и docker-assigned портом, без монтирования прод-томов. Заливает globals (best-effort — на свежем контейнере конфликт с рольюpostgresожидаем и не фатален) + сам дамп (ON_ERROR_STOP=1— это и есть настоящая проверка целостности). Проверяетpostgis_full_version(), число таблиц вpublic, и построчный count по списку ключевых таблиц (для tradein:listings, listing_sources, deals, houses, trade_in_estimates; для gendesign:rosreestr_deals, cad_opportunity_parcels, domrf_snapshots, trade_in_estimates, parcel_user_status— выбраны как представительные central-таблицы разных доменов схемы, можно переопределить черезRESTORE_DRILL_TABLES). Контейнер гарантированно удаляется в конце (trap ... EXIT). В шапке — предупреждение заглавными буквами, чтоops/restore.sh— это восстановление В БОЕВУЮ базу и для учений не годится.ops/gendesign-backup.default.exampleдополнен комментариями про globals, про то, что этот файл теперь ещё и fallback-источник S3-кредов для tradein-backup, и проops/restore-drill.sh. Реальных значений не добавлял.Что остаётся за человеком
/etc/default/gendesign-backup(и опционально отдельно в/etc/default/tradein-backup, если нужны разные креды/бакет для tradein) на проде — root-owned, chmod 600, НЕ в git. Шаблон —ops/gendesign-backup.default.example.Verify
bash -nна всех трёх изменённых/новых скриптах — чисто.shellcheckнедоступен в этом окружении (не установлен, docker daemon не запущен) — сделан ручной review на типовые SC-паттерны (quoting, SC2012/SC2164/SC2155 и т.п.), явных проблем не найдено.Refs #2203