VPS 可能出故障、被误删,或被一次糟糕的更新搞坏。唯一的保护就是经过测试的备份。本指南使用免费工具设置简单、自动化、加密的备份。
3-2-1 原则
保留 3 份数据副本,存放在 2 种不同类型的存储上,并且有 1 份副本放在完全不同的地方。对于 VPS,这通常意味着在线数据、本地快照,以及存放在另一家提供商或另一个国家的异地副本。
需要备份什么
- 网站文件和上传内容(
/var/www)。 - 数据库,需先导出为文件(绝不要复制正在运行的数据库文件)。
- 配置:
/etc/nginx、/etc中的更改、Docker Compose 文件和数据卷。 - 计划任务(cron)和任何自定义脚本。
操作系统几分钟就能重装。无法重装的是你的数据和设置。
使用 restic 进行加密、去重的备份
sudo apt install -y restic
export RESTIC_REPOSITORY=sftp:backup@other-server:/backups/vps1
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic init
用一长串随机字符创建密码文件,并把副本保存在安全的地方。如果丢失这个密码,备份将无法打开。restic 还支持兼容 S3 的存储,因此你可以推送到任何对象存储。
备份脚本
#!/bin/bash
set -e
export RESTIC_REPOSITORY=sftp:backup@other-server:/backups/vps1
export RESTIC_PASSWORD_FILE=/root/.restic-pass
mysqldump --single-transaction --all-databases | gzip > /var/backups/db.sql.gz
restic backup /var/www /etc /var/backups/db.sql.gz
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
将其保存为 /usr/local/bin/backup.sh,设为可执行并安排定时运行:
sudo chmod +x /usr/local/bin/backup.sh
echo "30 3 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1" | sudo tee /etc/cron.d/backup
復元をテストする
restic snapshots
restic restore latest --target /tmp/restore-test --include /etc/nginx
从未恢复过的备份只是一种希望。每季度测试一次,并且在更改任何东西之后一定要测试。
快照有帮助,但还不够
提供商的快照速度快,在进行有风险的更改之前很方便,但它们与你的服务保存在同一个提供商和同一个账户下。把它们当作便利手段,并另外保留一份独立的异地副本。