feature: архитектура v2 — api + очередь + worker, удержание окна браузера (#78)
- Сервис api (FastAPI, без Chrome): POST /v2/tasks, GET /v2/tasks/{id} (доступ по cookie
сессии), DELETE /v2/sessions/current; /v1/solve — прежний контракт поверх очереди.
- Сервис worker (dramatiq + RabbitMQ): слоты браузера, окна сессий между задачами
(browser_idle_timeout 0–120 мин, простой — TTL ключа в Redis), heartbeat.
- Маршрутизация задач сессии в персональную очередь воркера с открытым окном.
- Redis: задачи, результаты (RESULT_TTL_HOURS), окна, воркеры. Прокси и ключ 2captcha
в Redis не сохраняются.
- Движок: AsyncStealthySession.run() — действия на текущей странице без навигации.
- Два образа (robotex-api, robotex-worker), compose с rabbitmq и redis,
make up/down/logs/smoke, релиз собирает все образы.
- Тесты: api + worker в одном процессе (fakeredis), настоящий воркер dramatiq на
StubBroker, браузерные тесты на новой схеме, smoke для запущенного стенда.
- Документация: README, API (v2), Deployment, Usage.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
fe509c25c3
commit
7b511d5d38
38 files changed
+2142
-545
No files matched your search
+61
-6
@@ -1,25 +1,78 @@
|
||||
# Локальный запуск и тесты: docker compose up -d --build
|
||||
# Шаблон для релизов — docker-compose.prod.yml (make release).
|
||||
x-backend-env: &backend-env
|
||||
RABBITMQ_URL: amqp://robotex:${RABBITMQ_PASSWORD:-robotex}@rabbitmq:5672/
|
||||
REDIS_URL: redis://redis:6379/0
|
||||
|
||||
services:
|
||||
api:
|
||||
build: .
|
||||
image: robotex:latest
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.api
|
||||
image: robotex-api:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${API_PORT:-8000}:8000"
|
||||
env_file:
|
||||
- path: .env
|
||||
required: false
|
||||
environment: *backend-env
|
||||
depends_on:
|
||||
rabbitmq: {condition: service_healthy}
|
||||
redis: {condition: service_healthy}
|
||||
|
||||
worker:
|
||||
build: .
|
||||
image: robotex-worker:latest
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- path: .env
|
||||
required: false
|
||||
environment: *backend-env
|
||||
volumes:
|
||||
- extra:/app/extra
|
||||
# Chrome активно использует /dev/shm, дефолтных 64MB не хватает
|
||||
shm_size: "2gb"
|
||||
# Потолок ресурсов: при переборе OOM-killer прибьёт процесс Chrome внутри контейнера,
|
||||
# а не соседние сервисы на хосте. Подбирать под сервер вместе с BROWSER_SLOTS.
|
||||
cpus: ${API_CPUS:-4}
|
||||
mem_limit: ${API_MEM_LIMIT:-8g}
|
||||
memswap_limit: ${API_MEM_LIMIT:-8g}
|
||||
cpus: ${WORKER_CPUS:-4}
|
||||
mem_limit: ${WORKER_MEM_LIMIT:-8g}
|
||||
memswap_limit: ${WORKER_MEM_LIMIT:-8g}
|
||||
# при остановке воркер дожидается текущих задач и закрывает окна
|
||||
stop_grace_period: 60s
|
||||
depends_on:
|
||||
rabbitmq: {condition: service_healthy}
|
||||
redis: {condition: service_healthy}
|
||||
|
||||
rabbitmq:
|
||||
image: rabbitmq:4.1-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
RABBITMQ_DEFAULT_USER: robotex
|
||||
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-robotex}
|
||||
# задача выполняется до 3 ч, а по умолчанию RabbitMQ рвёт канал, если сообщение не подтверждено 30 мин
|
||||
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: -rabbit consumer_timeout 14400000
|
||||
volumes:
|
||||
- rabbitmq:/var/lib/rabbitmq
|
||||
healthcheck:
|
||||
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
|
||||
interval: 10s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
|
||||
redis:
|
||||
image: redis:8.2-alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- redis:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
# HTTP-прокси для локальных тестов (exit-IP = IP хоста): docker compose --profile loadtest up -d
|
||||
# из контейнера api доступен как http://proxy:8080
|
||||
# из контейнера worker доступен как http://proxy:8080
|
||||
proxy:
|
||||
image: gogost/gost:3.1.0
|
||||
profiles: ["loadtest"]
|
||||
@@ -28,3 +81,5 @@ services:
|
||||
|
||||
volumes:
|
||||
extra:
|
||||
rabbitmq:
|
||||
redis:
|
||||
Reference in new issue
Block a user