从零搭建生产级 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-apimysqlredisnpm)均处于 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 添加反向代理规则

  1. 点击左侧菜单 Proxy HostsAdd Proxy Host

  2. Details 选项卡配置:

    字段
    Domain Names 输入你的解析好的域名(如 api.yourdomain.com),敲回车确认
    Scheme http
    Forward Hostname / IP new-api(Docker 内网 DNS 自动解析容器名)
    Forward Port 3000
    Block Common Exploits ✅ 勾选
    Websockets Support ✅ 勾选(对 API 的流式对话极其重要)
  3. SSL 选项卡配置:

    字段
    SSL Certificate Request a new SSL Certificate
    Force SSL ✅ 勾选
    I Agree to the Let’s Encrypt Terms of Service ✅ 勾选
  4. 点击 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 PriceIdCreem 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、配置安全网关,到解决商业化支付报错,这篇文章凝聚了无数个坑踩出来的实战经验。

全文核心知识点回顾

  1. ✅ Docker Compose 四件套容器化部署
  2. ✅ Nginx Proxy Manager 反向代理 + HTTPS 自动挂载
  3. ✅ 安全组精细化管控(不暴露 3000 端口)
  4. ✅ 易支付接入与"余额不足"Bug 修复
  5. ✅ 公告卡片美化与 iframe 跨域绕过技巧

如果你在部署中遇到了任何问题,欢迎在评论区留言交流!


📝 版权声明:本文为原创实战教程,转载请注明出处。

❤️ 觉得有帮助的话,请点赞 + 收藏 + 关注支持一下,后续会持续更新更多硬核项目实战!(本人可以提供相关大模型的渠道,搭建过程以及后续渠道可以找我合作)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