最近更新于 2026-08-09 11:50
前言
前年我用过基于 ssh 传输的方案:https://blog.iyatt.com/?p=16856
把数据库导出到文件,把 WordPress 整个目录打包,然后用 scp 传到另外一台服务器。这种方案比较受限。
新的方案把 scp 换成 rclone 工具,这个工具支持的存储非常广,各大云厂商的对象储存、自建网盘等都可行。
开始我尝试的自建网盘,我是用树莓派部署有一个 NextCloud 网盘,使用 frp 内网穿透的。只是由于我这个博客备份文件有些大,我试了几次都把 frp 搞崩溃了。最后我还是切换到阿里云的对象存储,虽然要付费,但是用作备份,一般不下载(高频下载是比较贵的),存储价格还是很便宜的(大约 0.1元/1GB/1月)。
在阿里云对象存储创建 Bucket
阿里云对象存储:https://oss.console.aliyun.com/bucket
创建

Bucket 名称:自行填写,后续同步脚本要填写和这里的一样名字
地域:我服务器在新加坡的,这里也选新加坡的对象存储
存储类型:标准存储操作要灵活些,只是价格比其它贵。像归档那种价格很便宜,但是你需要调用文件可能就要等很久才能拿到。
存储冗余类型:同城冗余存储就是在选地的多个数据中心存储,本地冗余存储就是只有一个数据中心。同城冗余可以防范整个数据中心意外毁灭,价格也更贵。
版本控制:相当于可以追溯文件的历史版本,我这里不需要。我自己控制备份日期的文件就行。
阻止公共访问:创建时默认打开的,相当于对象储存不公开访问。
读写权限:默认也是私有。相当于要用“账号”和“密码”才能访问。
所属资源组:自己创建组管理,或者就是默认的组。
下面的设置项:位处默认的关闭就行,不用管。


创建后在列表就能看到了

阿里云访问控制设置
阿里云访问控制 RAW:https://ram.console.aliyun.com/users
相当于要创建一个独立的子账号来访问对象存储。
这些信息自己填,只是要勾选“使用永久 AccessKey 访问”和“我确认必须创建 AccessKey”

先不要关页面,后续配置要设置 AccessKey ID 和 AccessKey Secret

去权限管理标签页下添加对象存储的访问权限 AliyunOSSFullAccess


配置 rclone
我是 Ubuntu 24.04 服务器,直接使用 root 操作的。
安装 rclone
apt install -y rclone
配置 rclone
rclone config
输入 n 回车新建

为这个远程存储创建 1 个名字,后面要用这个名字

输入 5 回车选 Amazon S3 Compliant Storage
5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, Huawei OBS, IBM COS, IDrive e2, IONOS Cloud, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS, Qiniu and Wasabi

输入 2 回车选阿里云
2 / Alibaba Cloud Object Storage System (OSS) formerly Aliyun
\ (Alibaba)

输入 1 回车

复制粘贴阿里云访问控制创建的 ID 和 Secret(key)



根据创建的 Bucket 所在地选择,我这里是新加坡,输入 17 回车
17 / Southeast Asia Southeast 1 (Singapore)
\ (oss-ap-southeast-1.aliyuncs.com)

输入 1 回车

输入 1 回车

输入 n 回车结束编辑

输入 y 回车确认

输入 q 退出

使用命令尝试访问 Bucket
rclone lsd 创建的远程远程存储名称:
注意名称后要加英文冒号,比如我刚才创建的是 aliyun,可以看到显示出了在阿里云的 Bucket 名称

配置备份脚本
OSS_REMOTE 是 rclone 配置时创建的远程存储的名称,根据实际的修改
OSS_BUCKET 是阿里云上创建的 Bucket 名称
OSS_BASE_PATH 是顶层目录,如果需要多套一层文件夹久设置
#!/usr/bin/env bash
getTime(){
date '+%Y-%m-%d %H:%M:%S'
}
cd ~
# ==================== 配置区域 ====================
# 请在这里集中修改你的阿里云 OSS 配置信息
# rclone 中配置的远端名称 (例如: alioss 或 aliyun)
OSS_REMOTE="aliyun"
# 你的阿里云 OSS 存储桶名称
OSS_BUCKET="singapore-blog"
# 在 OSS 中的存放目录(如果直接放在根目录可留空或设为 "")
OSS_BASE_PATH=""
# ==================================================
# 定义带日期时间的后缀变量
DATETIME=$(date +"%Y%m%d-%H%M%S")
# 删除所有以前本地残留的导出文件
rm -rf wordpress_backup_*
echo ""
# 在本地创建一个以时间戳命名的专属临时文件夹
BACKUP_DIR="wordpress_backup_${DATETIME}"
mkdir -p "$BACKUP_DIR"
echo "$(getTime) 创建本地备份目录: $BACKUP_DIR"
# 导出数据库到该目录下
echo "$(getTime) 开始导出数据库"
DB_BACKUP="$BACKUP_DIR/wordpress_db_${DATETIME}.sql"
mysqldump -u root --password="" wordpress_db > "$DB_BACKUP"
# 分卷打包 WordPress 目录,并将分卷直接输出到该目录下
echo "$(getTime) 开始分卷打包 WordPress"
ARCHIVE_PREFIX="$BACKUP_DIR/wordpress_${DATETIME}_part_"
tar czf - -C /var/www wordpress | split -b 50M -d -a 2 - "$ARCHIVE_PREFIX"
# 组合 OSS 目标路径并使用 rclone 同步
if [ -n "$OSS_BASE_PATH" ]; then
DEST_DIR="${OSS_REMOTE}:${OSS_BUCKET}/${OSS_BASE_PATH}/backup_${DATETIME}"
else
DEST_DIR="${OSS_REMOTE}:${OSS_BUCKET}/backup_${DATETIME}"
fi
echo "$(getTime) 开始整体同步文件夹到 OSS: $DEST_DIR"
rclone copy -P --transfers 4 --buffer-size 16M "$BACKUP_DIR/" "$DEST_DIR/"
# 同步完成后,清理本地创建的整个临时备份文件夹及其内容
if [ $? -eq 0 ]; then
echo "$(getTime) 清理本地临时文件夹"
rm -rf "$BACKUP_DIR"
echo "$(getTime) 备份上传成功并清理完成"
else
echo "$(getTime) 错误:备份上传失败,保留本地文件夹以供排查"
fi
echo "$(getTime) 结束"
这里我把脚本保存为 backup.sh,完整路径为 /root/backup.sh
添加可执行权限
chmod a+x /root/backup.sh
现在可以手动运行进行同步
/root/backup.sh

可以看到文件夹备份到阿里云对象存储了

使用 cron 控制自动执行
比如我配置每天陵城 4:00 执行一次备份
打开任务设置
crontab -e
首次使用可能让选择编辑器,这里直接输入 1 回车用 nano 更方便(我一般习惯用 vim,只是对新手不那么友好)
在新行粘贴
0 4 * * * /bin/bash /root/backup.sh >> /root/backup.log 2>&1
粘贴后按 Ctrl+O ,然后回车确认保存,按 Ctrl+X 退出

现在就会在每天 4 点执行,同时脚本执行输出内容会保存到 /root/backup.log,如果有失败的情况,页可以分析。
