[EPIC][tradein] Полная автоматизация scrapers с persistence через redeploy #559

Closed
opened 2026-05-25 06:02:30 +00:00 by lekss361 · 3 comments
Owner

Контекст

Сейчас в tradein-mvp только один scraper запускается автоматически — avito_city_sweep через in-app scheduler (backend/app/services/scheduler.py, тикает раз в 60 сек, читает таблицу scrape_schedules).

Все остальные ручные триггеры через POST /api/v1/admin/scrape/*:

  • avito-detail, avito-imv, avito-house — manual
  • cian-detail, cian-newbuilding, cian-valuation, cian-backfill-history — manual
  • yandex-detail, yandex-newbuilding, yandex-valuation — manual
  • n1 — endpoint вообще не подключён (класс есть)
  • deploy/import-rosreestr.sh — shell-скрипт, запускается руками после деплоя

Проблема redeploy

После docker compose down && up:

  • Cian cookies сохраняются (encrypted в cian_session_cookies)
  • scrape_schedules / scrape_runs сохраняются (volume tradein-postgres-data)
  • Schema scraper_settings сохраняется
  • Любые in-memory asyncio task убиты — heartbeat обрывается → run помечается zombie через 6h
  • import-rosreestr.sh не запускается, fresh ДКП данные старятся
  • Cian session может exhausted (cookies валидны, но 1-time auth flow утерян если рестарт во время backfill)

Цель

Все источники должны идти через scrape_schedules (или Celery если решим переезжать) с:

  1. Persistent state в БД (heartbeat, last_run_at, next_run_at).
  2. Graceful resume после redeploy: scheduler видит zombie run → перезапускает с last checkpoint.
  3. Cron-like окна (например yandex-valuation в 03:00-05:00 Москва).
  4. Per-source rate limit + backoff из scraper_settings.

Sub-tasks

  • #560 — Cian history backfill в scheduler
  • #561 — Yandex Realty периодический sweep
  • #562 — Avito IMV + Houses batch enrichment
  • #563 — Rosreestr ДКП автоимпорт (P0 critical)
  • #569 — Rosreestr geocoding автоматизация
  • #575 — N1 Realty integration
  • #581 — Cron vs in-app scheduler decision (Celery/systemd/etc)

Связанные

  • #564 — Аналитика ДКП ↔ Listings (sales-vs-asks) — нуждается в свежих данных автоматизации
  • #565 #566 — Pending Avito fixes (blocker для P0 enrichment)
  • #567 #568 — Cian price history blockers

Acceptance

  • scrape_schedules содержит row для каждого источника (8+ записей).
  • docker compose restart tradein-backend не создаёт data gap > 1 час для критичных sources.
  • Admin UI /trade-in/admin/scrapers показывает all sources + next_run_at + last_run_status.
  • Документ runbook в vault runbooks/tradein_scrapers_automation.md.

Vault refs

  • decisions/Decision_TradeIn_DataQuality_8PR_Roadmap
  • sessions/Session_TradeIn_Dkp_Roadmap_May25 — "Celery autoload 2026Q2" в outstanding
  • decisions/Decision_Beat_Task_Zombie_Cleanup
## Контекст Сейчас в `tradein-mvp` только **один** scraper запускается автоматически — `avito_city_sweep` через in-app scheduler (`backend/app/services/scheduler.py`, тикает раз в 60 сек, читает таблицу `scrape_schedules`). Все остальные ручные триггеры через `POST /api/v1/admin/scrape/*`: - `avito-detail`, `avito-imv`, `avito-house` — manual - `cian-detail`, `cian-newbuilding`, `cian-valuation`, `cian-backfill-history` — manual - `yandex-detail`, `yandex-newbuilding`, `yandex-valuation` — manual - `n1` — endpoint вообще не подключён (класс есть) - `deploy/import-rosreestr.sh` — shell-скрипт, запускается руками после деплоя ## Проблема redeploy После `docker compose down && up`: - ✅ Cian cookies сохраняются (encrypted в `cian_session_cookies`) - ✅ `scrape_schedules` / `scrape_runs` сохраняются (volume `tradein-postgres-data`) - ✅ Schema `scraper_settings` сохраняется - ❌ Любые in-memory asyncio task убиты — heartbeat обрывается → run помечается zombie через 6h - ❌ `import-rosreestr.sh` не запускается, fresh ДКП данные старятся - ❌ Cian session может exhausted (cookies валидны, но 1-time auth flow утерян если рестарт во время backfill) ## Цель Все источники должны идти через `scrape_schedules` (или Celery если решим переезжать) с: 1. Persistent state в БД (heartbeat, last_run_at, next_run_at). 2. Graceful resume после redeploy: scheduler видит zombie run → перезапускает с last checkpoint. 3. Cron-like окна (например yandex-valuation в 03:00-05:00 Москва). 4. Per-source rate limit + backoff из `scraper_settings`. ## Sub-tasks - [ ] #560 — Cian history backfill в scheduler - [ ] #561 — Yandex Realty периодический sweep - [ ] #562 — Avito IMV + Houses batch enrichment - [ ] #563 — Rosreestr ДКП автоимпорт (P0 critical) - [ ] #569 — Rosreestr geocoding автоматизация - [ ] #575 — N1 Realty integration - [ ] #581 — Cron vs in-app scheduler decision (Celery/systemd/etc) ## Связанные - #564 — Аналитика ДКП ↔ Listings (sales-vs-asks) — нуждается в свежих данных автоматизации - #565 #566 — Pending Avito fixes (blocker для P0 enrichment) - #567 #568 — Cian price history blockers ## Acceptance - `scrape_schedules` содержит row для каждого источника (8+ записей). - `docker compose restart tradein-backend` не создаёт data gap > 1 час для критичных sources. - Admin UI `/trade-in/admin/scrapers` показывает all sources + next_run_at + last_run_status. - Документ runbook в vault `runbooks/tradein_scrapers_automation.md`. ## Vault refs - `decisions/Decision_TradeIn_DataQuality_8PR_Roadmap` - `sessions/Session_TradeIn_Dkp_Roadmap_May25` — "Celery autoload 2026Q2" в outstanding - `decisions/Decision_Beat_Task_Zombie_Cleanup`
lekss361 added the
tradein
scrapers
automation
enhancement
labels 2026-05-25 06:02:30 +00:00
Author
Owner

EPIC / umbrella — НЕ flow'ится автономно: auto-analyst читает vault inbox, не Forgejo-эпики; единый воркер эпик не возьмёт. Требует ручной декомпозиции на sub-issues (по источникам: avito-enrich #562, n1 #575, cian #639, rosreestr-auto-ingest, redeploy-persistence). Оставляю как tracking-эпик, статус не ставлю.

EPIC / umbrella — НЕ flow'ится автономно: auto-analyst читает vault inbox, не Forgejo-эпики; единый воркер эпик не возьмёт. Требует ручной декомпозиции на sub-issues (по источникам: avito-enrich #562, n1 #575, cian #639, rosreestr-auto-ingest, redeploy-persistence). Оставляю как tracking-эпик, статус не ставлю.
lekss361 added this to the Praktika demo — Mon 2026-06-01 milestone 2026-05-30 17:21:13 +00:00
Collaborator

Прогресс автоматизации 2026-05-31 (roll-up)

Сегодня закрыт большой кусок эпика:

  • Full city-sweep для всех источников (один прогон = SERP+enrichment): avito #848+#861 (SERP+detail+houses+IMV), cian #864+#868 (SERP+detail+price-history+houses), yandex #867 (SERP+address-enrich). n1 уже SERP-only полный.
  • Proxy-routing всех скрейперов через scraper_proxy_url (#860): yandex/valuation/imv/newbuilding теперь через мобильный прокси (раньше datacenter→бан).
  • cian descriptionMinhash краш-фикс (#840) — cian SERP ожил (5158→6282 listings).
  • Backfill-эндпоинты (#856): cian-price-history, yandex-address, house-imv (admin-triggerable).
  • cian-куки разблокированы (#639).

Осталось по эпику: (1) per-anchor watchdog в sweep (#581 — sweep зависает); (2) расписание новых sweep'ов (сейчас ручной запуск — авто-cron ловит 429, нужно решить пейсинг/прокси); (3) домклик — Qrator, выбран Camoufox (#796); (4) persistence через redeploy (исходный пункт эпика). Эпик остаётся открытым.

## Прогресс автоматизации 2026-05-31 (roll-up) Сегодня закрыт большой кусок эпика: - **Full city-sweep для всех источников** (один прогон = SERP+enrichment): avito #848+#861 (SERP+detail+houses+IMV), cian #864+#868 (SERP+detail+price-history+houses), yandex #867 (SERP+address-enrich). n1 уже SERP-only полный. - **Proxy-routing всех скрейперов** через scraper_proxy_url (#860): yandex/valuation/imv/newbuilding теперь через мобильный прокси (раньше datacenter→бан). - **cian descriptionMinhash краш-фикс** (#840) — cian SERP ожил (5158→6282 listings). - **Backfill-эндпоинты** (#856): cian-price-history, yandex-address, house-imv (admin-triggerable). - **cian-куки** разблокированы (#639). **Осталось по эпику:** (1) per-anchor watchdog в sweep (#581 — sweep зависает); (2) расписание новых sweep'ов (сейчас ручной запуск — авто-cron ловит 429, нужно решить пейсинг/прокси); (3) домклик — Qrator, выбран Camoufox (#796); (4) persistence через redeploy (исходный пункт эпика). Эпик остаётся открытым.
lekss361 added the
priority/p0
label 2026-06-17 20:17:56 +00:00
Collaborator

Закрыто — полная автоматизация + persistence достигнута (прод 2026-06-26): 27 enabled scrape_schedules (avito/cian/yandex/rosreestr + инфра-таски), 132/163 done-runs за 7д, no data-gap >1h (avito_city_sweep, cian_full_load, yandex_city_sweep, rosreestr_dkp_import — все в 24ч-cadence), checkpoint/resume через counters jsonb переживает redeploy (#930), reap_zombies каждые 60с, все 7 саб-тасок закрыты (#560-#563, #569, #575, #581). DoD выполнен.

✅ Закрыто — полная автоматизация + persistence достигнута (прод 2026-06-26): **27 enabled scrape_schedules** (avito/cian/yandex/rosreestr + инфра-таски), 132/163 done-runs за 7д, **no data-gap >1h** (avito_city_sweep, cian_full_load, yandex_city_sweep, rosreestr_dkp_import — все в 24ч-cadence), **checkpoint/resume через `counters` jsonb переживает redeploy** (#930), `reap_zombies` каждые 60с, все 7 саб-тасок закрыты (#560-#563, #569, #575, #581). DoD выполнен.
Sign in to join this conversation.
No project
No assignees
2 participants
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#559
No description provided.