来源:互联网 更新时间:2026-06-09 07:30
这篇文章记录了一次实打实的 Sub2API 迁移过程,从旧服务器的脚本安装环境,完整搬迁到新服务器的 Docker Compose 部署方式。整个流程走下来,核心思路其实很清晰:把配置和数据打包带走,在新的容器环境里重新组装。
旧服务器是用官方脚本装的,配置文件和程序都老老实实待在 /opt/sub2api。新服务器这边,则用官方提供的 docker-compose.local.yml 来部署,数据库从 PostgreSQL 备份里恢复。整个过程不复杂,但细节需要格外留意。

在开始之前,先确认一下这套方案适用的环境:
/opt/sub2api/config.yaml。sub2api_20260528_152845.sql.gz。在旧服务器上,需要先把手头的东西收一收:
cd /opt/sub2api
# 备份主配置文件
cp config.yaml /root/sub2api-config.yaml
# 备份应用本地数据目录
tar czf /root/sub2api-data.tar.gz data
接下来,确认旧配置里的数据库、Redis、JWT 这些关键信息:
grep -nA 20 '^database:' /opt/sub2api/config.yaml
grep -nA 20 '^redis:' /opt/sub2api/config.yaml
grep -nE 'secret|password|client_secret|encryption_key' /opt/sub2api/config.yaml
需要带到新服务器的文件清单:
/root/sub2api-config.yaml
/root/sub2api-data.tar.gz
R2/S3 下载下来的 sub2api_YYYYMMDD_HHMMSS.sql.gz
如果不用 R2/S3 备份,也可以选择在旧服务器手动导出 PostgreSQL:
PGPASSWORD='<旧库密码>' pg_dump -h localhost -p 5432 -U sub2api -d sub2api --no-owner --no-acl -f /root/sub2api.sql
gzip -f /root/sub2api.sql
/opt把准备好的文件上传到新服务器的 /opt 目录下:
/opt/sub2api-config.yaml
/opt/sub2api-data.tar.gz
/opt/sub2api_YYYYMMDD_HHMMSS.sql.gz
可以这样操作:
scp /root/sub2api-config.yaml root@<新服务器IP>:/opt/sub2api-config.yaml
scp /root/sub2api-data.tar.gz root@<新服务器IP>:/opt/sub2api-data.tar.gz
scp sub2api_YYYYMMDD_HHMMSS.sql.gz root@<新服务器IP>:/opt/
在新服务器上开始搭建:
cd /opt
git clone https://github.com/Wei-Shaw/sub2api.git
cd /opt/sub2api/deploy
cp .env.example .env
mkdir -p data postgres_data redis_data
解压旧服务器的本地数据目录:
tar xzf /opt/sub2api-data.tar.gz -C /opt/sub2api/deploy
然后把旧的配置文件放进去:
cp /opt/sub2api-config.yaml /opt/sub2api/deploy/config.yaml
config.yaml这一步比较关键,需要编辑新服务器上的配置:
vi /opt/sub2api/deploy/config.yaml
核心改动是:把旧服务器上的本地地址,改成 Docker Compose 环境里的内部服务名:
database:
host: postgres
port: 5432
user: sub2api
password: "<旧数据库密码>"
dbname: sub2api
sslmode: disable
redis:
host: redis
port: 6379
password: "
如果旧配置里没有设置固定的 totp.encryption_key,强烈建议现在补上,否则每次重启都会生成一个随机密钥:
openssl rand -hex 32
把生成的密钥填入 config.yaml,与 jwt: 同级:
totp:
encryption_key: "<64位hex密钥>"
这里有一个很容易踩的坑:如果旧实例之前没有固定的 totp.encryption_key,那么数据库里已经加密保存的部分敏感信息,在新实例里是无法自动解密的。具体受影响的内容包括:
Secret Access Keydocker-compose.local.yml编辑这个文件:
vi /opt/sub2api/deploy/docker-compose.local.yml
需要确保 sub2api 服务的 volumes 部分包含这两行挂载:
volumes:
- ./data:/app/data
- ./config.yaml:/app/data/config.yaml
.env编辑环境变量文件:
vi /opt/sub2api/deploy/.env
至少确保以下值与 config.yaml 保持一致:
POSTGRES_USER=sub2api
POSTGRES_PASSWORD=<旧数据库密码>
POSTGRES_DB=sub2api
REDIS_PASSWORD='
一个小技巧:如果 Redis 密码里包含 >、^、! 这类特殊字符,建议在 .env 里用单引号包起来,避免解析出错。
先只启动数据库和 Redis,确认基础组件没问题:
cd /opt/sub2api/deploy
docker compose -f docker-compose.local.yml up -d postgres redis
docker compose -f docker-compose.local.yml ps
等待几秒钟,确认 sub2api-postgres 和 sub2api-redis 的状态都显示为 Healthy,再往下走。
现在,把之前下载或导出的备份文件恢复到数据库里:
gunzip -c /opt/sub2api_YYYYMMDD_HHMMSS.sql.gz | docker compose -f /opt/sub2api/deploy/docker-compose.local.yml exec -T postgres psql -U sub2api -d sub2api
如果 .env 文件里配置的数据库用户名或库名不是 sub2api,记得把命令里的 -U 和 -d 参数同步换成实际的值。
数据库恢复完成后,就可以启动主服务了:
docker compose -f /opt/sub2api/deploy/docker-compose.local.yml up -d sub2api
docker compose -f /opt/sub2api/deploy/docker-compose.local.yml logs -f sub2api
正常情况下,日志里应该能看到类似这样的信息:
[Backup] 定时备份已启用: 0 2 * * *
如果日志里出现了下面这条:
TOTP encryption key auto-generated
这说明你配置的固定 totp.encryption_key 没有被正确加载。这个时候需要逐一排查:
/opt/sub2api/deploy/config.yaml 是否正确挂载到了容器内的 /app/data/config.yamlconfig.yaml 文件中是否确实有 totp.encryption_key 这个字段.env 文件里是否也填了对应的 TOTP_ENCRYPTION_KEY服务启动后,别急着关终端,先做一轮基本检查:
docker compose -f /opt/sub2api/deploy/docker-compose.local.yml ps
docker compose -f /opt/sub2api/deploy/docker-compose.local.yml logs --tail=200 sub2api
然后进后台确认几件事:
如果遇到 R2/S3 连接测试失败的情况,大概率是因为旧数据库里保存的 Secret Access Key 因为旧加密密钥缺失而无法解密。解决方案很简单:进入后台「系统设置 -> 数据备份」,重新填一遍 Secret Access Key,保存后再次测试连接即可。
pg_dump version 报错这个其实是个小乌龙。正确的查看版本命令是 pg_dump --version,pg_dump version 会被 PostgreSQL 当作数据库名处理,进而触发连接错误。
channel_monitor: decrypt api key failed这说明旧库中保存的 Channel Monitor API Key 无法用当前密钥解密。进入后台,重新填写对应监控项的 API Key 就行。
payment encryption/signing key is not explicitly configured配置好固定的 totp.encryption_key,然后重启服务即可解决。
通常不需要。Sub2API 的核心业务数据都在 PostgreSQL 里,Redis 只是用来做缓存、锁和临时状态存储。新服务器直接用新 Redis,干净利落。
这是一个常见误区。Sub2API 的备份列表并不是去扫描 R2/S3 桶里的文件,而是读取 PostgreSQL 数据库里 settings.key = 'backup_records' 这条记录。只要导入的是完整的 PostgreSQL 备份,备份记录就能正常恢复。
下饭影视APP下载安装指南
灵宝派对手游下载安装地址推荐
和平精英如何做到压枪稳-和平精英怎样才能压枪稳
下载浏览器app下载安装选择推荐
《Off Campus》第二季官宣:这对CP还在,但不再是主角
4D采矿者官网在哪下载 最新官方下载安装地址
免费影视剧APP推荐
儿子穿新中式现身大会堂 马斯克罕见用中文回应:他正在学习普通话
Elysium Above 履云录官网在哪下载 最新官方下载安装地址
名单曝光!库克、马斯克等将随团到访中国 黄仁勋不在其中
抖音最火沙雕男生网名(精选100个)
短剧《情绪超市》剧情介绍
短视频软件推荐
免费看电影的软件推荐
苹果macOS 27将优化界面设计并测试AI驱动的Safari标签页自动分组功能
网络热词聊污是什么意思
网石18禁MMO《RAVEN2:渡鸦》大型更新推出全新职业“军阀”
KuCoin基本面分析
洛克王国世界S2赛季狂欢怪谈介绍
SpaceX狂揽AI人才,马斯克亲自面试且不看简历背景
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc