CLIProxyAPI 安装与升级指南

项目地址: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. 系统要求
  3. 安装方式
  4. config.yaml 完整配置参考
  5. Docker 运行方式对比
  6. 管理面板使用指南
  7. API 调用示例
  8. 客户端 SDK 集成
  9. OAuth 提供者配置
  10. 多提供商配置模板
  11. 模型管理
  12. 路由与负载均衡
  13. Payload 操作(请求干预)
  14. 代理配置
  15. 插件系统
  16. 存储后端
  17. 日志管理
  18. 禁止 IP 直连
  19. Nginx 反向代理与域名
  20. Cloudflare Tunnel 隐藏源站
  21. 安全加固
  22. 生产环境 Checklist
  23. 升级服务
  24. 备份与恢复
  25. 故障排查
  26. 一键诊断脚本
  27. 卸载 CLIProxyAPI
  28. 常用命令速查
  29. 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

菜单操作:

  1. 进入应用商店 → 找到 CLIProxyAPI
  2. 选择 1. 安装
  3. 按提示输入管理***
  4. 记录输出的访问地址

验证:

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 等

常见错误(⚠️ 注意)

  1. 把 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" “`

  1. base-url 路径不完整 ❌ 某些服务需要完整路径
  • https://token.sensenova.cn/v1 ✅ 不需要 /chat/completions
  • https://anyrouter.top ✅ 不需要 /v1
  • https://api.cline.bot/api/v1 ✅ 自带 /api/v1
  1. 模型名带斜杠导致客户端调用不便
  • 可以使用 alias 设置简短别名

“`yaml models:

  • name: "stepfun/step-3.7-flash-free"

alias: "step-3.7-flash-free" “`

  1. 示例 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 故障转移机制

  1. 请求失败(403/408/500/502/503/504)→ 自动重试
  2. 切换到其他凭证 → 最多尝试 max-retry-credentials 次
  3. 临时失败的凭证进入冷却(cooldown)
  4. 配额超限 → 自动切换项目或预览版模型

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:如何迁移到新服务器?

  1. 旧服务器:备份 /root/cli-proxy-api/data/ + 管理面板导出配置
  2. 新服务器:安装 CLIProxyAPI
  3. 恢复 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+

Leave a Comment