为甲骨文设置rclone自动备份,防止封号后所有文件丢失!

准备工作

必须设置了rclone的服务,如果没有,按照前面的教程设置。
必须为rclone挂载了网盘,我在这里挂载了谷歌网盘。

创建第一个备份脚本文件

/root/root_multi_backup.sh

#!/bin/bash

# 设置变量 - 请修改以下路径
CONFIG_FILE="/root/backup_directories.txt"  # 配置文件位于root用户目录
REMOTE_NAME="googledrive"                        # root用户配置的rclone远程名称
BACKUP_DIR="backup"                        # Google Drive上的备份目录名称
DATE=$(date +"%Y-%m-%d_%H-%M-%S")          # 当前日期和时间
BACKUP_NAME="backup_${DATE}"               # 备份总文件夹名称
LOG_DIR="/root/backup_logs"                # 日志文件目录
LOG_FILE="${LOG_DIR}/backup_${DATE}.log"   # 当前备份的日志文件

# 确保日志目录存在
mkdir -p "$LOG_DIR"

# 创建日志标题
echo "=====================================================" | tee -a "$LOG_FILE"
echo "备份开始: $(date)" | tee -a "$LOG_FILE"
echo "备份由root用户执行" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"

# 检查是否以root身份运行
if [ "$(id -u)" -ne 0 ]; then
    echo "错误:此脚本必须以root身份运行!" | tee -a "$LOG_FILE"
    exit 1
fi

# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
    echo "错误:配置文件 $CONFIG_FILE 不存在!" | tee -a "$LOG_FILE"
    exit 1
fi

# 创建备份根目录
echo "创建备份目录: ${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}" | tee -a "$LOG_FILE"
rclone mkdir "${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}" 2>&1 | tee -a "$LOG_FILE"

# 读取目录列表并备份每个目录
while IFS= read -r SOURCE_DIR || [[ -n "$SOURCE_DIR" ]]; do
    # 跳过空行和注释
    [[ -z "$SOURCE_DIR" || "$SOURCE_DIR" =~ ^# ]] && continue
    
    # 移除可能的空格
    SOURCE_DIR=$(echo "$SOURCE_DIR" | xargs)
    
    # 提取目录名作为备份子目录名
    DIR_NAME=$(basename "$SOURCE_DIR")
    
    echo "" | tee -a "$LOG_FILE"
    echo "=====================================================" | tee -a "$LOG_FILE"
    echo "正在备份目录: $SOURCE_DIR" | tee -a "$LOG_FILE"
    echo "开始时间: $(date)" | tee -a "$LOG_FILE"
    echo "=====================================================" | tee -a "$LOG_FILE"
    
    # 检查目录是否存在
    if [ ! -d "$SOURCE_DIR" ]; then
        echo "警告:目录 $SOURCE_DIR 不存在,跳过" | tee -a "$LOG_FILE"
        continue
    fi
    
    # 计算目录大小和文件数量
    echo "计算目录大小和文件数量..." | tee -a "$LOG_FILE"
    DIR_SIZE=$(du -sh "$SOURCE_DIR" 2>/dev/null | cut -f1)
    FILE_COUNT=$(find "$SOURCE_DIR" -type f | wc -l)
    echo "目录大小: $DIR_SIZE, 文件数量: $FILE_COUNT" | tee -a "$LOG_FILE"
    
    # 使用rclone将目录复制到目标位置,显示详细进度
    echo "开始复制文件..." | tee -a "$LOG_FILE"
    rclone copy "$SOURCE_DIR" "${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}/${DIR_NAME}" \
        --progress \
        --stats-one-line-date \
        --stats=5s \
        -v 2>&1 | tee -a "$LOG_FILE"
    
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "✓ 成功备份: $SOURCE_DIR" | tee -a "$LOG_FILE"
        echo "完成时间: $(date)" | tee -a "$LOG_FILE"
    else
        echo "✗ 备份失败: $SOURCE_DIR" | tee -a "$LOG_FILE"
    fi
done < "$CONFIG_FILE"

# 管理旧备份
echo "" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"
echo "检查旧备份..." | tee -a "$LOG_FILE"
BACKUPS=$(rclone lsf "${REMOTE_NAME}:${BACKUP_DIR}" | sort)

# 计算备份数量
BACKUP_COUNT=$(echo "$BACKUPS" | wc -l)
echo "发现 $BACKUP_COUNT 个备份" | tee -a "$LOG_FILE"

# 如果超过3个备份,删除最旧的备份
if [ "$BACKUP_COUNT" -gt 3 ]; then
    # 计算需要删除多少个备份
    DELETE_COUNT=$((BACKUP_COUNT - 3))
    
    # 获取要删除的备份列表
    TO_DELETE=$(echo "$BACKUPS" | head -n $DELETE_COUNT)
    
    # 删除旧备份
    echo "删除 $DELETE_COUNT 个旧备份..." | tee -a "$LOG_FILE"
    echo "$TO_DELETE" | while read -r backup; do
        echo "删除: ${backup}" | tee -a "$LOG_FILE"
        rclone purge "${REMOTE_NAME}:${BACKUP_DIR}/${backup}" -v 2>&1 | tee -a "$LOG_FILE"
    done
else
    echo "备份数量为 $BACKUP_COUNT,不需要删除旧备份。" | tee -a "$LOG_FILE"
fi

# 管理旧的日志文件,只保留最近3个
echo "" | tee -a "$LOG_FILE"
echo "管理旧的日志文件..." | tee -a "$LOG_FILE"
LOG_FILES=$(ls -t ${LOG_DIR}/backup_*.log 2>/dev/null)
LOG_COUNT=$(echo "$LOG_FILES" | wc -l)

if [ "$LOG_COUNT" -gt 3 ]; then
    DELETE_LOG_COUNT=$((LOG_COUNT - 3))
    OLD_LOGS=$(echo "$LOG_FILES" | tail -n $DELETE_LOG_COUNT)
    
    echo "删除 $DELETE_LOG_COUNT 个旧日志文件..." | tee -a "$LOG_FILE"
    for old_log in $OLD_LOGS; do
        echo "删除日志: $(basename $old_log)" | tee -a "$LOG_FILE"
        rm -f "$old_log"
    done
else
    echo "日志文件数量为 $LOG_COUNT,不需要删除旧日志。" | tee -a "$LOG_FILE"
fi

echo "=====================================================" | tee -a "$LOG_FILE"
echo "备份完成: $(date)" | tee -a "$LOG_FILE"
echo "日志保存在: $LOG_FILE" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"

创建第二个备份目录文件

填入你要备份的目录

/root/backup_directories.txt

内容如下

/var/discourse
/opt


添加权限、执行脚本

sudo chmod +x /root/root_multi_backup.sh
sudo /root/root_multi_backup.sh

看一下脚本执行情况如何,如果正常,中止即可。

在1panel 面板添加计划任务——shell脚本——每天执行一次

1panel 执行计划任务的内容:

sudo /root/root_multi_backup.sh