这次要搭的东西很具体:用一台雨云 Linux 云服务器跑 new-api,把手里的 OpenAI、Claude、Gemini、DeepSeek 等渠道收进同一个入口,再由 new-api 负责令牌、额度、模型映射和 OpenAI 兼容接口。
我采用 Docker Compose + SQLite 的单机方案。它的好处是组件少,迁移时带走数据目录和 Compose 文件即可;代价也很明确:不适合多节点并发写数据库。文章会把购买页上该看什么、SSH 信息从哪里取、端口怎样放行都写出来,而不是从一段现成的 Compose 命令直接开跑。
项目地址:QuantumNous/new-api
官方文档:docs.newapi.pro
雨云注册链接:https://www.rainyun.com/out_
邀请码:out
一、部署前怎么选服务器
先打开雨云官网确认入口与当前活动,再登录控制台进入“云产品”。本文中的雨云界面均为我在 2026 年 7 月亲自截取,实际套餐、库存和价格仍以你打开页面时显示的内容为准。
控制台会集中列出云服务器等产品,从这里进入云服务器的选购与管理页:
new-api 是 Go 应用,个人使用不需要一上来买很大的机器。不过容器镜像、SQLite 数据、调用日志和备份都会吃磁盘,内存也要给系统和反向代理留余量。选购时我主要看下面五项:
- 系统选仍在维护期内的 Ubuntu 或 Debian 64 位版本。
- 节点离主要访问者近一些;不要只看控制台里的理论延迟。
- 磁盘要同时装镜像、数据库、日志和备份,不能只按程序体积估算。
- 有域名并准备长期使用时,给 Nginx 或 Caddy 留出 80/443。
- 是否需要独立公网 IP 要在下单前确认;NAT 套餐的连接地址和端口会不同。
截图只用于说明实例卡片中需要核对的字段;节点、套餐、库存和价格会变化,以当前购买页为准。
通过雨云注册链接注册时,邀请码填写 out。套餐、价格和库存会变化,以购买页面的实时信息为准。
二、连接服务器并安装 Docker
服务器进入“运行中”后,管理页会显示节点、系统、配置和远程连接入口。先确认系统确实是刚才选择的 Linux 发行版,再复制 SSH 地址。
密码在终端中输入时通常不会显示字符,这是正常现象。使用独立公网 IP 时,连接命令一般是:
ssh root@你的服务器公网IP
NAT 套餐需要把控制台给出的端口加到 -p 参数。使用普通用户时先确认它能执行 sudo。登录后我会先看架构、磁盘和内存,避免安装到一半才发现空间不足:
uname -m
df -h
free -h
常见的 64 位架构是 x86_64 和 aarch64。Docker Engine 与 Compose 插件按 Docker 官方文档安装。装完以后先看版本,不要直接执行 Compose:
docker version
docker compose version
再启动 Docker 并设置开机自启:
sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
docker info 能同时看到 Engine、Buildx 和 Compose 插件。部署期间也可以在雨云实例页观察 CPU、内存、网络与磁盘曲线,异常飙升时先检查日志,不要连续重复拉起容器。
上图记录了写作时仓库的最新提交。latest 镜像和项目代码都会继续更新,正式环境升级前应先备份数据,并阅读对应版本的发布说明。
SQLite 还是 PostgreSQL
我这次选 SQLite,因为目标是一台机器、少量用户,备份一个数据目录最省事。它的问题也很直接:数据库文件绑在单机上,多个应用节点不能同时写。
如果从第一天就会有多人使用、大量调用日志或横向扩容,直接上 PostgreSQL 和 Redis 更合适。仓库的 docker-compose.yml 已经给了示例,但默认密码必须换掉;数据库与 Redis 只在 Compose 内网通信,不要为了图省事映射到公网。
三、准备部署目录
目录不要散在当前用户的家目录里。我把 Compose、数据和日志都收进 /opt/new-api,以后打包、迁移或排查权限会省很多时间:
sudo mkdir -p /opt/new-api/data /opt/new-api/logs
sudo chown -R "$USER":"$USER" /opt/new-api
cd /opt/new-api
会话密钥现场生成,并把结果存进密码管理器:
openssl rand -hex 32
openssl rand -base64 24
不要直接沿用仓库示例里的 123456,也不要把真实密码提交到 GitHub。SESSION_SECRET 用于会话签名;如果以后扩展为多节点,所有节点必须使用同一个值。
仓库同时提供 Dockerfile、Compose 示例和环境变量说明。部署前值得先看一遍 docker-compose.yml 与 .env.example,这样遇到配置项时能知道它来自哪里。
四、编写 Docker Compose 配置
下面这份配置只跑一个应用容器,数据落在宿主机的 ./data。这正是我前面选择 SQLite 的原因:先把单机链路跑稳,确实需要扩容时再迁数据库。
在 /opt/new-api/compose.yaml 写入:
services:
new-api:
image: calciumion/new-api:latest
container_name: new-api
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
environment:
TZ: Asia/Shanghai
SESSION_SECRET: "替换为刚才生成的随机值"
ERROR_LOG_ENABLED: "true"
volumes:
- ./data:/data
- ./logs:/app/logs
这里把宿主机端口绑定到 127.0.0.1,表示服务只能从服务器本机访问,适合后面接反向代理。如果暂时没有域名、只想短时间测试,可以改成 3000:3000,同时在雨云安全组中仅允许自己的公网 IP 访问 TCP 3000;测试完成后再关闭。
先检查 Compose 文件是否能正确解析:
cd /opt/new-api
docker compose config
输出没有报错后再拉取镜像并启动:
docker compose pull
docker compose up -d
五、检查启动状态
docker compose up -d 只说明启动请求发出去了。服务是否真的可用,我看三处:容器状态、最近日志、本机 HTTP 响应。
docker compose ps
docker compose logs --tail=100 new-api
curl -i --max-time 10 http://127.0.0.1:3000/api/status
容器应保持 running,而不是每隔几秒重启;日志里不能持续刷数据库写入或权限错误;curl 则要在 10 秒内得到 HTTP 响应。三项都过了,再打开网页做管理员初始化。
首次打开页面后完成管理员初始化,然后按顺序做这些事情:
- 设置高强度管理员密码。
- 根据需要关闭公开注册。
- 添加自己有权使用的上游模型渠道。
- 创建一个低额度测试令牌。
- 用该令牌完成一次最小 API 请求。
- 确认额度扣减、日志和模型映射符合预期。
例如,用 OpenAI 兼容接口查看模型列表:
curl https://你的域名/v1/models \
-H "Authorization: Bearer 你的测试令牌"
六、配置 HTTPS 和防火墙
我不会把 3000 直接暴露给所有公网地址。应用仍监听 127.0.0.1:3000,由 Nginx 或 Caddy 接住 80/443,再把请求转给容器。Nginx 的核心配置如下:
server {
listen 443 ssl http2;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
}
}
证书可以用 Let’s Encrypt。HTTPS 跑通后,雨云防火墙只保留实际需要的入口:SSH、80 和 443。PostgreSQL、Redis、Docker API 与应用内部端口不开放。
新增规则时逐项填写协议、端口和来源地址,并在保存后回到列表复核:
截图展示的是控制台的规则结构,不代表本文要求照抄其中的端口或来源地址。SSH 最好只允许自己的固定公网 IP;网站端口再按实际访问范围放行,保存后从外部网络做一次真实连通性测试。
如果启用安全 Cookie,还需要在 Compose 环境变量中加入:
SESSION_COOKIE_SECURE: "true"
SESSION_COOKIE_TRUSTED_URL: "https://api.example.com"
修改配置后执行 docker compose up -d 使其生效。
七、常见问题排查
1. 提示找不到 docker 命令
先运行:
command -v docker
docker version
docker compose version
如果第一条没有输出,说明 Docker CLI 尚未安装或不在 PATH 中。本文自动采集环境在 Windows 上执行部署命令时就遇到了这一情况,终端结果如下:
这张图是错误示例,不代表雨云服务器上的部署结果。真正部署时应在 Linux 服务器中完成 Docker 安装和上述版本检查,再继续执行 Compose 命令。
2. 端口 3000 已被占用
sudo ss -lntp | grep ':3000'
docker ps --format 'table {{.Names}}\t{{.Ports}}'
找到冲突服务后决定是停止它,还是把宿主机端口改为其他值。只修改映射左侧,例如 127.0.0.1:3001:3000,容器内端口仍保持 3000。
3. 容器反复重启
docker inspect new-api --format 'status={{.State.Status}} exit={{.State.ExitCode}} error={{.State.Error}}'
docker compose logs --tail=200 new-api
df -h
优先根据日志检查环境变量、目录权限和磁盘空间。不要在没有备份的情况下删除 /opt/new-api/data,也不要用 chmod -R 777 掩盖权限问题。
4. 服务器本机能访问,外网打不开
按顺序检查监听地址、雨云安全组、Linux 防火墙和反向代理:
curl -v http://127.0.0.1:3000/api/status
sudo ss -lntp
sudo ufw status
sudo nginx -t
本机请求成功而域名失败,通常说明问题在应用之外。逐层验证比反复重启容器更有效。
八、备份和更新
SQLite 数据位于 /opt/new-api/data。更新前先停止写入并备份:
cd /opt/new-api
docker compose stop new-api
tar -czf "new-api-backup-$(date +%F-%H%M%S).tar.gz" data compose.yaml
docker compose start new-api
确认备份文件存在且大小合理后,可以再创建一份云服务器快照,形成“应用数据包 + 实例快照”两层回滚点。
重装系统会清空实例内的数据。控制台虽然提供重装入口,但它不是日常更新手段;执行前必须确认数据包已经下载到实例之外,并记录当前系统、端口与挂载配置。
随后再拉取新镜像:
docker compose pull
docker compose up -d
docker compose logs --tail=100 new-api
生产环境最好固定经过验证的镜像版本,而不是长期跟随 latest。如果用户量、日志量或并发持续增长,再考虑迁移到 PostgreSQL/MySQL 与 Redis;迁移前应先在测试机验证数据和回滚流程。
验收清单
部署完成后逐项确认:
docker compose config能正常解析配置。docker compose ps显示容器稳定运行。- 本机
/api/status能返回 HTTP 响应。 - 域名 HTTPS 访问正常,证书链有效。
- 管理员初始化、登录和退出正常。
- 测试令牌可以访问预期模型,额度统计正确。
- 数据目录已持久化,重启容器后配置仍在。
- 公网没有暴露数据库、Redis 和 Docker API。
- 已生成一份可以恢复的备份。
总结
这套配置适合单机自用或小团队起步:SQLite 少一个数据库服务,/data 也容易备份。真正需要盯住的不是 Compose 文件有多长,而是三件事:随机会话密钥没有泄露,应用端口没有裸露在公网,更新前确实做过可恢复的备份。
本文没有把本地 Windows 环境中失败的 Docker 命令当作部署成功证据;对应截图只放在故障排查里。实际服务器上线时,以雨云实例状态、docker compose ps、容器日志、/api/status 和测试令牌调用共同作为验收依据。
雨云注册链接统一使用:https://www.rainyun.com/out_,邀请码为 out。
参考资料:














