feat(tradein): отдельный scraper-контейнер — scheduler вне API-процесса #1183

Merged
lekss361 merged 2 commits from feat/tradein-scraper-container into main 2026-06-12 08:01:24 +00:00
Owner

Summary

  • Новый standalone-entrypoint tradein-mvp/backend/app/scheduler_main.py (python -m app.scheduler_main): sentry-init без FastAPI-integrations, best-effort FDW bootstrap, SIGTERM/SIGINT → clean cancel scheduler_loop, уважает SCHEDULER_ENABLE (единый kill-switch). Zombie-reap не дублируется — он уже в начале каждого тика scheduler_loop (reap_zombies, scheduler.py:976).
  • docker-compose.prod.yml (tradein): новый сервис scraper (container tradein-scraper, тот же backend-image, сеть tradein-net, env-зеркало backend + SCHEDULER_ENABLE=true); в API-контейнере SCHEDULER_ENABLE=false — после деплоя ровно один scheduler.
  • deploy-tradein.yml: новый paths-filter output scraper + селективный up -d --no-deps postgres browser backend frontend; tradein-scraper пересоздаётся ТОЛЬКО при изменении scraper-путей/infra (SCRAPER_CHANGED, default-safe true). Иначе блочный up -d рестартовал бы scraper на каждом backend-деплое (общий :latest image) — ровно та боль, которую чиним.
  • Тесты test_scheduler_main.py (4): import, kill-switch выходит без запуска loop, clean cancellation.

Pre-push review: ⚠️ MINOR → мёртвый monkeypatch убран fixup-коммитом; GIT_SHA/SENTRY_RELEASE gap и browser healthcheck — не-регрессии (то же у backend), отмечены как follow-up.

Test plan

  • pytest tests/test_scheduler_main.py — 4 passed
  • полная суита tradein-backend: 1733 passed, 2 deselected
  • ruff + compose YAML valid
  • post-merge: первый деплой (infra-filter) поднимает tradein-scraper; лог backend «in-app scheduler disabled»; лог scraper «scheduler task spawned»
  • post-merge: backend-only коммит → docker ps uptime tradein-scraper не сбрасывается

Refs #1182

## Summary - Новый standalone-entrypoint `tradein-mvp/backend/app/scheduler_main.py` (`python -m app.scheduler_main`): sentry-init без FastAPI-integrations, best-effort FDW bootstrap, SIGTERM/SIGINT → clean cancel `scheduler_loop`, уважает `SCHEDULER_ENABLE` (единый kill-switch). Zombie-reap не дублируется — он уже в начале каждого тика `scheduler_loop` (reap_zombies, scheduler.py:976). - `docker-compose.prod.yml` (tradein): новый сервис `scraper` (container `tradein-scraper`, тот же backend-image, сеть `tradein-net`, env-зеркало backend + `SCHEDULER_ENABLE=true`); в API-контейнере `SCHEDULER_ENABLE=false` — после деплоя ровно один scheduler. - `deploy-tradein.yml`: новый paths-filter output `scraper` + селективный `up -d --no-deps postgres browser backend frontend`; `tradein-scraper` пересоздаётся ТОЛЬКО при изменении scraper-путей/infra (`SCRAPER_CHANGED`, default-safe `true`). Иначе блочный `up -d` рестартовал бы scraper на каждом backend-деплое (общий `:latest` image) — ровно та боль, которую чиним. - Тесты `test_scheduler_main.py` (4): import, kill-switch выходит без запуска loop, clean cancellation. Pre-push review: ⚠️ MINOR → мёртвый monkeypatch убран fixup-коммитом; GIT_SHA/SENTRY_RELEASE gap и browser healthcheck — не-регрессии (то же у backend), отмечены как follow-up. ## Test plan - [x] `pytest tests/test_scheduler_main.py` — 4 passed - [x] полная суита tradein-backend: 1733 passed, 2 deselected - [x] ruff + compose YAML valid - [ ] post-merge: первый деплой (infra-filter) поднимает `tradein-scraper`; лог backend «in-app scheduler disabled»; лог scraper «scheduler task spawned» - [ ] post-merge: backend-only коммит → `docker ps` uptime tradein-scraper не сбрасывается Refs #1182
lekss361 added 2 commits 2026-06-12 07:57:10 +00:00
Причина: docker restart tradein-backend (при каждом API-деплое) убивал бегущие
sweep'ы avito/cian/rosreestr — они могут идти часами, и их прерывание середине
батча создавало zombie-runs и пропуски данных.

Что сделано:
- scheduler_main.py — standalone entrypoint для tradein-scraper; SIGTERM/SIGINT
  отменяют scheduler_loop чисто; GlitchTip init без Starlette/FastAPI интеграций.
- docker-compose.prod.yml — новый сервис scraper (тот же image, команда python -m
  app.scheduler_main, только tradein-net); SCHEDULER_ENABLE=false в backend.
- deploy-tradein.yml — селективный up -d --no-deps: scraper пересоздаётся только
  при изменениях scraper/infra путей (SCRAPER_CHANGED), не при каждом backend-деплое.
- tests/test_scheduler_main.py — импорт, kill-switch _should_run(), чистая отмена _run().
test(tradein): убрать мёртвый monkeypatch в test_scheduler_main (review fixup)
All checks were successful
CI / changes (push) Successful in 6s
CI / changes (pull_request) Successful in 5s
CI / backend-tests (push) Has been skipped
CI / frontend-tests (push) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
07b06617fd
lekss361 added the
automation
scope/backend
status/review
labels 2026-06-12 07:57:46 +00:00
lekss361 merged commit 7a06839a0d into main 2026-06-12 08:01:24 +00:00
lekss361 deleted branch feat/tradein-scraper-container 2026-06-12 08:01:24 +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#1183
No description provided.