gendesign/tradein-mvp/backend/app/services
bot-backend aef43df650
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 10s
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (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 3m10s
fix(tradein/imv): домовая оценка ходит в сайдкар через пул, а не через чужой env-прокси (#2698)
Домовая оценка Авито не сохранила ни одной записи с 03.07 — 34 дня, каждый
прогон 35 отказов из 35 попыток. Отказ приходил от НАШЕГО сайдкара
(tradein-browser:3000/fetch-json): 1240 домов «503 Service Unavailable»
(до 02.08), затем 83 «500 Internal Server Error» и 31 «403 auth rejected»
(05.08). При этом сам сайдкар был жив.

1. Проводка пула. backfill_house_imv конструировал
   BrowserFetcher(source="avito", endpoint=...) без proxy_provider/use_pool/
   environment — единственный avito-путь без пула (avito_city_sweep его
   подключает, orchestration/pipeline.py:519). Без них тело POST /fetch-json
   уходит БЕЗ "proxy", и сайдкар берёт свой env-прокси SCRAPER_PROXY_URL. На
   проде это узел пула id=1 (asocks-residential-1, provider_affinity='domclick')
   — узел, который proxy_pool.acquire('avito') не выдал бы никогда: он отбирает
   affinity IN (provider,'any'), а последний узел выделенной affinity ещё и
   защищён от fallback (173_scrape_proxies_add_domclick_affinity.sql).

   Контрольная группа в тех же сутках: avito_city_sweep и
   avito_newbuilding_sweep тянули сотни объявлений через ТОТ ЖЕ сайдкар и тот
   же инстанс камуфокса (01.08: 78/69 и 484/447), пока house_imv_backfill
   получал 35 отказов из 35. Разница ровно одна — поле "proxy" в теле запроса.
   Второй эффект этой же дыры: запрос без "proxy" роняет сайдкару желаемый
   прокси на env → relaunch камуфокса на каждый дом (server.py::_ensure_browser),
   то есть путь IMV ещё и сбивал тёплый браузер sweep'ам.

   environment пробрасывается ради #2616 шаг 1: иначе прод-отказ «пул пуст»
   на этом пути мёртв и фетчер молча уходит на тот самый env-прокси.

2. Причина отказа больше не выбрасывается. Сайдкар кладёт её в тело
   ({"error": "browser unavailable (proxy may be down)"} / {"error": "Error:
   Page.goto: NS_ERROR_PROXY_BAD_GATEWAY"}), а resp.raise_for_status() печатает
   только код: ровно строка «Server error '503 Service Unavailable' for url
   'http://tradein-browser:3000/fetch-json'» и лежала 34 дня в
   houses.imv_error_reason у 1240 домов. Общий _raise_for_sidecar_status в
   browser_fetcher (оба вызова, /fetch и /fetch-json) добавляет тело в текст
   ошибки; тип исключения прежний (HTTPStatusError ⊂ HTTPError), retry-политика
   не меняется.

Тесты: проводка пула доезжает до фетчера; причина сайдкара доезжает до
вызывающего на обоих эндпоинтах. Прежний parity-тест эндпоинта расширен
новыми аргументами (не ослаблен).

Не чинится кодом (в #2704): 403 от самой площадки и живость единственного
исходящего IP — ротация пула ждёт ASOCKS_API_TOKEN (#2638).

Refs #2698
2026-08-06 11:47:41 +05:00
..
exporters fix(tradein/pdf): МЕРА branding + 4-page report, no empty pages (#2513) 2026-07-13 18:04:07 +00:00
matching fix(tradein/matching): снять слияние по ГАР-GUID, починить приёмник кадастра и keeper (#2674) 2026-08-06 05:11:47 +05:00
tgbot fix(tradein/tgbot): ограничение частоты на отправителя в мосте поддержки (#2543) 2026-07-26 23:16:57 +00:00
__init__.py feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in) 2026-05-21 00:25:39 +03:00
account_quota.py feat(tradein/auth): восстановить доступ praktika + безлимит через данные вместо хардкода (#2544) 2026-07-26 23:29:53 +00:00
auth_session.py feat(tradein): переключаемый реестр людей — подготовка переезда «Меры» в БД auth [PR-2b/6] 2026-08-01 02:50:14 +03:00
brand.py fix(tradein/pdf): МЕРА branding + 4-page report, no empty pages (#2513) 2026-07-13 18:04:07 +00:00
buildings_query.py fix(tradein/sale-share): гард по этажности — отсечь near-neighbor mis-match 2026-06-29 00:31:09 +03:00
cache.py feat(tradein): Phase 3.2 — /api/v1/search endpoint + Redis cache (#479) 2026-05-23 14:44:22 +00:00
cian_price_history.py fix(tradein/cian): персист bti_data/valuation house_info в houses + дедуп УК (#2435) (#2437) 2026-07-04 20:21:32 +00:00
cian_session.py fix(tradein/scraper): фильтр skipped в админке + освежение схлопнутой строки (#2658) 2026-08-05 23:10:47 +05:00
dadata.py fix(tradein/geocoder): строгий матч литеры дома + починка DaData region-фильтра (#2622) 2026-08-02 12:06:44 +00:00
domclick_session.py fix(tradein): сигналы о сбоях наконец становятся событиями, а протухание кук предупреждает заранее (#2674) 2026-08-06 02:29:11 +05:00
domrf_kapremont_loader.py fix(tradein/ingest): 4 data-integrity дефекта в бэкфилле годов и импорте ДКП 2026-07-12 22:12:31 +03:00
estimator.py fix(tradein): панорама для страниц без истории, точные счётчики, окно без гонки (#2674) 2026-08-06 05:32:14 +05:00
gar_flats_loader.py feat(tradein): канонический матч ГАР↔houses (0%→41% yield) + tradein_canon_addr + --match-only (#2063) 2026-06-28 15:50:07 +00:00
geocoder.py fix(tradein/geocode): гейт мусорного города вынести в общий хелпер и прошить в admin-путь (#2603) 2026-08-05 20:20:41 +05:00
house_dedup_merge.py fix(tradein/matching): снять слияние по ГАР-GUID, починить приёмник кадастра и keeper (#2674) 2026-08-06 05:11:47 +05:00
house_imv_backfill.py fix(tradein/imv): домовая оценка ходит в сайдкар через пул, а не через чужой env-прокси (#2698) 2026-08-06 11:47:41 +05:00
house_metadata.py feat(tradein): postgres_fdw live read of gendesign.cad_buildings (replaces snapshot) (#493) 2026-05-24 08:57:30 +00:00
identity_store.py feat(tradein): переключаемый реестр людей — подготовка переезда «Меры» в БД auth [PR-2b/6] 2026-08-01 02:50:14 +03:00
image_sanitizer.py fix(tradein/photos): защита от pixel-flood DoS в image_sanitizer 2026-07-12 22:12:12 +03:00
location_index.py fix(tradein): тест ловит копию константы, а не equality; честный комментарий про вклад свежести (#2660) 2026-08-05 23:13:22 +05:00
product_handlers.py chore(tradein): разбор мёртвого кода — подключить, удалить или задокументировать (#2674) 2026-08-06 05:00:36 +05:00
proxy_pool.py fix(tradein/proxy): backup-узел должен быть пригоден + рычаг снятия бана (#2600 п.2) 2026-08-05 17:45:07 +05:00
proxy_rotation.py fix(tradein/proxy): backup-узел должен быть пригоден + рычаг снятия бана (#2600 п.2) 2026-08-05 17:45:07 +05:00
rosreestr_poll.py fix(tradein): чинит такт загрузки СберИндекса — иначе новый ERROR стал бы ложной тревогой (#2674) 2026-08-06 02:53:26 +05:00
sber_index.py fix(tradein): сигналы о сбоях наконец становятся событиями, а протухание кук предупреждает заранее (#2674) 2026-08-06 02:29:11 +05:00
scheduler.py fix(tradein): такт в сохранении расписания, position_in_serp невыразим (#2674) 2026-08-06 05:49:48 +00:00
scrape_runs.py fix(tradein/scraper): detail-backfill с нулём обогащений перестаёт называться успехом (#2674) (#2695) 2026-08-06 05:59:37 +00:00
scraper_adapters.py fix(tradein/matching): снять слияние по ГАР-GUID, починить приёмник кадастра и keeper (#2674) 2026-08-06 05:11:47 +05:00
scraper_settings.py chore(tradein): деактивировать N1.ru scraper — источник переехал в Cian 2026-06-16 14:50:51 +03:00
search_query.py fix(tradein/matching): честность тиров сопоставления домов (#2674) 2026-08-06 04:37:12 +05:00
user_events.py feat(tradein/audit): request-audit middleware + estimate_request logging → user_events (#2519) 2026-07-13 20:09:22 +00:00
yandex_address_backfill.py fix(tradein): yandex address-enrich — city-agnostic title regex (спутники ЕКБ) (#875) 2026-05-31 09:08:29 +00:00
yandex_price_history.py chore(tradein/scrapers): удалить весь legacy scrapers/ каталог — final E (#2397, #2277) 2026-07-04 15:58:15 +03:00
zhkh_flats_loader.py fix(tradein): cadastre ЖКХ-fallback + COALESCE merge-key + median-floors guard 2026-06-29 01:32:48 +03:00