File size: 1,513 Bytes
f26e640
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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: