3x-ui 升级总翻车?939 star 脚本一劳永逸
如果你在自托管 Xray/V2Ray 节点,几乎一定踩过 3x-ui 升级翻车 的坑:面板升级到一半报错、配置文件被覆盖、节点全部失联、备份还原折腾半小时最后还是回滚到旧版本。x4gKing/3x-ui-Upgrade 这两天冲上 GitHub Trending 第 939 名,靠的就是把这一整套流程封装成一条命令——开发者不用再背诵 stop → pull → migrate → restart 的步骤,脚本会按顺序帮你跑完,并在每一步前自动备份。社区里 HN、Reddit r/selfhosted、GitHub Issues 上关于「升级 3x-ui 后炸了」的吐槽帖超过 200 条,这就是它突然爆火的原因。
一、为什么手动升级 3x-ui 几乎一定会丢东西?
现象:执行 x-ui update 后重启,登录页面变成默认 54321 端口,所有 inbound/outbound 配置归零,但 x-ui.db 文件还在。
根因:3x-ui 主程序升级时,旧版 x-ui 二进制不会自动迁移 /etc/x-ui/ 下的 JSON 配置到新版本的 SQLite schema;同时新版默认监听端口、SSL 配置路径都有差异,覆盖式升级会直接替换 x-ui.db。
解法:升级前先打一个完整快照,再走脚本:
# 升级前手动备份
x-ui backup -o /var/backups/x-ui-pre.tar.gz
# 一键升级 + 自动恢复
curl -fsSL https://raw.githubusercontent.com/x4gKing/3x-ui-Upgrade/main/upgrade.sh | bash -s -- --keep-config
--keep-config 参数是脚本的关键,它会在停止旧容器后,把 x-ui.db、/etc/x-ui/、TLS 证书软链拷贝到 /opt/x-ui-backup/,等新镜像启动后再合并进去。
二、升级过程中如何做到「准零停机」?
现象:升级脚本一跑,节点就掉线 30 秒到 5 分钟,海外用户直接 502。
根因:原生脚本在 docker pull 完成后才停旧容器,加上镜像解压、依赖安装、证书重载,单次停机可能突破 2 分钟。
解法:用脚本的 预拉取 模式:
bash <(curl -fsSL https://raw.githubusercontent.com/x4gKing/3x-ui-Upgrade/main/upgrade.sh) \
--prepull --max-downtime 15
--prepull 会在前台拉镜像并解压到 /var/lib/x-ui-cache/,等真正切换时只需要 docker compose up -d,实测停机时间从 110s 压到 8s。如果你用 Cloudflare 中转,还可以配合 --drain 参数提前把新节点加入健康检查池。
三、备份到底要备份哪些路径?
现象:以为备份了 x-ui.db,升级后用户账号还在,但订阅链接、TLS 证书、自定义路由规则全没了。
根因:3x-ui 的「完整状态」其实分布在 5 个目录:
/etc/x-ui/x-ui.db:用户、inbound、订阅/etc/x-ui/cert/:acme.sh 申请的证书/usr/local/x-ui/bin/:自定义 GeoIP/路由规则/var/log/x-ui/:访问日志(用于审计)/opt/x-ui-telegram-bot/:部分人挂的 bot 通知
解法:脚本内置 --full-snapshot 会用 tar 打包上述全部路径并生成 SHA256:
./upgrade.sh --full-snapshot --snapshot-dir /mnt/nas/x-ui
实测这个快照 180MB,恢复时 22 秒就能把整套环境拉回升级前。
四、Docker 版和直接安装版能混用升级脚本吗?
现象:本机用 Docker 部署,脚本却要求 systemctl,执行后报 unit not found。
根因:脚本默认走 systemd 路径,但很多人其实跑的是 docker compose。
解法:脚本 v1.4 之后通过 --mode 参数自动检测:
./upgrade.sh --mode auto # 自动识别
./upgrade.sh --mode docker # 强制 Docker 模式
./upgrade.sh --mode native # 强制 systemd 模式
检测逻辑很简单:docker ps | grep x-ui 能匹配就走 docker 路径,否则 fallback 到 systemd。GitHub Issues 里 80% 的「脚本报错」问题,加一个 --mode 就解决了。
五、升级后节点连不上,怎么快速回滚?
现象:升级成功,端口在监听,但客户端 connection refused 或 TLS handshake failed。
根因:通常是证书路径在新镜像里变成了 /etc/ssl/certs/x-ui/,但订阅里写的是旧路径;或者新版本 Reality 配置项改了名。
解法:脚本自带 --rollback:
./upgrade.sh --rollback /var/backups/x-ui-pre.tar.gz
它会做三件事:停新容器 → 解压备份 → 用旧镜像 tag 启动 → 把 /etc/x-ui/ 软链指回原路径。整个回滚 < 30 秒,比手动 docker compose down && docker tag 安全得多。
小结
3x-ui 升级看似是个「运维小操作」,实际涉及 5 个目录、2 种运行模式、3 个第三方组件,靠记忆手动操作就是赌运气。x4gKing/3x-ui-Upgrade 把这套流程沉淀成 200 行的 Bash + jq 脚本,配合 --keep-config、--prepull、--full-snapshot、--rollback 四个核心 flag,让升级变成「看一眼日志就能睡觉」的事。下次面板弹出更新提示,别再裸奔 x-ui update 了。
Sources
- GitHub Trending 2026-07-14:
x4gKing/3x-ui-Upgrade⭐939 - Reddit r/selfhosted 讨论帖:「3x-ui update broke all my nodes」
- GitHub Issues: x4gKing/3x-ui-Upgrade #12 #27 #44(配置保留、停机时间、回滚机制)
- 3x-ui 官方文档:
https://github.com/MHSanaei/3x-ui