NAS上线之后便部署了 Immich 来保存照片1。自托管虽然空间够用,但数据安全却需要自行保障。为此,我参考3-2-1原则制定了数据备份方案,今天分享给大家。
💡Tip备份3-2-1原则为即为3个副本、2个不同备份介质、1个异地灾备中心。即,数据保留3份,备份在2个不同备份介质中,同时还有至少1个异地容灾数据中心。
我在 NAS 设备一文2中已经讲过,因为存储价格高企,只买了两块4T的硬盘。如果做 RAID,最大容量只有4T,很不划算。但为了数据安全又不得不备份数据。这可如何是好呢?
我想的方案是在应用导致备份数据。简单来说就是通过工具自动备份照片等核数据。比如我的两块硬盘 A 和 B,Immich 数据指定保存到 A 上,然后再通过工具定时将数据同步到 B 上,这就实现了最基本的数据备份。只要不是两块硬盘同时坏,数据就不会丢。
因为两块硬盘在同一设备上,备份工具有多种先择。最简单也最常用的就是 rsync,可以实现增量备份。下面指令就能完成备份:
rsync -avP /a/immich /b/backup首次执行会复制全部数据,后续再执行只会复制新增的数据,非常高效。
但我却不建议在这种情形下使用 rsync,因为它缺少一种核心特性——数据快照!
数据快照可以解决为数据版本。将磁盘上的照片和视频数据看成一个整体,每天都会增删。我希望可以把每天的数据状态用快照来固定下来。如果今天不小心删除了某些文件,就可以回滚到昨天的版本。
自己误删除的场景问题还不大,最危险的是设备被黑客控制,它们可能将所有数据都加密,然后勒索赎金。如果不用快照而是直接用 rsync,那么家时备份工具可能会用加密后数据来覆盖正常的数据,从而丧失保护作用。而用了快照就不同了,它只能影响最新的快照,而无法破坏已经备份的版本。
带数据快照的备份工具也有很多,我这里用的是 BorgBackup,它支持快照、加密、压缩等功能。
在使用之前需要先创建备份仓库:
borg init --encryption=none $BACKUP_PATH/immich我这里禁用了加密功能。首先,我是自己的设备,不需要加密数据;其次,加密数据会额外消耗算力,耗电不说,还会增加备份时长。所以我就禁用了。如果大家需要将数据备份到三方的服务器,那确实应该开启加密。这部分可以自己用 AI 查询。
创建仓库之后就可以备份数据了。备份数据需要指定快照名字:
borg create --stats "$BACKUP_PATH/immich::{now}" $UPLOAD_LOCATION \
--exclude $UPLOAD_LOCATION/thumbs/ \
--exclude $UPLOAD_LOCATION/encoded-video/这里后面的::{now}表示用当前时间做版本号。这里我还用--exclude跳过一些临时目录,里面的内容可以通过 Immich 生成,没有必要占用宝贵的磁盘空间。
数据备份之后可以通过list子命令查看快照:
borg list immich/
2025-12-31T04:00:04 Wed, 2025-12-31 04:00:05 [700665f3312ee979...]
2026-01-31T04:00:04 Sat, 2026-01-31 04:00:05 [91eac62238eec0aa...]
2026-02-28T04:00:04 Sat, 2026-02-28 04:00:04 [b3e87ce3b3e63c95...]
2026-03-01T04:00:04 Sun, 2026-03-01 04:00:04 [727e7272739f5f01...]
2026-03-08T04:00:04 Sun, 2026-03-08 04:00:04 [c52dfd6f81447c18...]
2026-03-15T04:00:04 Sun, 2026-03-15 04:00:04 [7ce6672c22950384...]
2026-03-16T04:00:04 Mon, 2026-03-16 04:00:04 [1be999423649aa5f...]注意第一列就是前面说的版本号。备份之后我们就可以查看或者提取相关数据:
# 查看快照文件目录
borg list $BACKUP_PATH/immich::2026-03-16T04:00:04
# 提取快照内容到当前目录
borg extract $BACKUP_PATH/immich::2026-03-16T04:00:04
# 删除快照
borg delete $BACKUP_PATH/immich::2026-03-16T04:00:04每天生成快照会占用大量磁盘空间,我们可以制定清理策略。比如最近7天每天保留一个快照,最近4周每周保留一个快照,最近3个月每月保留一个快照,可以执行如下命令:
borg prune \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=3 \
$BACKUP_PATH/immichborg 会自动删除过期的快照。但删除后不会清理数据,为此还需要执行:
borg compact $BACKUP_PATH/immich好了,到现在我们就完成了最基本的数据备份。要满足3-2-1原则,我们还得再做一次异地备份。通常大家会将备份数据上传到网盘。但我家情况特别,有两个小院,而且已经通过 10G 光纤打通3,所以我就把异地备份数据放到另一个小院了。
另一个小院因为不住人,只放了一台 GL-iNet A1300 迷你路由器。好在我还有一块2T闪迪固态移动硬盘,就用它们保存数据了。这台路由器上刷了 OpenWRT 系统,接入移动硬盘还需要额外安装软件包4。
然后就用 rsync 来同步数据就行了:
rsync -avzP --delete /data2/backup root@a13.lan:/mnt/sda1A1300 性能较差,而 rsync 走 ssh 又需要加密,所以首次全量同步性能较差,只有 10MB/s,白瞎了我 10Gbps 的网络🤦♂️好在后续只会同步增量数据,问题不大。数据无价,先确保安全,再想办法提升性能。
💡Tip还有细节需要提一下,备份数据使用 root 账号,运行 Immich 使用普通账号。这样即便 Immich 服务被黑客攻破,它也很难获得 root 权限来操作备份数据。
以上就是我的3-2-1备份方案。在保障数据安全的前提一下,尽量复用已有设备,减少浪费,算是一种比较经济的方案。但这套方案还不够完善。虽然异地备份可以抵抗火灾这类的问题,但两个小院毕竟在一个村里,如果有洪水或地震,可能也会完全丢失数据,后续还是有必要在云端备份数据。
来一张 nano-banana-pro 根据本文内容生成的总结图片😂
有兴趣可以看我家的网络拓扑 ./network.html↩︎
请参考官方文档 https://openwrt.org/docs/guide-user/storage/usb-drives↩︎





























