从零搭建生产级 AI API 中转平台(New-API + Docker + 易支付完整避坑指南)
从零搭建生产级 AI API 中转平台(New-API + Docker + 易支付完整避坑指南)
🏷️ 分类标签:Docker、Nginx、API中转、大模型、商业化部署、运维实战
📅 更新时间:2026年5月
💡 阅读对象:有基础 Linux 操作能力的开发者、计科学生、想搭建 API 中转站的站长
📌 写在前面
随着大模型的爆发,API 中转分发成为了很多开发者和计科学生"薅羊毛"乃至商业化运营的首选项目。市面上有很多开源的中转面板,其中 New-API 因其强大的多渠道调度、高并发支持和完善的计费系统而备受青睐。
但*"能跑起来"和"能稳定商业运营"完全是两码事*。
本文将带你跳过所有试错坑,用生产环境的标准(Docker 容器化 + Nginx Proxy Manager 反代 + HTTPS 加密 + 易支付商业化)从零搭建一套属于你自己的全链路 API 中转站。
🔖 全文目录:
- 第一阶段:基础设施与环境准备
- 第二阶段:Docker Compose 全家桶部署
- 第三阶段:Nginx 网关接管与 HTTPS 挂载
- 第四阶段:商业化闭环 —— 接入"易支付"
- 第五阶段:站长进阶"黑科技"
- 附录:实用命令备忘录
🛠️ 第一阶段:基础设施与环境准备
不要直接在宿主机裸奔二进制文件,我们要用现代工程化的标准来做。
1.1 服务器与域名选型
| 项目 | 推荐配置 |
|---|---|
| VPS | 延迟较低的海外轻量云服务器(阿里云国际版新加坡节点、腾讯云香港节点),2C4G 配置起步最佳 |
| 域名 | 准备一个域名(哪怕是几块钱一年的 .top 或 .xyz),将子域名(如 api.yourdomain.com)的 A 记录解析到 VPS 公网 IP |
| 操作系统 | Ubuntu 22.04 LTS 或 Debian 12 |
1.2 安全组配置(极其关键)
在你的云服务器控制台(如阿里云安全组),只放行以下入方向端口:
| 端口 | 协议 | 用途 | 备注 |
|---|---|---|---|
| 22 | TCP | SSH 远程连接 | 必须保留 |
| 80 | TCP | HTTP | 用于 SSL 证书验证 |
| 443 | TCP | HTTPS | 加密访问 |
| 81 | TCP | NPM 管理面板 | 临时放行,配置完域名后可关闭 |
⚠️ 避坑指南:千万不要在安全组放行 3000 端口(New-API 的默认端口)。我们将通过 Nginx 反向代理进行内网转发,直接暴露 3000 端口极易遭到黑客扫描和爆破。
1.3 安装 Docker 环境
在服务器终端执行以下命令,安装最新版 Docker 及 Compose 插件:
# 更新源并安装基础工具
sudo apt update && sudo apt install -y curl vim git
# 一键安装 Docker
curl -fsSL https://get.docker.com | bash
# 启动并设置开机自启
sudo systemctl enable --now docker
验证安装是否成功:
docker --version
docker compose version
看到版本号输出即表示安装成功。
🐳 第二阶段:Docker Compose 全家桶部署
为了极致的性能和数据安全,我们采用 New-API + MySQL(持久化)+ Redis(缓存提速)+ NPM(网关) 的经典四件套架构。
2.1 创建项目目录
mkdir -p /home/new-api && cd /home/new-api
2.2 编写 docker-compose.yml
nano docker-compose.yml
将以下内容完整复制进去(注意修改你的强密码):
services:
new-api:
image: calciumion/new-api:latest
container_name: new-api
restart: always
command: --log-dir /app/logs
ports:
# ⚠️ 安全加固:只监听本地的 3000 端口,公网无法直接访问
- "127.0.0.1:3000:3000"
volumes:
- ./data:/data
- ./logs:/app/logs
environment:
# 请将下面的密码替换为你自己的 MySQL 强密码
- SQL_DSN=root:YourStrongPassword123!@tcp(db:3306)/newapi?charset=utf8mb4&parseTime=True&loc=Local
- REDIS_CONN_STRING=redis://redis:6379
- SESSION_SECRET=change_this_to_a_random_string
- TZ=Asia/Shanghai
depends_on:
- db
- redis
db:
image: mysql:8.0
container_name: mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=YourStrongPassword123! # 必须与上面的密码一致
- MYSQL_DATABASE=newapi
volumes:
- ./mysql:/var/lib/mysql
redis:
image: redis:alpine
container_name: redis
restart: always
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: always
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./npm/data:/data
- ./npm/letsencrypt:/etc/letsencrypt
depends_on:
- new-api
2.3 一键启动
docker compose up -d
2.4 验证容器状态
docker ps
确认四个容器(new-api、mysql、redis、npm)均处于 Up 状态。
💡 架构说明:
- new-api:核心 API 中转服务,监听 3000 端口
- mysql:数据持久化存储,保存用户、令牌、日志等数据
- redis:缓存加速,提升高并发场景下的响应速度
- npm:Nginx 反向代理网关,负责 SSL 终结和域名转发
🔐 第三阶段:Nginx 网关接管与 HTTPS 挂载
目前系统在跑,但我们需要给它穿上"加密铠甲"。
3.1 进入 NPM 管理后台
浏览器访问 http://你的公网IP:81,进入 Nginx Proxy Manager 后台。
| 项目 | 值 |
|---|---|
| 默认账号 | admin@example.com |
| 默认密码 | changeme |
登录后系统会强制要求修改默认密码,请设置一个强密码。
3.2 添加反向代理规则
-
点击左侧菜单 Proxy Hosts → Add Proxy Host
-
Details 选项卡配置:
字段 值 Domain Names 输入你的解析好的域名(如 api.yourdomain.com),敲回车确认Scheme httpForward Hostname / IP new-api(Docker 内网 DNS 自动解析容器名)Forward Port 3000Block Common Exploits ✅ 勾选 Websockets Support ✅ 勾选(对 API 的流式对话极其重要) -
SSL 选项卡配置:
字段 值 SSL Certificate Request a new SSL CertificateForce SSL ✅ 勾选 I Agree to the Let’s Encrypt Terms of Service ✅ 勾选 -
点击 Save 保存。
3.3 验证部署
等待几秒钟,如果列表里显示绿色的 Online,恭喜你!
直接访问 https://api.yourdomain.com,你就能看到带有 小绿锁 的 New-API 登录界面了。
🔑 初始登录信息:
- 账号:
root- 密码:
123456⚠️ 登录后请立刻修改默认密码!
💳 第四阶段:商业化闭环 —— 接入"易支付"
很多人想用支付宝收款,但在后台填配置时频频踩坑。这里彻底梳理接入逻辑。
4.1 获取商户信息
在任意支持"支付宝当面付"的易支付平台(如彩虹易支付、虎皮椒等)注册商户,获取三个核心参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| API 接口地址 | 易支付平台的网关 URL(注意末尾带斜杠) | https://www.ezfpy.cn/ |
| 商户 PID | 你的商户编号 | 10001 |
| 商户 KEY | 你的商户密钥 | xxxxxxxxxxxxx |
4.2 New-API 后台配置
进入 New-API 后台 → 设置 → 充值设置。
⚠️ 避坑指南:千万不要填错位置!
很多新手会把参数填进
Stripe PriceId或Creem ProductId里,那是给海外信用卡平台用的!对于国内易支付,完全无视这两个框,留空即可。
往下拉,找到专属的 易支付 (Epay) 配置区:
| 字段 | 值 |
|---|---|
| 易支付地址 | 填入平台 URL(https://www.ezfpy.cn/) |
| 易支付商户 ID | 填入 PID |
| 易支付商户密钥 | 填入 KEY |
| 支付方式 | 勾选 支付宝 (Alipay) |
4.3 终极 Bug 修复:为什么点击充值报错"账户余额不足"?
如果你配置好后,前端点击充值跳转时报错 “账户余额不足”,这通常不是代码问题!
原因分析:
如今大部分易支付平台采用"预扣手续费"模式。它在为你创建支付二维码前,需要先从你的商户余额扣除几分钱的手续费。
解决方案:
登录易支付平台的商户后台,给自己充值 1~5 元作为"手续费池",再次点击即可完美跳出二维码。
💡 这是绝大多数新手都会踩的坑,网上几乎搜不到答案,记住这个解法能帮你省去几小时的排查时间。
🚀 第五阶段:站长进阶"黑科技"
黑科技 1:为公告加入高颜值的 Telegram 客服卡片
在 New-API 的 设置 → 常规设置 → 公告 中,系统支持 Markdown 和原生 HTML。你可以复制以下代码,实现一个极具科技感的悬停电报按钮:
<a href="https://t.me/你的TG群组链接" target="_blank" style="display: flex; align-items: center; background-color: #f0f8ff; border-left: 4px solid #0088cc; padding: 12px 16px; border-radius: 8px; text-decoration: none; color: #333; transition: all 0.3s ease; box-shadow: 0 2px 5px rgba(0,0,0,0.05);" onmouseover="this.style.boxShadow='0 4px 10px rgba(0,136,204,0.15)'; this.style.transform='translateY(-2px)';" onmouseout="this.style.boxShadow='0 2px 5px rgba(0,0,0,0.05)'; this.style.transform='translateY(0)';">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" style="width: 24px; height: 24px; fill: #0088cc; margin-right: 12px;">
<path d="M248 8C111 8 0 119 0 256S111 504 248 504 496 393 496 256 385 8 248 8zM363 176.7c-3.7 39.2-19.9 134.4-28.1 178.3-3.5 18.6-10.3 24.8-16.9 25.4-14.4 1.3-25.3-9.5-39.3-18.7-21.8-14.3-34.2-23.2-55.3-37.2-24.5-16.1-8.6-25 5.3-39.5 3.7-3.8 67.1-61.5 68.3-66.7 .2-.7 .3-3.1-1.2-4.4s-3.6-.8-5.1-.5q-3.3 .7-104.6 69.1-14.8 10.2-26.9 9.9c-8.9-.2-25.9-5-38.6-9.1-15.5-5-27.9-7.7-26.8-16.3q.8-6.7 18.5-13.7 108.4-47.2 144.6-62.3c68.9-28.6 83.2-33.6 92.5-33.8 2.1 0 6.6 .5 9.6 2.9a10.5 10.5 0 0 1 3.5 6.7A43.8 43.8 0 0 1 363 176.7z"/>
</svg>
<div>
<strong style="display: block; font-size: 15px; color: #0088cc;">加入技术交流群</strong>
<span style="font-size: 13px; color: #666;">获取最新模型更新与技术支持</span>
</div>
</a>
效果预览:
- 左侧蓝色边框 + Telegram 图标
- 悬停时有轻微上浮动画和阴影变化
- 点击直接跳转到你的 Telegram 群组
💡 使用时将
https://t.me/你的TG群组链接替换为你真实的群组链接即可。
黑科技 2:解决"关于"页面点击无反应 / iframe 跨域报错
很多站长想在系统的"关于"页面跳转到自己的博客或导航站,直接填入 URL 后却发现点击无反应,按 F12 会出现大量的 Mixed Content(HTTPS 混合内容拦截) 或 CORS 跨域报错。
解决方案:前端路由劫持(暴力重定向)
既然系统的 iframe 渲染被浏览器安全策略拦截了,我们可以直接清空输入框里的网址,填入这段万能跳转代码:
<img src="x" onerror="window.top.location.href='https://你的目标网址.com'" style="display:none;">
原理解析:
这是一段极具"攻击性"但非常有效的防御式编程代码。系统一旦尝试渲染这个不可见的破损图片,就会立刻触发 onerror 错误处理钩子,利用 window.top 进行顶级页面的提权跳转,直接无视掉所有 Iframe 的限制与跨域拦截。
⚠️ 安全提醒:此方法仅用于你自己的站点,请勿用于恶意用途。
📌 实用命令备忘录
| 场景 | 命令 |
|---|---|
| 查看所有容器状态 | docker ps |
| 实时查看报错日志 | docker compose logs -f new-api |
| 重启更新系统 | docker compose pull && docker compose up -d |
| 停止所有服务 | docker compose down |
| 重启单个容器 | docker restart new-api |
| 进入 New-API 容器 | docker exec -it new-api /bin/sh |
| 查看 MySQL 数据 | docker exec -it mysql mysql -uroot -p newapi |
| 备份数据库 | docker exec mysql mysqldump -uroot -p newapi > backup.sql |
🎯 结语
从买服务器、写 Docker Compose、配置安全网关,到解决商业化支付报错,这篇文章凝聚了无数个坑踩出来的实战经验。
全文核心知识点回顾:
- ✅ Docker Compose 四件套容器化部署
- ✅ Nginx Proxy Manager 反向代理 + HTTPS 自动挂载
- ✅ 安全组精细化管控(不暴露 3000 端口)
- ✅ 易支付接入与"余额不足"Bug 修复
- ✅ 公告卡片美化与 iframe 跨域绕过技巧
如果你在部署中遇到了任何问题,欢迎在评论区留言交流!
📝 版权声明:本文为原创实战教程,转载请注明出处。
❤️ 觉得有帮助的话,请点赞 + 收藏 + 关注支持一下,后续会持续更新更多硬核项目实战!(本人可以提供相关大模型的渠道,搭建过程以及后续渠道可以找我合作)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)