换服务器 / 迁移数据
这篇给「站建好了,但想换个配置更高的服务器 / 想搬到国内机房 / 原机器要退租」的站长看。照着做就能整个站搬走,数据、用户、种子一个不丢。 全程约 1 小时。 不懂的词查 术语小词典。
TL;DR(赶时间看这版)
- 老站先备份:
bash scripts/backup.sh(生成归档,别关终端等它跑完)。 - 演练恢复:
bash scripts/restore.sh <刚生成的备份文件> --drill—— 这一步能提前暴露「备份其实不能用」,千万别跳。 - 搬文件:把备份归档 + 源码 +
docker/.env传到新机器(这三样就够,不用搬数据库运行中的文件)。 - 新机器起服务:
git clone源码 → 把同一个.env放回docker/.env→docker compose up -d。 - 恢复数据:
bash scripts/restore.sh <备份文件> --force(整库替换)。 - 改 DNS:域名解析指到新服务器 IP,等生效。
- 验证:能登录、能看老种子、老客户端能连 tracker 做种。
⚠️ 顺序不能乱:先在新机器验证跑通,再切 DNS。顺序反了 = 全站 downtime。
为什么必须按这个顺序
最容易踩的坑是直接在老机器上改配置然后「搬」——搬的过程断电、网断、文件传一半,都会让老站直接不可用。正确思路是:
老机器只负责"导出一份备份",新机器负责"导入并验证"。DNS 最后一改,切换瞬间完成。
这样老站在你整个操作期间一直正常服务,只在最后切 DNS 的那几十秒内受影响。
第 1 步:在老机器做备份
SSH 登录老服务器,进到项目目录:
cd /path/to/FluxTorrent # 你当初放代码的目录
bash scripts/backup.sh怎么算成功:最后会打印出备份文件的路径和大小,形如 backup/flux-20261003-0400.tar.gz(14 天内的旧备份会被自动清理)。
这一步做了什么(backup.sh 一次搞定三样):
- PostgreSQL 全量导出(含所有表、用户、种子、消息、设置、迁移记录);
- 附件卷打包(种子原始文件也存在数据库里,一并覆盖);
- Redis 快照(含未落库的做种计费事件,别以为 Redis 是缓存就丢)。
💡 想改成保留 30 天:
bash scripts/backup.sh 30。
第 2 步:演练恢复(关键,别跳)
bash scripts/restore.sh backup/flux-20261003-0400.tar.gz --drill做什么:把备份恢复到「一个临时数据库」里,验证它能读、能用,但完全不碰你的生产数据。
为什么必须做:备份文件存在 ≠ 备份能用。文件可能损坏、可能缺表、可能是空库(磁盘满了写出来的 0 字节文件也算「成功」)。没演练过的备份,等于没有备份。
怎么算成功:结尾出现校验通过、无报错。
第 3 步:把三样东西传到新机器
需要传的只有三样,别去拷贝数据库运行中的数据目录(那样拷出来的多半是坏的):
| 要传什么 | 从哪拿 | 怎么传 |
|---|---|---|
| 备份归档 | 老机器 backup/*.tar.gz | SFTP 客户端 / scp / U 盘 |
| 源码 | 老机器的项目目录 | git clone 重新拉(推荐)或整目录传 |
| 配置文件 | 老机器 docker/.env | 必须拿这个(里面是你改过的密码和设置) |
# 传备份文件(在新机器上执行,把 IP 和路径换成你的)
scp root@老机器IP:/path/to/FluxTorrent/backup/flux-20261003-0400.tar.gz ./
# 传 .env(关键!密码都在里面)
scp root@老机器IP:/path/to/FluxTorrent/docker/.env /tmp/flux-env-backup为什么不用
docker/.env.example?因为它里面全是change_me占位符,用示例文件 = 新站连不上老站的数据(数据库密码都不一样)。
第 4 步:新机器起服务
在新机器上(详细步骤见 SSH 部署方式 的阶段 A–B):
git clone https://github.com/gntv456/FluxTorrent.git && cd FluxTorrent
# 或用 SSH:git clone git@github.com:gntv456/FluxTorrent.git && cd FluxTorrent
cp /tmp/flux-env-backup docker/.env # 用老站那份 .env
docker compose -f docker/docker-compose.yml up -d怎么算成功:curl http://localhost:8080/api/v1/health 返回 {"status":"up"}。
此时新站是空站(数据库刚初始化),这是正常的,下一步才灌数据。 首次访问会走一遍安装向导——这次要填和老站一样的站名和管理员密码,否则恢复完你会登不进去。
第 5 步:恢复数据
# 1) 按脚本提示,先停掉会写库的服务
docker compose -f docker/docker-compose.yml stop api worker tracker
# 2) 整库恢复(会要求你输入 YES 二次确认)
bash scripts/restore.sh backup/flux-20261003-0400.tar.gz --force
# 3) 恢复完重新起服务
docker compose -f docker/docker-compose.yml up -d怎么算成功:恢复脚本打印完成、无 ERROR,然后 up -d 后浏览器打开站点,能看到迁移前的用户和种子。
⚠️
--force会先 DROP 再重建整个库,老库数据全部覆盖。所以必须在第 2 步演练通过后才能执行,且执行时确认新机器上的库确实是那个空库。
第 6 步:切 DNS(真正「切换」的时刻)
- 域名商后台,把 A 记录从老服务器 IP 改成新服务器 IP;
- 记得同步改服务器防火墙 / 云安全组(新机器要放行 80/443);
- DNS 生效需几分钟到几小时(这期间老 IP 仍被部分用户解析,取决于缓存)。
第 7 步:验证这 6 件事
| 检查 | 怎么验 | 不通过怎么办 |
|---|---|---|
| 站点能打开 | 浏览器访问域名 | 检查容器是否全 Up |
| 管理员能登录 | 用老站的管理员密码登录 | 密码在 .env 关联的库里,重置见 故障排查 |
| 老种子还在 | 随便打开一个老种子的详情页 | 恢复没成功,重跑第 5 步 |
| 用户能下载种子 | 下老种子,看地址是否是新域名 | 后台把 announce 改成新域名(见 域名部署) |
| 客户端能连 tracker | 挂上老种子看是否有 peer 进场 | 检查 /announce/ 反代是否配了(见 域名部署) |
| 新用户能注册 | 注册一个新账号 | 检查 SMTP(见 开站 checklist) |
🔴 最容易忘的一步:老种子里的 announce 地址还是老域名。恢复完必须去后台「Tracker 地址」改成新域名,然后让用户重新下载种子。否则老用户全都做不了种(这是搬家后最常见的事故)。
常见问题
Q:能不能直接把老机器的数据库目录整个拷过去? 不能。PostgreSQL 的数据文件必须在停止服务后用 pg_dump 导出,直接拷运行中的目录会拿到损坏的数据。用本篇的 backup.sh 是唯一安全做法。
Q:新旧两台同时跑,会不会有冲突? 只要没切 DNS 就是安全的(老站照常服务)。切了 DNS 之后建议立刻把老机器的容器停掉(docker compose down,别加 -v),避免两边数据分叉。
Q:--drill 会占用多久? 几分钟。它会真的走一遍恢复流程到一个临时库,所以能测出「恢复要多久」——这也是你判断停机窗口长短的依据。
Q:需要停站吗? 切 DNS 那一瞬间有几十秒影响,之后无需停站。恢复数据全程老站不受影响(在新机器上做)。
Q:IP 变了,之前发的种子全废了? 是,老种子里的旧 IP 全部失效,必须改 announce + 让用户重下。这属于搬家必付的代价,提前在用户公告里说明。
词看不懂?→ 术语小词典