备份覆盖
原则只有一条:任何一份数据,至少存在两台物理设备上,其中一台不在家里。下表是机架上每项服务的落地目录、备份节奏与第二副本位置——没有写「已备份」的,就是还没做。
| 服务 | 数据目录 | 备份方案 | 内存 |
|---|---|---|---|
| Gitea | /srv/homelab/gitea/data | gitea dump 会生成一个包含数据库、仓库、配置和附件的完整归档。每周跑一次,每次升级前再跑一次,归档拷到 NAS。仓库在每台推送过的笔记本上本来就有一份,除了 issue 之外这也算一份真实的第二副本。 | 320 MB |
| Grafana | /srv/homelab/grafana/data | 数据卷里的 SQLite 数据库存着所有仪表盘、用户和数据源,每晚导出一次。仪表盘本身在每次改动后还会导出成 JSON 放进 git,因为一个没法 diff 的仪表盘,就是一个没人会复核的仪表盘。 | 260 MB |
| Immich | /srv/homelab/immich/library | 媒体库就是一棵结构可读的普通目录,每晚用 rsync 同步到 NAS,再由 NAS 负责异地备份。数据库要单独用 pg_dump 导出——没有它,相册、人脸、以及文件与日期之间的对应关系都会丢失,媒体库就退化成一堆命名正确但毫无组织的文件。 | 1300 MB |
| WireGuard (wg-easy) | /srv/homelab/wg-easy/data | 数据目录里存着服务端密钥对和所有客户端配置,所以每次改动后都复制一次,并导出成压缩包放进密码管理器。丢了它意味着每台手机和笔记本都要重发一份配置——二十分钟的活,而你绝对不想在旅途中干这件事。 | 40 MB |
| Nextcloud | /srv/homelab/nextcloud/html | 三部分,缺一不可:每晚用 mysqldump 导出数据库、备份含 config.php 与 apps 的配置目录、以及数据目录。恢复时必须把匹配的数据库和匹配的配置一起放回去,因为实例 id 和密钥都在 config.php 里,配错的一对会让所有客户端掉线并报服务端错误。 | 1100 MB |
| Uptime Kuma | /srv/homelab/uptime-kuma/data | kuma.db 这个 SQLite 文件在容器运行时用 sqlite3 .backup 每晚导出一次,再拷到 NAS。直接复制正在使用的 SQLite 文件可能拿到撕裂的副本;.backup 命令才是安全的做法,这个体量下耗时不到一秒。 | 180 MB |
| Jellyfin | /srv/homelab/jellyfin/config | 配置目录每晚同步到 NAS;媒体库本身就在 NAS 上,由 NAS 那边负责备份——树莓派上没有任何不可替代的数据。唯一值得手工导出的是用户列表和观看进度,因为「继续观看」重新累积起来要靠好几周的观看量。 | 900 MB |
| Caddy | /srv/homelab/caddy/data | Caddyfile 放在 git 里,那才是真正的备份。/srv/homelab/caddy/data 存着 ACME 账户密钥和已签发的证书,每周复制一次;丢了它只是每个域名重新签发一次,不会造成中断。 | 45 MB |
| Pi-hole | /srv/homelab/pihole/etc-pihole | 每晚 03:10 用 rclone 把整个 /etc/pihole 目录同步到 NAS 的 SMB 共享,保留 14 份每日快照;每次重建广告列表后再单独留一份 gravity.db。树莓派坏掉时,把该目录恢复到新卡上,拦截列表、本地 DNS 记录和客户端分组都会跟着回来,不必重跑安装脚本。 | 240 MB |
不备份的东西
- 镜像本身:重新 pull 比备份快,且镜像层是可重建的
- 日志目录:docker logs 只保留最近一周,历史值不高
- 缩略图与转码缓存:Immich、Jellyfin 都能重建,只是费时间
- Prometheus 原始样本:只备份告警规则与 Grafana 面板 JSON