02. Docker 部署 New API

前置条件

服务器已经具备:

  • Docker 可用
  • CPA 已经跑通,端口 8317
  • 腾讯云实例有公网 IP

本次选择:

  • 数据库:SQLite
  • 部署方式:单容器 Docker
  • 外部端口:3000
  • 数据目录:/root/new-api/data

1. 创建数据目录

mkdir -p /root/new-api/data
ls -la /root/new-api/

期望看到:

data

这个目录会挂进容器 /data,里面保存 SQLite 数据库、上传文件等。容器删除重建后,数据仍然保留。

2. 启动容器

多行命令如果复制容易出问题,可以直接用这一行:

docker run -d --name new-api --restart unless-stopped -p 3000:3000 -e TZ=Asia/Shanghai -v /root/new-api/data:/data calciumion/new-api:latest

参数说明:

参数说明
--name new-api容器名
--restart unless-stoppedDocker 重启后自动拉起
-p 3000:3000宿主机 3000 映射到容器 3000
-e TZ=Asia/Shanghai设置时区
-v /root/new-api/data:/data持久化数据
calciumion/new-api:latestNew API 镜像

3. 验证启动

docker ps | grep new-api
docker logs --tail 30 new-api

正常日志里能看到类似:

New API v1.0.0-rc.4 started
Network: http://172.17.0.2:3000/

如果日志里出现:

system is not initialized and no root user exists

这是正常的。新版 New API 第一次访问会让你初始化管理员账号,不一定有默认 root/123456

4. 服务器本地测试

docker exec new-api wget -qO- http://localhost:3000/ | head -3
curl -sI http://127.0.0.1:3000/
ss -tlnp | grep 3000

期望结果:

  • 容器内能返回 HTML。
  • 宿主机 curl 返回 HTTP/1.1 200 OK
  • ss 显示 0.0.0.0:3000 正在监听。

5. 首次访问

浏览器打开:

http://服务器公网IP:3000

第一次进入页面后,按提示创建管理员账号。

创建完成后,先进入后台,再去配置 CPA 渠道。

6. Docker iptables 报错

如果启动容器时报:

iptables: No chain/target/match by that name

常见原因是 Docker 的 iptables 链被 firewalld 或系统安全组件刷新了。处理方式:

docker rm new-api
systemctl restart docker
docker ps
docker run -d --name new-api --restart unless-stopped -p 3000:3000 -e TZ=Asia/Shanghai -v /root/new-api/data:/data calciumion/new-api:latest

重启 Docker 会让容器短暂中断,但 --restart unless-stopped 的容器会自动回来。