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>
This commit is contained in:
1 parent
4e930caccb
commit
08a6b52b9d
8 files changed
+162
-21
No files matched your search
@@ -57,7 +57,7 @@ src/antibot/
|
||||
```python
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
from playwright.async_api import Page
|
||||
from patchright.async_api import Page
|
||||
|
||||
class Stage(str, Enum):
|
||||
INTERSTITIAL = "interstitial"
|
||||
@@ -188,7 +188,7 @@ async def solve_interactive(page, info, captcha_key: str):
|
||||
|
||||
1. **Траектория мыши** — не прыжок в точку, а несколько промежуточных точек по кривой Безье от текущей позиции курсора до цели, с нелинейным (ease-in-out) распределением скорости и небольшим шумом (±1-2px) на каждом шаге. `page.mouse.move(x, y, steps=N)` даёт линейную интерполяцию — этого мало, нужно звать `mouse.move` несколько раз вручную по расчётным точкам.
|
||||
2. **Ускорение/замедление клика** — задержка `mouse.down()` -> `mouse.up()` рандомная (100-250мс), плюс случайный сдвиг координаты клика внутри bounding box (не в центр, как это делает и сам Scrapling — `randint(26,28)`).
|
||||
3. **Общая стелс-часть** (не про капчу, но без неё стадия A вообще не пройдёт): подмена `navigator.webdriver`, canvas noise, консистентные timezone/locale/UA — то, что в вашем проекте уже частично закрыто Camoufox-фингерпринтом в [main.py](../src/main.py) (`generate_context_fingerprint`). Это нужно сохранить как есть — не переизобретать, Camoufox с этим справляется хорошо, вопрос отказа от него у Scrapling был про производительность/стабильность, а не про качество стелса.
|
||||
3. **Общая стелс-часть** (не про капчу, но без неё стадия A вообще не пройдёт): подмена `navigator.webdriver`, canvas noise, консистентные timezone/locale/UA — сейчас закрывается связкой Patchright + настоящий Google Chrome (`real_chrome=True`) в [engine/stealthy.py](../src/engine/stealthy.py), timezone/locale берутся из геолокации прокси ([api/geoip.py](../src/api/geoip.py)). Camoufox (Firefox) пока остаётся в зависимостях, но как движок не используется — проблемы были скорее с генератором отпечатков, чем с самим Camoufox.
|
||||
|
||||
## 6. Оркестратор (`orchestrator.py`)
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
# Развёртывание в 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/<session_id>` — профили браузера (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 с).
|
||||
@@ -10,7 +10,7 @@
|
||||
- proxy - обязательно нужно задать прокси, система не станет палить свою инфраструктуру
|
||||
- time_zone - временная зона
|
||||
- locale - языковая настройка
|
||||
- user_agent - заголовок браузера Firefox, если не передать будет использован свой
|
||||
- user_agent - User-Agent браузера Chrome, если не передать будет использован свой
|
||||
- screen - размер окна, по умолчанию: 1280х920
|
||||
- timeout - общий таймаут выполнения запроса, по умолчанию: 120
|
||||
- captcha - токен сервиса распознавания, если требуется решить капчу на странице
|
||||
|
||||
Reference in new issue
Block a user