用 CLIProxyAPI + CPA Manager Plus 搭建 AI CLI 网关,聚合多家模型供应商

大家好,好久不见啊!这两年 AI 发展得过于迅速,AI 编程工具越来越多,从最原始的 IDE+ AI 插件(VS Code,Antigravity)到各种基于 AI 的 desktop app(如cursor,codex,claude code),几乎每个工具都有自己的认证方式、模型配置和用量统计。如果只是偶尔用一个服务,这些差异并不明显。但当你同时接入多个模型提供商、多个账号,甚至想在不同 CLI 工具之间复用同一套 API 入口时,问题就会变得很现实:配置分散、费用难算、请求失败不好排查,也很难知道到底是谁在消耗 token。用 CLIProxyAPI (以下简称CPA)聚合多个 AI 提供商,再配合 CPA Manager Plus (以下简称CPAMP) 查看用量、费用和账号状态,最后通过 Cloudflare Tunnel 安全地映射到公网,供 Codex、Claude Code 等工具统一使用,这样统计用量一目了然,而且还方便不少,不用再费劲切换 provider 配置文件了。

CLIProxyAPI 是一个为 CLI 提供多种兼容 API 接口(OpenAI,A/,Gemini等)的代理服务器,它可以聚合多个 model provider,统合成为一个 API base URL,且可以分发多个 API key。CPA Manager Plus 是一个 Manager Server 用于持久化请求监控,还可以巡检 codex 账户,检查是否有效,其有一个单独的管理面板,在这个单独的管理面板里可以看到统计用量,如下图所示:

