准备工作

  1. 配置rclone服务

    • 确保已在甲骨文服务器上配置好rclone
    • 已为rclone挂载Google Drive或其他云存储(如通过alist)
  2. 验证rclone配置

    rclone listremotes

    应显示配置的远程名称(如googledrive:

备份脚本设置

1. 创建备份脚本文件

/root/目录下创建root_multi_backup.sh文件:

#!/bin/bash

# ========================
# 备份配置
# ========================
CONFIG_FILE="/root/backup_directories.txt"  # 备份目录列表文件
REMOTE_NAME="googledrive"                   # rclone配置的远程名称
BACKUP_DIR="backup"                         # 云盘上的备份目录名称
MAX_BACKUPS=3                               # 保留的备份数量
LOG_DIR="/root/backup_logs"                 # 日志文件目录

# ========================
# 初始化设置
# ========================
DATE=$(date +"%Y-%m-%d_%H-%M-%S")          # 当前日期和时间
BACKUP_NAME="backup_${DATE}"               # 备份文件夹名称
LOG_FILE="${LOG_DIR}/backup_${DATE}.log"   # 日志文件路径

# 创建日志目录
mkdir -p "$LOG_DIR"

# ========================
# 日志函数
# ========================
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

log_divider() {
    echo "=====================================================" | tee -a "$LOG_FILE"
}

log_header() {
    log_divider
    log "$1"
    log_divider
}

# ========================
# 备份开始
# ========================
log_header "备份开始"
log "执行用户: $(whoami)"
log "备份名称: $BACKUP_NAME"

# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
    log "错误:此脚本必须以root身份运行!"
    exit 1
fi

# 检查配置文件
if [ ! -f "$CONFIG_FILE" ]; then
    log "错误:配置文件 $CONFIG_FILE 不存在!"
    exit 1
fi

# 创建云盘备份目录
log "创建云盘备份目录: ${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}"
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")
    
    log_header "正在备份: $SOURCE_DIR"
    
    # 检查目录是否存在
    if [ ! -d "$SOURCE_DIR" ]; then
        log "警告:目录 $SOURCE_DIR 不存在,跳过"
        continue
    fi
    
    # 计算目录信息
    log "计算目录大小和文件数量..."
    DIR_SIZE=$(du -sh "$SOURCE_DIR" 2>/dev/null | cut -f1)
    FILE_COUNT=$(find "$SOURCE_DIR" -type f | wc -l)
    log "目录大小: $DIR_SIZE | 文件数量: $FILE_COUNT"
    
    # 执行备份
    log "开始复制文件到云盘..."
    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
        log "✓ 备份成功: $SOURCE_DIR"
    else
        log "✗ 备份失败: $SOURCE_DIR"
    fi
done < "$CONFIG_FILE"

# ========================
# 备份管理
# ========================
log_header "管理旧备份"

# 获取备份列表并按日期排序
BACKUPS=$(rclone lsf "${REMOTE_NAME}:${BACKUP_DIR}" | sort)
BACKUP_COUNT=$(echo "$BACKUPS" | wc -l)
log "当前备份数量: $BACKUP_COUNT (最多保留 $MAX_BACKUPS 个)"

# 删除多余备份
if [ "$BACKUP_COUNT" -gt $MAX_BACKUPS ]; then
    DELETE_COUNT=$((BACKUP_COUNT - MAX_BACKUPS))
    TO_DELETE=$(echo "$BACKUPS" | head -n $DELETE_COUNT)
    
    log "将删除 $DELETE_COUNT 个旧备份:"
    echo "$TO_DELETE" | while read -r backup; do
        log "删除: ${backup}"
        rclone purge "${REMOTE_NAME}:${BACKUP_DIR}/${backup}" -v 2>&1 | tee -a "$LOG_FILE"
    done
fi

# ========================
# 日志管理
# ========================
log_header "管理日志文件"

# 保留最新的3个日志文件
find "$LOG_DIR" -name "backup_*.log" -type f | sort -r | awk -v max=$MAX_BACKUPS 'NR>max {print}' | xargs rm -f

log "当前日志文件:"
ls -lh "$LOG_DIR"/backup_*.log 2>/dev/null | tee -a "$LOG_FILE"

# ========================
# 备份完成
# ========================
log_header "备份完成"
log "日志文件: $LOG_FILE"

2. 创建备份目录列表文件

创建/root/backup_directories.txt文件,每行一个要备份的目录:

/opt
# /home  # 注释示例,如需备份取消注释
# /var/www

设置与测试

  1. 添加执行权限:

    chmod +x /root/root_multi_backup.sh
  2. 测试脚本:

    /root/root_multi_backup.sh
  3. 检查日志:

    ls -lh /root/backup_logs/
    tail -f /root/backup_logs/backup_*.log

自动化设置

1panel面板设置

  1. 进入1Panel控制面板
  2. 导航到"计划任务"
  3. 创建新任务:

    • 任务类型:Shell脚本
    • 任务名称:Daily Backup
    • 执行周期:每天
    • 执行时间:建议设置为服务器负载低的时段(如凌晨2点)
    • 脚本内容:

      /root/root_multi_backup.sh

手动设置cron任务(备用方案)

如果使用原生cron,可以添加:

(crontab -l ; echo "0 2 * * * /root/root_multi_backup.sh") | crontab -

高级优化建议

  1. 增量备份:考虑使用rclone sync代替copy进行增量备份
  2. 压缩备份:对大文件目录先压缩再备份
  3. 通知功能:添加邮件或Webhook通知备份结果
  4. 错误处理:对关键步骤添加更详细的错误检查和重试机制
  5. 性能监控:记录备份耗时和传输速度

故障排除

  1. 权限问题

    • 确保脚本以root权限执行
    • 检查rclone配置文件的权限
  2. rclone连接问题

    rclone ls ${REMOTE_NAME}:${BACKUP_DIR}
  3. 空间不足

    rclone about ${REMOTE_NAME}:
  4. 查看详细日志

    journalctl -u cron.service -n 50 --no-pager

标签: 甲骨文云, fu'wu'qi, 备份, Google drive

添加新评论