Files
robotex/docs/Deployment.md
protokeyandClaude Opus 5.5 08a6b52b9d build: сборка в docker
- Dockerfile: python 3.12, Google Chrome (patchright), Xvfb, tini как PID 1 против зомби-процессов
- docker-compose: volume для extra/, shm_size 2gb, порт через API_PORT
- requirements: добавлены playwright и camoufox
- docs: Deployment.md, README и доки актуализированы под Chrome

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 00:17:28 +04:00

2.7 KiB

Развёртывание в Docker

Быстрый старт

docker compose up -d --build
docker compose logs -f api

API доступно на http://localhost:8000 (POST /v1/solve).

Без compose:

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/<session_id> — профили браузера (cookies, local storage, fingerprint) по session_id;
  • extra/geoip_cache.json — кэш геолокации прокси.

Профили со временем накапливаются — чистить вручную:

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 с).