fix(tradein/ops): health-check валит деплой + mem-лимиты + log-rotation (#2214) #2231

Merged
lekss361 merged 1 commit from fix/tradein-observability-hardening into main 2026-07-02 21:29:31 +00:00
Owner

Summary

  • Health-check больше не декоративен: 30 фейлов /health подряд → exit 1 до записи success-маркера .tradein-deployed-sha — мёртвый backend не помечается задеплоенным, changes-job следующего прогона берёт корректную базу. Порядок миграций #2216 не задет; set -e семантика сохранена (curl в if-условии).
  • mem-лимиты всем 5 tradein-сервисам от прод-замеров (docker stats): postgres 3g (idle 656MiB; дефолтный shared_buffers=128MB — запас на PostGIS-спайки), backend 768m (WeasyPrint 200-500MB поверх idle 100MiB), browser 2560m/3g (swap-cushion, BROWSER_CONCURRENCY=1), scraper 640m, frontend 384m. memswap_limit == mem_limit — tradein перестаёт докидывать в общий своп; restart: unless-stopped у всех → OOM-kill = авто-recovery, не мёртвый сервис (проверено ревью).
  • Log-rotation: json-file 20m×3 каждому сервису (YAML anchor) — закрывает unbounded-рост логов.
  • Premise аудита «коробка 4GB» устарел: фактически 11.96G RAM (замер в комментарии diff).

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

  • docker compose config exit 0; YAML валиден; anchor резолвится во все 5 сервисов.
  • code-reviewer: ⚠️ MINOR → учтено в этом же PR (postgres 2g→3g, backend 640m→768m); restart policy у всех сервисов verified — BLOCK-условие не сработало.
  • ⚠️ Первый деплой пересоздаст ВСЕ tradein-контейнеры (включая scraper — прервёт бегущий sweep; stop_grace_period 120s; допустимо разово).

Оставшееся по #2214 (needs-human, вне PR)

Off-box uptime-probe: нужен внешний хост/сервис (вариант (а) UptimeRobot/BetterUptime free tier — 5-мин HTTP+keyword, zero-infra; вариант (б) docker-compose.uptime.yml на другом VPS). Мониторить https://gendsgn.ru/ и /trade-in; /health наружу не проброшен (только docker exec). Решение и доступ — за человеком.

Refs #2214

## Summary - **Health-check больше не декоративен:** 30 фейлов `/health` подряд → `exit 1` **до** записи success-маркера `.tradein-deployed-sha` — мёртвый backend не помечается задеплоенным, changes-job следующего прогона берёт корректную базу. Порядок миграций #2216 не задет; set -e семантика сохранена (curl в if-условии). - **mem-лимиты всем 5 tradein-сервисам** от прод-замеров (`docker stats`): postgres **3g** (idle 656MiB; дефолтный shared_buffers=128MB — запас на PostGIS-спайки), backend **768m** (WeasyPrint 200-500MB поверх idle 100MiB), browser 2560m/3g (swap-cushion, BROWSER_CONCURRENCY=1), scraper 640m, frontend 384m. `memswap_limit == mem_limit` — tradein перестаёт докидывать в общий своп; `restart: unless-stopped` у всех → OOM-kill = авто-recovery, не мёртвый сервис (проверено ревью). - **Log-rotation:** json-file 20m×3 каждому сервису (YAML anchor) — закрывает unbounded-рост логов. - **Premise аудита «коробка 4GB» устарел:** фактически 11.96G RAM (замер в комментарии diff). ## Как проверено - `docker compose config` exit 0; YAML валиден; anchor резолвится во все 5 сервисов. - code-reviewer: ⚠️ MINOR → учтено в этом же PR (postgres 2g→3g, backend 640m→768m); restart policy у всех сервисов verified — BLOCK-условие не сработало. - ⚠️ Первый деплой пересоздаст ВСЕ tradein-контейнеры (включая scraper — прервёт бегущий sweep; stop_grace_period 120s; допустимо разово). ## Оставшееся по #2214 (needs-human, вне PR) Off-box uptime-probe: нужен внешний хост/сервис (вариант (а) UptimeRobot/BetterUptime free tier — 5-мин HTTP+keyword, zero-infra; вариант (б) docker-compose.uptime.yml на другом VPS). Мониторить https://gendsgn.ru/ и /trade-in; /health наружу не проброшен (только docker exec). Решение и доступ — за человеком. Refs #2214
lekss361 added 1 commit 2026-07-02 21:20:04 +00:00
fix(tradein/ops): health-check валит деплой + mem-лимиты + log-rotation (#2214)
All checks were successful
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 8s
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
c7eaecdb37
- deploy-tradein.yml: health-цикл через флаг; 30 фейлов подряд → exit 1 ДО
  записи success-маркера .tradein-deployed-sha (мёртвый backend больше не
  помечается задеплоенным; changes-job следующего прогона берёт верную базу)
- docker-compose.prod.yml: mem_limit/memswap_limit всем 5 сервисам от
  прод-замеров (postgres 3g, browser 2560m/3g swap-cushion, backend 768m,
  scraper 640m, frontend 384m; сумма потолков 6.4g на 12G-коробке);
  memswap==mem запрещает tradein-контейнерам свап (фикс swap-находки);
  restart: unless-stopped у всех → OOM-kill = авто-recovery
- log-rotation: json-file 20m×3 каждому сервису (YAML anchor)
- premise аудита «коробка 4GB» устарел: фактически 11.96G (замер в diff)

Первый деплой пересоздаст все tradein-контейнеры (включая scraper —
прервёт бегущий sweep, stop_grace_period 120s; допустимо разово).

Refs #2214
lekss361 merged commit 8ea52b9b7a into main 2026-07-02 21:29:31 +00:00
lekss361 deleted branch fix/tradein-observability-hardening 2026-07-02 21:29:31 +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#2231
No description provided.