跳到正文

备份与恢复

备份就是整个 config/ 目录打成一个 .tar.gz。把它在一台新机器上还原,再跑一遍安装器,这台设备就回来了。

备份里只有 config/,没有共享里的文件,没有仓库,没有容器卷,也没有数据集,想备份数据的同学请到数据所在的那台机器上想办法。存档本身不加密,里面的凭据由保险库主口令封存,config/ 的其余部分谁拿到文件谁就能看。恢复会覆盖 config/ 下的每一个文件,并让面板重启。换口令不会追到已经下载好的存档上,旧存档认的还是旧口令。没有迁移这回事,版本换了 config/ 的形状可以变,跨版本的存档不一定应用得上。

备份里有什么

  • 整个 config/,一个普通的 .tar.gz,没有别的。
  • 存档第一个成员是 neutrino_backup.json,说明这是什么;第二个是 SHA256SUMS,列出后面每个成员的摘要;再往后是 config/ 这棵树。
  • 保险库文件在里面的 credentials/vault.json
  • 存档能明文传输,是因为 config/ 里没有未封存的秘密:保险库的数据密钥只以主口令包住的形式存在。
  • 上传恢复的文件最大 32 MiB。
备份里没有的它在哪
Samba 共享里的文件提供共享的那台机器上的磁盘
Gitea 仓库那台机器上 Gitea 自己的数据目录
容器卷跑 podman 的那台机器
ZFS 数据集存储池里
/etc/neutrino/agent每台机器上的被控端包

下载

1. 打开「设置」页,找到「配置存档」。

预期:说明是「包含整个 config/ 目录。里面的凭据以保险库主口令封存,恢复时会要求输入。」

2. 点「下载备份」。

预期:浏览器下载目录里多一个 .tar.gz,页面上写「备份已下载。」

设置页的配置存档

TIP

存档是明文的。里面的内容能读,凭据是封存的。同时拿到存档和口令的人,就等于拿到了那些凭据。

保管好口令

保险库主口令是初始化第二屏里填的那一句,和面板密码是两回事。

1. 要换口令时,在中枢那台机器上跑。

bash
sudo nhub vault rekey

预期:它问一遍新口令,然后打印 rekeyed,说明保险库现在用新口令打开。换口令只是把数据密钥重新用新口令包一次,已经封存的东西不会重新加密,数据密钥本身也没变。

2. 脚本里不想交互时用这一条。

bash
printf '%s' "$NEW_PASSPHRASE" | sudo nhub vault rekey --stdin

预期:没有任何提示,直接换好。

DANGER

换口令之前下载的存档,只认口令。

旧存档还没清掉之前,两个口令都要留着。

恢复

1. 在设置页点「从文件恢复」,选中存档。

预期:弹出「恢复 {name}」,正文是「config/ 下的每个文件都会被存档里的覆盖,配置随即应用,面板自行重启。」,下面有「保险库主口令」一栏。

设置页的恢复

2. 填这份存档所属那台机器的主口令,点「恢复」。

预期:先是恢复中,再是「正在应用恢复的配置,重服务重新渲染时这可能要几分钟。」,最后是「面板正在重启,本页会自行刷新。请用恢复后的密码登录。」

被拒绝什么意思
备份是 .tar.gz 文件,这个文件不是后缀不对
这不是 Neutrino 的备份没有那个说明成员
backup_corruptSHA256SUMS 里有摘要对不上
vault_passphrase_neededvault_passphrase_wrong存档里的保险库用你填的口令打不开
backup_too_large超过 32 MiB

WARNING

文件已经覆盖好了,应用那一步仍然可能失败,面板会把原因打在上面。

文件既然在了,就照它说的做:在终端里跑 sudo nhub apply,修掉原因再跑一次。面板自己没回来时也一样,跑完再刷新页面。

恢复之后

bash
# 1. 每个模块还渲染得出来吗。应该没有报错,也没有差异。
sudo nhub apply --dry-run

# 2. 服务起来了吗。应该看到面板正在运行。
systemctl status neutrino_hub_web
  • 面板密码是恢复出来的那个,不是这台机器原来那个。
  • 保险库口令是这份存档被取走时的那个,直到你再换一次。
  • 被控端会自己连回来;hub 身份变了的那些会被要求重新加入,它们那边的说法是 hub 的身份变了,被重置或者重装过。

Neutrino · 个人开发基础设施