Маленький Node+Playwright сервис для выделенной виртуалки. Портал (Лидерра) зовёт его по HTTP как xf4 — он рисует страницу с маскировкой через прокси и отдаёт данные. **Ни базы, ни Redis, ни денег** — только рендер (топология Б, см. `docs/superpowers/specs/2026-07-05-self-render-2gis-yandex-channel-design.md`).
## Что делает
- Постоянный браузер, на каждую страницу — свой контекст (куки + прокси).
- Маскировка под живой Chrome + **museum double-tap** для поиска 2ГИС (иначе запрос уходит в мусор — см. findings-спайк).
- Отсечка картинок/шрифтов/медиа (экономит трафик прокси и время).
- Для 2ГИС отдаёт `window.initialState` (портал разбирает `TwoGisJsonReader`), для Яндекса/сайтов — HTML.
После оплаты в дашборде берём для порта: **host, port, login, password**.
🔴 **Только HTTP-эндпоинт, НЕ SOCKS5.** Playwright умеет авторизацию прокси (`user:pass`) лишь для HTTP/HTTPS — у SOCKS5 авторизация не поддерживается (тихо не подключится). У Proxy.Market для порта обычно есть оба протокола — берём HTTP.
Формат в `.env` виртуалки:
```
PROXIES=http://login:password@host:port
```
Несколько портов — через запятую (тогда round-robin по ним). Один мобильный порт = один IP за раз; для нашего объёма (5–6 прогонов/день) этого хватает — мобильный IP высокодоверенный. Смена IP у мобильных — по ссылке-ротатору из дашборда (опционально, на будущее; сейчас не требуется).
npm run smoke # проверка на живом 2ГИС (без прокси)
```
## На стороне портала
`.env`: `SELF_RENDER_ENDPOINT=https://<виртуалка>/render`, `SELF_RENDER_KEY=<тот же секрет>`, флаг `AUTOPODBOR_SELF_RENDER=true`. Откат — флаг в `false` (мгновенно назад на xf4).