项目地址:https://github.com/router-for-me/CLIProxyAPI
功能:将 Gemini、Claude、Codex、Qwen、Kimi、xAI 等模型包装成 OpenAI 兼容 API
文档版本:v3.0 | 2026-06-19 | 适用版本:v7.2.19+
目录
- 1 目录
- 2 1. 项目简介
- 3 2. 系统要求
- 4 3. 安装方式
- 5 4. config.yaml 完整配置参考
- 6 5. Docker 运行方式对比
- 7 6. 管理面板使用指南
- 8 7. API 调用示例
- 9 8. 客户端 SDK 集成
- 10 9. OAuth 提供者配置
- 11 10. 多提供商配置模板
- 12 11. 模型管理
- 13 12. 路由与负载均衡
- 14 13. Payload 操作(请求干预)
- 15 14. 代理配置
- 16 15. 插件系统
- 17 16. 存储后端
- 18 17. 日志管理
- 19 18. 禁止 IP 直连
- 20 19. Nginx 反向代理与域名
- 21 20. Cloudflare Tunnel 隐藏源站
- 22 21. 安全加固
- 23 22. 生产环境 Checklist
- 24 23. 升级服务
- 25 24. 备份与恢复
- 26 25. 故障排查
- 27 26. 一键诊断脚本
- 28 27. 卸载 CLIProxyAPI
- 29 28. 常用命令速查
- 30 29. FAQ
目录
- 项目简介
- 系统要求
- 安装方式
- config.yaml 完整配置参考
- Docker 运行方式对比
- 管理面板使用指南
- API 调用示例
- 客户端 SDK 集成
- OAuth 提供者配置
- 多提供商配置模板
- 模型管理
- 路由与负载均衡
- Payload 操作(请求干预)
- 代理配置
- 插件系统
- 存储后端
- 日志管理
- 禁止 IP 直连
- Nginx 反向代理与域名
- Cloudflare Tunnel 隐藏源站
- 安全加固
- 生产环境 Checklist
- 升级服务
- 备份与恢复
- 故障排查
- 一键诊断脚本
- 卸载 CLIProxyAPI
- 常用命令速查
- FAQ
1. 项目简介
CLIProxyAPI 是一个 AI API 网关,核心能力:
- 多模型聚合:接入 Gemini、Claude、Codex、Qwen、Kimi、xAI、Vertex AI、Antigravity 等
- 统一接口:所有模型暴露为 OpenAI 兼容 API(/v1/chat/completions)
- OAuth 自动化:自动刷新 Cookie/Token
- 负载均衡:多 API Key 轮询、会话亲和性、故障转移
- 请求干预:默认参数、强制覆盖、参数过滤
- 管理面板:Web UI 管理提供者、API Key、用量统计
2. 系统要求
| 组件 | 要求 |
|---|---|
| 操作系统 | Linux(推荐 Ubuntu 22.04+) |
| Docker | 20.10+ |
| Docker Compose | v2+ |
| CPU | 1 核最低 / 2 核推荐 |
| 内存 | 512MB 最低 / 1GB+ 推荐 |
| 端口 | 8317(主服务) |
| 域名(可选) | 用于 HTTPS 访问 |
3. 安装方式
方式 A:一键管理脚本(推荐)
适合通过 VPS 管理面板(如 ygkkk 面板)部署的用户。
bash
bash /path/to/manager-script.sh
菜单操作:
- 进入应用商店 → 找到 CLIProxyAPI
- 选择 1. 安装
- 按提示输入管理***
- 记录输出的访问地址
验证:
bash
curl -I http://[IP REDACTED]:8317 # 预期:HTTP/1.1 200(根路径返回 200 是正常的)
方式 B:Docker Compose 手动安装
bash
git clone https://github.com/router-for-me/CLIProxyAPI.git cd CLIProxyAPI cp config.example.yaml config.yaml cp .env.example .env # 编辑 config.yaml,至少配置 secret-key vim config.yaml docker compose up -d
方式 C:Docker 手动运行
bash
docker pull eceasy/cli-proxy-api:latest mkdir -p /root/cli-proxy-api/data # 提取默认配置模板 docker run --rm --entrypoint cat eceasy/cli-proxy-api:latest /CLIProxyAPI/config.example.yaml > /root/cli-proxy-api/data/config.yaml vim /root/cli-proxy-api/data/config.yaml docker run -d --name cli-proxy-api --restart always --network host -v /root/cli-proxy-api/data/config.yaml:/CLIProxyAPI/config.yaml -v /root/cli-proxy-api/data:/CLIProxyAPI/data -v /root/cli-proxy-api/auth:/root/.cli-proxy-api eceasy/cli-proxy-api:latest
4. config.yaml 完整配置参考
4.1 基础设置
yaml
# 绑定地址:"" = 所有网卡,"[IP REDACTED]" = 仅本机(禁止 IP 直连) host: "" port: 8317 debug: false
4.2 TLS/HTTPS(服务端直启 HTTPS)
yaml
tls: enable: false # true 时启用 HTTPS cert: "/path/to/cert" key: "/path/to/key"
4.3 管理面板
yaml
remote-management: allow-remote: true # true = 允许远程访问管理面板 *** "your-key-here" # ⚠️ ***限制: # - 最大 72 字节(bcrypt 限制) # - 避免 $ ! 等特殊字符(YAML 解析失败) # - 建议大小写字母+数字组合 disable-control-panel: false panel-github-repository: "https://github.com/router-for-me/Cli-Proxy-API-Management-Center"
4.4 认证与 API Key
yaml
auth-dir: "~/.cli-proxy-api" *** - "*** - "***
⚠️ v7.2.19+ 安全检测:配置中如果包含示例 Key(your-api-key-*),服务会进入 warning-only 模式,只返回警告页面,正常 API 不可用。删除或替换示例 Key 后重启即可。
4.5 重试与路由
yaml
request-retry: 3 max-retry-credentials: 0 max-retry-interval: 30 quota-exceeded: switch-project: true switch-preview-model: true antigravity-credits: true routing: strategy: "round-robin" session-affinity-ttl: "1h"
4.6 日志
yaml
logging-to-file: false # true = 写入文件 logs-max-total-size-mb: 500 # 日志上限(MB) error-logs-max-files: 10 commercial-mode: false # true = 禁用详细日志 usage-statistics-enabled: false
4.7 代理
yaml
proxy-url: "" # socks5://user:pass@host:port/
4.8 AI 提供者
yaml
gemini-api-key: [] codex-api-key: [] claude-api-key: [] vertex-api-key: [] openai-compatibility: []
4.9 OAuth 模型别名
yaml
oauth-model-alias: gemini-cli: - name: "gemini-2.5-pro" alias: "g2.5p" fork: true oauth-excluded-models: gemini-cli: - "gemini-2.5-flash-lite" - "*-preview"
4.10 Payload 操作
yaml
payload: default: - models: - name: "gemini-*" protocol: "gemini" params: "generationConfig.thinkingConfig.thinkingBudget": 32768 override: - models: - name: "gpt-*" protocol: "codex" params: "reasoning.effort": "high" filter: - models: - name: "gemini-2.5-pro" params: - "generationConfig.thinkingConfig.thinkingBudget"
4.11 插件
yaml
plugins: enabled: false dir: "plugins" configs: example: enabled: true priority: 1
4.12 调试
yaml
pprof: enable: false addr: "[IP REDACTED]:8316"
5. Docker 运行方式对比
6. 管理面板使用指南
6.1 访问
text
http://<IP>:8317/management.html
6.2 常见登录失败原因
| 现象 | 原因 | 解决 |
|---|---|---|
| HTTP 404 | secret-key 为空 | 设置一个*** |
| HTTP 404 | secret-key 格式错误 | 避免 $ ! 特殊字符 |
| 容器不断重启 | *** >72 字节 | 缩短*** |
| 登录按钮无反应 | 面板 JS 未加载 | 检查网络,强制刷新 |
6.3 功能模块
| 模块 | 功能 |
|---|---|
| 仪表盘 | 服务状态、模型列表、请求统计 |
| 提供者管理 | 添加/编辑/删除 AI 提供者(Gemini/Claude/Codex 等) |
| API Key 管理 | 创建/禁用/删除客户端 API Key |
| 模型管理 | 查看可用模型、配置别名 |
| 日志 | 实时请求日志、错误日志 |
| 设置 | 导出/导入配置、修改全局设置 |
6.4 导出/导入配置
管理面板 → 设置 → 导出(JSON)/ 导入(上传 JSON)
推荐定期导出保存到本地,是最稳妥的备份方式。
7. API 调用示例
7.1 列出模型
bash
curl http://localhost:8317/v1/models -H "Authorization: Bearer ***
7.2 Chat Completions
bash
curl http://localhost:8317/v1/chat/completions -H "Authorization: Bearer *** -H "Content-Type: application/json" -d '{ "model": "gemini-2.5-pro", "messages": [{"role": "user", "content": "Hello!"}] }'
7.3 流式响应
bash
curl http://localhost:8317/v1/chat/completions -H "Authorization: Bearer *** -H "Content-Type: application/json" -d '{ "model": "gemini-2.5-pro", "stream": true, "messages": [{"role": "user", "content": "Tell me a story"}] }'
8. 客户端 SDK 集成
Python (openai 库)
python
from openai import OpenAI client = OpenAI( api_key="*** base_url="http://your-server:8317/v1" ) response = client.chat.completions.create( model="gemini-2.5-pro", messages=[{"role": "user", "content": "Hello!"}] ) print(response.choices[0].message.content)
JavaScript (fetch)
javascript
const response = await fetch("http://your-server:8317/v1/chat/completions", { method: "POST", headers: { "Authorization": "Bearer *** "Content-Type": "application/json" }, body: JSON.stringify({ model: "gemini-2.5-pro", messages: [{ role: "user", content: "Hello!" }] }) });
cURL (脚本中)
bash
curl -s http://your-server:8317/v1/chat/completions -H "Authorization: Bearer *** -H "Content-Type: application/json" -d '{"model":"gemini-2.5-pro","messages":[{"role":"user","content":"Hello"}]}' | jq -r '.choices[0].message.content'
配合 OpenAI 官方 SDK 使用
所有支持 OpenAI 兼容 API 的工具都可以直接使用 CLIProxyAPI:
| 平台 | 配置方式 |
|---|---|
| OpenAI Python SDK | base_url="http://your-server:8317/v1" |
| OpenAI Node SDK | baseURL: "http://your-server:8317/v1" |
| LangChain | model = ChatOpenAI(model="gemini-2.5-pro", openai_api_base="http://your-server:8317/v1") |
| Cursor/IDE 插件 | 自定义 API Endpoint 指向你的服务器 |
9. OAuth 提供者配置
9.1 支持平台
| 提供者 | 类型 | 说明 |
|---|---|---|
| Gemini (gemini-cli) | OAuth | Cookie 认证,免费额度 |
| Vertex AI | OAuth / API Key | GCP 官方 |
| AI Studio | OAuth | Google 官方 |
| Antigravity | OAuth | 免费额度 |
| Claude | OAuth / API Key | Anthropic |
| Codex | OAuth / API Key | OpenAI Codex CLI |
| Kimi | OAuth | 月之暗面 |
| xAI | OAuth | Grok 系列 |
9.2 配置方式
管理面板 → 提供者管理 → 添加提供者 → 选择平台 → 填写凭据。
OAuth 提供者自动管理 Token/Cookie 刷新(默认 3 小时间隔)。
10. 多提供商配置模板
同时配置 Gemini + Claude + Codex
yaml
*** - "*** gemini-api-key: - "AIzaSy..." # 你的 Gemini API Key claude-api-key: - "*** # 你的 Claude API Key codex-api-key: - "codex-..." # 你的 Codex API Key
通过管理面板添加
推荐在管理面板中添加,因为面板会自动处理提供者配置和认证。
11. 模型管理
11.1 模型列表
启动时自动从 https://github.com/router-for-me/models 拉取最新列表,每 3 小时自动更新。
11.2 模型别名
yaml
oauth-model-alias: gemini-cli: - name: "gemini-2.5-pro" alias: "g2.5p"
11.3 模型排除
yaml
oauth-excluded-models: gemini-cli: - "gemini-2.5-flash-lite" - "*-preview" - "*flash*" # 通配符匹配
11.4 协议说明
11.5 模型配置详解(重要)
每种提供者类型有不同的模型配置方式。以下是完整说明:
Claude / Anthropic 系列(claude-api-key)
yaml
claude-api-key: # 官方 Claude API(无需 base-url) - api-key: "*** models: - name: "claude-sonnet-4-5-20250929" - name: "claude-opus-4-5-20251101" # 第三方 Claude 代理(通过 anyrouter 等)(需 base-url) - api-key: "*** base-url: "https://anyrouter.top" models: - name: "claude-haiku-4-5-20251001"
OpenAI 兼容系列(openai-compatibility)
yaml
openai-compatibility: # 最简配置 - name: "sensenova" base-url: "https://token.sensenova.cn/v1" api-key-entries: - api-key: "*** models: - name: "deepseek-v4-flash" - name: "sensenova-6.7-flash-lite" # 含模型别名 + 优先级 - name: "cline.bot" base-url: "https://api.cline.bot/api/v1" api-key-entries: - api-key: "sk_d7ba31d765a1abee96e8609a3e383f89a74063564d6b11394cc4d13c755c9d16" models: - name: "mimo-v2.5" - name: "minimax-m3" priority: 500
Gemini 系列(gemini-api-key)
yaml
gemini-api-key: - api-key: "AIzaSy..." models: - name: "gemini-2.5-pro" - name: "gemini-2.5-flash"
配置原则
| 提供者类型 | 配置字段 | 适用 API 类型 |
|---|---|---|
| Claude | claude-api-key |
Anthropic 原生格式(含第三方代理) |
| OpenAI 兼容 | openai-compatibility |
OpenAI 格式的任何第三方 API |
| Gemini | gemini-api-key |
Google Gemini 原生 |
| Codex | codex-api-key |
OpenAI Codex CLI |
| Vertex AI | vertex-api-key |
Google Vertex AI |
| OAuth | 管理面板添加 | Gemini/Claude/Codex/Kimi/xAI 等 |
常见错误(⚠️ 注意)
- 把 Claude 代理配成 OpenAI 兼容 ❌
“`yaml # 错误:anyrouter 提供的是 Anthropic API,不是 OpenAI 兼容 openai-compatibility:
- name: "anyrouter"
base-url: "https://anyrouter.top/v1" “` “`yaml # 正确:应配在 claude-api-key 下,加 base-url claude-api-key:
- api-key: "…"
base-url: "https://anyrouter.top" “`
- base-url 路径不完整 ❌ 某些服务需要完整路径
https://token.sensenova.cn/v1✅ 不需要/chat/completionshttps://anyrouter.top✅ 不需要/v1https://api.cline.bot/api/v1✅ 自带 /api/v1
- 模型名带斜杠导致客户端调用不便
- 可以使用
alias设置简短别名
“`yaml models:
- name: "stepfun/step-3.7-flash-free"
alias: "step-3.7-flash-free" “`
- 示例 API Key 未删除导致服务不可用
your-api-key-*必须全部删除,否则 v7.2.19+ 启动失败
管理面板 vs 直接编辑 config.yaml
| 方式 | 优点 | 缺点 |
|---|---|---|
| 管理面板添加 | 自动验证格式、生成正确配置、即时生效 | 不支持批量操作 |
| 直接编辑 config.yaml | 批量添加、版本控制 | 需要重启容器、容易格式错误 |
推荐做法:复杂配置直接编辑 config.yaml,单条配置用管理面板。
模型列表验证
配置后可以通过 API 验证模型是否正确加载:
bash
curl http://[IP REDACTED]:8317/v1/models -H "Authorization: Bearer your-api-key"
预期输出示例:
json
{ "data": [ {"id": "claude-haiku-4-5-20251001", "owned_by": "anthropic"}, {"id": "deepseek-v4-flash", "owned_by": "sensenova"}, {"id": "stepfun/step-3.7-flash-free", "owned_by": "zenmux.ai"} ] }
owned_by字段显示的是提供者名称(name 字段),可用于确认模型归属哪个提供者。
| 协议 | 对应模型 | API 格式 |
|---|---|---|
| openai | GPT 系列 | /v1/chat/completions |
| gemini | Gemini 系列 | /v1/chat/completions(转换后) |
| claude | Claude 系列 | /v1/chat/completions(转换后) |
| codex | Codex (GPT) | /v1/chat/completions |
| antigravity | Antigravity | /v1/chat/completions |
所有协议都转换为 OpenAI 兼容格式,客户端无需区分。
12. 路由与负载均衡
12.1 策略
| 策略 | 说明 |
|---|---|
| round-robin | 轮询所有可用凭证(默认) |
| session-affinity | 同一会话固定同一凭证 |
12.2 故障转移机制
- 请求失败(403/408/500/502/503/504)→ 自动重试
- 切换到其他凭证 → 最多尝试
max-retry-credentials次 - 临时失败的凭证进入冷却(cooldown)
- 配额超限 → 自动切换项目或预览版模型
12.3 冷却机制详解
text
配额超限 → cooldown(默认 60 秒)
→ 到期后自动恢复
→ 可配置 save-cooldown-status 持久化冷却状态
13. Payload 操作(请求干预)
典型场景
| 场景 | 类型 | 效果 |
|---|---|---|
| 所有 Gemini 开启思考 | default | 为所有 gemini 请求设置 thinkingBudget |
| 强制 GPT 高推理强度 | override | 覆盖所有 codex 请求的 reasoning.effort |
| 移除敏感参数 | filter | 删除客户端传入的 thinkingConfig |
规则匹配条件
name:模型名称(支持*通配符)protocol:协议类型(openai / gemini / claude / codex / antigravity)from-protocol:来源协议headers:请求头匹配match/not-match:JSON 路径值匹配exist/not-exist:JSON 路径存在性
14. 代理配置
CLIProxyAPI 支持通过代理访问上游 AI 服务:
yaml
# 全局代理 proxy-url: "socks5://user:pass@[IP REDACTED]:1080/" # 每提供者单独设置(管理面板中配置) # 设为 "direct" 或 "none" 可绕过全局代理
支持协议:
- SOCKS5
- HTTP / HTTPS
15. 插件系统
插件是 Go 动态库(.so),可实现自定义提供者或中间件。
yaml
plugins: enabled: true dir: "plugins" store-sources: - "https://example.com/registry.json"
插件需要实现 C ABI + JSON 方法协议,管理面板自动识别插件 Logo 和配置字段。
16. 存储后端
本地文件(默认)
认证数据存储在 auth-dir(默认 ~/.cli-proxy-api)。
Postgres(可选)
env
PGSTORE_DSN=postgresql://user:pass@localhost:5432/cliproxy
Git 存储(可选)
env
GITSTORE_GIT_URL=https://github.com/your-org/cli-proxy-config.git
对象存储(可选)
env
OBJECTSTORE_ENDPOINT=https://s3.your-cloud.com OBJECTSTORE_BUCKET=cli-proxy-config
这些通过 .env 文件配置,非本地存储时
auth-dir仍作为本地缓存。
17. 日志管理
配置
yaml
logging-to-file: true # 写入文件 logs-max-total-size-mb: 500 # 日志上限 error-logs-max-files: 10 # 错误日志保留数 commercial-mode: false # 禁用详细日志
查看日志
bash
docker logs cli-proxy-api -f # 实时 docker logs cli-proxy-api --tail 50 # 最近 50 行
Docker 自身日志清理
bash
# Docker daemon 配置(/etc/docker/daemon.json) { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
18. 禁止 IP 直连
方法一:修改 host 为 localhost(推荐)
yaml
# config.yaml host: "[IP REDACTED]"
修改后重启:
bash
docker restart cli-proxy-api
效果:服务只监听 [IP REDACTED],外部无法通过 IP+端口访问。Nginx 仍然可以通过本地回环代理。
方法二:iptables 规则
bash
iptables -A INPUT -p tcp --dport 8317 ! -s [IP REDACTED] -j DROP
方法三:云服务器防火墙
在云控制台的安全组/防火墙规则中,不放行 8317 端口,只放行 443(HTTPS)。
19. Nginx 反向代理与域名
完整 Nginx 配置(含 SSL、WebSocket、限流)
nginx
upstream cliproxy_backend { server [IP REDACTED]:8317; keepalive 64; } # HTTP → HTTPS 跳转 server { listen 80; server_name api.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name api.example.com; ssl_certificate /etc/nginx/certs/api.example.com.pem; ssl_certificate_key /etc/nginx/certs/api.example.com.key; # WebSocket 支持(流式必需) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # 限流(可选) limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s; limit_req zone=api burst=50 nodelay; location / { proxy_pass http://cliproxy_backend; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 86400s; # 长连接 proxy_send_timeout 86400s; } client_max_body_size 1000m; }
Nginx 目录结构参考(来自实际环境)
text
/etc/nginx/ ├── conf.d/ │ ├── default.conf # 默认返回 444 │ ├── api.example.com.conf │ └── map.conf # 连接升级映射 ├── certs/ # SSL 证书 ├── nginx.conf └── stream.d/
SSL 证书获取
bash
curl https://get.acme.sh | sh ~/.acme.sh/acme.sh --issue -d api.example.com --nginx ~/.acme.sh/acme.sh --install-cert -d api.example.com --key-file /etc/nginx/certs/api.key --fullchain-file /etc/nginx/certs/api.crt --reloadcmd "nginx -s reload"
20. Cloudflare Tunnel 隐藏源站
使用 Cloudflare Tunnel(cloudflared)可以完全隐藏服务器真实 IP。
bash
# 安装 cloudflared wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O /usr/local/bin/cloudflared chmod +x /usr/local/bin/cloudflared # 登录 cloudflared tunnel login # 创建隧道 cloudflared tunnel create cliproxy # 配置隧道(~/.cloudflared/config.yml) tunnel: cliproxy credentials-file: /root/.cloudflared/cliproxy.json ingress: - hostname: api.example.com service: http://localhost:8317 - service: http_status:404 # 配置 DNS cloudflared tunnel route dns cliproxy api.example.com # 启动 cloudflared tunnel run cliproxy
配合
host: "[IP REDACTED]"使用,API 完全不暴露公网,仅通过 Cloudflare 网络访问。
21. 安全加固
21.1 禁止 IP 直连
yaml
host: "[IP REDACTED]" # 或 iptables / 云防火墙封锁 8317 端口
21.2 管理面板保护
yaml
# 仅允许本地访问管理面板,通过 SSH 隧道使用 remote-management: allow-remote: false
21.3 API Key 安全
- 定期轮换
- 使用强随机字符串(
openssl rand -hex 32) - 不同客户端用不同 Key,方便审计
21.4 Nginx 限流防滥用
nginx
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s; limit_req zone=api burst=50 nodelay;
21.5 IP 白名单(Nginx geo)
nginx
geo $allow_access { default 0; 你的家庭IP/32 1; 公司VPN网段/24 1; } server { if ($allow_access = 0) { return 403; } }
21.6 Fail2Ban 防护
ini
# /etc/fail2ban/jail.local [cliproxy-api] enabled = true port = 8317 filter = cliproxy-api logpath = /root/cli-proxy-api/data/logs/*.log maxretry = 5 bantime = 3600
21.7 文件权限
bash
# config.yaml 仅 root 可读 chmod 600 /root/cli-proxy-api/data/config.yaml
22. 生产环境 Checklist
上线前逐项检查:
- [ ] host 设为 [IP REDACTED](禁止 IP 直连)
- [ ] 管理***已设置(非空、无特殊字符、≤72 字节)
- [ ] 示例 API Key 已删除(否则 v7.2.19+ 不可用)
- [ ] HTTPS 已配置(Nginx + Let’s Encrypt)
- [ ] 数据库已持久化(auth-dir 映射到宿主机)
- [ ] Docker 已设置开机自启(
systemctl enable docker) - [ ] 容器已设置
--restart always - [ ] 防火墙已配置(仅开放必要端口)
- [ ] 系统文件描述符已调优(高并发时)
- [ ] 定时备份已配置
- [ ] 管理面板配置已导出到本地
系统参数调优(高并发)
bash
# /etc/sysctl.conf fs.file-max = 1000000 net.ipv4.tcp_tw_reuse = 1 net.core.somaxconn = 65535 # /etc/security/limits.conf * soft nofile 1000000 * hard nofile 1000000
Docker 资源限制
bash
# 限制容器内存和 CPU docker run -d --memory="1g" --cpus="1" --restart always ...
23. 升级服务
方式 A:一键管理脚本
管理菜单中选择 2. 更新。
方式 B:Docker Compose
bash
cd /home/docker/CLIProxyAPI cp config.yaml config.yaml.bak.$(date +%Y%m%d) git pull docker compose pull docker compose up -d docker logs cli-proxy-api --tail 10
方式 C:Docker 手动
bash
# 1. 备份 cp /root/cli-proxy-api/data/config.yaml /root/config.yaml.bak.$(date +%Y%m%d) # 2. 拉取新镜像 docker pull eceasy/cli-proxy-api:latest # 3. 删除旧容器 docker rm -f cli-proxy-api # 4. 启动新容器 docker run -d --name cli-proxy-api --restart always --network host -v /root/cli-proxy-api/data/config.yaml:/CLIProxyAPI/config.yaml -v /root/cli-proxy-api/data:/CLIProxyAPI/data -v /root/cli-proxy-api/auth:/root/.cli-proxy-api eceasy/cli-proxy-api:latest # 5. 验证 docker logs cli-proxy-api --tail 10 | grep "started successfully"
升级注意事项
| 风险 | 说明 | 预防 |
|---|---|---|
| config.yaml 变成目录 | Docker 挂载路径不正确 | 升级前备份,升级后检查文件 |
| 示例 Key 检测 | 新版本可能新增安全检查 | 删除 your-api-key-* |
| 配置字段不兼容 | 新增/废弃字段 | 对比 config.example.yaml |
| iptables 冲突 | Docker 重启后规则丢失 | 升级后 systemctl restart docker |
24. 备份与恢复
24.1 本地备份
bash
BACKUP_DIR=/root/backups/cli-proxy-$(date +%Y%m%d-%H%M) mkdir -p $BACKUP_DIR cp -r /root/cli-proxy-api/data $BACKUP_DIR/ du -sh $BACKUP_DIR/ # 验证备份有实际内容(应 >12KB) find $BACKUP_DIR/ -type f
24.2 管理面板导出
管理面板 → 设置 → 导出配置 → 保存 JSON 到本地。
这是最稳妥的方式,包含所有提供者配置。
24.3 定时自动备份
bash
# crontab -e,每天凌晨 3 点,保留 7 天 0 3 * * * BACKUP_DIR=/root/backups/cli-proxy-$(date +%Y%m%d); mkdir -p $BACKUP_DIR; cp -r /root/cli-proxy-api/data $BACKUP_DIR/; find /root/backups/ -type d -mtime +7 -exec rm -rf {} + 2>/dev/null; echo "Backup done: $BACKUP_DIR"
24.4 恢复
bash
docker stop cli-proxy-api rm -rf /root/cli-proxy-api/data cp -r /path/to/backup/data /root/cli-proxy-api/data # 确保 config.yaml 是文件不是目录 ls -la /root/cli-proxy-api/data/config.yaml docker start cli-proxy-api docker logs cli-proxy-api --tail 10 curl -I http://[IP REDACTED]:8317
24.5 备份验证
24.6 完整数据备份(重装后可直接恢复)
CLIProxyAPI 的数据分布在三个位置,全部需要备份:
| 路径(宿主机) | 容器内路径 | 说明 | 是否必需 |
|---|---|---|---|
/root/cli-proxy-api/data/config.yaml |
/CLIProxyAPI/config.yaml |
所有提供者配置、API Key、管理*** | ✅ 必需 |
/root/cli-proxy-api/auth/ |
/root/.cli-proxy-api |
认证文件、Token、会话数据 | ✅ 必需 |
/root/cli-proxy-api/data/ |
/CLIProxyAPI/data |
其他数据文件 | 可选 |
一键备份命令
bash
# 创建备份目录(带时间戳) BACKUP_DIR=/root/cli-proxy-full-backup-$(date +%Y%m%d-%H%M) mkdir -p $BACKUP_DIR # 备份全部数据 cp -r /root/cli-proxy-api/data $BACKUP_DIR/data cp -r /root/cli-proxy-api/auth $BACKUP_DIR/auth # 校验 du -sh $BACKUP_DIR/ echo "文件数:$(find $BACKUP_DIR -type f | wc -l)" echo "备份完成:$BACKUP_DIR"
重装后完整恢复
bash
# 1. 停止并删除容器 docker rm -f cli-proxy-api # 2. 恢复数据目录 rm -rf /root/cli-proxy-api/data /root/cli-proxy-api/auth cp -r /path/to/backup/data /root/cli-proxy-api/data cp -r /path/to/backup/auth /root/cli-proxy-api/auth # 3. 确认 config.yaml 是文件不是目录 ls -la /root/cli-proxy-api/data/config.yaml # 4. 启动新容器(挂载全部三个目录) docker pull eceasy/cli-proxy-api:latest docker run -d --name cli-proxy-api --restart always --network host -v /root/cli-proxy-api/data/config.yaml:/CLIProxyAPI/config.yaml -v /root/cli-proxy-api/data:/CLIProxyAPI/data -v /root/cli-proxy-api/auth:/root/.cli-proxy-api eceasy/cli-proxy-api:latest # 5. 验证 sleep 2 docker logs cli-proxy-api --tail 10 curl -I http://[IP REDACTED]:8317
管理面板导出(补充方案)
管理面板 → 设置 → 导出配置 → 保存 JSON。
导出配置不能替代文件备份,因为不包含 OAuth Token、会话数据等。
但导出 JSON 可以快速恢复提供者列表,适合小范围调整后导入。
最佳实践
bash
# 添加到 crontab,每天凌晨 3 点自动备份,保留最近 7 天 0 3 * * * BACKUP_DIR=/root/backups/cli-proxy-full-$(date +%Y%m%d); mkdir -p $BACKUP_DIR; cp -r /root/cli-proxy-api/data $BACKUP_DIR/data; cp -r /root/cli-proxy-api/auth $BACKUP_DIR/auth; find /root/backups/ -type d -mtime +7 -exec rm -rf {} + 2>/dev/null; echo "Backup done: $BACKUP_DIR ($(du -sh $BACKUP_DIR | cut -f1))"
bash
# 如果备份目录只有 12KB 左右(只有空的目录结构),说明备份时数据已丢失 du -sh /path/to/backup/ find /path/to/backup/ -type f
25. 故障排查
25.1 config.yaml 被识别为目录(最常见的坑)
现象:read /CLIProxyAPI/config.yaml: is a directory 原因:Docker 挂载 -v 时,宿主机路径不存在或挂载路径不完整,Docker 自动创建了目录而非文件。 解决:
bash
docker rm -f cli-proxy-api rm -rf /root/cli-proxy-api/data/config.yaml # 从镜像提取默认配置 docker run --rm --entrypoint cat eceasy/cli-proxy-api:latest /CLIProxyAPI/config.example.yaml > /root/cli-proxy-api/data/config.yaml vim /root/cli-proxy-api/data/config.yaml docker run -d --name cli-proxy-api --restart always --network host -v /root/cli-proxy-api/data/config.yaml:/CLIProxyAPI/config.yaml -v /root/cli-proxy-api/data:/CLIProxyAPI/data -v /root/cli-proxy-api/auth:/root/.cli-proxy-api eceasy/cli-proxy-api:latest
25.2 管理面板 404(完整排查)
bash
# 步骤 1:检查 secret-key 是否为空 grep -A2 'secret-key' /root/cli-proxy-api/data/config.yaml # 步骤 2:检查是否含特殊字符 grep 'secret-key' /root/cli-proxy-api/data/config.yaml | grep -E '[$!]' # 步骤 3:检查***长度 grep 'secret-key' /root/cli-proxy-api/data/config.yaml | awk -F'"' '{print length($2)}' # 步骤 4:检查容器是否正常运行 docker ps -a | grep cli-proxy-api docker logs cli-proxy-api --tail 10 | grep -E "management|secret|error" # 步骤 5:修改***后重启 docker restart cli-proxy-api
25.3 iptables 错误
日志:iptables: No chain/target/match by that name 原因:Docker 的 iptables 规则冲突。 解决:
bash
systemctl restart docker docker start cli-proxy-api
25.4 容器不断重启
bash
docker logs cli-proxy-api --tail 50 | grep -i error # 常见原因对照: # "is a directory" → 见 25.1 # "password length exceeds 72" → secret-key 超长 # "unsafe example API key" → 删掉 your-api-key-* # "failed to hash" → secret-key 格式问题 # 端口占用 → ss -tunlp | grep 8317 # 磁盘满 → df -h
25.5 升级后示例 Key 检测
v7.2.19+ 新增安全检查:检测到 your-api-key-* 时会进入 warning-only 模式。
特征:
- 日志:
unsafe example API key configured; starting warning-only server - 所有 API 返回警告页面
- 管理面板可能正常工作
解决:删除 config.yaml 中的示例 API Key:
bash
sed -i '/your-api-key/d' /root/cli-proxy-api/data/config.yaml docker restart cli-proxy-api
25.6 外部无法访问
bash
# 1. 本地测试 curl -I http://[IP REDACTED]:8317 # 2. 检查监听 ss -tunlp | grep 8317 # 3. 检查防火墙 iptables -L -n | grep 8317 # 4. 云服务器安全组 # 登录云控制台检查防火墙规则 # 5. 如果 host="[IP REDACTED]" # 这是正常的——服务只在本地监听,需通过 Nginx 反向代理访问
25.7 管理面板配置丢失
原因:
- auth-dir 未映射到宿主机,容器重建后数据丢失
- 备份目录为空(config.yaml 已是目录时做的备份)
解决:
- 确保 Docker 挂载了 auth-dir 或 data 目录到宿主机
- 定期通过管理面板导出配置到本地
26. 一键诊断脚本
将以下命令保存为 diagnose.sh:
bash
#!/bin/bash echo "=== 1. 容器状态 ===" docker ps -a | grep cli-proxy-api echo -e "n=== 2. 最近日志 ===" docker logs cli-proxy-api --tail 20 echo -e "n=== 3. 端口监听 ===" ss -tunlp | grep 8317 echo -e "n=== 4. 本地测试 ===" curl -I http://[IP REDACTED]:8317 echo -e "n=== 5. 配置*** ===" grep -E 'secret-key|host:|port:' /root/cli-proxy-api/data/config.yaml echo -e "n=== 6. 磁盘 ===" df -h / | tail -1 echo -e "n=== 7. Docker 服务 ===" systemctl is-active docker echo -e "n=== 8. 数据文件 ===" ls -la /root/cli-proxy-api/data/
27. 卸载 CLIProxyAPI
方式 A:管理脚本
管理菜单 → 3. 卸载
方式 B:手动
bash
# 1. 停止容器 docker rm -f cli-proxy-api # 2. 删除镜像 docker rmi eceasy/cli-proxy-api:latest # 3. 删除数据(⚠️ 先确认已备份) rm -rf /root/cli-proxy-api # 4. 删除项目目录(Compose 安装) rm -rf /home/docker/CLIProxyAPI # 5. 清理 Docker docker system prune -f
28. 常用命令速查
bash
# 容器 docker ps -a | grep cli-proxy-api # 状态 docker logs cli-proxy-api -f # 实时日志 docker logs cli-proxy-api --tail 50 # 最近日志 docker restart cli-proxy-api # 重启 docker stop cli-proxy-api # 停止 docker start cli-proxy-api # 启动 docker rm -f cli-proxy-api # 删除 # 镜像 docker pull eceasy/cli-proxy-api:latest # 配置 vim /root/cli-proxy-api/data/config.yaml grep secret-key /root/cli-proxy-api/data/config.yaml # 诊断 curl -I http://[IP REDACTED]:8317 curl http://[IP REDACTED]:8317/v1/models -H "Authorization: Bearer *** ss -tunlp | grep 8317
29. FAQ
Q1:支持哪些模型?
Gemini(2.0/2.5)、Claude(3.5/4.0/4.5)、Codex(GPT-5)、Qwen、Kimi、xAI(Grok)、Vertex AI、Antigravity。管理面板自动拉取最新模型列表。
Q2:修改配置后需要重启吗?
api-keys:热加载,不需要重启secret-key/host/port:需要docker restart cli-proxy-api- 管理面板中添加的提供者:即时生效
Q3:管理面板 404 怎么办?
按 25.2 排查,90% 是 secret-key 为空或格式问题。
Q4:为什么设置的***登录失败?
| 原因 | 解决 |
|---|---|
| 含 $ ! 特殊字符 | 只使用 a-zA-Z0-9 |
| 超过 72 字节 | 缩短*** |
| 修改后未重启 | docker restart cli-proxy-api |
Q5:升级后服务启动不了?
检查 docker logs cli-proxy-api --tail 20:
is a directory→ Docker 挂载把 config.yaml 变成了目录(25.1)example API key→ 删掉 config.yaml 中的your-api-key-*password length exceeds 72→ secret-key 超长
Q6:Stream 不工作?
确保 Nginx 配置了 WebSocket:
nginx
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
Q7:如何迁移到新服务器?
- 旧服务器:备份
/root/cli-proxy-api/data/+ 管理面板导出配置 - 新服务器:安装 CLIProxyAPI
- 恢复 data 目录 + 导入配置 JSON
Q8:API Key 多少位合适?
建议 32 字节以上,用 openssl rand -hex 32 生成。
Q9:如何监控?
bash
# 简单健康检查 curl -I http://[IP REDACTED]:8317 # 或外部 curl -I https://api.example.com
Q10:免费额度怎么配置?
Gemini、Antigravity 等提供免费额度,通过 OAuth 认证即可使用。在管理面板中添加对应的 OAuth 提供者。
Q11:大并发怎么优化?
bash
# 系统调优 sysctl -w fs.file-max=1000000 sysctl -w net.core.somaxconn=65535 # Docker 限制 docker run --memory="1g" --cpus="2" ... # 商用模式 commercial-mode: true # 禁用详细日志,减少内存开销
Q12:如何限制用户调用频率?
- Nginx
limit_req模块 - 每个客户端使用独立 API Key,方便统计和封禁
- CLIProxyAPI 内置冷却机制(配额超限自动暂停)
文档版本:v3.0 | 最后更新:2026-06-19 | 适用版本:CLIProxyAPI v7.2.19+