new-api 配置实战:从源码构建 + CLIProxyAPI 渠道 + Caddy 反代

本文是 new-api 系列的配置实战补充篇,以本站实际运行的服务器配置为蓝本,完整记录从源码构建到生产上线的每一步。

系列导航

new-api 系列

  1. (一)认识 new-api——新一代 AI API 管理网关
  2. (二)安装部署——从零搭建 new-api
  3. (三)渠道配置——接入各类模型提供商
  4. (四)令牌与用户管理
  5. (五)计价模型与成本控制
  6. (六)监控、日志与告警
  7. (七)生产环境部署与安全加固
  8. (八)进阶——多实例、负载均衡与 SSO
  9. (九)接入国内支付——支付宝、微信与自动充值
  10. (十)接入国际支付——Stripe、PayPal 与海外收银
  11. 配置实战:从源码构建 + CLIProxyAPI 渠道 + Caddy 反代(本文)

CLIProxyAPI 系列(把 CLI 订阅变成标准 API)

  1. (一)入门
  2. (二)多账号轮询与配额策略
  3. (三)接入主流 AI 编程工具
  4. (四)生产部署——Nginx、TLS 与安全加固
  5. (五)Antigravity——用 Google 订阅解锁 Claude Opus 4.8
  6. (六)结合 new-api 打造多用户 API 网关
  7. (七)自动化运维——配额监控与告警
  8. (八)cpa_keeper 与 cpa_cost——用量追踪与成本分析工具
# new-api 配置实战 ## 从源码构建 ### 克隆仓库 ### Go 编译 ### 目录结构 ## systemd 服务 ### 服务单元文件 ### 启动参数 ### GIN_MODE=release ## CLIProxyAPI 渠道 ### config.yaml 关键字段 ### 两个 api-key 轮询 ### 模型列表对齐 ### 渠道测试 ## Caddy 反代 ### airouter.k330.com → :3000 ### cliproxy.k330.com → :8317 ### flush_interval -1(SSE 必须) ### 长超时配置 ## 完整链路验证 ### 普通请求测试 ### 流式输出测试 ### 日志核查

本文记录的是真实机器的真实配置,所有路径、端口、域名均与线上一致。敏感凭证(API Key、密码)以占位符标注。

整体架构

flowchart LR CLI["客户端\nsk- 令牌"] --> CA["Caddy\nairouter.k330.com"] CA --> NA["new-api :3000\n鉴权 · 计费 · 限流"] NA --> CL["CLIProxyAPI :8317\nOAuth 轮询 · 模型路由"] CL --> CC["Claude Code\nOAuth 账号池"] CL --> GM["Gemini CLI\nGemini API Key"] CPA_WEB["浏览器\n管理面板"] --> CA2["Caddy\ncliproxy.k330.com"] CA2 --> CL

两层代理,一套 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)

flowchart LR A["go build -o new-api"] --> B["写 /etc/systemd/system/new-api.service"] B --> C["systemctl daemon-reload"] C --> D["systemctl enable --now new-api"] D --> E["访问 :3000 确认运行"]

第三步:配置 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 字段有值)。

flowchart LR REQ["curl 请求\nBearer sk-xxx"] --> CA["Caddy HTTPS\nairouter.k330.com"] CA --> NA["new-api :3000\n验证令牌 · 扣额度"] NA --> CPA["CLIProxyAPI :8317\nOAuth 账号轮询"] CPA --> UP["上游模型\nClaude / Gemini"] UP --> LOG["new-api 日志\nToken 消耗记录"]

从 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 系列

CLIProxyAPI 系列(上游订阅层)

实操清单

  • Go 1.22+ 已安装(go version 确认)
  • 克隆 new-api 仓库到 ~/new-api/go build -o new-api ./main.go 编译成功
  • /etc/systemd/system/new-api.service 写入实际路径和用户名(User=sdmikeWorkingDirectory=/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-keysgemini-api-keyrouting.strategy: round-robin
  • new-api 管理面板添加 CLIProxyAPI 渠道(类型 OpenAI,代理 http://127.0.0.1:8317/v1,填入两个 api-key)
  • 勾选完整模型列表,点「测试」确认通过,开启「自动禁用」
  • Caddyfile 添加 airouter.k330.com 块,flush_interval -1read_timeout 600s
  • caddy reload 后确认 HTTPS 证书自动签发(首次可能需要等 30 秒)
  • 创建测试令牌,发普通请求和流式请求各一次,均返回正常
  • 管理面板「日志」页确认 Token 消耗有记录
  • 如从 one-api 迁移:备份 one-api.db,复制到 ~/new-api/,重启服务确认原有数据保留