Blog
restic 实践 3-2-1:备份到本机与异地
备份话题人人点头,真出事才发现脚本没跑、密码忘了、或从来没恢复过。工具争论(restic 还是 Borg 还是其它)噪声很大,真正决定能否回家的是策略是否完整、密钥是否可取回、以及你有没有在平静日子里演练过恢复。我见过仓库里快照整齐、当事人却找不到密码纸的情况——那不是工具失败,是哲学缺了「人还能打开」这一环。我把 3-2-1 当作哲学约束,把 restic 当作实现手段;先讲约束,再落命令。
3-2-1 不是口号,是三条可检验命题
- 3 份副本:在线数据、本地备份、异地各至少一份,丢一份不致命
- 2 种介质:例如 NAS 盘与云对象存储,避免同一种故障域
- 1 份异地:火灾、盗窃、整机房断电进水时仍够不着的那一份
映射到我家:业务盘上的在线数据;USB/备用盘或二级 NAS 上的 restic 本地仓库;Backblaze B2 或其它 S3 兼容上的异地仓库。restic 负责加密与去重,让两份仓库不至于以「原始文件翻倍」的方式吃满容量。密钥文件权限 600,另外打印或写在离线介质密封存放——密钥与仓库一同消失时,加密备份等于精致的随机数。
可检验的意思是:你能指着目录与 bucket 说出三份分别在哪,而不是「云上也有」的模糊自信。
哲学落地前的取舍:备份什么,故意不备什么
备份的是「丢了会哭、重建成本高于存储成本」的东西:/opt/stack 一类 compose 与配置、数据库逻辑 dump 目录、重要 library、用户 home 里的 .ssh 与笔记。故意不备:缓存、容器镜像层、可再下载的 ISO、能从 git 重新 clone 且无本地未推送改动的工作树。把「能再下载」写进 exclude 清单时要诚实:若离线环境或上游消失,ISO 就不再是可再得资产。
媒体库若以 TB 计,单独策略与频率,避免和每天变更的配置挤在同一组 forget 参数里。数据库优先「先 dump 再进 restic」,减少直接拷数据目录的一致性争议。同一哲学下,密码库导出、证书私钥、隧道凭证应进加密备份,但权限与存放位置要比普通文档更严,不能因为「反正 restic 已加密」就散落在世界可读目录。
初始化两套仓库
export RESTIC_PASSWORD_FILE=/root/.restic-pass
chmod 600 /root/.restic-pass
export RESTIC_REPOSITORY=/mnt/backup/restic-lab
restic init
export RESTIC_REPOSITORY=s3:https://s3.example.com/bucket/lab
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
restic init
本地与异地可以是两个 repository,也可以本地完成后 restic copy 到远端。我倾向关键路径两边都 backup,结构对称,排障时少一层「copy 是否跑完」的状态机。环境变量放在 root 可读的 env 文件里,由 systemd 服务 EnvironmentFile= 加载,避免写进世界可读的 cron 行。
定时、标签与保留:让时间轴可读
restic backup /opt/stack /var/backups/db \
--tag daily --exclude-file=/etc/restic/excludes.txt
restic forget --prune \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6
forget 不带 --prune 时只摘引用,真正空间回收要 prune;生产脚本里二者顺序与是否同一次跑,按你可接受的锁定期决定。标签方便按业务筛选快照。失败必须通知——静默失败是备份的癌症;exit code 非零就该进邮件或手机通道。
专用系统用户跑备份、对业务数据只读,是权限上的最小礼貌。云上若支持对象锁定,打开以对抗「密钥被勒索软件滥用后删备份」。成本上 B2 一类对家庭通常可接受,贵的是恢复时的出口流量——大库恢复地点要想清楚。
没有演练就不叫备份
每季度固定半天:
restic snapshots
restic restore latest --target /tmp/restore-test --include /opt/stack
# 抽查 hash 或直接 docker compose 在空目录试拉起
记录耗时、缺了哪些密钥、DNS 与防火墙是否挡了 S3。只证明 backup 退出码为 0 不够,你要证明「从零能回来」。演练发现的问题常见是:密码文件只在已加密家目录、异地密钥轮换后旧 timer 未更新、exclude 过大导致其实没备到库。
补充一条常被忽略的操作纪律:改 exclude 规则、轮换密码或迁移仓库路径后,主动跑一次短备份并 restic check,确认仓库索引仍健康。异地仓库若长时间只有 forget 没有新 backup,要警惕 timer 是否指错了 RESTIC_REPOSITORY。多机备份进同一仓库时,主机名与路径标签要规划好,否则 snapshots 列表会变成考古现场。
restic 文档优秀,命令稳定。把它嵌进可检验的 3-2-1 和日历上的恢复演练,比参与「哪个工具圣战」有用得多。哲学给出边界,命令填满边界;两者缺一,磁盘上那堆加密块就还只是安慰剂。