File size: 4,069 Bytes
c47ec10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
services:
  init-config:
    image: python:3.13-alpine
    container_name: chatgpt2api-warp-init
    working_dir: /app
    volumes:
      - ./config.json:/app/config.json
      - ./scripts:/app/scripts:ro
    environment:
      CHATGPT2API_CONFIG_FILE: /app/config.json
      CHATGPT2API_PROXY_RUNTIME_ENABLED: ${CHATGPT2API_PROXY_RUNTIME_ENABLED:-true}
      CHATGPT2API_PROXY_RUNTIME_EGRESS_MODE: ${CHATGPT2API_PROXY_RUNTIME_EGRESS_MODE:-single_proxy}
      CHATGPT2API_PROXY_RUNTIME_PROXY_URL: ${CHATGPT2API_PROXY_RUNTIME_PROXY_URL:-http://privoxy:8118}
      CHATGPT2API_PROXY_RUNTIME_RESOURCE_PROXY_URL: ${CHATGPT2API_PROXY_RUNTIME_RESOURCE_PROXY_URL:-}
      CHATGPT2API_PROXY_RUNTIME_SKIP_SSL_VERIFY: ${CHATGPT2API_PROXY_RUNTIME_SKIP_SSL_VERIFY:-false}
      CHATGPT2API_PROXY_RUNTIME_RESET_STATUS_CODES: ${CHATGPT2API_PROXY_RUNTIME_RESET_STATUS_CODES:-403}
      CHATGPT2API_PROXY_RUNTIME_CLEARANCE_ENABLED: ${CHATGPT2API_PROXY_RUNTIME_CLEARANCE_ENABLED:-true}
      CHATGPT2API_PROXY_RUNTIME_CLEARANCE_MODE: ${CHATGPT2API_PROXY_RUNTIME_CLEARANCE_MODE:-flaresolverr}
      CHATGPT2API_PROXY_RUNTIME_CLEARANCE_TIMEOUT_SEC: ${CHATGPT2API_PROXY_RUNTIME_CLEARANCE_TIMEOUT_SEC:-60}
      CHATGPT2API_PROXY_RUNTIME_CLEARANCE_REFRESH_INTERVAL: ${CHATGPT2API_PROXY_RUNTIME_CLEARANCE_REFRESH_INTERVAL:-3600}
      CHATGPT2API_PROXY_RUNTIME_WARM_UP_ON_START: ${CHATGPT2API_PROXY_RUNTIME_WARM_UP_ON_START:-false}
      CHATGPT2API_PROXY_RUNTIME_BROWSER: ${CHATGPT2API_PROXY_RUNTIME_BROWSER:-chrome}
      CHATGPT2API_PROXY_RUNTIME_USER_AGENT: ${CHATGPT2API_PROXY_RUNTIME_USER_AGENT:-}
      CHATGPT2API_FLARESOLVERR_URL: ${CHATGPT2API_FLARESOLVERR_URL:-http://flaresolverr:8191}
    command: ["python3", "/app/scripts/init_proxy_config.py"]
    restart: "no"

  warp-proxy:
    image: caomingjun/warp:latest
    container_name: chatgpt2api-warp-proxy
    restart: unless-stopped
    environment:
      WARP_SLEEP: "2"
      # 可选:填写 Cloudflare WARP+ License Key
      # WARP_LICENSE_KEY: ${WARP_LICENSE_KEY:-}
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      net.ipv6.conf.all.disable_ipv6: 0
      net.ipv4.conf.all.src_valid_mark: 1
    ports:
      - "127.0.0.1:${WARP_SOCKS_PORT:-40000}:1080"
    healthcheck:
      test: ["CMD-SHELL", "python3 -c \"import socket; s=socket.create_connection(('127.0.0.1', 1080), 5); s.close()\""]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s

  privoxy:
    image: vimagick/privoxy:latest
    container_name: chatgpt2api-privoxy
    restart: unless-stopped
    depends_on:
      warp-proxy:
        condition: service_started
    volumes:
      - ./scripts/privoxy-warp.conf:/etc/privoxy/config:ro
    ports:
      - "127.0.0.1:${PRIVOXY_PORT:-40080}:8118"
    healthcheck:
      test: ["CMD-SHELL", "nc -z 127.0.0.1 8118 || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 10s

  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: chatgpt2api-flaresolverr
    restart: unless-stopped
    environment:
      LOG_LEVEL: ${FLARESOLVERR_LOG_LEVEL:-info}
      TZ: ${TZ:-Asia/Shanghai}
    ports:
      - "127.0.0.1:${FLARESOLVERR_PORT:-8191}:8191"
    healthcheck:
      test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:8191/ >/dev/null"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s

  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: chatgpt2api:warp
    container_name: chatgpt2api-warp
    restart: unless-stopped
    depends_on:
      init-config:
        condition: service_completed_successfully
      privoxy:
        condition: service_started
      flaresolverr:
        condition: service_started
    ports:
      - "${CHATGPT2API_PORT:-3000}:80"
    volumes:
      - ./data:/app/data
      - ./config.json:/app/config.json
    environment:
      STORAGE_BACKEND: ${STORAGE_BACKEND:-json}
      DATABASE_URL: ${DATABASE_URL:-}
      CHATGPT2API_AUTH_KEY: ${CHATGPT2API_AUTH_KEY:-}
      CHATGPT2API_BASE_URL: ${CHATGPT2API_BASE_URL:-}