← [ BACK_TO_NOTES ]

备份、升级和恢复哪吒 Dashboard

建立哪吒 Dashboard 的一致性备份、升级前检查、恢复和迁移验证流程。

#howto #evergreen #ops #nezha #linux #server

备份、升级和恢复哪吒 Dashboard

[!info] related notes

目标与恢复点

备份必须能恢复 Dashboard 配置、SQLite 数据、用户与服务器记录,并让现有 Agent 使用原 UUID 重新上线。仅备份二进制文件没有价值。

备份对象

独立部署通常需要:

  • /opt/nezha/dashboard/data/:配置和 SQLite。
  • systemd unit:确认启动用户、WorkingDirectory 和环境变量。
  • Caddy/Nginx 配置和证书获取方式。
  • 自定义前端模板、通知配置和额外资源。
  • 当前 Dashboard 与 Agent 版本清单。

不要把密钥明文放进公开仓库。备份应限制访问并验证可恢复性;若归档没有客户端加密,应明确记录这个安全边界。

Oracle2 当前备份模型

2026-09-08 起,哪吒有两层备份:

层 1:本机变更前回滚快照

仍保留:

  • /opt/nezha/dashboard/data/config.yaml.bak-*:重大配置/UI 变更前保存的配置快照。
  • /opt/nezha/dashboard/data/sqlite.db.bak-*:删除服务器、增加监控、UI 调整等操作前保存的 SQLite 快照。
  • /opt/nezha/dashboard/theme-backups/20260908T042214Z/:切回 Dashboard 内置 Nazhua 前,对旧本地主题覆盖目录和配置做的归档。

它们解决的是“刚改坏了怎么快速回滚”。

层 2:Oracle2 共用 OneDrive 周备份

哪吒不单独创建自己的 timer,而是接入 Oracle2 统一的:

oracle2-agent-backup.timer
  ↓
personal-infrastructure/etc/server/oracle2/backup-to-onedrive.sh
  ↓
myonedrive:/ServerBackups/Oracle2

当前归档格式:

schema=oracle2-runtime-backup-v3
components=hermes,cpa,nezha-dashboard,sub-store

哪吒 payload 包含:

nezha/
├── config.yaml
├── sqlite.db
├── nezha-dashboard.service
└── dashboard-version.txt

其中 sqlite.db 不是在运行时直接 cp,而是使用 SQLite online backup:

sqlite3 /opt/nezha/dashboard/data/sqlite.db \
  ".backup '<staging>/nezha/sqlite.db'"

随后对副本执行:

PRAGMA integrity_check;

只有结果为 ok 才继续打包和上传。Caddy 配置同时由 Oracle2 的 CPA payload 保存,因此灾难恢复时哪吒 Web/gRPC 反向代理也有同一批次的异地副本。

[!important] 当前安全边界 Oracle2 周归档目前是普通 tar.gz,MANIFEST 标记为 protection=onedrive-access-control-only。config.yaml 含 secret,所以 OneDrive 账号访问控制、MFA 和 OAuth 应用安全属于备份安全边界;当前并非客户端加密备份。

2026-09-08 验收

新周备份已经真实上传并通过 restore-drill.sh:

oracle2-agent-20260908T044352Z.tar.gz

验证包含:外层 SHA-256、内层 SHA256SUMS、SQLite integrity_check = ok、恢复 payload 结构,以及备份结束后 nezha-dashboard.service = active。

实现位于 personal-infrastructure 提交:

d832727 feat(backup): include Nezha and Sub-Store in Oracle2 weekly backups

当前主题恢复边界

生产已回归 Dashboard 内置 Nazhua:

user_template: nazhua-dist

并且生产目录不再保留 /opt/nezha/dashboard/nazhua-dist/ 本地覆盖。旧主题二改只作为历史回滚材料保存在 theme-backups,不再属于长期生产恢复的必要对象。正常灾难恢复优先恢复 data/、systemd、Caddy 和版本信息,然后直接使用内置 Nazhua。

