将 VPS 上的数据库备份到 Cloudflare R2 是一个非常好的选择,因为 R2 兼容 S3 协议,且免收出站流量费(Egress Fees)。
为了实现这个流程,我们通常使用 rclone 这个工具,它被誉为云存储界的“瑞士军刀”。
1. 准备工作
在开始编写脚本前,你需要准备好以下信息:
Cloudflare R2:
Account ID(在 R2 控制面板右侧可见)。
Access Key ID 和 Secret Access Key(在 R2 设置中创建 API 令牌获取)。
Bucket Name(存储桶名称)。
VPS: 安装 rclone。
安装 rclone
curl https://rclone.org/install.sh | sudo bash
2. 配置 rclone 连接 R2
运行 rclone config 进行交互式配置,或者直接创建配置文件:
编辑 ~/.config/rclone/rclone.conf(如果没有则创建),添加以下内容:
Ini, TOML
[cfr2]
type = s3
provider = Cloudflare
access_key_id = 你的Access_Key_ID
secret_access_key = 你的Secret_Access_Key
endpoint = https://你的Account_ID.r2.cloudflarestorage.com
acl = private
3. 编写备份脚本
创建一个脚本文件,例如 db_backup.sh:
#!/bin/bash
# --- 配置信息 ---
DB_USER="root"
DB_PASS="你的数据库密码"
DB_NAME="需要备份的数据库名" # 备份所有库可用 --all-databases
BACKUP_DIR="/tmp/db_backups"
DATE=$(date +%Y%m%d_%H%M%S)
FILE_NAME="${DB_NAME}_${DATE}.sql.gz"
RCLONE_REMOTE="cfr2:你的存储桶名称/mysql_backups"
# --- 执行步骤 ---
# 1. 创建临时目录
mkdir -p $BACKUP_DIR
# 2. 导出并压缩数据库
echo "正在导出数据库..."
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/$FILE_NAME
# 3. 上传到 Cloudflare R2
echo "正在上传到 R2..."
rclone copy $BACKUP_DIR/$FILE_NAME $RCLONE_REMOTE
# 4. 删除本地临时文件
rm $BACKUP_DIR/$FILE_NAME
# 5. (可选) 删除 R2 上超过 30 天的旧备份
rclone delete --min-age 30d $RCLONE_REMOTE
echo "备份完成!"
给脚本执行权限
chmod +x db_backup.sh
4. 设置定时任务 (Cron)
如果你希望每天凌晨 3 点自动运行备份,执行 crontab -e 并添加一行:
0 3 * * * /bin/bash /root/db_backup.sh > /dev/null 2>&1
💡 进阶建议
安全提示:为了避免在脚本中明文写入密码,建议在 VPS 上创建 ~/.my.cnf 文件,写入数据库凭据,这样 mysqldump 就不再需要 -p 参数。
多数据库:如果你有多个数据库,可以修改脚本中的 DB_NAME 为一个数组进行循环。
监控:你可以配合 Telegram Bot 或邮件通知,在备份失败时向你发送报警。