> Исторический документ исходного WTG. Сервис удалён 07.09.2026; описанные здесь команды эксплуатации не являются действующей конфигурацией VPS.

# Docker и runtime

Актуально на 2026-06-22.

## Compose-сервисы

Локальная базовая схема в `docker-compose.yml`:

- `postgres`;
- `migrate`;
- `web`;
- `worker`;
- `auth_tool` по необходимости.

Локальные debug-profile сервисы:

- `crawler`;
- `scheduler`.

Production-схема в `infra/deploy/compose.prod.yml`:

- `postgres`;
- `migrate`;
- `web`;
- `worker`;
- `ocr_sidecar`;
- `ocr_worker`;
- `auth_tool`;
- `fast_screen_pool`;
- `scheduler`;
- `telegram-bot`;
- `accounts_vnc` только с profile `legacy-vnc`.

## Основной локальный запуск

```powershell
docker compose up -d postgres web worker
```

Что происходит:

- `postgres` поднимает БД;
- `migrate` применяет Alembic migrations перед стартом app services;
- `web` запускает FastAPI/Jinja admin;
- `worker` слушает очередь `admin_jobs`.

Запуск с visible browser/noVNC:

```powershell
docker compose up -d postgres web worker auth_tool
```

Окно noVNC:

```text
http://127.0.0.1:6080
```

`auth_tool` не запускает логин сам при старте. Он поднимает Xvfb/noVNC и
visible worker; reauthorization создается вручную из `/admin/schedules` или
`/admin/accounts`.

## Production runtime

Production compose запускает scheduler, OCR sidecar/worker и fast screen pool
как обычные сервисы.

`scheduler`:

- ставит API polling jobs при `WTG_API_POSTS_POLL_ENABLED=1`;
- обновляет user token jobs при `WTG_API_USER_TOKEN_REFRESH_ENABLED=1`;
- валидирует browser session перед новой posts-wave;
- не выполняет legacy crawl при `WTG_SCHEDULER_CRAWL_ENABLED=0`.

`ocr_sidecar`:

- отдельный FastAPI service на `:8090`;
- держит PaddleOCR engine;
- endpoints: `/health`, `/ocr`;
- используется для deep OCR через `WTG_OCR_SIDECAR_URL`.

`ocr_worker`:

- leases `ocr_jobs`;
- вызывает `ocr_sidecar`;
- записывает result JSON;
- пере-применяет publication-intelligence/canonical writer после deep OCR,
  если результат уточнил pipeline post.

`fast_screen_pool`:

- обслуживает `api_group_pool_items`;
- создает/leases `fast_screen_pool_states`;
- пишет `fast_screen_pool_checks`;
- использует общий RPS limiter.

## Что не должно происходить автоматически

При `docker compose up` не должно быть:

- автоматического обхода всех групп;
- автоматической переавторизации;
- полной переобработки всех постов;
- автоматического teacher apply;
- автоматического удаления/archive stale data.

Эти действия запускаются через `/admin/*`, scheduler, worker jobs или явные CLI
команды.

## API schedule runtime constraints

После live-калибровки используется глобально сериализованная lane:

- одновременно выполняется не больше одного VK group-wall запроса;
- schedule capacity и runtime cooldown используют `global_interval_seconds`;
- текущий cooldown: `1 wall.get / 5s`;
- суточная емкость одного API-valid аккаунта: `floor(86400 / 5) = 17280 slots/day`;
- capacity дают только аккаунты с валидным API User Token и canary `wall.get`;
- `N <= 8640`: две posts waves в `10:00` и `22:00 Europe/Moscow`;
- `8641 <= N <= 17280`: одна daily wave от `11:00 Europe/Moscow`;
- `N > 17280`: daily overflow/fair rotation;
- `products/services/addresses` выполняются best-effort после posts;
- VK `6/9/29` включает account/fleet cooldown;
- captcha, validation, access denied и rate limit не архивируют группу.

Если web UI VK показывает `Failed to load posts. Too many requests`, это тот же
класс лимита для browser session/IP/account. Не увеличивать число browser retry;
дать cooldown/fleet canary восстановить polling.

## Debug profile

Для ручной отладки:

```powershell
docker compose --profile debug run --rm crawler
docker compose --profile debug run --rm scheduler run-once
docker compose --profile debug up -d scheduler
```

Host CLI альтернативы:

```powershell
.\.venv\Scripts\wtg-crawler.exe crawl-all-groups --limit 5
.\.venv\Scripts\wtg-fast-screen-pool.exe status
.\.venv\Scripts\wtg-ocr-sidecar.exe --host 127.0.0.1 --port 8090
.\.venv\Scripts\wtg-ocr-worker.exe run-once
```

## Хранение state и зависимостей

Обязательные локальные пути:

- deps root: `E:\DEV\wtg\deps`;
- runtime state: `E:\DEV\wtg\state`.

Под ними живут:

- Playwright browsers;
- PaddleOCR/Tesseract/OCR assets and caches;
- auth session state;
- local post media;
- debug artifacts;
- reports;
- logs;
- archive snapshots;
- PostgreSQL data.

Production equivalents:

- `/opt/wtg/deps`;
- `/opt/wtg/state`;
- `/opt/wtg/env/prod.env`.

## Основные URLs

Local:

- `http://127.0.0.1:8000/admin/schedules`;
- `http://127.0.0.1:6080` for noVNC when `auth_tool` is running.

Production:

- `https://wtg.komaroff-dev.ru/admin/schedules`;
- `https://wtg.komaroff-dev.ru/admin/results`;
- `https://wtg.komaroff-dev.ru/profile` for Telegram WebApp.
