-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
148 lines (148 loc) · 10.2 KB
/
Copy pathdocker-compose.yml
File metadata and controls
148 lines (148 loc) · 10.2 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
services:
coding2api:
build: .
image: ghcr.io/robbsluo/coding2api:latest
container_name: coding2api
restart: unless-stopped
environment:
# 必填:凭证列加密密钥。丢失后已存凭证全部不可解,只能重录。
APP_SECRET: ${APP_SECRET:?set APP_SECRET in .env}
# 管理台管理员用户名(逗号分隔);留空则所有用户只读
ADMIN_USERNAMES: ${ADMIN_USERNAMES:-admin}
# 远程部署时必须设为浏览器可达的地址,TRAE 登录回调依赖它
PUBLIC_BASE_URL: ${PUBLIC_BASE_URL:-http://127.0.0.1:8000}
CODEBUDDY_API_ENDPOINT: ${CODEBUDDY_API_ENDPOINT:-https://copilot.tencent.com}
DEFAULT_MODEL: ${DEFAULT_MODEL:-glm-5.2}
# 模型列表黑名单(fnmatch glob,逗号分隔,完全替换语义)
MODEL_BLOCKLIST: ${MODEL_BLOCKLIST:-custom_model_*,*sub*agent*,summary,browser_use_*,file_search_agent,default,hunyuan-image-*}
QUOTA_PROBE_MINUTES: ${QUOTA_PROBE_MINUTES:-60}
# 模型目录兜底刷新周期(分钟):没有它,模型表只在有人调 /v1/models 时
# 才刷新,纯 API 用法的部署会让「模型→渠道」归属表与落盘快照变陈旧
MODEL_CATALOG_MINUTES: ${MODEL_CATALOG_MINUTES:-30}
# 成长中心(仅 CodeBuddy):一轮领取周期,以及是否允许不可逆动作
# (抽奖/连登兑换/开 Buddy 盲盒/消耗补登卡)
GROWTH_INTERVAL_MINUTES: ${GROWTH_INTERVAL_MINUTES:-60}
GROWTH_IRREVERSIBLE_ACTIONS: ${GROWTH_IRREVERSIBLE_ACTIONS:-true}
# 活跃上报(B1.7,仅 CodeBuddy,默认关闭):补发一条对话事件续连登;
# 官方条款禁止脚本篡改活动数据,开启前请自行评估账号风险
ACTIVITY_REPORT_ENABLED: ${ACTIVITY_REPORT_ENABLED:-false}
ACTIVITY_REPORT_HOUR: ${ACTIVITY_REPORT_HOUR:-10}
# 运维告警(P1-7):周期评估四类风险,命中落站内记录并可选推送 webhook。
# webhook 留空 = 只留站内记录、不外推(多个地址用逗号分隔)
ALERT_ENABLED: ${ALERT_ENABLED:-true}
ALERT_WEBHOOK_URL: ${ALERT_WEBHOOK_URL:-}
ALERT_INTERVAL_MINUTES: ${ALERT_INTERVAL_MINUTES:-5}
# 同一 (规则, 对象) 的静默窗(分钟);0 关闭静默(每轮都报)
ALERT_SILENCE_MINUTES: ${ALERT_SILENCE_MINUTES:-30}
# 池耗尽:ready 少于该值即告警;0 关闭该规则
ALERT_POOL_READY_MIN: ${ALERT_POOL_READY_MIN:-1}
# 任务连续失败达到该次数即告警;0 关闭该规则
ALERT_TASK_FAILURES: ${ALERT_TASK_FAILURES:-3}
# token 剩余少于该小时数即告警;0 关闭该规则
ALERT_TOKEN_EXPIRY_HOURS: ${ALERT_TOKEN_EXPIRY_HOURS:-24}
# 上游错误率:窗内失败占比达到阈值且样本数足够时告警;阈值 0 关闭该规则
ALERT_ERROR_RATE_THRESHOLD: ${ALERT_ERROR_RATE_THRESHOLD:-0.5}
ALERT_ERROR_RATE_MIN_REQUESTS: ${ALERT_ERROR_RATE_MIN_REQUESTS:-20}
ALERT_ERROR_RATE_WINDOW_MINUTES: ${ALERT_ERROR_RATE_WINDOW_MINUTES:-15}
# 到期排序窗口(秒):把距到期 ≤ 该值的积分加总,多的账号先用;≤0 关闭
QUOTA_EXPIRY_WINDOW_SECONDS: ${QUOTA_EXPIRY_WINDOW_SECONDS:-129600}
# 次到期排序窗口(秒):主窗口打平(含都为 0)时才比较;≤0 关闭该级
QUOTA_EXPIRY_SECONDARY_WINDOW_SECONDS: ${QUOTA_EXPIRY_SECONDARY_WINDOW_SECONDS:-604800}
# 会话粘性 TTL(秒):同一对话多轮请求固定用同一凭证;≤0 关闭
CONVERSATION_STICKY_SECONDS: ${CONVERSATION_STICKY_SECONDS:-3600}
# token 到期预警阈值(秒):剩余时间低于该值时管理台标红;≤0 关闭预警
TOKEN_EXPIRY_WARNING_SECONDS: ${TOKEN_EXPIRY_WARNING_SECONDS:-3600}
LOG_LEVEL: ${LOG_LEVEL:-INFO}
# ---- 高级项:默认值已合适,需要时在 .env 里设即可生效 ----
# 注意:compose 的 .env 只用于 ${VAR} 插值,只有在这里透传过的变量
# 才会真正进容器;漏透传会让 .env 里的设置静默失效(无任何报错)。
# Host 白名单(防 DNS rebinding);空 = 本地回环 + PUBLIC_BASE_URL 主机
ALLOWED_HOSTS: ${ALLOWED_HOSTS:-}
# 是否采信 X-Forwarded-For 判定来源 IP(API Key 的 allowed_ips 用)。
# 默认 false;仅在本服务前恰好一层受信反代时开启,否则客户端可伪造。
TRUST_PROXY: ${TRUST_PROXY:-false}
# 上游端点白名单(逗号分隔);改 CODEBUDDY_API_ENDPOINT 时必须同时含它
CODEBUDDY_ALLOWED_ENDPOINTS: ${CODEBUDDY_ALLOWED_ENDPOINTS:-https://copilot.tencent.com,https://www.codebuddy.ai}
# OpenCode Zen 免费层端点与其白名单(Zen 无凭证;白名单仅防误配)
ZEN_API_ENDPOINT: ${ZEN_API_ENDPOINT:-https://opencode.ai}
ZEN_ALLOWED_ENDPOINTS: ${ZEN_ALLOWED_ENDPOINTS:-https://opencode.ai}
# Zen 门禁要求的 UA 版本(低于上游阈值会被 426 拒绝)
ZEN_OPENCODE_VERSION: ${ZEN_OPENCODE_VERSION:-1.18.0}
# Kilo Gateway 免费层端点与其白名单(无凭证;白名单仅防误配)
KILO_API_ENDPOINT: ${KILO_API_ENDPOINT:-https://api.kilo.ai/api/gateway}
KILO_ALLOWED_ENDPOINTS: ${KILO_ALLOWED_ENDPOINTS:-https://api.kilo.ai/api/gateway}
# Qoder(阿里,COSY 私有协议):真实账号渠道。默认国内 openapi 网关;
# 国际版改 QODER_API_ENDPOINT=https://openapi.qoder.sh 并把国际版域名
# 保留在白名单里。推理走 gateway.*,额度/登录走 openapi.*。白名单防把
# 带 COSY 签名的请求发往未授权主机。
QODER_API_ENDPOINT: ${QODER_API_ENDPOINT:-https://openapi.qoder.com.cn}
QODER_GATEWAY_ENDPOINT: ${QODER_GATEWAY_ENDPOINT:-https://gateway.qoder.com.cn}
QODER_ALLOWED_ENDPOINTS: ${QODER_ALLOWED_ENDPOINTS:-https://openapi.qoder.com.cn,https://gateway.qoder.com.cn,https://openapi.qoder.sh,https://api1.qoder.sh}
# CodeArts(华为云码道 / snap-access):AK/SK 签名渠道。白名单必须含
# snap 引擎(推理/令牌)、STS(refresh)、福利网关(模型/领取/余额)、
# 门户(PKCE 授权页)。
CODEARTS_API_ENDPOINT: ${CODEARTS_API_ENDPOINT:-https://snap-access.cn-north-4.myhuaweicloud.com}
CODEARTS_ALLOWED_ENDPOINTS: ${CODEARTS_ALLOWED_ENDPOINTS:-https://snap-access.cn-north-4.myhuaweicloud.com,https://sts.cn-north-4.myhuaweicloud.com,https://opengw.developer.huaweicloud.com,https://codearts.huaweicloud.com}
# CodeBuddy 聊天最小间隔(秒):同凭证顺序连发节流,0 关闭
CODEBUDDY_CHAT_MIN_INTERVAL: ${CODEBUDDY_CHAT_MIN_INTERVAL:-5}
# Zen 聊天最小间隔(秒):独立节流器,0(默认)关闭
ZEN_CHAT_MIN_INTERVAL: ${ZEN_CHAT_MIN_INTERVAL:-0}
# Kilo 聊天最小间隔(秒):独立节流器,0(默认)关闭
KILO_CHAT_MIN_INTERVAL: ${KILO_CHAT_MIN_INTERVAL:-0}
# Qoder / CodeArts 聊天最小间隔(秒):真实账号渠道,独立节流器
QODER_CHAT_MIN_INTERVAL: ${QODER_CHAT_MIN_INTERVAL:-5}
CODEARTS_CHAT_MIN_INTERVAL: ${CODEARTS_CHAT_MIN_INTERVAL:-5}
# CodeArts 每账号在途并发上限(上游硬限会话数 3);0 关闭上限
CODEARTS_MAX_CONCURRENCY: ${CODEARTS_MAX_CONCURRENCY:-3}
# CodeArts 账号滑动窗口(秒):与上限组合成「窗口内最多启动 N 次」,
# 对齐上游「每账号每约 60s 最多 3 个会话」;0 关闭窗口口径
CODEARTS_REQUEST_WINDOW_SECONDS: ${CODEARTS_REQUEST_WINDOW_SECONDS:-60}
# 11128 内容风控自愈:中和出站正文里的伪装客户端指纹,false 关闭
CODEBUDDY_SANITIZE_CHANNEL_MARKERS: ${CODEBUDDY_SANITIZE_CHANNEL_MARKERS:-true}
# token 预刷新窗口(小时)
REFRESH_SKEW_HOURS: ${REFRESH_SKEW_HOURS:-24}
# 全局节流器随机区间(秒)
PACER_MIN_SECONDS: ${PACER_MIN_SECONDS:-5}
PACER_MAX_SECONDS: ${PACER_MAX_SECONDS:-20}
# 诊断:把 /v1 原始请求体落盘到 data/dumps/(含对话内容,仅排查用)
DUMP_REQUEST_BODIES: ${DUMP_REQUEST_BODIES:-false}
# 截断续写:上游 finish_reason=length 时同凭证自动续写的最多次数;0 关闭
AUTO_CONTINUE_MAX: ${AUTO_CONTINUE_MAX:-10}
UPSTREAM_COMPLETE_TIMEOUT_SECONDS: ${UPSTREAM_COMPLETE_TIMEOUT_SECONDS:-600}
# 上下文压缩:按模型目录里的输入上限裁剪过长对话,避免撞上游硬限制
CONTEXT_COMPRESS_ENABLED: ${CONTEXT_COMPRESS_ENABLED:-true}
CONTEXT_COMPRESS_RESERVE_TOKENS: ${CONTEXT_COMPRESS_RESERVE_TOKENS:-4096}
CONTEXT_COMPRESS_MIN_KEEP_MESSAGES: ${CONTEXT_COMPRESS_MIN_KEEP_MESSAGES:-4}
CONTEXT_COMPRESS_SAFETY_RATIO: ${CONTEXT_COMPRESS_SAFETY_RATIO:-0.95}
# 跨渠道 fallback 兼容组:主渠道全不可用时按组回退到同义模型(留空关闭)
MODEL_FALLBACK_GROUPS: ${MODEL_FALLBACK_GROUPS:-}
# 按渠道出站代理(启动期):渠道=代理URL;渠道2=代理URL2,留空直连
PROVIDER_PROXIES: ${PROVIDER_PROXIES:-}
ENABLE_DOCS: ${ENABLE_DOCS:-false}
# 服务监听地址(容器内必须 0.0.0.0 才能被映射访问)
HOST: ${HOST:-0.0.0.0}
PORT: ${PORT:-8000}
# 用户文件路径(容器内固定挂载点,一般无需改)
USERS_FILE: ${USERS_FILE:-/app/secrets/users.txt}
# SQLite 与运行数据目录(容器内固定挂载点,一般无需改)
DATA_DIR: ${DATA_DIR:-/app/data}
ports:
- "${PORT:-8000}:8000"
volumes:
# 凭证与统计(SQLite)与用户文件分开挂载
- ./data:/app/data
- ./secrets:/app/secrets:ro
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request;urllib.request.urlopen('http://127.0.0.1:8000/health')"]
interval: 30s
timeout: 5s
retries: 3
# 日志轮转(唯一声明式、无需运维动手的一层):json-file 驱动默认
# **无上限**,长期运行会把宿主磁盘写满。应用只写 stdout/stderr,
# 由 docker 采集,因此限额必须在这里给。
# 查看:docker logs coding2api;宿主机路径见 docker inspect 的 LogPath
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"