de544c25b0
Рисовалка топологии Б (§5.6): портал зовёт по HTTP как xf4, она рисует и
отдаёт данные. Ни базы, ни Redis, ни денег. Смоук на живом 2ГИС: листинг 12
фирм, карточка 1 — чистый initialState.
- browser.mjs — постоянный браузер + маскировка + контекст-на-страницу +
museum double-tap для поиска 2ГИС + отсечка картинок/шрифтов/медиа.
- proxy-pool.mjs — round-robin пул прокси из env PROXIES (резидентные/мобильные RU).
- server.mjs — POST /render {url,type}→{data}, auth X-Render-Key, семафор
MAX_CONCURRENCY, /health.
- package.json, README.md, smoke.mjs, .gitignore (node_modules не в гит).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Рендер-сервис 2ГИС/Яндекс (замена xf4)
Маленький 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.
Контракт
POST /render заголовок X-Render-Key: <секрет>, тело { "url": "...", "type": "initialState"|"html" } → { "data": "<initialState|html>" }. Ошибка → { "data": "" } (портал не роняем).
GET /health → { ok, active, max, proxies }.
Переменные окружения (только в .env виртуалки, не в гит)
| Env | Смысл | Дефолт |
|---|---|---|
PORT |
порт сервиса | 8790 |
RENDER_KEY |
секрет портал↔виртуалка (совпадает с SELF_RENDER_KEY портала) |
— (пусто = 401) |
MAX_CONCURRENCY |
сколько браузер-контекстов разом (по памяти, ~350 МБ/контекст) | 4 |
PROXIES |
пул прокси через запятую: http://user:pass@host:port,host:port |
пусто (без прокси) |
Запуск
npm install # ставит playwright
npx playwright install chromium
RENDER_KEY=... MAX_CONCURRENCY=16 PROXIES=... npm start
npm run smoke # проверка на живом 2ГИС (без прокси)
На стороне портала
.env: SELF_RENDER_ENDPOINT=https://<виртуалка>/render, SELF_RENDER_KEY=<тот же секрет>, флаг AUTOPODBOR_SELF_RENDER=true. Откат — флаг в false (мгновенно назад на xf4).