fix(tradein/deploy): миграции ДО подъёма app-контейнеров + manifest-инвариант (#2216) #2228

Merged
lekss361 merged 1 commit from fix/tradein-migrations-before-up into main 2026-07-02 21:03:38 +00:00
Owner

Summary

  • Порядок деплоя: pullup -d --no-deps postgres (только БД) → pg_isready-цикл (30×2s, fail=exit 1) → весь блок миграций (внутренности байт-идентичны, только перемещены) → reader-password bootstrap → up -d browser backend frontend (+условный scraper) → Caddy reload → health → cleanup. Сбой миграции = exit 1 до подъёма нового кода — старые контейнеры остаются на консистентной паре код↔схема. docker restart tradein-backend удалён (backend стартует после миграций, FDW server уже существует; история сохранена в комментарии).
  • Реконсиляция «152 vs 131» не актуальна: прод _schema_migrations и репо data/sql совпадают (154 == 154, diff пуст; проверено на проде 2026-07-02 — аудит снят со стейл-ветки).
  • Инвариант против rename-trap: _manifest_applied.txt (154 имени) + test_migrations_manifest.py — red при переименовании/удалении применённой миграции (tracking по bare-filename → rename = повторное выполнение на проде) и при дубль-NN-префиксе новых файлов; 6 исторических дублей (084/108/113/121/124/130) grandfathered. Manifest дополняется автором в том же PR (подсказка в assert).

Как проверено

  • Полный локальный pytest: 2977 passed, 6 skipped, 1 deselected (включая 4 новых manifest-теста; negative-пробы rename/dup-prefix дают red — проверено воркером).
  • YAML валиден; ruff чисто. code-reviewer: APPROVE — построчная сверка перемещённых блоков (потерянных строк/env нет), pg_isready-цикл корректен под set -e, первый прогон нового порядка на текущем проде no-op-безопасен.
  • Minor из ревью (health-check не валит job при мёртвом backend — pre-existing) = предмет #2214, будет закрыт там.

Refs #2216

## Summary - **Порядок деплоя:** `pull` → `up -d --no-deps postgres` (только БД) → `pg_isready`-цикл (30×2s, fail=exit 1) → весь блок миграций (внутренности байт-идентичны, только перемещены) → reader-password bootstrap → `up -d browser backend frontend` (+условный scraper) → Caddy reload → health → cleanup. Сбой миграции = exit 1 **до** подъёма нового кода — старые контейнеры остаются на консистентной паре код↔схема. `docker restart tradein-backend` удалён (backend стартует после миграций, FDW server уже существует; история сохранена в комментарии). - **Реконсиляция «152 vs 131» не актуальна:** прод `_schema_migrations` и репо `data/sql` совпадают (154 == 154, diff пуст; проверено на проде 2026-07-02 — аудит снят со стейл-ветки). - **Инвариант против rename-trap:** `_manifest_applied.txt` (154 имени) + `test_migrations_manifest.py` — red при переименовании/удалении применённой миграции (tracking по bare-filename → rename = повторное выполнение на проде) и при дубль-NN-префиксе новых файлов; 6 исторических дублей (084/108/113/121/124/130) grandfathered. Manifest дополняется автором в том же PR (подсказка в assert). ## Как проверено - Полный локальный pytest: **2977 passed, 6 skipped, 1 deselected** (включая 4 новых manifest-теста; negative-пробы rename/dup-prefix дают red — проверено воркером). - YAML валиден; ruff чисто. code-reviewer: ✅ APPROVE — построчная сверка перемещённых блоков (потерянных строк/env нет), pg_isready-цикл корректен под set -e, **первый прогон нового порядка на текущем проде no-op-безопасен**. - Minor из ревью (health-check не валит job при мёртвом backend — pre-existing) = предмет #2214, будет закрыт там. Refs #2216
lekss361 added 1 commit 2026-07-02 20:51:47 +00:00
fix(tradein/deploy): миграции ДО подъёма app-контейнеров + инвариант manifest (#2216)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m42s
6409b5fdf7
deploy-tradein.yml: up только postgres → pg_isready-wait (30×2s) → весь блок
миграций → затем up browser/backend/frontend(/scraper). Сбой миграции = exit 1
до нового кода, старые контейнеры остаются на консистентной паре код↔схема.
Удалён docker restart tradein-backend (lifespan-hook теперь видит миграции
с первого старта; история PR #493/deploy-1156 сохранена в комментарии).

Реконсиляция «152 vs 131» из аудита не актуальна: прод _schema_migrations и
репо data/sql совпадают (154 == 154, diff пуст; проверено 2026-07-02).

Инвариант против rename-trap (tracking по bare-filename → переименование
применённой миграции = повторное выполнение на проде):
test_migrations_manifest.py + _manifest_applied.txt (154 имени) — red при
rename/rm применённой и при дубль-NN-префиксе новых (6 исторических дублей
084/108/113/121/124/130 grandfathered).

Refs #2216
lekss361 merged commit 0793571c4a into main 2026-07-02 21:03:38 +00:00
lekss361 deleted branch fix/tradein-migrations-before-up 2026-07-02 21:03:38 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2228
No description provided.