SQLite 一致性备份

短暂停机最简单可靠:

sudo systemctl stop nezha-dashboard
sudo tar -C /opt -czf /var/backups/nezha-$(date +%F).tar.gz nezha
sudo systemctl start nezha-dashboard

在线生产备份则优先使用 SQLite 自身备份命令,而不是在高写入时直接复制文件:

sudo sqlite3 /opt/nezha/dashboard/data/sqlite.db \
  '.backup /var/backups/nezha-sqlite.db'
sudo sqlite3 /var/backups/nezha-sqlite.db 'PRAGMA integrity_check;'

期望输出为 ok。Oracle2 周备份已经采用这一方案。

推荐的两层备份模型

层 1:本机变更前快照

用于几十秒内回滚最近一次错误操作:

/opt/nezha/dashboard/data/config.yaml.bak-<reason>-<timestamp>
/opt/nezha/dashboard/data/sqlite.db.bak-<reason>-<timestamp>
/opt/nezha/dashboard/theme-backups/<timestamp>/

命名应包含“为什么备份”,而不只是日期,例如 bak-add-network-monitors、bak-ui。

层 2:异地灾备

当前已由 Oracle2 周备份自动完成,包含:

  • config.yaml
  • SQLite 一致性副本
  • nezha-dashboard.service
  • Dashboard 版本信息
  • 同一归档中的 Caddy/CPA 状态
  • SHA-256 校验与恢复演练

应用二进制本身仍视为可重建对象:在全新主机恢复时,应先安装与备份记录匹配的 Dashboard 版本,再应用持久状态。旧本地 Nazhua fork 不属于当前生产恢复依赖。

升级前检查

  1. 记录当前版本与安装方式。
  2. 阅读目标版本发布说明。
  3. 确认最近一组 Oracle2 周备份和恢复演练成功;重大升级前可以额外触发一次手动 quick backup。
  4. 验证备份完整性和剩余远端空间。
  5. 确认 Caddy、Cloudflare gRPC 与 Agent 版本兼容路径没有变化。

[!warning] V0 与 V1 数据结构 官方文档说明 V0 与 V1 数据库结构不兼容,不能把普通目录复制当作跨大版本迁移方案。

恢复流程

全新主机上的推荐顺序:

  1. 安装与备份版本匹配的 Nezha Dashboard 二进制和 nezha 运行用户。
  2. 配置 Oracle2 恢复环境与 OneDrive rclone remote。
  3. 先运行 restore-from-onedrive.sh 不带 --apply,验证 archive、SHA、SQLite 和 manifest。
  4. 检查 MANIFEST.txt,确认 schema=oracle2-runtime-backup-v3 且含 nezha-dashboard。
  5. 明确批准后运行 restore-from-onedrive.sh --apply,脚本恢复 config.yaml、SQLite 和 systemd unit,并修正可用的文件所有权。
  6. 启动 Dashboard 并检查日志。
  7. 验证用户登录、服务器记录、服务监控和 Agent 重连。
sudo systemctl daemon-reload
sudo systemctl restart nezha-dashboard
sudo systemctl status nezha-dashboard --no-pager
sudo journalctl -u nezha-dashboard -e --no-pager

当前使用内置 Nazhua 时,不应为了恢复而重新创建旧的 /opt/nezha/dashboard/nazhua-dist/,除非是在明确执行历史回滚。

恢复验证

  • PRAGMA integrity_check 返回 ok。
  • 外层 .sha256 与内层 SHA256SUMS 都通过。
  • Dashboard 版本和数据库迁移成功。
  • Caddy gRPC 探测返回 application/grpc。
  • 原服务器 UUID 复用,没有批量生成新记录。
  • 通知、服务监控和权限边界符合预期。
  • 首页使用内置 Nazhua,核心 JS/CSS 返回正确 MIME。
  • 旧主机关闭后,新主机仍能独立工作。

资料来源

创建于 2026/7/20 更新于 2026/9/8
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本