记一次搭建 API 中转站的过程
背景
之前家里 NAS 上跑了好几个 API 代理服务:
- chat2api:把 ChatGPT 网页版转成 API 接口
- gemini2api:把 Google Gemini 网页版转成 API
- CLIProxyAPI:CLI 代理认证网关
这些服务各自独立,端口分散,管理起来挺麻烦。加上我日常用 Hermes Agent 调各种模型(智谱、DeepSeek、OpenRouter),需要一个统一的中转站来管理 API Key 和渠道转发。
于是决定把这些服务整合到一个统一的 API 中转站里。
选型
在开源社区里,API 中转站/分发站最主流的方案是:
- One API(songquanpeng/one-api):老牌项目,功能成熟,社区大
- New API(Calcium-Ion/new-api):One API 的增强版 Fork,在 One API 基础上增加了更多功能
对比了一下,New API 作为增强分支,功能更全(支持更多渠道类型、更完善的配额管理),而且 Docker 镜像直接拉就能跑,不需要源码编译。果断选 New API。
部署
环境准备
NAS 上已经有 Docker 环境,直接用 docker-compose 部署。
yaml
services:
new-api:
image: calciumion/new-api:latest
container_name: new-api
restart: always
ports:
- "3010:3000"
volumes:
- ./data:/data
environment:
- TZ=Asia/Shanghai
networks:
- private
networks:
private:
driver: bridge
把端口映射从默认的 3000 改成其他端口(避免跟其他服务冲突),数据挂载到本地目录持久化。
启动
bash
docker-compose up -d
Docker 镜像拉了大概几十 MB,启动后容器 healthcheck 通过,访问 http://localhost:端口 就能看到 NewAPI 的管理面板了。
CLIProxyAPI 合并部署
CLIProxyAPI(eceasy/cli-proxy-api)是给 CLI 工具做认证代理的,之前独立部署。既然 NewAPI 提供了统一的 API 管理,我把 CLIProxyAPI 也放到了同一个 docker-compose 里,共用一个 bridge 网络:
yaml
cli-proxy-api:
image: eceasy/cli-proxy-api:latest
container_name: cli-proxy-api
restart: unless-stopped
ports:
- "8317:8317"
volumes:
- ./cli-proxy-config.yaml:/CLIProxyAPI/config.yaml
networks:
- private
这样 NewAPI 和 CLIProxyAPI 通过 Docker 内部网络通信,延迟更低。
清理旧服务
部署完成后,把之前独立的 chat2api 和 gemini2api 容器和相关数据清理掉了,统一由 NewAPI 管理所有渠道。
配置域名
服务跑起来后,只能通过 localhost 在本地访问。要让外网也能用,需要走 frp 穿透。
整体链路
自定义域名
-> CF DNS (CNAME -> VPS 域名)
-> VPS nginx (SSL termination + reverse proxy frps)
-> frp tunnel
-> NAS localhost:端口 (NewAPI Docker)
很经典的 DNS + nginx + frp 三层穿透,跟之前给其他内网服务搞的一样。
1. Cloudflare DNS
给自定义域名加一条 CNAME 记录,指向 VPS 域名,关闭代理(DNS Only)。因为走的 frp HTTP 代理,不需要 CF 的 CDN。
2. VPS 宝塔 nginx
SSH 到 VPS,在 frp 专用的 nginx 配置里加上新域名,然后 reload。SSL 证书本身是通配配置,新域名自动覆盖。
3. NAS frpc 添加代理
在 frpc 配置中新增代理,绑定自定义域名到本地端口。
踩坑:frpc 热重载不生效
改完配置后尝试了发送重载信号,但 frpc 没有重新读配置。
看日志发现这个进程跑了很久没重启过,期间虽然跟 frps 断连过几次(会自动重连),但新加的代理一直没注册上去。
访问域名时看到的是 frp 的默认 404 页面:"The page you requested was not found"。请求到了 frps,但 frps 找不到匹配的代理。
最终直接 kill 掉 frpc 进程重新拉起来,新配置才生效。
另外,飞牛 OS 的 frpc 有两个配置路径,实际进程读取的跟应用面板展示的路径不一样,改错文件的话重启也不会生效。
验证
bash
curl -I https://你的域名/
# HTTP/1.1 200 OK
能正常返回就说明链路通了。
最终架构
VPS (宝塔)
nginx :80/443 -> frps
|
frp tunnel
|
NAS (飞牛 OS)
new-api (API 中转站 + 渠道管理)
cli-proxy-api (CLI 认证代理)
旧服务已清理: chat2api, gemini2api
一次整合,把之前散落的 API 代理服务统一到了 NewAPI,管理起来清爽多了。