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:-}