Skip to content

备份与恢复

Zeno 的有效备份必须同时包含运行配置、SQLite 数据和文件型 secrets。只备份数据库、只复制镜像或只保存 .env 都不能保证可恢复。

最小备份范围

text
/opt/zeno/.zeno-installation
/opt/zeno/.env
/opt/zeno/docker-compose.yml
/opt/zeno/data/
/opt/zeno/secrets/

.zeno-installation 是安装目录身份标记;恢复时不要把它复制到无关目录。

安装器自动备份

重复运行官方安装器升级时,会先做路径、磁盘和镜像预检,再短暂停止 Controller,创建完整离线备份:

text
/opt/zeno/backups/install-YYYYmmdd-HHMMSS-PID/

备份带完成标记和 SHA-256 manifest,默认保留最近 5 份。安装器会检查备份数据库和当前数据库,启动后等待 /ready,失败时自动恢复旧镜像和完整快照。

自动备份不能替代异机备份;Controller 主机磁盘损坏时,同机备份会一起丢失。

手工离线备份

下面的示例会短暂停服,以获得 SQLite、通知 keyring 和配置一致的快照:

bash
sudo sh -eu -c '
  cd /opt/zeno
  docker compose stop zeno
  trap "docker compose start zeno" EXIT
  dst="/var/backups/zeno/$(date -u +%Y%m%dT%H%M%SZ)"
  install -d -m 0700 "$dst"
  cp -a -- .zeno-installation .env docker-compose.yml data secrets "$dst/"
  (cd "$dst" && find . -type f -print0 | sort -z | xargs -0 sha256sum > MANIFEST.sha256)
'

备份后验证:

bash
cd /var/backups/zeno/<backup-directory>
sha256sum -c MANIFEST.sha256
curl -fsS http://127.0.0.1:18980/ready

再把完整目录复制到另一台受控主机或对象存储。异机副本需要加密、限制访问并保留恢复所需的权限信息。

恢复前检查

  1. 确认备份来自目标 Zeno 实例和正确时间点。
  2. 验证 MANIFEST.sha256
  3. 确认 .env、Compose、data/secrets/ 来自同一快照。
  4. 记录当前运行镜像和失败现场。
  5. 停止 Controller;禁止覆盖在线 SQLite。
  6. 准备独立回滚目录,避免恢复失败后无路可退。

恢复流程

  1. 停止 Controller。
  2. 把当前 /opt/zeno 另存为失败现场。
  3. 恢复同一备份中的安装标记、.env、Compose、data/secrets/
  4. 恢复权限:
bash
cd /opt/zeno
chown -R 10001:10001 data
find data -type d -exec chmod 700 {} +
find data -type f \( -name '*.db' -o -name '*.db-wal' -o -name '*.db-shm' -o -name '*-wal' -o -name '*-shm' \) -exec chmod 600 {} +
chown -R 0:10001 secrets
find secrets -type d -exec chmod 750 {} +
find secrets -type f -exec chmod 640 {} +
  1. 使用备份记录的不可变镜像 reference 启动。
  2. 验证:
bash
curl -fsS http://127.0.0.1:18980/health
curl -fsS http://127.0.0.1:18980/ready
curl -fsS http://127.0.0.1:18980/api/public/v1/summary
  1. 登录后台,核对服务器、设置、延迟目标、通知渠道和最近数据。
  2. 确认 Agent 恢复上报,通知凭据可解密且测试通知能送达。

不要拆分恢复

不要把一个时间点的数据库与另一个时间点的 secrets/.env 或 Compose 混合。通知 keyring/authority 与数据库状态不一致时,可能导致凭据不可用或错误路由。

恢复验收

只有以下项目全部成立,恢复才算完成:

  • manifest 通过;
  • 文件属主和模式正确;
  • 容器运行固定的目标镜像;
  • /health/ready 和 Public API 正常;
  • SQLite 可读,页面数据与快照时间相符;
  • Agent 重新上报;
  • Admin 登录和通知测试正常;
  • 失败现场与恢复前副本仍保留,直到观察期结束。

升级专用流程和安装器自动回滚见 升级与回滚

基于 MIT License 发布