services: newapi-usage: build: context: . dockerfile: Dockerfile args: APK_MIRROR: ${APK_MIRROR-https://mirrors.aliyun.com/alpine} GOPROXY: ${GOPROXY-https://goproxy.cn,direct} GOSUMDB: ${GOSUMDB-sum.golang.google.cn} image: newapi-usage:local container_name: newapi-usage restart: unless-stopped ports: - "${PORT:-8080}:8080" environment: # PostgreSQL example: # SQL_DSN=postgresql://root:123456@postgres:5432/new-api?sslmode=disable # # MySQL example: # SQL_DSN=root:123456@tcp(mysql:3306)/new-api?charset=utf8mb4&parseTime=true # # SQLite example: # SQL_DSN=/data/one-api.db - SQL_DSN=${SQL_DSN} - DB_DRIVER=${DB_DRIVER:-} - HOST=0.0.0.0 - PORT=8080 - DB_MAX_OPEN_CONNS=${DB_MAX_OPEN_CONNS:-10} - DB_MAX_IDLE_CONNS=${DB_MAX_IDLE_CONNS:-5} - QUERY_TIMEOUT_SECONDS=${QUERY_TIMEOUT_SECONDS:-30} - SHOW_FULL_KEYS=${SHOW_FULL_KEYS:-false} - ADMIN_PASSWORD=${ADMIN_PASSWORD} - AUDIT_LOG_GLOB=${AUDIT_LOG_GLOB:-} - AUDIT_INDEX_DSN=${AUDIT_INDEX_DSN:-/var/lib/newapi-usage/audit.db} - AUDIT_TIMEZONE=${AUDIT_TIMEZONE:-UTC} - AUDIT_SCAN_INTERVAL_SECONDS=${AUDIT_SCAN_INTERVAL_SECONDS:-10} - AUDIT_LOOKUP_WINDOW_SECONDS=${AUDIT_LOOKUP_WINDOW_SECONDS:-120} - AUDIT_MAX_LINES_PER_SCAN=${AUDIT_MAX_LINES_PER_SCAN:-50000} - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} - DEEPSEEK_ENABLED=${DEEPSEEK_ENABLED:-false} - DEEPSEEK_API_BASE=${DEEPSEEK_API_BASE:-https://api.deepseek.com} - DEEPSEEK_LABEL=${DEEPSEEK_LABEL:-DeepSeek} - DEEPSEEK_ACCOUNTS_PATH=${DEEPSEEK_ACCOUNTS_PATH:-/var/lib/newapi-usage/deepseek-accounts.json} - CPA_BASE_URL=${CPA_BASE_URL:-} - CPA_TOKEN=${CPA_TOKEN:-} - CPA_LABEL=${CPA_LABEL:-CPA} - CPA_TARGET_TYPE=${CPA_TARGET_TYPE:-codex} - CPA_PROBE_CONCURRENCY=${CPA_PROBE_CONCURRENCY:-20} - CPA_PROBE_TIMEOUT_SECONDS=${CPA_PROBE_TIMEOUT_SECONDS:-15} - CPA_REFRESH_INTERVAL_SECONDS=${CPA_REFRESH_INTERVAL_SECONDS:-300} - CPA_MAX_ACCOUNTS=${CPA_MAX_ACCOUNTS:-0} - SUB2API_BASE_URL=${SUB2API_BASE_URL:-} - SUB2API_API_KEY=${SUB2API_API_KEY:-} - SUB2API_LABEL=${SUB2API_LABEL:-Sub2API} - SUB2API_TIMEZONE=${SUB2API_TIMEZONE:-Asia/Shanghai} - SUB2API_TIMEOUT_SECONDS=${SUB2API_TIMEOUT_SECONDS:-15} - SUB2API_PAGE_SIZE=${SUB2API_PAGE_SIZE:-50} - IKUN_API_BASE=${IKUN_API_BASE:-https://api.ikuncode.cc} - IKUN_ACCESS_TOKEN=${IKUN_ACCESS_TOKEN:-} - IKUN_API_KEY=${IKUN_API_KEY:-} - IKUN_USER_ID=${IKUN_USER_ID:-0} - IKUN_SUB2API_ACCOUNT_ID=${IKUN_SUB2API_ACCOUNT_ID:-0} - IKUN_SUB2API_ACCOUNT_KEY=${IKUN_SUB2API_ACCOUNT_KEY:-ikun} - IKUN_LABEL=${IKUN_LABEL:-Ikun} - OPENCODE_BASE_URL=${OPENCODE_BASE_URL:-} - OPENCODE_USERNAME=${OPENCODE_USERNAME:-admin} - OPENCODE_PASSWORD=${OPENCODE_PASSWORD:-} - OPENCODE_LABEL=${OPENCODE_LABEL:-OpenCode} - OPENCODE_TIMEOUT_SECONDS=${OPENCODE_TIMEOUT_SECONDS:-30} - OPENCODE_CONCURRENCY=${OPENCODE_CONCURRENCY:-5} - ZHIPU_ENABLED=${ZHIPU_ENABLED:-false} - ZHIPU_API_BASE=${ZHIPU_API_BASE:-https://open.bigmodel.cn} - ZHIPU_API_KEY=${ZHIPU_API_KEY:-} - ZHIPU_LABEL=${ZHIPU_LABEL:-智谱 GLM} - ZHIPU_ACCOUNTS_PATH=${ZHIPU_ACCOUNTS_PATH:-/var/lib/newapi-usage/zhipu-accounts.json} - ZHIPU_TIMEOUT_SECONDS=${ZHIPU_TIMEOUT_SECONDS:-15} - XFYUN_ENABLED=${XFYUN_ENABLED:-false} - XFYUN_API_BASE=${XFYUN_API_BASE:-https://maas.xfyun.cn} - XFYUN_LABEL=${XFYUN_LABEL:-讯飞 MaaS} - XFYUN_ACCOUNTS_PATH=${XFYUN_ACCOUNTS_PATH:-/var/lib/newapi-usage/xfyun-accounts.json} - XFYUN_TIMEOUT_SECONDS=${XFYUN_TIMEOUT_SECONDS:-15} - XFYUN_PAGE_SIZE=${XFYUN_PAGE_SIZE:-20} - TZ=${TZ:-Asia/Shanghai} volumes: # Mount the SQLite database here only if SQL_DSN points to /data/*.db. - ./data:/data:ro # Set AUDIT_LOG_DIR to the host directory that contains OpenResty *.jsonl files. - ${AUDIT_LOG_DIR:-./audit-logs}:/audit-logs:ro - ./audit-index:/var/lib/newapi-usage extra_hosts: - "host.docker.internal:host-gateway" networks: - default - newapi-network healthcheck: test: ["CMD", "wget", "-q", "-O", "-", "http://localhost:8080/api/health"] interval: 30s timeout: 5s retries: 3 start_period: 10s networks: default: newapi-network: external: true name: ${NEWAPI_NETWORK:-new-api_new-api-network}