Featured image of post VPS 自动备份与灾难恢复:从裸机到数据无忧

VPS 自动备份与灾难恢复:从裸机到数据无忧

从零搭建 VPS 自动备份系统,涵盖数据库、文件、配置的全链路备份方案,配合 rclone + crontab 实现异地容灾。

引言

在自托管和 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/天

总结

建立完善的备份体系不需要复杂的基础设施。核心要点:

  1. 自动化:用 crontab + 脚本实现无人值守
  2. 异地容灾:rclone 同步到 S3 兼容存储
  3. 加密保护:Restic 端到端加密
  4. 定期演练:每季度做一次恢复测试
  5. 监控告警:备份失败立即通知

“备份不是可选功能,而是基础设施的基石。”

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials