Skip to content
VDS · 备份与磁盘

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 的数据可能会内存不足——请限制并行度,或将重量级备份迁移到更高一档。磁盘负载也很明显,因此请安排在夜间执行:参见磁盘速度。

常见错误

  • 密码只保存在被备份的机器上。 经典场景:机器丢失,备份的密钥也随之丢失。
  • forget 不加 --prune。 空间不会释放,仓库会持续增长。
  • 备份放在同一磁盘的同一目录下。 您将无处可恢复——参见异地备份。
  • 未排除缓存和 /var/lib/docker。 备份体积会毫无意义地膨胀四倍;需要包含的内容清单见文章备份什么。
  • 并行运行。 第二次运行会触发仓库锁。请用 flock 包裹调用。