(图片来源:https://github.com/seakee/CPA-Manager-Plus/blob/main/img/home-zh.png

需要注意的是,CPA也有一个单独的面板,一般设置都在CPA面板中,而 CPAMP 的面板是主要用来查看统计用量和巡检的。两者均可以用 docker 来部署。

话不多说,我们开始吧!

1. 配置需求和本次部署环境

先明确一点:CLIProxyAPI + CPA Manager Plus 并不是在本地运行大模型,而是作为 AI API 网关、协议转换层和用量统计面板存在。真正的模型推理仍然发生在上游模型服务商那里。因此,这套系统对显卡没有要求,CPU 和内存压力也远低于本地部署 LLM。服务器主要承担的是流量转发、流式响应维持、认证、日志记录、SQLite 写入、用量统计和 Cloudflare Tunnel 连接。注意,若要访问 OpenAI,Antrophic 等国外大模型,需要将服务器部署在可访问这两家的地区,如美洲,欧洲;不能部署在内地和中国香港。

本文章默认您已注册 Cloudflare,且已经在内托管了一个域名。否则,将无法使用 cloudflare tunnel。

对于不同用户数量的配置需求,可以参考下表(配置需求由 AI 生成,并不绝对):

使用规模 典型场景 并发流式请求 推荐配置 说明
个人使用 1 人,Codex / Claude Code 偶尔使用 1–5 1 vCPU / 2 GB RAM / 20 GB 足够跑 CPA、管理面板和 cloudflared
轻度小团队 2–5 人,共用一个 AI 网关 5–15 2 vCPU / 4 GB RAM / 40 GB 建议限制日志保留时间,开启基础监控
重度小团队 5–15 人,经常同时跑 coding agent 15–50 4 vCPU / 8 GB RAM / 80 GB SSD SQLite 写入、日志查询和长连接会更明显
更大规模 20 人以上或公开给多人使用 50+ 不建议直接照搬本文方案 应考虑反代限流、独立监控、备份策略和压测

本次部署环境为:Ubuntu Server 24.04 LTS,CPU:2 核,内存:2 GB,硬盘:20 GB(部署在 PVE 中的虚拟机)。

2. 安装 Docker

用 sudo 身份用户 SSH 进入到服务器后,推荐先更新一下:

sudo apt update
sudo apt full-upgrade

然后安装 Docker:

# Add Docker's official GPG key (添加 Docker 官方 GPG 密钥):
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources(将 Docker 软件源添加到 Apt 源中):
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

# 更新软件源
sudo apt update
# 安装 Docker
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装后,可以使用如下命令添加个 docker 容器验证是否安装成功:

sudo docker run hello-world

3. 配置 Cloudflare Tunnel

注册步骤省略,直接到 https://dash.cloudflare.com/sign-up 注册即可。托管域名的步骤也省略,默认在 cloudflare 已经有一个可用域名了。

登录到控制台后(https://dash.cloudflare.com/),在侧边栏中找到并点击“联网”,再点击“Tunnels”:

点击右上角的“创建隧道”,给隧道命个名,之后选择对应的操作系统。本例中为 ubuntu,也可以用 debian 的,架构用 64-bit(除非不同),之后复制粘贴下面的前两条命令到服务器上安装即可:

安装完成后,会在页面上显示连接成功:

然后进入到刚才添加的隧道,在页面下方选择“添加路由”:

选择“已发布的应用程序”后,可以配置自定义域名(a.example.com 或 example.com 都行)。“路径”留空,最下方服务 URL 填写 http://localhost:8317

之后点击“添加路由”即可。

重复上述步骤给 CPAMP 也添加一个路由,注意要换一个子域名,且服务 URL 要换成 http://localhost:18317

4. 安装与配置 CPA

4.1 安装 CPA

我们使用 docker compose 方式来部署 CPA,且默认是部署在公网 VPS + cloudflare tunnel 的。

(问:为什么都有公网 IP 了还要用 cloudflare tunnel??答:懒得申 SSL 证书 + 速度能快一点点点点)

先给 CPA 创个文件夹(文件夹名为 cpa),并进入该文件夹:

mkdir -p ~/cpa
cd ~/cpa

创建 CPA API 和管理密钥(注意:一定要记下来管理密钥,且接下来都要在一个终端内进行,否则密钥无法继承):

# 生成 CPA API key (后期可以更改)
CPA_API_KEY="sk-$(tr -dc 'a-z0-9' </dev/urandom | head -c 32)"

# 生成 CPA 管理密钥
CPA_MNG_KEY="mng-pnl-$(tr -dc 'a-z0-9' </dev/urandom | head -c 32)"

# 查看 CPA API key:
echo "API Key: ${CPA_API_KEY}"

# 查看 CPA 管理密钥
echo "Management Key:${CPA_MNG_KEY}"

写入 CPA 配置文件:

# 限制新建文件权限,避免配置文件被其他用户读取 
umask 077 

# 写入 CLIProxyAPI 配置文件 
cat > config.yaml <<EOF
host: "127.0.0.1"
port: 8317

auth-dir: "/root/.cli-proxy-api"

request-retry: 3

quota-exceeded:
  switch-project: true
  switch-preview-model: true

api-keys:
  - "${CPA_API_KEY}"

remote-management:
  allow-remote: true
  # 首次启动时这里会被 CLIProxyAPI 自动 hash
  secret-key: "${CPA_MNG_KEY}"
  disable-control-panel: false

logging-to-file: true
usage-statistics-enabled: true
logs-max-total-size-mb: 100
EOF

chmod 600 config.yaml

写入 docker compose 文件:

cat <<'EOF' > docker-compose.yml
services:
  cli-proxy-api:
    image: eceasy/cli-proxy-api:latest
    pull_policy: always
    container_name: cli-proxy-api
    network_mode: host
    volumes:
      - ./config.yaml:/CLIProxyAPI/config.yaml
      - ./auths:/root/.cli-proxy-api
      - ./logs:/CLIProxyAPI/logs
    restart: unless-stopped
EOF

启动 CPA:

sudo docker compose up -d

启动后,可以打开网页验证是否成功,域名为:https://前面设定的域名/management.html,如果可以打开即为部署成功:

用我们之前生成的管理密钥(mng-pnl开头的)登录即可。

4.2 配置 CPA

在这里我们仅添加模型提供商,添加或删除 API key,使用方式配置,不进行别的高级操作。

4.2.1 添加模型提供商

CPA 提供了多种添加模型提供商的方式,例如 OAuth 认证(Codex,Anthropic 等),上传 json 文件,添加上游 API。

4.2.1.1 以 OAuth 认证方式添加

进入管理面板后,点击侧栏中的“OAuth”登录,之后选择要登录的提供商:

以登录 Anthropic 为例,选择“开始 Anthropic 登录”,面板会生成一个链接,复制链接到新标签页或无痕模式,登录到 Claude,之后复制验证后的链接地址填入“回调 URL”—“提交回调 URL”即可。注意 Claude 反代可能会导致封号。

Codex 也是一样的模式。

4.2.1.2 添加上游 API

如果买了官方 API,也可以将其添加进 CPA 中一起调用。在侧栏中选择“AI 提供商”,选择对应的格式。这里以 DeepSeek 为例,在 DeepSeek 开放平台充值后,可以调用其 API。这里选择“OpenAI 兼容”—“新建”, 名称可以自行填写,服务地址填写 https://api.deepseek.com,之后添加 API 密钥(从开放平台获取),然后展开“自定义模型”,点击“从端点拉取”,即可获取到 deepseek-v4-pro 和 deepseek-v4-flash(以实际拉取到的模型名为准),全选并应用,再点击“创建”即可。

4.2.2 添加或删除 API key

点击侧栏的“配置面板”,即可看到当前生效的 API key。可以添加(可以自动生成)或删除:

更改后要在下方点击对钩图标保存配置:

4.2.3 更改路由策略

默认的路由策略是“轮询”,如果添加了很多 OAuth 的账号,则在此模式下,每个账号的消耗量是差不多一致的(CPA 会每个账号使用一点用量,直到全部账号额度消耗完毕)。“填充优先”则是 CPA 会优先消耗其中一个账号的额度,一个账号额度用完后,再用下一个账号的额度。

若要更改路由策略,点击侧栏的“配置面板”,点击上方的“完整”,切换到“网络配置”,选择“路由策略”即可,别忘了保存配置。

4.3 更新 CPA

若要更新 CPA(CPA 更新挺频繁的),回到 SSH,进入到部署 CPA 的文件夹(本例为 cpa),再运行:

cd cpa  # 进入部署 CPA 的文件夹

# 更新 CPA
sudo docker compose up -d --pull always

5. 安装与配置 CPAMP

虽然 CPAMP 可以用 docker run 快速启动,但我更建议使用 Docker Compose。原因很简单:后续更新、重启、修改环境变量、备份数据目录都会更清晰。

回到 SSH,给 CPAMP 新建个目录:

mkdir -p ~/cpamp/data
cd ~/cpamp

生成个 CPAMP 的管理密钥(注意:一定要记下来管理密钥,且接下来都要在一个终端内进行,否则密钥无法继承):

CMP_ADMIN_KEY="cmp-admin-$(tr -dc 'a-z0-9' </dev/urandom | head -c 32)"

# 查看 CPAMP 管理密钥
echo "${CMP_ADMIN_KEY}"

写入 docker compose 文件:

cat > docker-compose.yml <<EOF
services:
  cpa-manager-plus:
    image: seakee/cpa-manager-plus:latest
    container_name: cpa-manager-plus
    restart: unless-stopped
    network_mode: host

    environment:
      HTTP_ADDR: "127.0.0.1:18317"
      USAGE_DB_PATH: "/data/usage.sqlite"
      CPA_MANAGER_DATA_KEY_PATH: "/data/data.key"
      USAGE_COLLECTOR_MODE: "auto"
      USAGE_BATCH_SIZE: "100"
      USAGE_POLL_INTERVAL_MS: "500"
      USAGE_QUERY_LIMIT: "50000"
      CPA_MANAGER_ADMIN_KEY: "${CMP_ADMIN_KEY}"

    volumes:
      - ./data:/data
EOF

启动 CPAMP:

sudo docker compose up -d

之后打开之前给 CPAMP 添加的域名(https://前面设定的域名/management.html),输入一下管理密钥。下一步的“CPA 连接地址”填http://127.0.0.1:8317,也可以写前面给 CPA 的域名(会绕一圈)。之后填写 CPA 的管理密钥,后面两步保持默认即可,最后可以勾选“记住凭证”:

点击“初始化”,即可进入主界面了:

这个面板也可以代替 CPA 原生面板,这个就看个人了。

侧栏的“用量分析”和“请求监控”可以看统计用量。在“请求监控”中可以看消耗的价格,可以设置模型价格,也可以一键拉取模型价格。

更新方式和 CPA 一样。

6. 在 CLI 中配置模型提供商

CLI 应用太多了,以 Claude Code 为例,在 Windows 里,打开终端,运行如下命令:

setx ANTHROPIC_BASE_URL "https://CPA 域名"
setx ANTHROPIC_AUTH_TOKEN "your-api-key"

在 macOS 里,打开终端,运行如下命令:

echo 'export ANTHROPIC_BASE_URL=https://CPA 域名' >> ~/.zshrc
echo 'export ANTHROPIC_AUTH_TOKEN=your-api-key' >> ~/.zshrc
source ~/.zshrc

在 Linux 里,打开终端,运行如下命令:

echo 'export ANTHROPIC_BASE_URL=https://CPA 域名' >> ~/.bashrc
echo 'export ANTHROPIC_AUTH_TOKEN=your-api-key' >> ~/.bashrc
source ~/.bashrc

用 Codex 的话,要修改 config.toml:

# ~/.codex/config.toml
model_provider = "cpa"
model = "在 CPA 中配置的模型名"
model_reasoning_effort = "high"

[model_providers.cpa]
name = "cpa"
base_url = "https://CPA 域名/v1"
wire_api = "responses"
requires_openai_auth = true
env_key = "CPA_API_KEY"

设置环境变量:

# Windows
setx CPA_API_KEY "your-api-key"

# macOS
echo 'export CPA_API_KEY=your-api-key' >> ~/.zshrc
source ~/.zshrc

# Linux
echo 'export CPA_API_KEY=your-api-key' >> ~/.bashrc
source ~/.bashrc

Windows 下使用 setx 后,需要关闭并重新打开终端,环境变量才会生效。

7. 安全提示

CPAMP 是管理面板,不建议直接裸露公网。可在 Cloudflare Zero Trust 中为该子域名单独创建 Access Application,只允许自己的邮箱访问。CPA 的 API 域名可以不加 Access,但必须依赖 CPA API Key 鉴权;CPAMP 管理面板一定不要只靠页面自己的 Admin Key 暴露在公网。如果后续主要使用 CPAMP 管理 CPA,可以考虑在 CPA 配置中关闭原生 control panel,或至少不要把管理密钥泄露给任何客户端。