在上一篇文章中,我们介绍了如何使用 Restic 实现自动备份。

HestiaCP 安装 Restic 并使用 Autorestic 实现自动增量备份
HestiaCP 自带的备份功能提供了强大的数据保护功能,可以轻松地对用户数据进行全量备份。其实现方式是打包整个用户目录下的所有文件,这对于大多数用户来说已经足够。但如果你需要更高效、灵活的备份方式,尤其是增量备份,那么使用 Restic 进行备份将是一个更好的选择。 restic · Backups done right! 增量备份相比全量备份,能够只备份发生变化的数据,从而大幅减少备份数据量,节省存储空间并提高备份速度。虽然 HestiaCP 在未来的版本中计划内建对 Restic 增量备份的支持,但它仍然局限于备份位于用户目录下的文件。为了实现更灵活的备份,我们可以通过安装 Restic 和配置 Autorestic 来实现自动化增量备份,并且不仅限于用户目录的文件。 在本篇教程中,我们将详细介绍如何在 HestiaCP 中安装 Restic、配置 Autorestic,并通过定时任务实现自动增量备份。 安装使用 Restic 安装 Restic 的安装很简单。 sudo apt update sudo apt

然而,HestiaCP 当前的版本仅支持打包备份,随着时间的推移,这些备份文件的数量不断增加,管理和优化备份过程变得尤为重要。此外,直接备份 /backup 目录无法充分利用 Restic 的增量备份优势。更为复杂的是,HestiaCP 创建的数据库、Cron 配置、SSL 等配置文件分散在不同路径,直接找到原路径再使用 Restic 进行备份显得非常麻烦。

为了解决这些问题,我们可以采用以下策略:

  1. 将打包后的备份文件解压到另一个目录:这样可以将所有相关配置文件集中管理,便于备份和恢复。
  2. 使用 Restic 备份新的备份目录:通过备份解压后的目录,Restic 可以更高效地进行增量备份和去重,节省存储空间。
  3. 恢复时的简便操作:需要导入 HestiaCP 时,只需将新的备份目录重新打包一次,再导入即可,实现备份与恢复的无缝衔接。

本文将详细介绍如何编写和配置一个 Bash 脚本,自动化处理 HestiaCP 的备份文件,并为后续使用 Restic 进行增量备份做好准备。

编写 Bash 脚本

创建一个名为 backup_extractor.sh 的脚本文件,并将以下内容粘贴进去:

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# 定义源目录、目标目录和日志文件
BACKUP_DIR="/backup"
DEST_DIR="/backup_restic"
LOG_FILE="${DEST_DIR}/backup_log.txt"

# 创建日志文件和目标目录(如果没有的话)
mkdir -p "$DEST_DIR"
touch "$LOG_FILE"

# 记录脚本开始时间
{
    echo "------ $(date '+%Y-%m-%d %H:%M:%S') ------"
    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 开始备份文件解压..."
} >> "$LOG_FILE"

# 遍历所有前缀,只处理 .tar 文件
find "$BACKUP_DIR" -maxdepth 1 -type f -name "*.tar" | while read -r FILE; do
    # 提取前缀(假设文件名格式为 prefix.YYYY-MM-DD_HH-MM-SS.tar)
    PREFIX=$(basename "$FILE" | cut -d '.' -f1)

    # 查找该前缀的最新备份文件
    LATEST_BACKUP=$(find "$BACKUP_DIR" -maxdepth 1 -type f -name "${PREFIX}.*.tar" -printf "%T@ %p\n" | sort -n | tail -1 | cut -d' ' -f2)

    # 检查是否找到了备份文件
    if [ -z "$LATEST_BACKUP" ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] 没有找到备份文件:${PREFIX}!" >> "$LOG_FILE"
        continue
    fi

    # 设置目标解压目录
    TARGET_DIR="${DEST_DIR}/${PREFIX}_backup"

    # 清空目标目录以确保只包含最新备份的内容
    if [ -d "$TARGET_DIR" ]; then
        rm -rf "${TARGET_DIR:?}/"*
        if [ $? -ne 0 ]; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 清空目录 ${TARGET_DIR} 失败!" >> "$LOG_FILE"
            continue
        fi
    else
        # 如果目标目录不存在,则创建它
        mkdir -p "$TARGET_DIR"
        if [ $? -ne 0 ]; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 创建目录 ${TARGET_DIR} 失败!" >> "$LOG_FILE"
            continue
        fi
    fi

    # 解压最新备份文件到目标目录
    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 解压 ${LATEST_BACKUP} 到 ${TARGET_DIR}..." >> "$LOG_FILE"
    if tar -xvf "$LATEST_BACKUP" -C "$TARGET_DIR" >> "$LOG_FILE" 2>&1; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 备份文件 ${LATEST_BACKUP} 已解压并存放到 ${TARGET_DIR}" >> "$LOG_FILE"
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 解压文件 ${LATEST_BACKUP} 时发生错误!" >> "$LOG_FILE"
    fi
done

# 记录脚本结束时间
{
    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 备份解压任务完成。结束时间:$(date '+%Y-%m-%d %H:%M:%S')"
    echo "-----------------------------------"
} >> "$LOG_FILE"

赋予脚本执行权限

确保脚本具有可执行权限:

chmod +x /path/to/backup_extractor.sh

测试脚本

在将脚本设置为自动运行之前,建议手动执行一次,确保其正常工作:

/path/to/backup_extractor.sh

配置 Cron 任务

为了每天自动运行脚本,可以使用 Cron 定时任务。在打开的编辑器中,添加以下行:

0 6 * * * /path/to/backup_extractor.sh

包含的标签:

教程, HestiaCP

最后更新: December 12, 2024