一份可以恢复的备份,决定了你是白忙一个下午,还是丢掉整个项目。基础 VPS 备份指南介绍了基本思路。本文更进一步,使用 restic 和 BorgBackup:这两个工具可以把加密、去重的备份存到第二台服务器或对象存储。
为什么用 restic 或 borg 而不是直接复制
- 去重。只存储更改过的数据,因此每日快照保持很小。
- 加密。数据在离开你的服务器之前就已加密。
- 快照。你可以恢复到过去任意一天的状态。
- 验证。两个工具都可以检查仓库完整性。
二选一即可。Restic 简单,支持多种存储类型,包括 SFTP 和兼容 S3 的存储。Borg 非常高效,通过 SSH 连接到已安装 borg 的服务器。
把备份发送到哪里
永远不要把唯一的备份存放在同一台服务器上。使用另一个位置的第二台 VPS、兼容 S3 的存储桶或存储盒。配大磁盘的小型 VPS 是便宜的备份目标。请参阅 VPS 套餐。
Restic:设置
sudo apt install -y restic
export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic/myserver"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic init
用一个很长的随机密码创建密码文件,并离线保存一份副本。没有这个密码,备份就无法恢复。
restic backup /etc /home /var/www --exclude-caches
restic snapshots
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic check
Borg:设置
sudo apt install -y borgbackup
export BORG_REPO="ssh://backup@backup.example.com/srv/borg/myserver"
borg init --encryption=repokey-blake2
borg create --stats --compression zstd ::'{hostname}-{now:%Y-%m-%d}' /etc /home /var/www
borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 6
borg check
用 borg key export 导出并保存仓库密钥。
数据库需要特别处理
不要复制正在运行的数据库文件。先转储,再备份转储文件:
mysqldump --single-transaction --all-databases | gzip > /var/backups/db.sql.gz
sudo -u postgres pg_dumpall | gzip > /var/backups/pg.sql.gz
安排计划任务
通过 systemd 定时器或 cron 运行备份。一条简单的 cron 行:
15 3 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
失败时给自己发出告警,例如在脚本末尾加一个监控 ping。
测试恢复
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls /tmp/restore-test
不时在备用机器上测试一次真实的恢复。从未测试过的备份只是一种希望。