如何使用rclone备份网站

如何使用 rclone 定时备份网站

一、安装rclone

				
					curl https://rclone.org/install.sh | sudo bash

				
			

二、配置rclone

				
					rclone config

				
			

配置步骤:

  1. 新建一个remote
  2. 取一个名字任意都可以
  3. 选择集成类型,博主这里选的是mega
  4. 输入你mega的用户名和密码
  5. 选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" <<EOF
upload_max_filesize = 64M
post_max_size = 64M
EOF
        
        echo "然后创建WordPress容器"
        docker run -d \
            --name wordpress \
            --network wp-net \
            -p 8080:80 \
            -e WORDPRESS_DB_HOST=wordpressdb:3306 \
            -e WORDPRESS_DB_NAME=wordpress \
            -e WORDPRESS_DB_USER=root \
            -e WORDPRESS_DB_PASSWORD="$MYSQL_ROOT_PASSWORD" \
            -v "$WORDPRESS_DIR":/var/www/html \
            -v "$WORDPRESS_DIR/php.ini":/usr/local/etc/php/conf.d/uploads.ini \
            wordpress:latest
    fi
else
    echo "容器已存在,重启wordpress容器"
    docker stop wordpress
    docker rm wordpress
    docker run -d \
        --name wordpress \
        --network wp-net \
        -p 8080:80 \
        -e WORDPRESS_DB_HOST=wordpressdb:3306 \
        -e WORDPRESS_DB_NAME=wordpress \
        -e WORDPRESS_DB_USER=root \
        -e WORDPRESS_DB_PASSWORD="$MYSQL_ROOT_PASSWORD" \
        -v "$WORDPRESS_DIR":/var/www/html \
        -v "$WORDPRESS_DIR/php.ini":/usr/local/etc/php/conf.d/uploads.ini \
        wordpress:latest
fi

echo "开始还原数据库。。。"
sleep 10

cat "$RESTORE_DIR/$SQL_FILE" | docker exec -i wordpressdb mysql -uroot -ptest123456 wordpress

echo "还原完成。。。"

# 清理临时文件
# 检查是否已将SQL文件复制到mysql_backup目录
echo "清理临时文件..."

if [ -f ~/mysql_backup/$(basename "$SQL_FILE") ]; then
    echo "保留了SQL备份文件以供手动还原,其余临时文件将被清除"
    find "$RESTORE_DIR" -type f -not -name "$(basename "$SQL_FILE")" -delete
    rmdir "$RESTORE_DIR" 2>/dev/null || true
else
    rm -rf "$RESTORE_DIR"
fi
echo "临时文件清理完成"