雨云部署 new-api:Docker Compose 实战

这次要搭的东西很具体:用一台雨云 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 数据、调用日志和备份都会吃磁盘,内存也要给系统和反向代理留余量。选购时我主要看下面五项:

  1. 系统选仍在维护期内的 Ubuntu 或 Debian 64 位版本。
  2. 节点离主要访问者近一些;不要只看控制台里的理论延迟。
  3. 磁盘要同时装镜像、数据库、日志和备份,不能只按程序体积估算。
  4. 有域名并准备长期使用时,给 Nginx 或 Caddy 留出 80/443。
  5. 是否需要独立公网 IP 要在下单前确认;NAT 套餐的连接地址和端口会不同。

截图只用于说明实例卡片中需要核对的字段;节点、套餐、库存和价格会变化,以当前购买页为准。

通过雨云注册链接注册时,邀请码填写 out。套餐、价格和库存会变化,以购买页面的实时信息为准。

二、连接服务器并安装 Docker

服务器进入“运行中”后,管理页会显示节点、系统、配置和远程连接入口。先确认系统确实是刚才选择的 Linux 发行版,再复制 SSH 地址。

密码在终端中输入时通常不会显示字符,这是正常现象。使用独立公网 IP 时,连接命令一般是:

ssh root@你的服务器公网IP

NAT 套餐需要把控制台给出的端口加到 -p 参数。使用普通用户时先确认它能执行 sudo。登录后我会先看架构、磁盘和内存,避免安装到一半才发现空间不足:

uname -m
df -h
free -h

常见的 64 位架构是 x86_64aarch64。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 响应。三项都过了,再打开网页做管理员初始化。

首次打开页面后完成管理员初始化,然后按顺序做这些事情:

  1. 设置高强度管理员密码。
  2. 根据需要关闭公开注册。
  3. 添加自己有权使用的上游模型渠道。
  4. 创建一个低额度测试令牌。
  5. 用该令牌完成一次最小 API 请求。
  6. 确认额度扣减、日志和模型映射符合预期。

例如,用 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;迁移前应先在测试机验证数据和回滚流程。

验收清单

部署完成后逐项确认:

  1. docker compose config 能正常解析配置。
  2. docker compose ps 显示容器稳定运行。
  3. 本机 /api/status 能返回 HTTP 响应。
  4. 域名 HTTPS 访问正常,证书链有效。
  5. 管理员初始化、登录和退出正常。
  6. 测试令牌可以访问预期模型,额度统计正确。
  7. 数据目录已持久化,重启容器后配置仍在。
  8. 公网没有暴露数据库、Redis 和 Docker API。
  9. 已生成一份可以恢复的备份。

总结

这套配置适合单机自用或小团队起步:SQLite 少一个数据库服务,/data 也容易备份。真正需要盯住的不是 Compose 文件有多长,而是三件事:随机会话密钥没有泄露,应用端口没有裸露在公网,更新前确实做过可恢复的备份。

本文没有把本地 Windows 环境中失败的 Docker 命令当作部署成功证据;对应截图只放在故障排查里。实际服务器上线时,以雨云实例状态、docker compose ps、容器日志、/api/status 和测试令牌调用共同作为验收依据。

雨云注册链接统一使用:https://www.rainyun.com/out_,邀请码为 out

参考资料:

这句话GPT的粪味是不是太重了 (

这个精,GPT写一遍然后再把图片粘贴上去

1 个赞