new-api 配置实战:从源码构建 + CLIProxyAPI 渠道 + Caddy 反代
本文是 new-api 系列的配置实战补充篇,以本站实际运行的服务器配置为蓝本,完整记录从源码构建到生产上线的每一步。
系列导航
new-api 系列
- (一)认识 new-api——新一代 AI API 管理网关
- (二)安装部署——从零搭建 new-api
- (三)渠道配置——接入各类模型提供商
- (四)令牌与用户管理
- (五)计价模型与成本控制
- (六)监控、日志与告警
- (七)生产环境部署与安全加固
- (八)进阶——多实例、负载均衡与 SSO
- (九)接入国内支付——支付宝、微信与自动充值
- (十)接入国际支付——Stripe、PayPal 与海外收银
- 配置实战:从源码构建 + CLIProxyAPI 渠道 + Caddy 反代(本文)
CLIProxyAPI 系列(把 CLI 订阅变成标准 API)
本文记录的是真实机器的真实配置,所有路径、端口、域名均与线上一致。敏感凭证(API Key、密码)以占位符标注。
整体架构
两层代理,一套 Caddy,全部 HTTPS,零额外配置。
第一步:从源码构建 new-api
官方同时提供预编译二进制和 Docker 镜像。选择从源码构建的原因:可以随时 git pull 拉取最新代码、方便本地调试,以及不依赖 Docker 守护进程。
环境准备
需要 Go 1.22+(new-api 的 go.mod 声明的最低版本):
# 下载 Go(或用系统包管理器安装)
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
go version # 确认输出 go1.22.x
克隆仓库并编译
cd ~
git clone https://github.com/Calcium-Ion/new-api.git
cd new-api
# 编译(生成 ./new-api 二进制)
go build -o new-api ./main.go
# 验证
./new-api --version
编译完成后目录结构:
~/new-api/
├── new-api ← 编译产物,实际运行的二进制
├── main.go
├── go.mod / go.sum
├── logs/ ← 运行后自动创建
└── one-api.db ← SQLite 数据库(首次启动后生成;也兼容 one-api 的数据库)
注意:one-api.db 是数据库文件名,new-api 默认继续沿用这个名字,与 one-api 数据格式兼容,从 one-api 迁移时直接覆盖即可。
编译前端(可选)
如果需要修改管理面板 UI,需要单独编译前端:
cd ~/new-api/web
bun install # 或 npm install
bun run build # 产物输出到 web/build/
普通使用直接用已内嵌的前端静态资源即可,不需要单独编译。
第二步:配置 systemd 服务
生产环境必须用 systemd 管理进程,保证崩溃自动重启、开机自启。
实际服务文件
路径:/etc/systemd/system/new-api.service
[Unit]
Description=New API Service
After=network.target
[Service]
User=sdmike
WorkingDirectory=/home/sdmike/new-api
ExecStart=/home/sdmike/new-api/new-api --port 3000 --log-dir /home/sdmike/new-api/logs
Restart=always
RestartSec=5
Environment=GIN_MODE=release
[Install]
WantedBy=multi-user.target
关键字段说明:
| 字段 | 值 | 说明 |
|---|---|---|
User |
sdmike |
以普通用户运行,不需要 root |
WorkingDirectory |
/home/sdmike/new-api |
数据库文件 one-api.db 在此目录 |
--port 3000 |
3000 | 监听本地端口,由 Caddy 反代 |
--log-dir |
.../logs |
应用日志目录,systemd 日志另存 |
GIN_MODE=release |
release | 关闭 Gin 的 debug 输出,生产必开 |
加载并启动
sudo systemctl daemon-reload
sudo systemctl enable --now new-api
# 确认运行
sudo systemctl status new-api
正常输出应包含 Active: active (running)。
第三步:配置 CLIProxyAPI
CLIProxyAPI 负责把 Claude Code / Gemini CLI 的 OAuth 订阅暴露成 OpenAI 兼容端点。new-api 把它当作一个普通渠道接入。
实际配置文件
路径:/home/sdmike/cliproxyapi/config.yaml
host: "127.0.0.1"
port: 8317
tls:
enable: false # TLS 由外层 Caddy 处理,本机通信不需要
auth-dir: "~/.cli-proxy-api" # OAuth 令牌存储目录
api-keys:
- "sk-<your-key-1>" # 多个 key,new-api 可填多个做轮询
- "sk-<your-key-2>"
routing:
strategy: "round-robin" # 多账号轮询策略
session-affinity: false
request-retry: 3 # 单次请求失败时,自动重试上游次数
max-retry-interval: 30 # 重试间隔上限(秒)
quota-exceeded:
switch-project: true # 配额用完时自动切换 Google 项目
switch-preview-model: true # 自动切换到 Preview 模型
antigravity-credits: true # 启用 Antigravity(Google 订阅额度)
logging-to-file: true
logs-dir: "/home/sdmike/cliproxyapi/logs"
logs-max-total-size-mb: 500
gemini-api-key:
- api-key: "<your-gemini-api-key>" # 同时支持 Gemini 模型
几个关键配置点:
两个 api-keys:new-api 渠道「密钥」栏可以填多个(换行分隔),new-api 会轮询调用,CLIProxyAPI 自身也做 round-robin,两层都有负载均衡。
tls.enable: false:CLIProxyAPI 只监听 127.0.0.1:8317,HTTPS 由 Caddy 统一处理,不需要在应用层配 TLS。
quota-exceeded:三个选项全开,充分利用订阅额度,避免因配额耗尽报错。
在 new-api 添加 CLIProxyAPI 渠道
登录 new-api 管理面板 → 左侧「渠道」→「添加渠道」:
| 字段 | 填写值 |
|---|---|
| 类型 | OpenAI(兼容协议) |
| 名称 | CLIProxyAPI-主 |
| 代理地址 | http://127.0.0.1:8317/v1 |
| 密钥 | CLIProxyAPI api-keys 里的两个 key,每个一行 |
| 模型 | 见下方列表 |
模型列表(与 CLIProxyAPI /v1/models 返回值对齐):
claude-opus-4-8
claude-opus-4-7
claude-opus-4-6
claude-sonnet-4-6
claude-sonnet-4-5-20250929
claude-haiku-4-5-20251001
gemini-3.5-flash
gemini-3-flash
gemini-3.1-flash-lite
gemini-2.5-flash
gemini-2.5-flash-lite
模型别名映射(让用户用更短的名字):
claude-opus:claude-opus-4-8
claude-sonnet:claude-sonnet-4-6
claude-haiku:claude-haiku-4-5-20251001
gemini-flash:gemini-3.5-flash
填完点「测试」,返回成功后保存。建议同时开启「自动禁用」,检测间隔 5 分钟。
第四步:Caddy 反代配置
Caddy 自动处理 Let's Encrypt 证书,几行配置搞定 HTTPS。
实际 Caddyfile
路径:/etc/caddy/Caddyfile
# 博客网站
k330.com {
reverse_proxy localhost:4321 {
flush_interval -1
transport http {
read_timeout 120s
write_timeout 120s
}
}
}
# new-api 管理面板 + API 端点
airouter.k330.com {
reverse_proxy localhost:3000 {
flush_interval -1
transport http {
read_timeout 600s
write_timeout 600s
}
}
}
# CLIProxyAPI 控制面板(可选对外暴露)
cliproxy.k330.com {
reverse_proxy localhost:8317 {
flush_interval -1
transport http {
read_timeout 600s
write_timeout 600s
}
}
}
flush_interval -1 为什么是必须的:AI 模型的流式输出(SSE)是一段一段发数据,Caddy 默认会缓冲响应再一次性转发。设置 -1 禁用缓冲后,每收到一个 chunk 立刻转发给客户端,用户才能看到逐字符输出。所有反代 AI API 的场景都必须加这个配置。
超时时间:read_timeout 600s 对应 10 分钟,足以应对长上下文慢响应的场景。write_timeout 设一致即可。
加载配置
# 验证配置语法
caddy validate --config /etc/caddy/Caddyfile
# 重载(热重载,不中断现有连接)
caddy reload --config /etc/caddy/Caddyfile
Caddy 会自动申请并续期证书,无需额外操作。
第五步:创建令牌并验证链路
创建测试令牌
管理面板 →「令牌」→「添加令牌」:
| 字段 | 建议值 |
|---|---|
| 名称 | test |
| 额度 | 无限制(初期调试用) |
| 过期时间 | 不过期 |
创建后复制生成的 sk- 令牌。
验证普通请求
curl https://airouter.k330.com/v1/chat/completions \
-H "Authorization: Bearer sk-<你的令牌>" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"messages": [{"role": "user", "content": "用一句话介绍你自己"}],
"max_tokens": 100
}'
验证流式输出
curl https://airouter.k330.com/v1/chat/completions \
-H "Authorization: Bearer sk-<你的令牌>" \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
"model": "claude-opus-4-8",
"messages": [{"role": "user", "content": "从 1 数到 10"}],
"stream": true
}'
流式模式应逐块返回 data: {...} 行,如果一次性返回说明 flush_interval 没生效,检查 Caddy 配置。
核查日志
# systemd 日志(实时)
journalctl -u new-api -f
# new-api 应用日志
tail -f ~/new-api/logs/new-api.log
# CLIProxyAPI 日志
tail -f ~/cliproxyapi/logs/cliproxyapi.log
管理面板 →「日志」页面确认每次请求有 Token 消耗记录(prompt_tokens / completion_tokens 字段有值)。
从 one-api 迁移
如果你原来跑的是 one-api,迁移到 new-api 只需一步——直接复制数据库文件:
# 停止 one-api
systemctl stop one-api
# 把 one-api 的数据库拷到 new-api 工作目录
cp /path/to/one-api/one-api.db ~/new-api/
# 启动 new-api(会自动升级 schema,原有渠道、令牌、用户全部保留)
systemctl start new-api
验证:登录 new-api 面板,原来的渠道和令牌应该都在。
注意:schema 升级是单向的,升级后不能再用 one-api 读同一个数据库。升级前请备份:
cp one-api.db one-api.db.bak
常见问题
Q:流式输出返回一整块,不是逐字符
检查 Caddy flush_interval -1 是否已加;检查 new-api 是否在 GIN_MODE=release 下运行(debug 模式有额外缓冲)。
Q:渠道测试失败,报 connection refused
确认 CLIProxyAPI 在运行:ss -tlnp | grep 8317;检查 config.yaml 里的 host 是否是 127.0.0.1(而非 0.0.0.0,这两个都能绑定但含义不同)。
Q:令牌报 429 Too Many Requests
new-api 的限额触发。检查令牌剩余额度:管理面板 →「令牌」→ 找到对应令牌查看「剩余额度」。
Q:想从外部用 cliproxy.k330.com 直接调 CLIProxyAPI
可以,但要注意:CLIProxyAPI 的 api-key 直接暴露给外部意味着跳过了 new-api 的用量统计。建议只对自己开放,团队成员统一走 new-api 令牌。
系列导航
new-api 系列
- (一)认识 new-api——新一代 AI API 管理网关
- (二)安装部署——从零搭建 new-api
- (三)渠道配置——接入各类模型提供商
- (四)令牌与用户管理
- (五)计价模型与成本控制
- (六)监控、日志与告警
- (七)生产环境部署与安全加固
- (八)进阶——多实例、负载均衡与 SSO
- (九)接入国内支付——支付宝、微信与自动充值
- (十)接入国际支付——Stripe、PayPal 与海外收银
- 配置实战:从源码构建 + CLIProxyAPI 渠道 + Caddy 反代(本文)
CLIProxyAPI 系列(上游订阅层)
实操清单
- Go 1.22+ 已安装(
go version确认) - 克隆 new-api 仓库到
~/new-api/,go build -o new-api ./main.go编译成功 -
/etc/systemd/system/new-api.service写入实际路径和用户名(User=sdmike,WorkingDirectory=/home/sdmike/new-api) - 添加
Environment=GIN_MODE=release到 service 文件 -
systemctl daemon-reload && systemctl enable --now new-api,确认active (running) - 登录
http://127.0.0.1:3000,修改默认密码(root/123456→ 自定义强密码) - CLIProxyAPI
config.yaml配置api-keys、gemini-api-key、routing.strategy: round-robin - new-api 管理面板添加 CLIProxyAPI 渠道(类型 OpenAI,代理
http://127.0.0.1:8317/v1,填入两个 api-key) - 勾选完整模型列表,点「测试」确认通过,开启「自动禁用」
- Caddyfile 添加
airouter.k330.com块,flush_interval -1,read_timeout 600s -
caddy reload后确认 HTTPS 证书自动签发(首次可能需要等 30 秒) - 创建测试令牌,发普通请求和流式请求各一次,均返回正常
- 管理面板「日志」页确认 Token 消耗有记录
- 如从 one-api 迁移:备份
one-api.db,复制到~/new-api/,重启服务确认原有数据保留