services: solver: build: . container_name: violetics-solver restart: unless-stopped depends_on: byparr: condition: service_healthy ports: - "9988:9988" environment: MAX_WORKERS: "8" PORT: "9988" # Byparr (Camoufox + playwright-captcha) replaces FlareSolverr. # FS v3.4.6 times out on current CF interactive challenges; Byparr # uses a stealthier fingerprint and actively tracks CF changes. # Protocol is FlareSolverr-compatible except `max_timeout` is in # seconds (not ms) — solver.py handles this. CHALLENGE_PROXY_URL: "http://byparr:8191" CHALLENGE_PROXY_KIND: "byparr" volumes: - solver-profile:/tmp/ts_profile shm_size: "1gb" healthcheck: test: ["CMD", "python3", "-c", "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:9988/health',timeout=2).status==200 else 1)"] interval: 30s timeout: 5s retries: 3 start_period: 30s byparr: image: ghcr.io/thephaseless/byparr:latest container_name: violetics-byparr restart: unless-stopped environment: LOG_LEVEL: "WARNING" TZ: "Asia/Jakarta" shm_size: "1gb" healthcheck: test: ["CMD-SHELL", "python3 -c 'import urllib.request,sys; sys.exit(0 if urllib.request.urlopen(\"http://127.0.0.1:8191/docs\",timeout=3).status==200 else 1)'"] interval: 30s timeout: 10s retries: 5 start_period: 90s volumes: solver-profile: