使用 rclone 自动将 VPS 备份至 S3 / Google Drive

将备份存储在与生产环境相同的服务器上并不是真正的备份——一旦服务器故障或遭到入侵,备份也会随之丢失。最安全的做法是将备份传输至异地云存储。

rclone 是"云端版 rsync"——一个工具支持 70 多个提供商:S3、Google Drive、OneDrive、Backblaze B2、Dropbox、Wasabi 等。本指南介绍如何在 Ubuntu VPS 上配置 rclone、编写备份脚本,并安排每晚自动上传至 S3 和 Google Drive。

前提条件:一台具有 sudo 权限的 Ubuntu VPS,以及一个用于接收备份的云存储账号(S3 / B2 / Google Drive / OneDrive)。

为什么选择 rclone 而非 aws-cli 或 gsutil

第一步 — 安装 rclone

使用官方安装脚本,Ubuntu 自带的软件包版本通常较旧:

sudo -v ; curl https://rclone.org/install.sh | sudo bash
rclone version

确认输出版本为 1.65 或更高。

第二步 — 配置 S3 远端存储

启动配置向导:

rclone config

按照提示操作:

  1. 选择 n 新建远端
  2. 名称:s3backup
  3. 存储类型:4(Amazon S3 兼容)
  4. 服务商:AWS(或 WasabiBackblaze
  5. access_key_id / secret_access_key:粘贴您的 AWS 凭证
  6. 区域:ap-southeast-1(新加坡)
  7. Endpoint:AWS 留空即可
  8. ACL:private

测试连接:

rclone lsd s3backup:

第三步 — 配置 Google Drive

Google Drive 需要 OAuth 授权。若 VPS 无图形界面,请在本地电脑完成授权后将令牌复制到 VPS。

在本地电脑上运行:

rclone config

选择 Google Drive,client_id/secret 留空,选择 y 打开浏览器,登录并授权访问。

令牌保存在 ~/.config/rclone/rclone.conf,将其复制到 VPS:

scp ~/.config/rclone/rclone.conf user@your-vps:/home/user/.config/rclone/rclone.conf

第四步 — 上传前加密(推荐)

crypt 后端会在上传前加密文件名和文件内容——云服务商看到的只有密文。

rclone config

选择 n,命名为 backup_enc,类型选 crypt,远端设为 s3backup:bucket-name/encrypted,然后设置密码(务必记录下来!)。

⚠️ 切勿丢失 crypt 密码。rclone 没有找回机制。请将密码存入密码管理器,并对密码管理器本身做好备份。

第五步 — 每晚自动备份脚本

创建文件 /usr/local/bin/backup-daily.sh

sudo nano /usr/local/bin/backup-daily.sh

脚本示例内容(MySQL + 网站目录 + 云上传):

#!/bin/bash
set -e
DATE=$(date +%F-%H%M)
BACKUP_DIR=/tmp/backup_$DATE
mkdir -p $BACKUP_DIR

# 1. Dump MySQL
mysqldump --all-databases --single-transaction \
  -u backup -p'BackupPassword!' > $BACKUP_DIR/mysql_all.sql

# 2. Archive the web folder
tar -czf $BACKUP_DIR/www.tar.gz /var/www

# 3. Push to S3 (encrypted)
rclone copy $BACKUP_DIR backup_enc:daily/$DATE \
  --transfers=4 --checkers=8 \
  --bwlimit "08:00,2M 22:00,off" \
  --log-file=/var/log/rclone-backup.log

# 4. Delete cloud backups older than 30 days
rclone delete backup_enc:daily --min-age 30d --log-file=/var/log/rclone-backup.log

# 5. Clean local temp files
rm -rf $BACKUP_DIR

echo "Backup completed: $DATE" >> /var/log/rclone-backup.log

赋予执行权限:

sudo chmod +x /usr/local/bin/backup-daily.sh

第六步 — 通过 Cron 设置每天凌晨 3 点执行

sudo crontab -e

添加以下行:

0 3 * * * /usr/local/bin/backup-daily.sh >> /var/log/cron-backup.log 2>&1

第七步 — 测试恢复

从未测试过恢复的备份不是真正的备份。拉取一个文件下来验证:

rclone copy backup_enc:daily/2026-05-15-0300/www.tar.gz /tmp/test_restore/
ls -la /tmp/test_restore/

提示:每月进行一次恢复演练——在真正需要使用备份之前,提前发现脚本的潜在问题。

常用 rclone 命令

命令功能说明
rclone copy SRC REMOTE:复制(不删除目标端已有文件)
rclone sync SRC REMOTE:镜像同步(删除目标端中源端缺失的文件)
rclone ls REMOTE:列出所有文件
rclone lsd REMOTE:仅列出目录
rclone size REMOTE:查看已用空间总量
rclone check SRC REMOTE:验证文件是否一致
rclone mount REMOTE: /mnt将云存储挂载为本地目录

3-2-1 备份策略清单

  1. 3 份副本 — 原始文件 + 本地备份 + 云端备份
  2. 2 种介质 — 磁盘 + 云存储(不同类型)
  3. 1 份异地 — 至少一份存放在机房之外(rclone 正是用于此目的)
  4. 使用 crypt 远端加密——云服务商只看到密文
  5. 设置保留策略——自动清除超过 X 天的旧备份
  6. 每月测试一次恢复——无法恢复的备份不算备份

VPS 备份云存储提供商对比

rclone 支持数十家提供商,各有不同的定价和性能特点。选择合适的后端可在不牺牲可靠性的前提下大幅降低备份成本。

提供商 存储费用 流出费用 适合场景
Amazon S3 Standard ~$0.023/GB/月 $0.09/GB 通用用途,高 SLA 需求
Backblaze B2 $0.006/GB/月 $0.01/GB 注重预算,大容量备份
Wasabi $0.0069/GB/月 免费 频繁恢复,兼容 S3 接口
Google Drive(免费 15 GB) 免费 15 GB / $2.99/月 100 GB 免费 小型项目,零额外成本
S3 Glacier Instant Retrieval $0.004/GB/月 $0.03/GB 长期归档,极少恢复

为备份脚本添加失败通知

无声的 Cron 任务是危险的。若备份脚本失败却没有任何提醒,您可能在紧急需要恢复时才发现问题——届时可能已有数周的备份缺失。以下是两种实用的通知方式:

方式一:Webhook 通知(Slack、Discord、Line Notify)

#!/bin/bash
# Add at the end of backup-daily.sh

WEBHOOK_URL="https://hooks.yourservice.com/abc123"
LOG="/var/log/rclone-backup.log"

if [ $? -eq 0 ]; then
  STATUS="Backup succeeded: $(date +%F)"
else
  STATUS="Backup FAILED: $(date +%F) — check $LOG"
fi

curl -s -X POST -H 'Content-type: application/json' \
  --data "{\"text\":\"$STATUS\"}" "$WEBHOOK_URL"

方式二:healthchecks.io 心跳检测(提供免费套餐)

脚本每次成功运行后 ping 一个 URL。若在预期时间窗口内未收到 ping,服务将自动发送邮件提醒:

# Add at the very end of your backup script
curl -fsS --retry 3 https://hc-ping.com/YOUR-UUID-HERE > /dev/null

rclone 过滤器 — 只传输需要的内容

将服务器上的所有文件都上传会浪费存储空间和费用。rclone 的过滤系统可精确控制包含或排除的路径。在 /etc/rclone-backup.filter 创建过滤规则文件:

# 包含
+ /var/www/**
+ /etc/nginx/**
+ /home/*/public_html/**
+ *.sql
+ *.sql.gz

# 排除
- *.log
- *.tmp
- /tmp/**
- /var/cache/**
- node_modules/**
- .git/**
- __pycache__/**

将过滤规则文件传入 rclone:

rclone copy /var/ backup_enc:daily/$DATE \
  --filter-from /etc/rclone-backup.filter \
  --transfers=4 \
  --log-file=/var/log/rclone-backup.log

正式传输前,务必先进行演习(dry run),确认将要传输的内容而不实际发送任何数据:

rclone copy --dry-run --filter-from /etc/rclone-backup.filter /var/ backup_enc:daily/test

监控备份大小与存储趋势

了解备份占用的空间有助于规划成本并发现异常——备份大小突然增加可能意味着日志文件失控或数据库急速增长。使用以下 rclone 命令进行追踪:

# 所有备份的总大小
rclone size backup_enc:daily

# 特定日期备份的大小
rclone size backup_enc:daily/2026-06-01-0300

# 列出所有备份中最大的 10 个文件
rclone ls backup_enc:daily | sort -rn | head -10

# 以人类可读格式汇总文件数量和总字节数
rclone about backup_enc:

通过添加 Cron 任务,将 rclone size backup_enc:daily 的输出写入日志文件或通过 Webhook 发送,即可生成每周汇总报告。每周查看一次报告只需不到两分钟,可及早发现问题。

需要一台可靠的 VPS 用于备份?

AsiaGB VPS 起价 500 泰铢/月,配备 SSD 与充裕带宽——非常适合自动将大量备份传输至云存储。

查看 VPS 方案