如何使用 rclone 定时备份网站
为什么要备份
最近,博主亲眼目睹了其他站点被入侵,导致文件被加密勒索的事件,这让我深刻意识到数据安全意识的重要性。由于博主平时也没有养成定期备份的习惯,这次事件让我下定决心整理一份备份教程,希望能帮助大家提高网站安全防护意识。
在数字化时代,网站数据的安全性不容忽视。一旦遭遇恶意攻击或意外事件,没有备份的站点往往面临巨大损失。通过建立每日备份机制,我们可以在遭受攻击时快速恢复数据,避免遭受不必要的经济损失。
因此,我整理了这份备份教程,希望能为各位站长提供参考,帮助大家未雨绸缪,构建更安全的网站运行环境
rclone使用mega网盘进行备份和恢复
一、安装rclone
curl https://rclone.org/install.sh | sudo bash
二、配置rclone
rclone config
配置步骤:
- 新建一个remote
- 取一个名字任意都可以
- 选择集成类型,博主这里选的是mega
- 输入你mega的用户名和密码
- 选q退出配置
root@wicked-strength:~# rclone config
2025/04/16 15:15:12 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> mega
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
1 / 1Fichier
\ (fichier)
2 / Akamai NetStorage
\ (netstorage)
3 / Alias for an existing remote
\ (alias)
4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, StackPath, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
\ (s3)
5 / Backblaze B2
\ (b2)
6 / Better checksums for other remotes
\ (hasher)
7 / Box
\ (box)
8 / Cache a remote
\ (cache)
9 / Citrix Sharefile
\ (sharefile)
10 / Cloudinary
\ (cloudinary)
11 / Combine several remotes into one
\ (combine)
12 / Compress a remote
\ (compress)
13 / Dropbox
\ (dropbox)
14 / Encrypt/Decrypt a remote
\ (crypt)
15 / Enterprise File Fabric
\ (filefabric)
16 / FTP
\ (ftp)
17 / Files.com
\ (filescom)
18 / Gofile
\ (gofile)
19 / Google Cloud Storage (this is not Google Drive)
\ (google cloud storage)
20 / Google Drive
\ (drive)
21 / Google Photos
\ (google photos)
22 / HTTP
\ (http)
23 / Hadoop distributed file system
\ (hdfs)
24 / HiDrive
\ (hidrive)
25 / ImageKit.io
\ (imagekit)
26 / In memory object storage system.
\ (memory)
27 / Internet Archive
\ (internetarchive)
28 / Jottacloud
\ (jottacloud)
29 / Koofr, Digi Storage and other Koofr-compatible storage providers
\ (koofr)
30 / Linkbox
\ (linkbox)
31 / Local Disk
\ (local)
32 / Mail.ru Cloud
\ (mailru)
33 / Mega
\ (mega)
34 / Microsoft Azure Blob Storage
\ (azureblob)
35 / Microsoft Azure Files
\ (azurefiles)
36 / Microsoft OneDrive
\ (onedrive)
37 / OpenDrive
\ (opendrive)
38 / OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)
\ (swift)
39 / Oracle Cloud Infrastructure Object Storage
\ (oracleobjectstorage)
40 / Pcloud
\ (pcloud)
41 / PikPak
\ (pikpak)
42 / Pixeldrain Filesystem
\ (pixeldrain)
43 / Proton Drive
\ (protondrive)
44 / Put.io
\ (putio)
45 / QingCloud Object Storage
\ (qingstor)
46 / Quatrix by Maytech
\ (quatrix)
47 / SMB / CIFS
\ (smb)
48 / SSH/SFTP
\ (sftp)
49 / Sia Decentralized Cloud
\ (sia)
50 / Storj Decentralized Cloud Storage
\ (storj)
51 / Sugarsync
\ (sugarsync)
52 / Transparently chunk/split large files
\ (chunker)
53 / Uloz.to
\ (ulozto)
54 / Union merges the contents of several upstream fs
\ (union)
55 / Uptobox
\ (uptobox)
56 / WebDAV
\ (webdav)
57 / Yandex Disk
\ (yandex)
58 / Zoho
\ (zoho)
59 / iCloud Drive
\ (iclouddrive)
60 / premiumize.me
\ (premiumizeme)
61 / seafile
\ (seafile)
Storage> mega
Option user.
User name.
Enter a value.
user> abcd@gmail.com
Option pass.
Password.
Choose an alternative below.
y) Yes, type in my own password
g) Generate random password
y/g> y
Enter the password:
password:
Confirm the password:
password:
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: mega
- user: tanselxy@gmail.com
- pass: *** ENCRYPTED ***
Keep this "mega" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
mega mega
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
写一个叫back.sh的脚本文件,相当于用rclne的api与mega进行交互,我这里首先进行备份,并设置back.sh这个脚本每天4点跑一次
#!/bin/bash
# WordPress和MySQL数据库备份到MEGA云存储脚本
# 设置为每天早上4点运行,保留最近7天的备份
# 设置变量
BACKUP_DIR="/tmp/wp_backups"
DATE=$(date +%Y%m%d)
MYSQL_ROOT_PASSWORD="1234567890"
RETENTION_DAYS=7
REMOTE_NAME="mega"
REMOTE_PATH="WordPress_Backups"
LOG_FILE="/tmp/wp_backup_$DATE.log"
# 启用日志记录
exec > >(tee -a "$LOG_FILE") 2>&1
echo "===== 开始WordPress备份 $(date) ====="
# 安装Rclone(如果尚未安装)
if ! command -v rclone &> /dev/null; then
echo "Rclone未安装,正在安装..."
curl https://rclone.org/install.sh | sudo bash
if ! command -v rclone &> /dev/null; then
echo "Rclone安装失败,请手动安装Rclone后再运行此脚本。"
echo "访问 https://rclone.org/install/ 获取安装指南。"
exit 1
fi
fi
# 检查Rclone配置
if ! rclone listremotes | grep -q "$REMOTE_NAME:"; then
echo "Rclone中未发现MEGA远程配置,请先运行 'rclone config' 设置MEGA远程存储。"
echo "具体步骤:"
echo "1. 运行 'rclone config'"
echo "2. 选择 'n' 创建新的远程存储"
echo "3. 名称设为 'mega'"
echo "4. 选择类型为 'mega'"
echo "5. 按照提示输入您的MEGA账户信息"
exit 1
fi
# 创建临时备份目录
mkdir -p $BACKUP_DIR
# 备份 WordPress 文件
echo "开始备份 WordPress 文件..."
if [ -d ~/wordpress ]; then
tar -czf $BACKUP_DIR/wordpress_files_$DATE.tar.gz -C ~/wordpress .
echo "WordPress 文件备份完成: $BACKUP_DIR/wordpress_files_$DATE.tar.gz"
else
echo "错误: WordPress目录不存在"
exit 1
fi
# 备份 MySQL 数据库
echo "开始备份 MySQL 数据库..."
if docker ps | grep -q wordpressdb; then
docker exec wordpressdb sh -c "exec mysqldump --all-databases -uroot -p\"$MYSQL_ROOT_PASSWORD\"" > $BACKUP_DIR/wordpress_db_$DATE.sql
if [ -s "$BACKUP_DIR/wordpress_db_$DATE.sql" ]; then
tar -czf $BACKUP_DIR/wordpress_db_$DATE.tar.gz -C $BACKUP_DIR wordpress_db_$DATE.sql
rm $BACKUP_DIR/wordpress_db_$DATE.sql
echo "MySQL 数据库备份完成: $BACKUP_DIR/wordpress_db_$DATE.tar.gz"
else
echo "错误: 数据库备份文件为空,可能是密码错误或数据库连接问题"
exit 1
fi
else
echo "错误: wordpressdb容器未运行"
exit 1
fi
# 确保远程目录存在
echo "确保远程目录存在..."
rclone mkdir "$REMOTE_NAME:$REMOTE_PATH"
if [ $? -ne 0 ]; then
echo "警告: 无法创建远程目录,但将继续尝试上传"
fi
# 上传备份文件到MEGA
echo "开始上传WordPress文件备份到MEGA..."
rclone copy "$BACKUP_DIR/wordpress_files_$DATE.tar.gz" "$REMOTE_NAME:$REMOTE_PATH"
if [ $? -eq 0 ]; then
echo "WordPress文件备份上传完成"
else
echo "错误: WordPress文件备份上传失败"
# 尝试备选路径
echo "尝试上传到根目录..."
rclone copy "$BACKUP_DIR/wordpress_files_$DATE.tar.gz" "$REMOTE_NAME:"
if [ $? -eq 0 ]; then
echo "WordPress文件备份上传到根目录成功"
else
echo "错误: 所有上传方法均失败"
fi
fi
echo "开始上传MySQL数据库备份到MEGA..."
rclone copy "$BACKUP_DIR/wordpress_db_$DATE.tar.gz" "$REMOTE_NAME:$REMOTE_PATH"
if [ $? -eq 0 ]; then
echo "MySQL数据库备份上传完成"
else
echo "错误: MySQL数据库备份上传失败"
# 尝试备选路径
echo "尝试上传到根目录..."
rclone copy "$BACKUP_DIR/wordpress_db_$DATE.tar.gz" "$REMOTE_NAME:"
if [ $? -eq 0 ]; then
echo "MySQL数据库备份上传到根目录成功"
else
echo "错误: 所有上传方法均失败"
fi
fi
# 列出MEGA上的备份文件
echo "验证上传的文件..."
echo "检查目标目录中的文件..."
rclone ls "$REMOTE_NAME:$REMOTE_PATH" 2>/dev/null || echo "注意: 无法列出目标目录中的文件"
# echo "检查根目录中的文件..."
# rclone ls "$REMOTE_NAME:" 2>/dev/null || echo "注意: 无法列出根目录中的文件"
# 清理MEGA上的旧备份文件(只保留最近7天)
echo "清理MEGA上的旧备份文件..."
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%Y%m%d)
echo "将删除早于 $CUTOFF_DATE 的备份文件"
# 检查目标目录中的文件
echo "清理目标目录中的旧备份文件..."
OLD_FILES=$(rclone ls "$REMOTE_NAME:$REMOTE_PATH" | grep -E "wordpress_.*_[0-9]{8}\.tar\.gz" | grep -v "$DATE" | awk '{print $2}')
for FILE in $OLD_FILES; do
FILE_DATE=$(echo $FILE | grep -o "[0-9]\{8\}")
if [[ "$FILE_DATE" < "$CUTOFF_DATE" ]]; then
echo "删除旧备份: $REMOTE_PATH/$FILE"
rclone deletefile "$REMOTE_NAME:$REMOTE_PATH/$FILE" || echo "警告: 无法删除 $FILE,可能需要手动清理"
fi
done
# 检查根目录中的文件
echo "清理根目录中的旧备份文件..."
OLD_FILES=$(rclone ls "$REMOTE_NAME:" | grep -E "wordpress_.*_[0-9]{8}\.tar\.gz" | grep -v "$DATE" | awk '{print $2}')
for FILE in $OLD_FILES; do
FILE_DATE=$(echo $FILE | grep -o "[0-9]\{8\}")
if [[ "$FILE_DATE" < "$CUTOFF_DATE" ]]; then
echo "删除旧备份: $FILE"
rclone deletefile "$REMOTE_NAME:$FILE" || echo "警告: 无法删除 $FILE,可能需要手动清理"
fi
done
# 清理本地临时备份
rm -rf $BACKUP_DIR
echo "本地临时备份清理完成"
echo "MEGA备份过程完成!"
echo "备份时间: $(date)"
echo "保留策略: 最近 $RETENTION_DAYS 天"
echo "日志文件: $LOG_FILE"
# 使用说明:
# 1. 在运行此脚本前,请先安装Rclone并配置MEGA存储
# 2. 安装Rclone: curl https://rclone.org/install.sh | sudo bash
# 3. 配置MEGA远程存储: rclone config
# - 选择 'n' 创建新的远程存储
# - 名称设为 'mega'
# - 选择类型为 'mega'
# - 按照提示输入您的MEGA账户信息
# 4. 赋予此脚本执行权限: chmod +x 此脚本名称.sh
# 5. 执行脚本: ./此脚本名称.sh
如果网站遇到了不可抗拒的因素,从mega网盘里面获取最新的文件,进行自动还原,我这里也写了一个脚本,仅供参考
#!/bin/bash
# WordPress和MySQL数据库从MEGA云存储还原脚本
# 此脚本会还原最新的备份文件
# 设置变量
RESTORE_DIR="/tmp/wp_restore"
MYSQL_ROOT_PASSWORD="test123456789"
REMOTE_NAME="mega"
REMOTE_PATH="WordPress_Backups"
WORDPRESS_DIR="$HOME/wordpress"
LOG_FILE="/tmp/wp_restore_$(date +%Y%m%d).log"
# 启用日志记录
exec > >(tee -a "$LOG_FILE") 2>&1
echo "===== 开始WordPress备份还原 $(date) ====="
# 检测环境和容器
echo "检测环境..."
DOCKER_INSTALLED=false
WORDPRESS_CONTAINER_EXISTS=false
MYSQL_CONTAINER_EXISTS=false
# 检查Docker是否安装
if command -v docker &> /dev/null; then
DOCKER_INSTALLED=true
echo "Docker已安装"
# 检查容器
if docker container inspect wordpress &>/dev/null; then
WORDPRESS_CONTAINER_EXISTS=true
echo "WordPress容器存在"
else
echo "WordPress容器不存在"
fi
if docker container inspect wordpressdb &>/dev/null; then
MYSQL_CONTAINER_EXISTS=true
echo "MySQL容器存在"
else
echo "MySQL容器不存在"
fi
else
echo "Docker未安装,"
exit 1
fi
# 创建临时还原目录
mkdir -p $RESTORE_DIR
echo "创建临时还原目录: $RESTORE_DIR"
# 列出备份文件并找到最新的
echo "查找最新的WordPress文件备份..."
LATEST_WP_BACKUP=$(rclone lsl "$REMOTE_NAME:$REMOTE_PATH" | grep "wordpress_files_" | sort -k2,3 -r | head -n 1 | awk '{print $NF}')
if [ -z "$LATEST_WP_BACKUP" ]; then
echo "错误: 未找到WordPress文件备份"
exit 1
fi
echo "找到最新的WordPress文件备份: $LATEST_WP_BACKUP"
echo "查找最新的MySQL数据库备份..."
LATEST_DB_BACKUP=$(rclone lsl "$REMOTE_NAME:$REMOTE_PATH" | grep "wordpress_db_" | sort -k2,3 -r | head -n 1 | awk '{print $NF}')
echo " 查找命令为 rclone lsl "$REMOTE_NAME:$REMOTE_PATH" | grep "wordpress_db_" | sort -k2,3 -r | head -n 1 | awk '{print $NF}'' "
if [ -z "$LATEST_DB_BACKUP" ]; then
echo "错误: 未找到MySQL数据库备份"
exit 1
fi
echo "找到最新的MySQL数据库备份: $LATEST_DB_BACKUP"
# 下载最新的备份文件
echo "下载WordPress文件备份..."
rclone copy "$REMOTE_NAME:$REMOTE_PATH/$LATEST_WP_BACKUP" "$RESTORE_DIR"
if [ $? -ne 0 ]; then
echo "错误: 下载WordPress文件备份失败"
exit 1
fi
echo "WordPress文件备份下载完成"
echo "下载MySQL数据库备份..."
rclone copy "$REMOTE_NAME:$REMOTE_PATH/$LATEST_DB_BACKUP" "$RESTORE_DIR"
if [ $? -ne 0 ]; then
echo "错误: 下载MySQL数据库备份失败"
exit 1
fi
echo "MySQL数据库备份下载完成"
# 解压WordPress文件备份
echo "解压WordPress文件备份..."
mkdir -p "$WORDPRESS_DIR"
tar -xzf "$RESTORE_DIR/$LATEST_WP_BACKUP" -C "$WORDPRESS_DIR"
# 设置适当的权限
echo "设置WordPress目录权限755..."
chmod -R 755 "$WORDPRESS_DIR"
if [ $? -ne 0 ]; then
echo "警告: 设置WordPress目录权限失败,可能需要手动设置"
fi
# 解压MySQL数据库备份
echo "解压MySQL数据库备份..."
tar -xzf "$RESTORE_DIR/$LATEST_DB_BACKUP" -C "$RESTORE_DIR"
if [ $? -ne 0 ]; then
echo "错误: 解压MySQL数据库备份失败"
exit 1
fi
echo "MySQL数据库备份解压完成"
# 还原MySQL数据库
echo "还原MySQL数据库..."
# 获取SQL文件名(去掉.tar.gz后缀)
SQL_FILE=$(basename "$LATEST_DB_BACKUP" .tar.gz).sql
#wordpressdb 数据库容器
if [ -f "$RESTORE_DIR/$SQL_FILE" ]; then
# 检查Docker和MySQL容器是否存在和运行
if command -v docker &> /dev/null; then
echo "检测到Docker已安装..."
# 检查wordpressdb容器是否存在
if docker container inspect wordpressdb &>/dev/null; then
echo "检测到wordpressdb容器..."
docker stop wordpressdb
docker rm wordpressdb
docker run -d \
--name wordpressdb \
--network wp-net \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=test123456789 \
-e MYSQL_DATABASE=wordpress \
-v /data/mysql/wordpressdb:/var/lib/mysql \
mysql:8.0
echo "MySQL容器创建完成✅"
else
echo "警告: wordpressdb容器不存在,需要创建新的MySQL容器"
echo "是否要创建新的MySQL容器? (y/n)"
read -r answer
if [[ "$answer" =~ ^[Yy]$ ]]; then
echo "创建MySQL容器..."
if ! docker network ls | grep -q wp-net; then
docker network create wp-net
fi
# 创建MySQL数据目录
mkdir -p /data/mysql/wordpressdb
# 然后创建MySQL容器
docker run -d \
--name wordpressdb \
--network wp-net \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" \
-e MYSQL_DATABASE=wordpress \
-v /data/mysql/wordpressdb:/var/lib/mysql \
mysql:8.0
echo "MySQL容器新建完成✅"
else
echo "跳过数据库还原。请手动创建MySQL容器并还原数据库。"
echo "SQL备份文件位置: $RESTORE_DIR/$SQL_FILE"
fi
fi
else
echo "警告: Docker未安装,无法使用Docker还原MySQL数据库"
echo "您可以手动安装MySQL并使用以下命令还原数据库:"
echo "mysql -uroot -p < $RESTORE_DIR/$SQL_FILE"
echo "SQL备份文件位置: $RESTORE_DIR/$SQL_FILE"
# 暂时保留SQL文件
mkdir -p ~/mysql_backup
cp "$RESTORE_DIR/$SQL_FILE" ~/mysql_backup/
echo "已将SQL文件复制到 ~/mysql_backup/$SQL_FILE 以便手动还原"
fi
else
echo "错误: 未找到SQL文件: $RESTORE_DIR/$SQL_FILE"
exit 1
fi
#!/bin/bash
if [ "$DOCKER_INSTALLED" = true ]; then
if [ "$WORDPRESS_CONTAINER_EXISTS" = false ]; then
echo "注意: WordPress容器不存在"
echo "您可以使用以下命令创建WordPress容器:"
# 进入WordPress目录再执行容器创建命令
cd "$WORDPRESS_DIR"
echo "已进入WordPress目录: $(pwd)"
# 检查Docker网络
if ! docker network ls | grep -q wp-net; then
echo "创建Docker网络wp-net..."
docker network create wp-net
fi
echo "# 创建 php.ini 提高上传限制"
cat > "$WORDPRESS_DIR/php.ini" </dev/null || true
else
rm -rf "$RESTORE_DIR"
fi
echo "临时文件清理完成"