Restic 实战:用命令行打造加密增量备份

数据丢失往往发生在最不经意的时候——一次误删、一块坏盘、一次勒索攻击,都可能让数月的劳动瞬间归零。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 足够简单到让你没有借口不去备份。

上一篇 TIME_WAIT 过多排查实战:从端口耗尽到连接复用优化
下一篇 CosyVoice 实战:本地语音合成 TTS 服务部署
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]