Files
portal/render-service
Дмитрий de544c25b0 feat(autopodbor): рендер-сервис на виртуалке — Node+Playwright (фаза 6)
Рисовалка топологии Б (§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>
2026-07-05 19:00:48 +03:00
..

Рендер-сервис 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).