
将备份存储在与生产环境相同的服务器上并不是真正的备份——一旦服务器故障或遭到入侵,备份也会随之丢失。最安全的做法是将备份传输至异地云存储。
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
- 一个工具,多家提供商 — 只需学习一套命令
- 内置加密 —
crypt后端在上传前完成加密 - 带宽限速 — 防止 rclone 在业务高峰期占满带宽
- 断点续传 — 网络中断后自动从上次位置继续
- 过滤器 — 只传输需要的文件(
--exclude *.log)
第一步 — 安装 rclone
使用官方安装脚本,Ubuntu 自带的软件包版本通常较旧:
sudo -v ; curl https://rclone.org/install.sh | sudo bash rclone version
确认输出版本为 1.65 或更高。
第二步 — 配置 S3 远端存储
启动配置向导:
rclone config
按照提示操作:
- 选择
n新建远端 - 名称:
s3backup - 存储类型:
4(Amazon S3 兼容) - 服务商:
AWS(或Wasabi、Backblaze) - access_key_id / secret_access_key:粘贴您的 AWS 凭证
- 区域:
ap-southeast-1(新加坡) - Endpoint:AWS 留空即可
- 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 备份策略清单
- 3 份副本 — 原始文件 + 本地备份 + 云端备份
- 2 种介质 — 磁盘 + 云存储(不同类型)
- 1 份异地 — 至少一份存放在机房之外(rclone 正是用于此目的)
- 使用 crypt 远端加密——云服务商只看到密文
- 设置保留策略——自动清除超过 X 天的旧备份
- 每月测试一次恢复——无法恢复的备份不算备份
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 发送,即可生成每周汇总报告。每周查看一次报告只需不到两分钟,可及早发现问题。