Skip to content

换服务器 / 迁移数据 ​

这篇给「站建好了,但想换个配置更高的服务器 / 想搬到国内机房 / 原机器要退租」的站长看。照着做就能整个站搬走,数据、用户、种子一个不丢。 全程约 1 小时。 不懂的词查 术语小词典。

TL;DR(赶时间看这版) ​

  1. 老站先备份:bash scripts/backup.sh(生成归档,别关终端等它跑完)。
  2. 演练恢复:bash scripts/restore.sh <刚生成的备份文件> --drill —— 这一步能提前暴露「备份其实不能用」,千万别跳。
  3. 搬文件:把备份归档 + 源码 + docker/.env 传到新机器(这三样就够,不用搬数据库运行中的文件)。
  4. 新机器起服务:git clone 源码 → 把同一个 .env 放回 docker/.env → docker compose up -d。
  5. 恢复数据:bash scripts/restore.sh <备份文件> --force(整库替换)。
  6. 改 DNS:域名解析指到新服务器 IP,等生效。
  7. 验证:能登录、能看老种子、老客户端能连 tracker 做种。

⚠️ 顺序不能乱:先在新机器验证跑通,再切 DNS。顺序反了 = 全站 downtime。

为什么必须按这个顺序 ​

最容易踩的坑是直接在老机器上改配置然后「搬」——搬的过程断电、网断、文件传一半,都会让老站直接不可用。正确思路是:

老机器只负责"导出一份备份",新机器负责"导入并验证"。DNS 最后一改,切换瞬间完成。

这样老站在你整个操作期间一直正常服务,只在最后切 DNS 的那几十秒内受影响。


第 1 步:在老机器做备份 ​

SSH 登录老服务器,进到项目目录:

bash
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
bash scripts/restore.sh backup/flux-20261003-0400.tar.gz --drill

做什么:把备份恢复到「一个临时数据库」里,验证它能读、能用,但完全不碰你的生产数据。

为什么必须做:备份文件存在 ≠ 备份能用。文件可能损坏、可能缺表、可能是空库(磁盘满了写出来的 0 字节文件也算「成功」)。没演练过的备份,等于没有备份。

怎么算成功:结尾出现校验通过、无报错。


第 3 步:把三样东西传到新机器 ​

需要传的只有三样,别去拷贝数据库运行中的数据目录(那样拷出来的多半是坏的):

要传什么从哪拿怎么传
备份归档老机器 backup/*.tar.gzSFTP 客户端 / scp / U 盘
源码老机器的项目目录git clone 重新拉(推荐)或整目录传
配置文件老机器 docker/.env必须拿这个(里面是你改过的密码和设置)
bash
# 传备份文件(在新机器上执行,把 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):

bash
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 步:恢复数据 ​

bash
# 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(真正「切换」的时刻) ​

  1. 域名商后台,把 A 记录从老服务器 IP 改成新服务器 IP;
  2. 记得同步改服务器防火墙 / 云安全组(新机器要放行 80/443);
  3. 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 + 让用户重下。这属于搬家必付的代价,提前在用户公告里说明。


更多:备份脚本细节见 备份恢复,升级迁移见 升级与回滚。

词看不懂?→ 术语小词典