最开始用 NewAPI 管理中转系统,感觉它的重试功能不太顺手,也有可能是我使用方式不对。后续切换到 Sub2API,又常在 CC-Switch 中遇到 403 报错无法使用。
我尝试把 Sub2API 作为 NewAPI 的后端协同运行,但二者通过 Docker 部署时,会各自新建 PG 和 Redis 实例,不仅体验很差,数据备份也很麻(原本数据库是2个,在docker里备份太不优雅了,在宿主机就方便了直接宝塔定时备份,迁移再也不担心重新开局了)。搜了一圈也没找到宿主机部署数据库的相关方案,便自己动手折腾,把过程记录下来分享给大家。(以上通过豆包润色 ^-^)
以下通过Gemini润色 ^-^
^-^ 部署架构说明
- 基础设施:宝塔面板(安装有 PostgreSQL 17/18+、Redis 8.x+)
- New-API:通过 Docker Compose 部署,不自带数据库,穿透访问宿主机。
- Sub2API:通过官方系统脚本直接安装在宿主机(默认路径
/opt/sub2api),服务由 systemd 管理。
- 网络安全:不暴露 5432 和 6379 到公网,仅内部安全互通。
^-^ 第一步:准备宝塔宿主机环境
1. 配置宿主机 Redis
- 宝塔面板 → 软件商店 → Redis → 设置。
- 选择 配置文件的文本,修改以下两项:
- 找到
bind 127.0.0.1,修改为 bind 0.0.0.0
- 找到
requirepass,在后面设置你的强密码(如:MyRedisPass123)。
- 保存并重启 Redis 服务。
2. 创建 PostgreSQL 数据库
- 宝塔面板 → 软件商店 → 打开 PostgreSQL管理器。
- 在 数据库 标签页,点击 添加数据库,分别创建两个数据库:
- 数据库1:库名
newapi,用户名 newapi,设置密码(例如:PassNew123),「访问权限」必须选择「所有人」。
- 数据库2:库名
sub2api,用户名 sub2api,设置密码(例如:PassSub123),「访问权限」必须选择「所有人」。
3. 配置 PostgreSQL 允许 Docker 访问
- 在 PostgreSQL管理器 设置中,点击 「配置修改」:
- 查找
listen_addresses,确保修改为:listen_addresses = '*'
- 点击 「pg_hba.conf」,在文件的最末尾另起一行,加入以下放行 Docker 大网段的规则:
host all all 172.16.0.0/12 md5
- 保存并在「服务状态」里重启 PostgreSQL 服务。
^-^ 第二步:彻底解决 PostgreSQL 高版本 Schema 权限坑
由于 PostgreSQL 15+ 以上版本收紧了安全策略,新创建的用户默认无法在 public 空间建表。我们需要手动在 SSH 终端以管理员身份赋予它们权限:
在服务器 SSH 终端中,严格按照以下两段顺序执行:
# 1. 解决 newapi 数据库权限
sudo -i -u postgres psql -d newapi
GRANT ALL ON SCHEMA public TO newapi;
\q
# 2. 解决 sub2api 数据库权限
sudo -i -u postgres psql -d sub2api
GRANT ALL ON SCHEMA public TO sub2api;
\q
^-^ 第三步:部署 Docker 版 New-API
- 在服务器上创建目录:
mkdir -p /www/wwwroot/new-api && cd /www/wwwroot/new-api
- 创建
docker-compose.yml 文件,填入以下优化后的精简内容:
version: '3.4'
services:
new-api:
image: calciumion/new-api:latest
container_name: new-api
restart: always
command: --log-dir /app/logs
ports:
- "3000:3000"
volumes:
- ./data:/data
- ./logs:/app/logs
environment:
- DB_ENGINE=postgres
# ⚠️ 必须修改:换成你宝塔实际的 newapi 数据库密码
- SQL_DSN=postgres://newapi:你的newapi库密码@host.docker.internal:5432/newapi?sslmode=disable
# ⚠️ 必须修改:换成你宝塔实际的 Redis 密码 (/0 代表使用 Redis 的 0号库)
- REDIS_CONN_STRING=redis://:你的Redis密码@host.docker.internal:6379/0
- TZ=Asia/Shanghai
- ERROR_LOG_ENABLED=true
- BATCH_UPDATE_ENABLED=true
- NODE_NAME=new-api-node-1
healthcheck:
test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' || exit 1"]
interval: 30s
timeout: 10s
retries: 3
extra_hosts:
- "host.docker.internal:host-gateway" # 🔑 核心:允许容器穿透访问宿主机别名
- 运行命令启动:
docker compose up -d
- 验证日志:输入
docker logs new-api,看到最后停在 server started on [::]:3000 即代表成功。
^-^ 第四步:部署宿主机版 Sub2API
- 在 SSH 终端任意位置,直接运行官方一键脚本安装:
curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash
- 启动并设置开机自启:
sudo systemctl enable sub2api --now
- 暂时不需要在宝塔或云服务器放行
8080 端口。我们直接去宝塔面板添加一个站点(如 sub.yourdomain.com),在站点设置里添加一个反向代理:
- 目标URL 填:
http://127.0.0.1:8080
- 在浏览器中访问你的域名
https://sub.yourdomain.com,会进入网页设置向导,请按下表填写:
- PostgreSQL 主机:
127.0.0.1 (因为就在本地,直接填 127 即可)
- PostgreSQL 端口:
5432
- 数据库名/用户名/密码:输入宝塔创建的
sub2api 数据库的信息。
- Redis 主机/端口:
127.0.0.1 / 6379
- Redis 密码:你的宿主机 Redis 密码
- Redis DB:
1 (^-^ 核心:输入 1,完美和 New-API 的 0 号库错开,互不干扰)
- 点击提交,创建管理员账号。
^-^ 第五步:打通互通链路(New-API 内部调用 Sub2API)
由于 new-api 在 Docker 容器内,sub2api 在宿主机上,当你在 New-API 后台添加 Sub2API 作为渠道或后端时,你有以下两种最佳调用路径选择:
推荐方式:走纯内网安全回环(无需暴露端口,速度极快)
在 New-API 后台添加渠道或配置时:
- 代理/BASE_URL 填写:
http://host.docker.internal:8080
- 原理:我们在 Docker 中注入的
host.docker.internal 会让 Docker 流量直接打回宿主机的 8080 端口,不经过外网防火墙,安全且延迟低。
备选方式:走标准公网域名访问
在 New-API 后台添加渠道或配置时:
- 代理/BASE_URL 填写:
https://sub.yourdomain.com (你的 Sub2API 域名)
- 原理:Docker 容器内的请求会发送到公网/DNS,经过宝塔的 Nginx 反向代理证书解析后,再转给宿主机的
8080。
^-^ 第六步:最终网络安全检查(极其重要)
因为我们在宝塔中把 PostgreSQL 和 Redis 的内部监听放宽了,为了防止被黑客扫描:
- 宝塔面板 → 安全:检查列表,千万不要放行
5432 和 6379。
- 云服务器控制台(如腾讯云/阿里云安全组):千万不要放行
5432 和 6379。