在上一篇文章中,我们介绍了如何使用 Restic 实现自动备份。
然而,HestiaCP 当前的版本仅支持打包备份,随着时间的推移,这些备份文件的数量不断增加,管理和优化备份过程变得尤为重要。此外,直接备份 /backup
目录无法充分利用 Restic 的增量备份优势。更为复杂的是,HestiaCP 创建的数据库、Cron 配置、SSL 等配置文件分散在不同路径,直接找到原路径再使用 Restic 进行备份显得非常麻烦。
为了解决这些问题,我们可以采用以下策略:
- 将打包后的备份文件解压到另一个目录:这样可以将所有相关配置文件集中管理,便于备份和恢复。
- 使用 Restic 备份新的备份目录:通过备份解压后的目录,Restic 可以更高效地进行增量备份和去重,节省存储空间。
- 恢复时的简便操作:需要导入 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