# Развёртывание в Docker ## Быстрый старт ```bash docker compose up -d --build docker compose logs -f api ``` API доступно на `http://localhost:8000` (`POST /v1/solve`). Без compose: ```bash docker build -t robotex-api . docker run -d --name robotex -p 8000:8000 --shm-size=2g -v robotex-extra:/app/extra robotex-api ``` ## Что внутри образа | Компонент | Зачем | |---|---| | `python:3.12-slim-bookworm` | базовый образ, Python той же версии, что и в `.venv` | | `requirements.txt` | ставится из PyPI (папка `wheels/` в образ не попадает — она под Ubuntu Noble и неполная) | | Google Chrome stable (`patchright install --with-deps chrome`) | сессия запускается с `real_chrome=True` → channel `chrome` | | Xvfb (`xvfb-run`) | браузер работает в headful-режиме (`headless=False`), нужен виртуальный дисплей 1920x1080x24 | | `tini` (ENTRYPOINT, PID 1) | пробрасывает сигналы и подбирает осиротевшие процессы Chrome/Xvfb — без него копятся зомби-процессы | | пользователь `app` (uid 1000) | Chrome не запускается от root без `--no-sandbox` | Рабочая директория — `/app/src`, uvicorn запускается как `uvicorn main:app` (импорты в проекте вида `from api import ...`). ## Данные и volume `/app/extra` вынесен в volume `extra`: - `extra/user_data_dir/` — профили браузера (cookies, local storage, fingerprint) по `session_id`; - `extra/geoip_cache.json` — кэш геолокации прокси. Профили со временем накапливаются — чистить вручную: ```bash docker compose exec api sh -c 'rm -rf /app/extra/user_data_dir/*' ``` ## Настройки compose - `shm_size: 2gb` — Chrome активно использует `/dev/shm`, дефолтных 64 МБ не хватает (вкладки падают с «Aw, Snap»). - `API_PORT` — порт на хосте (по умолчанию 8000): `API_PORT=8001 docker compose up -d`. - `restart: unless-stopped`. - `.env` подключается, если существует (шаблон — `env.example`). ## Reverse proxy В проде контейнер ставится за Caddy (TLS). Пример `Caddyfile`: ``` api.example.com { reverse_proxy localhost:8000 } ``` Таймауты прокси должны быть не меньше `timeout` запроса (по умолчанию 120 с).