数据丢失往往发生在最不经意的时候——一次误删、一块坏盘、一次勒索攻击,都可能让数月的劳动瞬间归零。Restic 备份是一款用 Go 编写的开源工具,主打加密、去重、增量三大特性,能把手边任意目录变成安全可恢复的快照库。它跨平台、单文件二进制、不依赖数据库,既能备份到本地硬盘,也能直接落到 SFTP 服务器或 S3 兼容对象存储。本文从安装、初始化仓库,到定时备份与灾难恢复,用真实可执行的命令带你把 Restic 用熟、用稳。
一、为什么选择 Restic
市面上的备份方案很多,但 Restic 的几个设计让它特别适合个人开发者与小团队:一是端到端加密,数据在离开本机前就用 AES-256 加密,即使备份到不可信的云存储也不会泄露;二是内容去重,相同的数据块只存一次,第二次备份几乎只记录差异,仓库不会无限膨胀;三是增量快照,每次备份都是一个可独立恢复的快照,保留历史版本而不重复占用空间;四是多后端,本地、SFTP、S3、Azure、GCS、Rest 等开箱即用。相比之下,rsync 不加密、rclone crypt 不去重、Borg 主要走 SSH,Restic 在易用与安全之间取得了很好的平衡。
二、安装 Restic
Restic 提供单一静态二进制,安装极其简单。macOS 用 Homebrew,Linux 直接下载官方二进制即可,无需编译、没有运行时依赖。
# macOS
brew install restic
# Linux(官方静态二进制,版本号按需替换)
curl -L https://github.com/restic/restic/releases/download/v0.17.0/restic_0.17.0_linux_amd64.bz2 -o restic.bz2
bunzip2 restic.bz2 && chmod +x restic && sudo mv restic /usr/local/bin/
# 验证安装
restic version
三、初始化仓库(Repository)
Restic 把备份目标称为“仓库(repository)”。仓库的地址和密码通过环境变量告诉 Restic,初始化只需一条 restic init。下面给出三种最常见后端的配置方式。
# 1) 本地目录
export RESTIC_REPOSITORY=/backup/restic-repo
export RESTIC_PASSWORD='换成你的强密码'
restic init
# 2) SFTP(依赖 SSH,适合把备份放到远程服务器)
export RESTIC_REPOSITORY=sftp:backup@192.168.1.10:/home/backup/repo
restic init
# 3) 对象存储 S3(兼容 MinIO / 阿里云 OSS / 腾讯云 COS)
export RESTIC_REPOSITORY=s3:s3.amazonaws.com/bucket-name
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=yyy
restic init
仓库初始化后,里面除了加密的数据块,还会写入配置与密钥文件。请务必记住 RESTIC_PASSWORD——它不参与任何服务端保存,一旦丢失,备份数据将永远无法解密。建议用密码管理器单独备份,或在受控环境下用 RESTIC_PASSWORD_FILE / RESTIC_PASSWORD_COMMAND 读取,避免明文暴露。
四、执行首次备份
备份命令是 restic backup,后面跟要备份的路径,--tag 用于打标签方便后续筛选。Restic 会扫描文件、分块、去重后写入仓库,并在结束时打印新增数据量与快照 ID。
# 备份一个目录,并打标签
restic backup ~/Documents --tag docs
# 同时备份多个路径
restic backup ~/Documents ~/Pictures ~/Projects --tag daily
# 只备份改动部分:Restic 默认按内容去重,二次备份极快
restic backup ~/Projects --tag daily
五、快照管理与保留策略
每次备份都会生成一个快照(snapshot)。随着时间推移,快照会越来越多,需要一套保留策略来自动清理旧数据。restic forget 负责按规则标记删除,配合 --prune 才能真正回收仓库空间。
# 查看所有快照
restic snapshots
# 按标签查看
restic snapshots --tag docs
# 删除单个快照(被其他快照引用的数据块不会被删,安全)
restic forget 8d5a1c2b
# 保留策略 + 清理孤儿数据块
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --keep-yearly 1 --prune
| 粒度 | 参数 | 效果 |
|---|---|---|
| 每日 | –keep-daily 7 | 保留最近 7 天每天一个快照 |
| 每周 | –keep-weekly 4 | 每周保留一个,共 4 周 |
| 每月 | –keep-monthly 6 | 每月保留一个,共 6 个月 |
| 每年 | –keep-yearly 1 | 每年保留一个历史版本 |
六、数据恢复:restore 与 mount
备份的价值只有在能恢复时才成立。Restic 提供两种恢复方式:restore 直接把快照还原到目标目录;mount 把仓库挂载成只读文件系统,像浏览普通文件夹一样挑文件恢复,非常适合“只找回某一个被改错的文件”的场景。
# 从最新快照恢复到指定目录
restic restore latest --target /restore/docs
# 从指定快照、只恢复单个文件
restic restore 8d5a1c2b --target /restore --include /Projects/重要.docx
# 把快照挂载成只读文件系统浏览
restic mount /mnt/restic
七、自动化:cron 定时备份脚本
手动备份很难坚持,真正可靠的是把它写进定时任务。下面是一个可直接落地的备份脚本,先备份再按策略清理,最后用 restic check 校验仓库完整性。
#!/usr/bin/env bash
# /usr/local/bin/backup.sh
set -euo pipefail
export RESTIC_REPOSITORY=sftp:backup@192.168.1.10:/home/backup/repo
export RESTIC_PASSWORD_FILE=/etc/restic/pass
restic backup /etc /home /var/www --tag "$(date +%F)"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic check
# 每天 02:30 执行,并记录日志
30 2 * * * /usr/local/bin/backup.sh >> /var/log/restic.log 2>&1
如果备份目标是 Docker 容器里的数据卷,可以先参照 Docker 容器编排实战 定位宿主机挂载点再备份;脚本本身可以用 VS Code 远程开发 编辑并同步到服务器。若你希望把备份步骤写进交付流水线,也可以集成到 GitHub Actions 实战 的 CI 中,实现代码仓库的自动快照。远程 SFTP 备份依赖 SSH,遇到连接异常可参考 SSH 连接故障排查实战。
八、加密与密码管理要点
Restic 的加密是“零知识”的:密码只在本地用于派生密钥,服务端永远看不到明文。因此密码管理比任何命令都重要。推荐做法:用密码管理器保管 RESTIC_PASSWORD;生产环境改用 RESTIC_PASSWORD_COMMAND 从 secret manager 或 GPG 解密读取;不要把密码写进会提交到 Git 的脚本。另外,仓库的 key 文件决定了谁能解密,加入新机器时用同一密码 restic init 的等价方式(实际是 restic key add)添加密钥,而非重新初始化。
九、Restic 与常见方案对比
| 工具 | 加密 | 去重 | 增量 | 多后端 | 易用性 |
|---|---|---|---|---|---|
| Restic | ✅ 原生 | ✅ 内容去重 | ✅ | ✅ 本地/SFTP/S3… | 高 |
| Borg | ✅ | ✅ | ✅ | ❌ 主要走 SSH | 中 |
| rclone | ✅ crypt | ❌ | ⚠️ 同步 | ✅ 40+ 云 | 高 |
| rsync | ❌ | ❌ | ✅ | ❌ | 高 |
十、常见坑与排障
| 现象 | 原因 | 修复 |
|---|---|---|
| repository locked | 上次备份被中断 | restic unlock |
| 忘记密码 | 无密码无法解密 | 事前用密码管理器备份 |
| 仓库逐渐膨胀 | 未定期 prune | 定时 forget –prune |
| SFTP 备份慢 | 网络或 SSH 配置 | 参见 SSH 连接故障排障 |
十一、落地清单
- 安装 restic 并验证
restic version; - 选一个后端(本地/SFTP/S3)初始化仓库;
- 用
restic backup完成首次备份并记下快照 ID; - 配置
--keep-*保留策略,写进 cron 每天执行; - 定期做一次
restic restore演练,确认真的能恢复; - 把
RESTIC_PASSWORD存入密码管理器,绝不明文散落。
把上面六步跑通,你就拥有了一套加密、去重、可版本化、可自动化的备份体系。数据安全没有“银弹”,但 Restic 足够简单到让你没有借口不去备份。




