Restic:带加密与历史的备份
如何设置端到端加密、去重和按日期快照的备份、将其自动化,并验证完整性。
更新于 2026年8月23日
Restic 解决了 rsync 无法解决的问题:它在发送前加密数据、保留快照历史、不会重复复制相同的数据块,还能将备份存储到兼容 S3 的对象存储中。一个程序,无需任何依赖。
安装与第一个仓库
sudo apt install -y restic
restic version
仓库是存放备份的地方。它可以是本地目录、通过 SFTP 连接的远程机器,或对象存储:
export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
head -c 32 /dev/urandom | base64 > /root/.restic-pass
chmod 600 /root/.restic-pass
restic init
仓库密码无法找回。一旦忘记,数据就彻底丢失——按设计这里不存在任何找回途径。请将密码与机器分开保存:放在密码管理器中、写在纸上,任何地方都行——但不要只存在您正在备份的那台机器的
/root/.restic-pass文件里。
创建备份
restic backup /var/www /etc/nginx /opt/myapp \
--exclude-file=/root/restic-exclude.txt \
--tag daily
restic snapshots
restic ls latest
restic stats
第二次及之后的运行会很快:只传输新增的数据块。
恢复
restic restore latest --target /restore
restic restore <snapshot-id> --target /restore --include /var/www/uploads
更方便的做法是不解包全部内容,直接查看:
mkdir /mnt/snapshots
restic mount /mnt/snapshots
该目录会按日期将所有快照显示为普通文件夹。这是找回单个误删文件的最佳方式。
定时与清理
/usr/local/bin/backup.sh 脚本:
#!/bin/bash
set -euo pipefail
export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
docker compose -f /opt/myapp/compose.yaml exec -T db \
pg_dump -U postgres app | gzip > /var/backups/db.sql.gz
restic backup /var/www /etc/nginx /opt/myapp /var/backups --tag daily
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
chmod 700 /usr/local/bin/backup.sh
接下来是 systemd 定时器,参见定时任务。forget --prune 会删除多余的快照并释放空间;不加 --prune 时,快照会从列表中消失,但数据仍然保留。
完整性检查
restic check
restic check --read-data-subset=5%
第一条命令检查结构,第二条命令读取部分数据并校验校验和。每月运行一次第二条命令:它会占用磁盘和带宽,但正是它能发现静默损坏。
结构检查不能替代真正的恢复——参见恢复演练。
资源占用
Restic 会在内存中维护索引:在大型数据集上会占用数百兆字节。在 2 GB 内存的 VDS-1 上,备份数十 GB 的数据可能会内存不足——请限制并行度,或将重量级备份迁移到更高一档。磁盘负载也很明显,因此请安排在夜间执行:参见磁盘速度。