fix(ops): дрилл восстановления ждал БД по сокету и умирал на старте настоящего сервера #3026
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3026
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2203-restore-drill-readiness"
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?
Как нашлось
Не по чтению кода. Я впервые запустил
ops/restore-drill.shна проде на живом дампеtradein-20260821-013001.sql.gz(307 МБ) — акцептанс #2203 «restore-тест в чистую БД», который до сегодня ни разу не выполнялся. Дрилл упал через 6 секунд:Причина
ops/restore-drill.sh:116проверял готовность черезdocker exec … pg_isready -U postgres— это unix-сокет. Образ postgres во время инициализации поднимает временный сервер, и он на сокете уже отвечает «accepting connections». Проба зеленела посредиinitdb, восстановление начиналось в этот временный сервер и получало SIGTERM в тот момент, когда entrypoint гасил его, чтобы поднять настоящий.Временный сервер не слушает TCP, поэтому
-h 127.0.0.1зеленеет только на настоящем сервере.Проверка
С правкой тот же дамп на той же машине проходит инициализацию, восстанавливает схему и данные и доходит до сборки индексов (прогон шёл в момент открытия PR).
bash -nчисто.Один баг в трёх местах
.forgejo/workflows/ci-tradein.yml:137-141.forgejo/workflows/deploy-tradein.yml:718-721ops/restore-drill.sh:116В деплое последствие тяжелее, чем здесь: там проба по сокету зеленеет посреди initdb, часовой
schema_already_presentвидитlistings(создаётся миграцией 002, то есть почти сразу) и уводит деплой в веткуbaseline— все 249 миграций помечаются applied без прогона. Разбор в ревью PR #3011.Blast radius
Нулевой для прода: скрипт поднимает одноразовый контейнер на анонимном хранилище, слушает только
127.0.0.1, боевые тома не монтирует и сносит контейнер в любом исходе. Меняется одна строка условия + комментарий, объясняющий, почему-h 127.0.0.1тут несущий, а не косметика.Refs #2203, #2989
`ops/restore-drill.sh` проверял готовность через `pg_isready -U postgres`, то есть по unix-сокету. Образ postgres во время инициализации поднимает временный сервер, который на сокете уже отвечает "accepting connections". Проба зеленела посреди initdb, восстановление начиналось в этот временный сервер и погибало, как только entrypoint гасил его ради настоящего: [12:26:22Z] Restoring dump into 'drill' (ON_ERROR_STOP=1 ...) FATAL: terminating connection due to administrator command server closed the connection unexpectedly Воспроизведено на проде 2026-08-21 на живом дампе `tradein-20260821-013001`: падение через 6 секунд после старта. С `-h 127.0.0.1` тот же дамп проходит восстановление и доходит до сборки индексов — временный сервер TCP не слушает, поэтому по TCP проба зеленеет только на настоящем сервере. Ровно та же проба и ровно по той же причине уже стоит в `.forgejo/workflows/ci-tradein.yml:137-141`. Тот же дефект живёт и в `.forgejo/workflows/deploy-tradein.yml:718-721` — там его чинят в PR #3011, здесь не трогаю. Refs #2203, #2989