fix(tradein/compose): USE_PROXY_POOL_CURL/BROWSER и сервису backend — не только scraper (#3386) #3387

Merged
bot-backend merged 1 commit from fix/backend-proxy-pool-flags into main 2026-09-05 22:30:41 +00:00
Collaborator

Closes #3386 (п. а).

Дефект. Флаги пула прокси стояли в environment: только у сервиса scraper (docker-compose.prod.yml:385-386). Процесс tradein-backend без них: admin._kit_proxy_provider() → None, use_proxy_pool_*=False → все скрейп-пути из backend (yandex full-load, админ-ручки, house-imv-backfill) идут на env-фолбэк SCRAPER_PROXY_URL = выключенный узел 9 (407) → camoufox InvalidIP, 83 провала запуска сайдкара за 3 ч; проба #3375 (run 6153) дала 18 пустых бакетов.

Фикс. Те же два литерала в environment: сервиса backend (перекрывают env_file; в .env.runtime на проде ключей нет). Комментарий — почему.

Blast radius (проверен grep'ом по backend-процессу, не по репо в целом):

  • включается: POST /admin/scrape* (avito/cian/yandex sweep/full-load/valuation/newbuilding) — lease из scrape_proxies (curl — per-fetch с release; browser — один lease на прогон, release в __aexit__, страховка reap_stale_leases); house-imv-backfill через admin — то же;
  • побочный эффект флага: при пустом пуле + ENVIRONMENT=production эти пути поднимут NoProxyAvailableError вместо тихого фолбэка (#2616) — заявленное поведение;
  • /estimate (v1 и public mera) — без изменений: evaluate_via_imv(..., config=RealScraperConfig()) вызывается без proxy_provideruse_pool False по второму условию (_proxy.py:79-83, browser_fetcher.py:690). Отдельный дефект — IMV оценщика сидит на том же мёртвом фолбэке и работает только пока сайдкар avito поднят scraper'ом (#3386 п. в);
  • cian_price_history._PoolCurlConfig форсил флаг именно из-за его отсутствия — станет избыточным, снять отдельно;
  • run_proxy_healthcheck — только scheduler (scraper), backend не исполняет.

Гейты: yaml.safe_load rc=0; scripts/check-compose-ambiguous-hosts.py rc=0; pre-commit passed.

Приёмка на проде: после деплоя (compose up -d пересоздаст backend по изменённому environment) docker exec tradein-backend printenv USE_PROXY_POOL_BROWSER = true; повтор пробы full-load (coop-cancel через 2-3 бакета): unique_fetched > 0, InvalidIP в логах сайдкара за час = 0.

Дополнение по ревью (что РЕАЛЬНО меняется в процессе backend): _kit_proxy_provider() (admin.py:97-105) гейтится ровно этими флагами → RealProxyProvider() для admin.py:200, 1223, 1316, 1457, 1563, 1631, 2073, 2173; house_imv_backfill.py:748-757 и задачи avito_detail_backfill.py:420, domclick_detail_backfill.py:406, cian_history_backfill.py:221/355, newbuilding_enrich_backfill.py:416-420 (провайдер там безусловный, гейт только use_pool) — при запуске из админ-ручек переезжают с env-прокси на lease пула и получают прод-отказ #2616: админские бэкфиллы теперь отвечают NoProxyAvailableError громко вместо тихого похода на мёртвый узел — это и есть фикс, не регресс. Release lease на всех путях выхода проверен (curl finally, browser __aexit__ идемпотентный). Мерж = правка infraSCRAPER_RECREATE=true → drain + пересоздание tradein-scraper — гейт по running перед мержем обязателен.

Closes #3386 (п. а). **Дефект.** Флаги пула прокси стояли в `environment:` только у сервиса scraper (`docker-compose.prod.yml:385-386`). Процесс `tradein-backend` без них: `admin._kit_proxy_provider()` → None, `use_proxy_pool_*=False` → все скрейп-пути из backend (yandex full-load, админ-ручки, house-imv-backfill) идут на env-фолбэк `SCRAPER_PROXY_URL` = выключенный узел 9 (407) → camoufox `InvalidIP`, 83 провала запуска сайдкара за 3 ч; проба #3375 (run 6153) дала 18 пустых бакетов. **Фикс.** Те же два литерала в `environment:` сервиса backend (перекрывают `env_file`; в `.env.runtime` на проде ключей нет). Комментарий — почему. **Blast radius (проверен grep'ом по backend-процессу, не по репо в целом):** - включается: `POST /admin/scrape*` (avito/cian/yandex sweep/full-load/valuation/newbuilding) — lease из `scrape_proxies` (curl — per-fetch с release; browser — один lease на прогон, release в `__aexit__`, страховка `reap_stale_leases`); `house-imv-backfill` через admin — то же; - **побочный эффект флага:** при пустом пуле + `ENVIRONMENT=production` эти пути поднимут `NoProxyAvailableError` вместо тихого фолбэка (#2616) — заявленное поведение; - **`/estimate` (v1 и public mera) — без изменений:** `evaluate_via_imv(..., config=RealScraperConfig())` вызывается без `proxy_provider` → `use_pool` False по второму условию (`_proxy.py:79-83`, `browser_fetcher.py:690`). Отдельный дефект — IMV оценщика сидит на том же мёртвом фолбэке и работает только пока сайдкар avito поднят scraper'ом (#3386 п. в); - `cian_price_history._PoolCurlConfig` форсил флаг именно из-за его отсутствия — станет избыточным, снять отдельно; - `run_proxy_healthcheck` — только scheduler (scraper), backend не исполняет. **Гейты:** yaml.safe_load rc=0; `scripts/check-compose-ambiguous-hosts.py` rc=0; pre-commit passed. **Приёмка на проде:** после деплоя (`compose up -d` пересоздаст backend по изменённому environment) `docker exec tradein-backend printenv USE_PROXY_POOL_BROWSER` = true; повтор пробы full-load (coop-cancel через 2-3 бакета): `unique_fetched > 0`, `InvalidIP` в логах сайдкара за час = 0. **Дополнение по ревью (что РЕАЛЬНО меняется в процессе backend):** `_kit_proxy_provider()` (`admin.py:97-105`) гейтится ровно этими флагами → `RealProxyProvider()` для `admin.py:200, 1223, 1316, 1457, 1563, 1631, 2073, 2173`; `house_imv_backfill.py:748-757` и задачи `avito_detail_backfill.py:420`, `domclick_detail_backfill.py:406`, `cian_history_backfill.py:221/355`, `newbuilding_enrich_backfill.py:416-420` (провайдер там безусловный, гейт только `use_pool`) — при запуске из админ-ручек переезжают с env-прокси на lease пула и получают прод-отказ #2616: **админские бэкфиллы теперь отвечают `NoProxyAvailableError` громко вместо тихого похода на мёртвый узел** — это и есть фикс, не регресс. Release lease на всех путях выхода проверен (curl `finally`, browser `__aexit__` идемпотентный). Мерж = правка `infra` → `SCRAPER_RECREATE=true` → drain + пересоздание `tradein-scraper` — гейт по `running` перед мержем обязателен.
bot-backend added 1 commit 2026-09-05 22:19:09 +00:00
fix(tradein/compose): USE_PROXY_POOL_* и для backend, не только scraper
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
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 / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
b65f75c1fc
`USE_PROXY_POOL_CURL`/`USE_PROXY_POOL_BROWSER` объявлены только у сервиса
scraper (#2126/#2160). В процессе backend оба флага оставались False, из-за
чего `_kit_proxy_provider()` возвращал None, а `curl_proxy_url` /
`BrowserFetcher._acquire_lease` игнорировали переданный proxy_provider и
уходили на env-фолбэк `SCRAPER_PROXY_URL` — на проде это выключенный узел
(407) → camoufox InvalidIP, 83 провала запуска сайдкара за 3 ч 05.09.

Правка — только объявление тех же двух переменных в `environment:` backend.
`environment:` перекрывает `env_file` (backend/.env.runtime), значений
USE_PROXY_POOL_* в runtime-env нет, так что конфликта нет.

Гейты: yaml.safe_load rc=0, scripts/check-compose-ambiguous-hosts.py rc=0.

Refs: issue «tradein-backend без USE_PROXY_POOL_* → браузерные скрейпы на мёртвый env-прокси»

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bot-backend merged commit 6875992746 into main 2026-09-05 22:30:41 +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#3387
No description provided.