在现代网站运维中,数据的安全性至关重要,尤其是对于像Halo博客系统这样重要的平台,定期备份更是不可或缺。为了确保数据的完整性和可恢复性,今天我们将探讨如何使用阿里云提供的ossutil工具,将Halo博客系统的数据备份并安全地上传至阿里云OSS,从而为您的业务保驾护航。

虽然Halo博客系统的插件市场提供了专门的备份插件,但这些插件通常需要付费订阅。为了节省开支,并且更灵活地管理备份过程,我们可以通过编写脚本自行实现备份,将数据上传到阿里云 OSS。这不仅避免了额外的费用,还能够根据自己的需求定制备份流程,实现高效且经济的解决方案。

ossutil 安装与使用

阿里云 OSS 提供了多种使用方法,除了通过网页手动操作外,还有丰富的工具和 SDK 可供选择。在本文中,我们将使用 ossutil 工具来完成操作。ossutil 是一款功能强大的命令行工具,适用于各种场景。关于安装细节,可以参考阿里云官网的官方文档。以下是我在Ubuntu系统上的安装过程:

  1. 安装ossutil
sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash
  • 安装过程中,需要使用解压工具(unzip、7z)解压软件包,请提前安装其中的一个解压工具。
  • 安装完成后,ossutil会安装到/usr/bin/目录下。

执行上述命令后,出现如下结果,说明ossutil工具安装成功。

  1. 配置ossutil
    • 输入配置命令。
ossutil config

根据提示设置配置文件路径。

  • 请输入配置文件名,文件名可以带路径(默认为:/home/user/.ossutilconfig,回车将使用默认路径
  • 如果用户设置为其它路径,在使用命令时需要将--config-file选项设置为该路径)
  • 根据提示设置工具的语言。请输入语言CHEN
  • 配置AccessKey IDAccessKey SecretSTSToken设置为空。
  1. 验证是否已成功安装ossutil
ossutil

如果屏幕中输出ossutil所有支持的命令,如下图所示,表明已成功安装ossutil

了解Halo博客系统目录情况

根据不同的Halo版本,工作目录的名称可能有所不同,例如 .halo2 等。在这里,我们以Halo 2.18.0版本为例,该版本通过1panel安装,并且使用 MySQL 数据库。 而1panel也是通过 Docker Compose 安装 的。如下图所示:

  • data目录:是存放网站的所有数据,包括主题,日志文件、插件等。如下图所示:

  • .env:保存着一些环境变量,如数据库账号/密码,数据连接地址等等。
  • docker-compose.yml: 是拉起程序的主要文件。

在了解Halo的目录结构后,我们可以确定,只需备份 Halo-blog 目录下的所有文件,就能完整备份网站的所有资源,除了数据库文件。数据库文件需要单独进行备份,以确保数据的完整性和安全性。

编写脚本

#!/bin/bash

# 日期变量
dd=$(date +%Y-%m-%d)
dd7=$(date -d'-7 day' +%Y-%m-%d)

# 目录和文件路径
backup_dir="/opt/1panel/backup/app/halo"
halo_dir="/opt/1panel/apps/halo/halo-blog"
backup_file="$backup_dir/halo-$dd.tar.gz"
oss_bucket="oss://didiplus/halo-blog-backup"

# 创建备份目录(如果不存在)
mkdir -p "$backup_dir"

# 日志记录函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$backup_dir/backup.log"
}

log "执行 Halo 文件备份!备份时间: $dd"

# 压缩 Halo 文件
if tar czf "$backup_file" "$halo_dir"; then
    log "Halo 文件备份成功!文件已压缩:$backup_file"
else
    log "Halo 文件压缩失败!"
    exit 1
fi

log "执行文件上传至阿里云 OSS!上传时间:$dd"

# 上传文件至阿里云 OSS
if ossutil64 cp "$backup_file" "$oss_bucket/$dd/" -f; then
    log "Halo 备份文件上传至阿里云 OSS 成功!"
else
    log "Halo 备份文件上传至阿里云 OSS 失败!"
    exit 1
fi

log "开始删除7天前的本地备份文件和 OSS 文件..."

# 删除本地7天前的备份文件
find "$backup_dir" -mtime +7 -type f -name "*.gz" -exec rm -f {} \; \
    && log "本地7天前的备份文件删除成功!" \
    || log "本地7天前的备份文件删除失败!"

# 删除阿里云 OSS 上7天前的备份目录
if ossutil64 rm "$oss_bucket/$dd7/" -rf; then
    log "阿里云 OSS 上7天前的备份目录删除成功!"
else
    log "阿里云 OSS 上7天前的备份目录删除失败!"
fi

log "备份流程完成。"

注意:如果使用子账号 ak/sk,对象存储访问控制 ACL 策略为私有,需要给子账号授权策略 AliyunOSSFullAccess

执行成功,日志如下所示:

通过命令查看OSS,Halo博客系统的备份文件已经上传成功了。如下图所示

定时执行

crontab -e 后输入定时执行命令,每天凌晨 2 点执行,路径跟进实际自行修改。

0 2 * * * bash /root/halo-blog-backup.sh 

:wq 保存退出即可。
这样就完成了定时备份到阿里云对象存储,迁移的时候下载解压,再用 docker-compose 启动即可,再也不怕丢失了~

结论

通过本文介绍的步骤,您可以轻松地备份 Halo 博客系统的数据并将其安全地存储在阿里云 OSS 中。这不仅确保了数据的安全性,还为未来的恢复操作提供了保障。结合自动化脚本,您可以进一步简化备份流程,减少手动操作的负担。