自建节点有个很反直觉的特点:它比机场更难"修"。机场挂了你去群里问客服,自建节点挂了只能自己翻日志;而真正让人一夜回到解放前的,通常不是被墙,而是一次手滑的 rm -rf、一张忘记续费的账单,或者商家某天突然下线一个机房。
这篇不讲怎么搭节点(那是自建VPN全教程该干的事),只讲一件被绝大多数人跳过的事:让这台机器上的东西可以被复制、被搬走、被重建。如果你读完后觉得这套维护成本不值,那结论也很清楚——把这件事直接交给一家稳定机场(例如自由猫),由商家负责服务端运维,本身就是一个理性选择。
下面按"会丢什么 → 备份什么 → 怎么备份 → 怎么迁移 → 丢了怎么捞 → 迁完怎么验"的顺序走一遍。
一、先想清楚:自建节点会怎么"丢",以及"备份"和"快照"根本不是一回事
绝大多数人第一次做自建节点备份,都是因为出过一次事。与其等那次事故发生,不如先认清风险来自哪三个方向。
第一类,商家侧。商家跑路、机房下线、账号因欠费或风控被封、IP 被回收重分配——这些都属于"你什么都没做错,但机器不属于你了"。这类风险的特点是同时收走你的机器和机器上的数据,所以放在同一商家的快照完全救不了你。
第二类,机器侧。系统盘损坏、误删配置、内核或系统大版本升级失败、被入侵后植入挖矿或勒索程序。这类事故里,机器本身还在,但磁盘上的东西已经不可信或不可用。
第三类,人这一侧。配置是在哪台机器上改的、证书放在哪个目录、域名还有几天到期、当时用的什么端口和伪装域名——过了三个月,自己都想不起来。迁移时真正卡住人的,往往不是技术,而是这些"只有当时记得"的信息。
然后是最容易被混淆的一点:商家控制台里的"快照"和"备份",逻辑上不是同一个东西。
| 形态 | 本质是什么 | 存在哪里 | 账号出事还能用吗 | 恢复粒度 |
|---|---|---|---|---|
| 配置级备份 | 文本配置 + 密钥 + 数据库导出,落地成可读文件 | 你自己的对象存储或私有仓库 | 能 | 单个文件 / 整个服务 |
| 系统快照 | 整盘在某个时点的副本 | VPS 商家的同一账号下 | 不能 | 整盘回滚 |
| 自定义镜像 | 可以用来开新机的整盘模板 | VPS 商家的同一账号下 | 不能 | 整盘 |
| 容器镜像 | 构建产物,配置靠挂载卷或变量注入 | 你自己的镜像仓库 | 能 | 单个容器 |
结论很简单:快照和镜像解决的是"同一商家内的整盘回滚",配置级备份解决的是"换一家也活得下去"。两者不冲突,但只有后者能覆盖第一类风险。想先看清自己机器上到底跑了什么、每条连接去了哪,可以先做观测再做备份——这套方法在流量监控与带宽归因里已经讲过,思路是通用的。
二、备份清单:一个自建节点到底有哪些东西不能丢
不要凭记忆列清单。下面这张表按"丢了会不会致命"排序,逐项对着自己的机器核对一遍,比记住任何命令都有用。
| 类别 | 具体内容(按常见默认路径) | 丢了会怎样 | 能否重建 |
|---|---|---|---|
| 代理内核配置 | Xray 的 /usr/local/etc/xray/config.json、sing-box 的 /etc/sing-box/config.json、WireGuard 的 /etc/wireguard/wg0.conf | 节点直接不可用 | 能重写,但参数全靠回忆 |
| 密钥与证书 | REALITY 的 privateKey / shortIds、自签证书与私钥、ACME 账户目录 | 客户端全部要改配置 | 能重签,但要重发订阅 |
| 面板与数据库 | 3X-UI 的 SQLite 库(常见 /etc/x-ui/x-ui.db)、V2Board 一类的 MySQL 库 | 用户、流量、订阅全丢 | 只能重建,历史数据不可逆 |
| 前置与域名 | nginx / Caddy 配置、DNS 记录、域名到期日与续费方式 | 域名一过期,越优雅的架构也白搭 | 能重建,但要时间 |
| 系统层配置 | systemd unit、防火墙规则、内核参数、cron 与 systemd timer、fail2ban 规则 | 节点"能连上但不对劲" | 能重建,容易漏项 |
| 脚本与参数表 | 安装脚本、.env 变量、端口 / 协议 / 路径 / 伪装域名的一份汇总 | 迁移时最耗时的一项 | 能重建,取决于记录习惯 |
| 客户端侧 | 订阅链接、分享链接、UUID / 密码 / 伪装参数 | 等于丢了"怎么连"的钥匙 | 能重新生成并分发 |
这张表里最容易被忽略的是最后两行。参数表不是给机器看的,是给三个月后的自己看的;客户端侧则是灾难重建时最值钱的东西,这一点第五节会展开。
反过来,有两件事要刻意避开:一是不要为了省事把密钥明文存进公开仓库,很多"节点配置仓库"就是被扫出来的;二是备份文件本身必须加密,否则等于把私钥和账号密码打包放在别人硬盘上。另外,如果你用的是机场而不是自建,服务端的节点、证书与备份这一半工作都由商家承担,你只需要保存好订阅链接。把自建留给真正需要独占出口的场景,日常入门价位的大流量需求交给瑶瑶领先这类按月付的档位反而更划算。
三、四层备份方案:从单文件加密到异地增量,怎么组一套够用的
不要一上来就追求"企业级容灾"。自建节点的备份,按下面四层从低到高搭,够用且不折腾。
第一层:配置文本加密归档。把内核配置、证书、面板库、nginx 配置打成一个包,用 age 或 gpg 加密后用 scp 拉到本地或另一台机器。命令形态大致是 tar czf - /etc/xray /etc/x-ui | age -r <你的公钥> > node-$(date +%F).tar.gz.age。优点是零依赖、可读可查;缺点是没有版本管理,每次都是整包。
第二层:面板数据库单独导出。SQLite 不要直接复制正在写入的文件,用 sqlite3 x-ui.db ".backup backup.db" 做一致性导出;MySQL 用 mysqldump。数据库导出最好单独保存一份并多留几个日期,因为用户、流量与订阅数据一旦丢失就无法从别处反推。
第三层:定时 + 异地。用 cron 或 systemd timer 把前两层跑成固定任务,再用 rclone 或 restic 推到对象存储。这一层的关键是"异地"和"加密":存储端看到的应当是不可读的密文,而不是一堆明文配置。
第四层:商家快照做补充。整盘快照的价值在于"系统升级失败可以一键回滚",把它当第四层补充,别当第一层救命稻草。
工具怎么选,取决于你要"归档"还是"长期版本管理":
| 工具 | 加密 | 增量 / 去重 | 常见后端 | 适合的场景 |
|---|---|---|---|---|
| tar + age / gpg | 是 | 否(每次整包) | 任意文件后端 | 配置量小、要求可读可查 |
| restic | 是(仓库级加密) | 是(内容分块去重) | S3 / B2 / R2 / SFTP / 本地 | 长期、多版本、定时快照 |
| rclone(+ crypt) | 可选(crypt 远程) | 否(sync 是镜像语义) | 几十种云存储 | 已有云盘、只要单向同步 |
| rsync | 否(靠 SSH 隧道) | 是(差量传输) | 任意 SSH 主机 | 两台自己的机器之间对拷 |
| 商家快照 | 商家侧决定 | 否 | 商家同账号 | 整盘回滚(作补充) |
组装时有四条硬要求。第一,遵守 3-2-1:至少三份、两种介质、一份异地。第二,备份密码与备份文件必须分开存放,否则加密只是心理安慰。第三,定期演练恢复——至少每季度把最近一次备份恢复到临时目录跑一遍,备份存在和备份能恢复是两件事。第四,让备份任务自己在失败时能报警,而不是等到要用的时候才发现三个月前就断了。最后别忘了:如果你把自建节点和机场订阅串成了同一份客户端配置(做法见自建节点统一订阅化),那么"客户端的这份订阅"本身也要纳入备份,它比配置更贴近你的实际使用路径。
四、迁移实操:换 VPS、换机房、换商家的正确顺序
迁移的目标不是"把旧机器复制过去",而是"让客户端在几乎无感的情况下换一个落点"。顺序错了,最常见的后果是两头都不通,或者客户端被迫全部重发。
第 0 步,先做参数表。把旧机器的架构(x86_64 还是 arm64)、系统版本、内核是否带了你依赖的模块、端口、协议、伪装域名、证书路径、面板端口与 webBasePath 全部记下来。这一步直接决定新机能不能一次部署成功。
第 1 步,提前降 TTL。切换前 24 到 48 小时,把域名的 TTL 调到 300 秒。TTL 不降,DNS 缓存会替你"延迟"半天到一天,回滚也会跟着变慢。
第 2 步,在新机按同一套参数部署。这里有个能省掉一堆麻烦的点:如果旧节点用的是 REALITY,那么把原来的 privateKey 和 shortIds 直接搬到新机即可,不需要重新签发证书,客户端也完全不用改。如果用的是 ACME 证书,就在新机重新签发一次,但要注意 Let's Encrypt 的速率限制(同一注册域名每周的证书数量有上限,重复签发同一组域名也有限制),别在短时间内反复重试。
第 3 步,用旁路验证再切流。先在本地用 hosts 绑定或不影响生产的临时域名访问新机,确认协议握手、分流和速度正常,再去动生产 DNS。生产环境直接试错是最贵的试错。
第 4 步,切换。配置里用的是域名,就改 DNS 解析;配置里写的是 IP,就要更新客户端订阅。这也是"尽量用域名而不是 IP"这条经验的全部价值所在——它把一次迁移从"要通知所有人改配置"降级成"等缓存过期"。
第 5 步,保留观察窗口。旧机器至少留 3 到 7 天再关,这期间它就是你的回滚点。确认新机稳定后,再导出账单与流量记录、关闭自动续费、按商家条款处理退款或释放资源。
第 6 步,迁移后立刻重设自动任务。定时备份、证书续期、监控告警、fail2ban——这些在原机器上是"当初顺手配的",新机器上不会自动出现,而忘记它们的代价通常要等到下一次出事才体现。想省掉手工重建这一步,可以把整个服务写成声明式配置再用编排工具拉起,思路和 Docker Compose 一键部署网关那套一样:机器是临时的,配置才是资产。
迁移窗口期最怕的情况,是旧机已经关了、新机还没调通,手上的出口全断。所以稳妥做法是在迁移期间保留一条机场线路作为过渡出口,把"能不能上网"和"自建节点能不能用"这两件事解耦。如果场景涉及跨境、多账号或需要相对干净的 IP,可以留意仙路湾这类以住宅 IP 为卖点的线路。
五、没有备份怎么办:从客户端订阅、运行进程与日志里把节点"捞"回来
如果事故已经发生、备份又不存在,仍然有四条从易到难的抢救路径,成功率比想象中高。
路径一:从客户端反推。这是最有效的一条。vmess、vless、ss、trojan 的分享链接和订阅内容里,本来就带着服务器地址、端口、UUID 或密码、传输方式与伪装参数;REALITY 的 publicKey、shortId 也在客户端侧。把客户端订阅导出并解码,重建参数就拿到了大半。唯一拿不回来的是服务端私钥——但直接生成新的一对、把客户端的 publicKey 换掉即可,代价是客户端要更新一次。
路径二:从还在运行的进程里读。只要机器还能启动,配置基本都在:systemctl cat <服务名> 看 unit 与启动参数,ps aux 与 /proc/<pid>/cmdline 看真实命令行,ss -tnlp 看监听端口,容器场景用 docker inspect 看挂载卷、环境变量与端口映射,docker compose config 能把最终生效的配置渲染出来。
路径三:从磁盘残留里找。/etc/letsencrypt/live、acme.sh 的目录、面板数据库、nginx 站点配置、shell 历史、代理内核的访问日志,都能还原出相当一部分参数。这些位置在"只是换了系统盘"的场景里往往还在。
路径四:接受重建。当上面三条都走不通,就用同一套协议和端口重建一个节点、重新生成凭据、重发订阅。这里要接受一个心理下限:目标是"能连、能用、够快",不是"100% 还原到旧的 UUID 和证书",后者成本高、收益低。
如果重建期间旧线路已经不可靠,手上最好有一条纯专线的兜底出口。以纯 IEPL 为定位的SS-ID 这类方案,链路层数少、路径可预期,适合放在"临时顶一段时间"的位置;自建机器本身被墙时的诊断与救活流程,可以对照VPS 被墙处理指南一步步来。
六、迁移后的验证清单:五项必查,以及"客户端零改动"的前提
迁移完成后,不要只看"能打开网页"就收工。下面五项逐条过一遍,才算真正完成。
- 可达性:用一条临时订阅或临时配置导入客户端,确认节点能连上、能出网。
- 握手与伪装:确认 TLS 证书链、REALITY 握手参数、伪装域名回源都正常,没有回退到明文或被中间设备识别。
- 分流与 DNS:确认规则仍然生效、DNS 不泄漏,国内外分流符合预期。
- 日志:确认内核与前置代理日志干净,没有反复重连、证书告警或异常登录。
- 自动任务:定时备份、证书续期、监控告警、fail2ban 全部重新挂上并跑通一次。
把迁移前后要做的事按时间轴排开,会更清楚哪些动作不能漏:
| 时点 | 必做动作 | 漏掉的后果 |
|---|---|---|
| 迁移前 48 小时 | 降低域名 TTL、整理参数表、导出面板数据库 | 切换慢、回滚慢、参数全靠回忆 |
| 切换前 | 用临时域名或 hosts 做旁路验证 | 把生产环境当试验场 |
| 切换瞬间 | 改 DNS 或更新订阅,确认客户端已恢复 | 断网时间被无限拉长 |
| 切换后 24 小时 | 复挂备份、证书续期、监控与告警 | 自动化静默失效,下次事故才暴露 |
| 切换后 3–7 天 | 观察稳定后再关旧机与自动续费 | 提前失去回滚点 |
还有一件事值得单独提醒:验证时要用一条全新的客户端配置去测,而不是用你平时那份"加载了缓存订阅"的配置。旧配置里可能还留着旧节点、旧策略组和旧 DNS,它连通往往只说明旧路径还在,说明不了新机器已经就绪。
另外,迁移完成后最好把这次的参数表、证书到期日、备份任务清单更新进你的文档里。下一次迁移的成本,几乎完全取决于这一次留下了多少可复用的信息——迁移本身只花一小时,找回"当时到底怎么配的"可能要花一整天。
而"客户端零改动"的前提只有三条:域名不变、端口不变、协议参数不变。这也是为什么第四节反复强调"尽量用域名而不是 IP"——它把一次迁移的客户端影响面从"所有人"缩小到"等 DNS 缓存过期"。至于自建和机场在长期持有成本上的取舍,如果还没想清楚,可以先用12 个月总持有成本账本算一遍再决定要不要继续折腾。
七、八个最容易踩的坑
下面八条都是"看起来很小心、实际上踩了"的类型。它们的共同点是:平时毫无症状,只在出事那一次集中结算。
- 把快照当备份。快照和机器在同一个商家账号下,账号出事就一起没了。
- 备份里带明文私钥,备份文件本身又不加密。等于把钥匙抄一份放在公共储物柜。
- 备份密码和备份文件放在一起。加密了,但入口和钥匙在同一个口袋。
- 只备份配置,忘了域名到期日与续费方式。技术全对,域名过期照样全断。
- 迁移前没降 DNS TTL。切换慢、回滚更慢,硬生生把一次平滑迁移做成一次故障。
- 新机架构或内核不一致。x86_64 与 arm64、缺少内核模块,都会让"照抄的配置"启不来。
- 迁移后忘了重设自动任务。备份断了、证书续期没了,问题在下一次事故时才集中爆发。
- 从没演练过恢复。备份存在不等于能恢复,没验过的备份只能算一份心理安慰。
如果只能改一件事,先改第八条:把"恢复演练"变成一个固定动作。因为前七个坑都会在演练里暴露——备份缺项、密码遗忘、路径不对、权限错误、任务没挂上,全都能在一次演练中被提前发现,而成本只是十几分钟。
八、FAQ:关于自建节点备份与迁移的八个常见问题
Q1:自建节点多久备份一次合适?
分两类看。配置与密钥变化很少,改一次备一次即可;面板数据库和用户、流量数据在变,建议每天一次。频率的意义在于限制"最多丢多少天的数据",而不是背一个固定数字。更实际的做法是反过来推:先定下"我能接受丢一天还是丢一周",再决定定时任务写 daily 还是 weekly,并让任务在失败时能发出提醒。
Q2:有商家快照是不是就不用自己备份了?
不能。快照解决的是同一商家内的整盘回滚,覆盖不了商家跑路、账号被封这类风险。快照是第四层补充,不是第一层保障。
Q3:备份一定需要加密吗?
只要备份离开了你完全掌控的机器,就应该加密。自建节点的配置文件里通常包含私钥或密码,明文存放在第三方存储上,等于把节点凭据公开。判断标准可以简化成一句:这份备份离开你的机器之后,是否仍由你独占控制?只要答案是否定的,就先加密再上传。
Q4:换 VPS 之后客户端一定要全部改吗?
不一定。前提是客户端配置里用的是域名,且端口与协议参数不变——这种情况下只需改 DNS,客户端等着缓存过期即可。用 IP 就一定得更新订阅。
Q5:REALITY 换机器为什么不用重签证书?
因为 REALITY 不依赖服务器端自有证书,它靠私钥与 shortIds 完成握手并与目标站点"借用"证书特征。所以把 privateKey 和 shortIds 搬到新机即可,客户端无需改动。
Q6:面板数据库直接复制文件可以吗?
SQLite 在写入过程中直接复制可能得到不一致的副本,应该用 .backup 之类的一致性导出方式;MySQL 用 mysqldump。数据库要单独多留几个日期。
Q7:备份存哪里比较合适?
优先选与机器不同商家的对象存储,并且开启版本管理。判定标准只有一个:机器被回收、账号被封之后,你还能不能从别的地方把数据取回来。另一个容易被忽视的细节是生命周期策略——对象存储的存储成本会随版本数增长,给旧版本设置一个保留期限,才能让备份长期跑下去而不至于某天因为账单停掉。
Q8:迁移后要留多久观察窗口?
建议 3 到 7 天。观察窗口内旧机保持可启动状态,随时能回滚;确认稳定后再关闭自动续费并释放资源。急着省钱先关旧机,往往省下的是最小的一笔,赔上的是可控性。如果架构里同时有中转机和落地机,两台机器的观察窗口要分别计算——它们的切换时点不同,回滚点也不同。
九、把这件事变成固定习惯
自建节点的可靠性,往往不取决于你用了多新的协议,而取决于两件很朴素的事:配置是不是声明式的、备份是不是离机的。前者决定你能不能在一台空机器上十分钟内重建服务,后者决定你在商家出事的那天有没有退路。
一个可以照着执行的最小闭环是:把配置与脚本放进私有仓库并加密敏感值;每天定时导出面板数据库并推到异地的加密存储;每季度做一次恢复演练;每换一次机器就顺手更新参数表。这四件事加起来每周花不到十分钟,却能把"自建节点"最大的隐性成本——不确定性和一次性事故——压到最低。
推荐阅读
- X-UI 面板完全指南:多用户、订阅与流量统计都在面板里,面板数据库正是备份清单中的关键一项。
- 自建节点 CDN 中转与隐藏源站:服务端藏在 CDN 后面时,迁移步骤会多几步,先看懂源站与证书的关系再动手。
- 自建中转加速完全指南:中转机和落地机是两台机器,迁移时要分别备份、分别切换。