引言
在自托管和 VPS 运维中,数据就是生命线。无论是个人博客、家庭 NAS 还是生产环境服务,一旦硬盘损坏、服务商跑路或被勒索软件攻击,没有备份意味着一切归零。
本文提供一套完整、自动化、低成本的 VPS 备份与灾难恢复方案,让你睡个安稳觉。
一、备份策略设计:3-2-1 原则
业界黄金法则——3-2-1 备份原则:
| 要素 | 说明 |
|---|---|
| 3 份副本 | 原始数据 + 至少 2 个备份 |
| 2 种介质 | 本地磁盘 + 远程对象存储 |
| 1 份异地 | 至少一份备份在不同地理位置 |
对于个人 VPS 用户,我们将其简化为:本地快照 + 云端同步。
二、核心工具链
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Cron Job │───▶│ Backup Script│───▶│ Rclone Sync │
│ (定时触发) │ │ (打包压缩) │ │ (加密上传 S3) │
└─────────────┘ └──────────────┘ └──────────────────┘
│
▼
┌──────────────────┐
│ AWS S3 / Backblaze│
│ / Cloudflare R2 │
└──────────────────┘
2.1 rclone 安装与配置
# 安装 rclone
curl https://rclone.org/install.sh | sudo bash
# 配置远程存储(以 Cloudflare R2 为例)
rclone config
# 选择 new remote → s3 → provider: Other
# Access key: your-R2-access-key
# Secret key: your-R2-secret-key
# endpoint: https://account-id.r2.cloudflarestorage.com
省钱技巧:Cloudflare R2 无流量费用,存储 $0.015/GB/月,是 VPS 备份的理想选择。Backblaze B2 同样便宜($0.006/GB/月)。
2.2 自动化备份脚本
创建 /usr/local/bin/vps-backup.sh:
#!/bin/bash
# VPS 全量备份脚本
set -euo pipefail
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/tmp/backups"
REMOTE_BUCKET="r2:vps-backups-$(hostname)"
RETENTION_DAYS=30
mkdir -p "$BACKUP_DIR/$DATE"
# ========== 1. 备份数据库 ==========
echo "[$(date)] 开始备份数据库..."
for db in $(mysql -e 'SHOW DATABASES;' --skip-column-names | grep -Ev '^(information_schema|performance_schema)$'); do
mysqldump --single-transaction --routines --triggers "$db" \
> "$BACKUP_DIR/$DATE/${db}.sql"
done
# ========== 2. 备份配置文件 ==========
echo "[$(date)] 备份系统配置..."
tar czf "$BACKUP_DIR/$DATE/etc-backup.tar.gz" \
/etc/hosts /etc/crontab /etc/fstab \
/etc/nginx/ /etc/ssl/ /etc/dovecot/ 2>/dev/null || true
# ========== 3. 备份 Web 内容 ==========
echo "[$(date)] 备份网站文件..."
tar czf "$BACKUP_DIR/$DATE/web-content.tar.gz" \
/var/www/html/ /home/*/public_html/ 2>/dev/null || true
# ========== 4. 打包并压缩 ==========
echo "[$(date)] 创建最终备份包..."
cd "$BACKUP_DIR"
tar czf "${DATE}-full.tar.gz" "$DATE"
rm -rf "$DATE"
# ========== 5. 上传到云端 ==========
echo "[$(date)] 上传到远程存储..."
rclone copy "${DATE}-full.tar.gz" "$REMOTE_BUCKET/latest/" \
--transfers=2 --checkers=4 \
--s3-chunk-size=64M \
--progress
# ========== 6. 清理本地旧备份 ==========
echo "[$(date)] 清理 ${RETENTION_DAYS} 天前的本地备份..."
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
# ========== 7. 远程清理 ==========
echo "[$(date)] 清理远程过期备份..."
rclone delete "$REMOTE_BUCKET/old/" --max-age 30d || true
mv "$REMOTE_BUCKET/latest/" "$REMOTE_BUCKET/old/" 2>/dev/null || true
mkdir -p "$REMOTE_BUCKET/latest/"
echo "[$(date)] 备份完成!文件大小: $(du -h "${DATE}-full.tar.gz" | cut -f1)"
2.3 定时任务设置
crontab -e
# 每天凌晨 2 点执行全量备份
0 2 * * * /usr/local/bin/vps-backup.sh >> /var/log/vps-backup.log 2>&1
# 每周日 3 点执行增量备份(配合 restic 更佳)
0 3 * * 0 /usr/local/bin/vps-backup.sh --incremental >> /var/log/vps-backup.log 2>&1
三、进阶方案:使用 Restic 做加密备份
如果安全性要求更高,推荐使用 Restic:
# 安装 restic
sudo apt install restic
# 初始化仓库
restic init --repo s3:s3.us-east-1.amazonaws.com/mybucket \
--password-file ~/.restic-password
# 备份整个系统
restic backup / --exclude=/proc/* --exclude=/sys/* \
--tag daily-backup \
-r s3:s3.us-east-1.amazonaws.com/mybucket
# 查看备份历史
restic snapshots -r s3:s3.us-east-1.amazonaws.com/mybucket
# 恢复单个文件
restic restore latest -r s3:s3.us-east-1.amazonaws.com/mybucket \
--target /tmp/recovered
Restic 的优势:
- 🔒 端到端加密,即使云存储泄露也无法读取
- 🧬 去重存储,节省空间
- ⚡ 增量备份,只传输变化部分
- 📋 丰富的恢复选项(按时间、标签、路径)
四、灾难恢复演练
备份不做测试等于没有备份。建议每季度进行一次恢复演练:
# 1. 准备一台新 VPS
# 2. 安装基础系统
# 3. 下载最新备份
rclone copy "$REMOTE_BUCKET/latest/" ./restore-latest/
# 4. 解压并验证
tar xzf restore-latest/*.tar.gz
ls restore-latest/
# 5. 逐步恢复
# a. 恢复配置文件
# b. 导入数据库
# c. 部署 Web 内容
# d. 验证服务正常运行
五、监控与告警
确保备份成功运行:
# 在备份脚本末尾添加健康检查
if [ $? -eq 0 ]; then
echo "$(date): ✅ 备份成功" >> /var/log/vps-backup.log
else
echo "$(date): ❌ 备份失败!" >> /var/log/vps-backup.log
# 发送告警通知(邮件/Telegram/Webhook)
curl -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=⚠️ VPS 备份失败!请及时检查。"
fi
六、成本估算
| 项目 | 每月费用 |
|---|---|
| VPS(8GB RAM) | ~$6-20 |
| Cloudflare R2(50GB) | ~$0.75 |
| 域名 | ~$10/年 |
| 合计 | ~$1-3/天 |
总结
建立完善的备份体系不需要复杂的基础设施。核心要点:
- ✅ 自动化:用 crontab + 脚本实现无人值守
- ✅ 异地容灾:rclone 同步到 S3 兼容存储
- ✅ 加密保护:Restic 端到端加密
- ✅ 定期演练:每季度做一次恢复测试
- ✅ 监控告警:备份失败立即通知
“备份不是可选功能,而是基础设施的基石。”
