newapi+sub2api使用宿主机数据库共存安装,解决迁移备份难题

荒野的烟雾 2026-05-26 10:43 1

最开始用 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



  1. 宝塔面板 → 软件商店 → Redis → 设置。

  2. 选择 配置文件的文本,修改以下两项:



  • 找到 bind 127.0.0.1,修改为 bind 0.0.0.0

  • 找到 requirepass,在后面设置你的强密码(如:MyRedisPass123)。



  1. 保存并重启 Redis 服务。


2. 创建 PostgreSQL 数据库



  1. 宝塔面板 → 软件商店 → 打开 PostgreSQL管理器。

  2. 在 数据库 标签页,点击 添加数据库,分别创建两个数据库:



  • 数据库1:库名 newapi,用户名 newapi,设置密码(例如:PassNew123),「访问权限」必须选择「所有人」。

  • 数据库2:库名 sub2api,用户名 sub2api,设置密码(例如:PassSub123),「访问权限」必须选择「所有人」。


3. 配置 PostgreSQL 允许 Docker 访问



  1. 在 PostgreSQL管理器 设置中,点击 「配置修改」:



  • 查找 listen_addresses,确保修改为:listen_addresses = '*'



  1. 点击 「pg_hba.conf」,在文件的最末尾另起一行,加入以下放行 Docker 大网段的规则:


host    all             all             172.16.0.0/12           md5



  1. 保存并在「服务状态」里重启 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



  1. 在服务器上创建目录:mkdir -p /www/wwwroot/new-api && cd /www/wwwroot/new-api

  2. 创建 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" # 🔑 核心:允许容器穿透访问宿主机别名



  1. 运行命令启动:


docker compose up -d



  1. 验证日志:输入 docker logs new-api,看到最后停在 server started on [::]:3000 即代表成功。




^-^ 第四步:部署宿主机版 Sub2API



  1. 在 SSH 终端任意位置,直接运行官方一键脚本安装:


curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash



  1. 启动并设置开机自启:


sudo systemctl enable sub2api --now



  1. 暂时不需要在宝塔或云服务器放行 8080 端口。我们直接去宝塔面板添加一个站点(如 sub.yourdomain.com),在站点设置里添加一个反向代理:



  • 目标URL 填:http://127.0.0.1:8080



  1. 在浏览器中访问你的域名 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 号库错开,互不干扰)



  1. 点击提交,创建管理员账号。




^-^ 第五步:打通互通链路(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 的内部监听放宽了,为了防止被黑客扫描:



  1. 宝塔面板 → 安全:检查列表,千万不要放行 5432 和 6379。

  2. 云服务器控制台(如腾讯云/阿里云安全组):千万不要放行 5432 和 6379。

最新回复 (15)
  • GODGINO 05-26 11:08
    1楼

    支持 Claude 的订阅转成 api 吗, 支持多账号轮换吗?

  • 荒野的烟雾 楼主 05-26 11:10
    2楼

    我这只是把相关的数据库统一使用宿主机的,而不是每个程序自己单独拉docker起的。本身是写好了自己丢在仓库落灰,今天看到了一个佬扩容迁移需要重新注册,我在想是不是就是docker直接拉的数据库,导致数据迁移导致的麻烦。

    至于你说的这些功能是sub2api本身具备的功能。

  • GODGINO 05-26 11:27
    3楼

    大佬^-^^-^, 我其实比较好奇的是 615 之后能不能继续使用 sub2api 还有多 Claude 账号切换账号其中的缓存命中是否跟着账号走

  • 荒野的烟雾 楼主 05-26 11:41
    4楼

    这个我还真不清楚,没关注缓存是不是跟账号走,但是按说不会走,应该跟你聊天一样,你跟我说今天吃早饭了,但是你跟你女朋友没有说话,你女朋友是不知道你今天吃早饭了。

    除去消耗的情况下,持久化记忆应该会保持项目的记忆和进度应该可行。

  • SGYH 05-28 00:13
    5楼

    最近我也正想改造一下相关的配置文件,让 docker 程序直接访问宿主机的数据库呢,正好打算找一下思路呢

  • 荒野的烟雾 楼主 05-28 09:47
    6楼

    那直接按照这个思路就可以了,我目前就是按照这个思路做的。完全可行,宿主机的数据库备份还是比较方便的,docker的其实也可以,但是要稍微小折腾下。

  • mjjss 05-28 09:53
    7楼

    好奇佬友要是只选一个的话 佬友觉得哪个好呀

  • 荒野的烟雾 楼主 05-28 10:25
    8楼

    不用好奇,没法二选一,开头说了。。。

  • SGYH 05-29 00:44
    9楼

    我之前是把数据库相关的 Compose 配置拆出来,单独部署的,设置一个数据库的网络,然后让需要使用数据库的程序连接到那个网络,这样配置时就能使用数据库容器名直接连接了


    networks:
    databases-network:
    name: databases-network # 强制指定网络名称,不使用项目前缀
    driver: bridge
    attachable: true # 允许其他容器后期连接

    networks:
    sub-network:
    driver: bridge
    databases-network:
    external: true
    name: databases-network
  • 荒野的烟雾 楼主 05-29 10:38
    10楼

    一开始考虑过,后来还是觉得不要docker拉数据库好,毕竟我只会个dcoker ps stop start,要是没挂卷,直接gg了

  • SGYH 05-29 23:16
    11楼

    我倒是配置了持久化,但想到宝塔有相关功能不用,有点浪费,所以借着迁移服务器这机会,想折腾一下。

    哈哈,我也是属于没事给自己找事了,不过折腾服务器感觉还是挺有意思的

  • LinuxDo 06-07 08:33
    12楼

    佬,买的哪家的服务器?用起来稳定吗

  • 荒野的烟雾 楼主 06-07 09:32
    13楼

    买的核云的,自己用还行。宕机过几次,不过胜在便宜。

  • LinuxDo 06-07 09:34
    14楼

    核云的机器多少钱?还有别的什么吗?

  • 荒野的烟雾 楼主 06-07 14:39
    15楼

    好多吧,我是在核云交易市场买的,几百块3年的。我也没有很多机器,剩下的就是腾讯 阿里,甲骨文的了。

* 帖子来源Linux.do
返回