chore(tradein): удалить мёртвые mobileproxy env-переменные и rotate-ip (#2616 шаги 2-3) #2650

Merged
bot-backend merged 1 commit from chore/tradein-remove-dead-proxy-vars into main 2026-08-05 09:35:55 +00:00
Collaborator

Summary

#2616 шаги 2 и 3 (шаг 1 fail-closed сделан вчера — #2634 + дожим). Порядок из issue соблюдён строго: чистить переменные можно было только после fail-closed, иначе пустая переменная означала бы прямое подключение с IP сервера (засветить перед Авито/Цианом).

Шаг 2 — удалены 9 мёртвых mobileproxy-переменных (AVITO/CIAN/YANDEX_PROXY_URL, BROWSER_PROXY_*, *_PROXY_ROTATE_URL; все на закрытых аккаунтах — 407/connection refused, #2613): поля config, чтения в browser/server.py::_provider_proxy, Protocol ScraperConfig, RealScraperConfig. SCRAPER_PROXY_URL (ASocks) — единственный источник egress для всех провайдеров.

Каскад: changeip-ротация mobileproxy мертва вместе с подпиской → _rotate_proxy_ip/_rotate_ip застаблены. Ревью проследило: поведение идентично — мёртвый URL и так возвращал False после впустую потраченного round-trip; max_rot 4→0 даёт тот же исход (никогда не проходил дальше), бюджет ban-rotation считался одинаково и раньше. Убрана только потерянная сетевая задержка.

Шаг 3 — удалена мёртвая ручка POST /scraper/{source}/rotate-ip + её кнопки во фронте (dead-branch удалён, не оставлен unreachable). Живая ASocks-ротация POST /admin/proxies/{id}/rotate (#2611) и fail-closed guard — zero behavior diff (проверено ревью).

Побочный фикс, найденный ревью: cian curl-путь брал config.cian_proxy_url = CIAN_PROXY_URL (мёртвый) вместо живого SCRAPER_PROXY_URL — теперь passthrough на живой узел.

По egress-изоляции: per-provider узлы были фикцией (мёртвые креды; BROWSER_PROXY_AVITO — задокументированный корень «52/53 забаненных прогонов за 14 дней»). Кодификация «один живой узел на всех» отражает реальность (#2638), а не вводит новую single-point-of-failure.

Test plan

  • backend touched-tests 170/170, полный сьют 3257 passed (1 known pre-existing)
  • browser-сьют 92 passed; 4 падения подтверждены pre-existing (тот же набор на чистом main-tip в отдельном worktree)
  • tsc --noEmit + lint фронта чисто; ноль dangling-ссылок на rotate-ip
  • Post-deploy: смоук сбора (прогон любого источника через ASocks), /scraper/health рендерится без кнопок ротации
  • Отдельно вручную: вычистить те же переменные из /opt/gendesign/tradein-mvp/backend/.env.runtime (безопасно из-за extra="ignore")

Review

deep-code-reviewer: APPROVE, ноль критичных/high/medium. Проверено по существу: fail-closed цел (providers/_proxy.py zero-diff), все 8 call-sites ban-rotation прослежены (нет бесконечных циклов, бюджет исчерпывается как раньше), ASocks-ротация не тронута, схема /scraper/health не сломана, pre-existing падения подтверждены запуском на чистом main.

Refs #2616

## Summary **#2616 шаги 2 и 3** (шаг 1 fail-closed сделан вчера — #2634 + дожим). Порядок из issue соблюдён строго: чистить переменные можно было **только после** fail-closed, иначе пустая переменная означала бы прямое подключение с IP сервера (засветить перед Авито/Цианом). **Шаг 2** — удалены 9 мёртвых mobileproxy-переменных (`AVITO/CIAN/YANDEX_PROXY_URL`, `BROWSER_PROXY_*`, `*_PROXY_ROTATE_URL`; все на закрытых аккаунтах — 407/connection refused, #2613): поля config, чтения в `browser/server.py::_provider_proxy`, Protocol `ScraperConfig`, `RealScraperConfig`. `SCRAPER_PROXY_URL` (ASocks) — единственный источник egress для всех провайдеров. **Каскад**: changeip-ротация mobileproxy мертва вместе с подпиской → `_rotate_proxy_ip`/`_rotate_ip` застаблены. Ревью проследило: **поведение идентично** — мёртвый URL и так возвращал False после впустую потраченного round-trip; `max_rot 4→0` даёт тот же исход (никогда не проходил дальше), бюджет ban-rotation считался одинаково и раньше. Убрана только потерянная сетевая задержка. **Шаг 3** — удалена мёртвая ручка `POST /scraper/{source}/rotate-ip` + её кнопки во фронте (dead-branch удалён, не оставлен unreachable). Живая ASocks-ротация `POST /admin/proxies/{id}/rotate` (#2611) и fail-closed guard — zero behavior diff (проверено ревью). **Побочный фикс, найденный ревью**: cian curl-путь брал `config.cian_proxy_url` = `CIAN_PROXY_URL` (мёртвый) вместо живого `SCRAPER_PROXY_URL` — теперь passthrough на живой узел. По egress-изоляции: per-provider узлы были фикцией (мёртвые креды; `BROWSER_PROXY_AVITO` — задокументированный корень «52/53 забаненных прогонов за 14 дней»). Кодификация «один живой узел на всех» отражает реальность (#2638), а не вводит новую single-point-of-failure. ## Test plan - [x] backend touched-tests 170/170, полный сьют 3257 passed (1 known pre-existing) - [x] browser-сьют 92 passed; 4 падения подтверждены pre-existing (тот же набор на чистом main-tip в отдельном worktree) - [x] `tsc --noEmit` + lint фронта чисто; ноль dangling-ссылок на rotate-ip - [ ] Post-deploy: смоук сбора (прогон любого источника через ASocks), `/scraper/health` рендерится без кнопок ротации - [ ] Отдельно вручную: вычистить те же переменные из `/opt/gendesign/tradein-mvp/backend/.env.runtime` (безопасно из-за `extra="ignore"`) ## Review deep-code-reviewer: **✅ APPROVE**, ноль критичных/high/medium. Проверено по существу: fail-closed цел (`providers/_proxy.py` zero-diff), все 8 call-sites ban-rotation прослежены (нет бесконечных циклов, бюджет исчерпывается как раньше), ASocks-ротация не тронута, схема `/scraper/health` не сломана, pre-existing падения подтверждены запуском на чистом main. Refs #2616
bot-backend added 1 commit 2026-08-05 09:32:27 +00:00
chore(tradein): удалить мёртвые mobileproxy env-переменные и rotate-ip (#2616 шаги 2-3)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI Trade-In / changes (pull_request) Successful in 7s
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
CI Trade-In / frontend-checks (pull_request) Successful in 1m3s
CI Trade-In / backend-tests (pull_request) Successful in 2m44s
21a27f6ebe
AVITO/CIAN/YANDEX_PROXY_URL, BROWSER_PROXY_* и *_PROXY_ROTATE_URL указывали
на закрытые mobileproxy-аккаунты (407/connection refused, проверено #2613).
SCRAPER_PROXY_URL (ASocks) остаётся единственным источником egress для всех
провайдеров. Порядок из issue соблюдён: чистка возможна только ПОСЛЕ
fail-closed (шаг 1, #2634) — иначе пустая переменная означала бы прямое
подключение с IP сервера.

Каскад: changeip-ротация mobileproxy мертва вместе с подпиской, поэтому
_rotate_proxy_ip/_rotate_ip застаблены (поведение идентично — мёртвый URL и
так возвращал False после впустую потраченного round-trip), удалена мёртвая
ручка POST /scraper/{source}/rotate-ip и её кнопки во фронте. Живая
ASocks-ротация POST /admin/proxies/{id}/rotate (#2611) не затронута,
fail-closed guard не затронут.

Побочный фикс: cian curl-путь брал config.cian_proxy_url = CIAN_PROXY_URL
(мёртвый) вместо живого SCRAPER_PROXY_URL — теперь passthrough на живой.

Refs #2616
bot-backend merged commit 59c072fc4c into main 2026-08-05 09:35:55 +00:00
bot-backend deleted branch chore/tradein-remove-dead-proxy-vars 2026-08-05 09:35:56 +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#2650
No description provided.