当前位置: 首页 > web >正文

Halo站点全站定时备份并通过邮箱存储备份

脚本实现思路

  • 编写脚本将MySql数据导出为.sql文件与网站根目录.halo文件一起打包压缩通过附件的方式发送给指定的备份邮箱,从而实现邮箱存储备份

  • 由于打包的文件可能存在文件过大,因为邮箱附件对大小有限制,因此设置了将其打包成压缩分卷的形式,每次备份打包成几个压缩分卷,就发送几个邮件,即每个邮件对应一个压缩分卷附件,最后需要备份时可以下载完毕后手动合并成一个压缩文件

  • 该思路和serv00 ssh登录保活脚本-邮件通知版差不多

需要安装的依赖

  • 与邮箱管理的有关的软件包 msmtp 和 mutt

  • 与定时任务有关的软件包

安装msmtp 和 mutt

sudo apt-get install msmtp mutt -y

sudo apt install msmtp ca-certificates

配置msmtp 和 mutt

新建专门用于备份的用户

建议新建一个用户专门用来操作备份,主要是为了防止发生意外操作,因为后面配置的脚本中有删除操作,如果你不小心填错了备份目录,root用户误删除比较危险

创建用户名

useradd -m forbackup

给用户设置密码

passwd forbackup

切换到forbackup

su forbackup

切换到forbackup家目录

cd /home/forbackup

配置mutt和msmtp

nano .muttrc

填入如下内容,注释部分替换成自己的

set sendmail="/usr/bin/msmtp"
set use_from=yes
# 发件人名字
set realname="Logdict Backup Service"
# 发件人地址
set from=xxx.com 
set envelope_from=yesset charset="utf-8"
set send_charset="utf-8"
set content_type = "text/html\;charset=utf-8"

nano .msmtprc

填入如下内容, 注释部分替换成自己的

# Set default values for all following accounts.
defaults
auth           on
# 是否开启tls
tls            on
# 如果是tls_starttls on
tls_starttls  off 
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.logaccount        alimail
# 填入发件箱服务商SMTP地址
host           smtp.qiye.aliyun.com
# SMTP端口号
port           465
# 邮箱账号
from           xx.com
# 邮箱账号
user           xx.com
# 邮箱账号密码或授权码
password     xx  # Set a default account
account default : alimail

赋予执行权限

chmod 600 msmtprc

发送测试邮箱

echo "Hello, this is a test email." | msmtp -a default xxxxx@qq.com

如果没错误就是代表成功了,检查收件邮箱收件箱,或者发件邮箱的已发送邮件,看是否有邮件,一般发件邮箱是发不出去的,因为被识别成了垃圾邮件退信了

编写脚本

创建备份目录

mkdir -p /home/forbackup/halo_backup

把标有手动设置注释部分,换成自己的即可,然后创建脚本nano halo_backup.sh

主要配置下面

  • 备份存储的位置

  • .halo2文件夹的路径

  • 数据库信息,用户名和密码

  • 接受备份的邮箱

    #!/bin/bash
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin
    export PATH
    export LANG=C

    ----------------------------------手动配置部分-----------------------------------------------------

    halo_bak_name=“halo_backup” # 生成的备份文件名
    backup_path=“/home/forbackup/halo_backup” # 备份存储路径
    halo2_path=“/home/halo/.halo2” # .halo2的路径
    database=“halo” # 数据库名
    u=“xxxxxxxxx” # 数据库用户
    p=“xxxxxxxxx” # 数据库密码(建议使用环境变量)
    mail_address=“xxxxxxxxxqq.com” # 接受备份的邮箱

    ----------------------------------清理备份文件夹-----------------------------------------------------

    echo “开始清理备份文件夹”
    rm -rf “${backup_path}”/* || { echo “清理备份文件夹失败!”; exit 1; }

    清理mutt临时文件

    cat /dev/null > ~/sent
    echo “清理备份文件夹结束”

    ----------------------------------自动创建目录-----------------------------------------------------

    mysql_backup_path=“ b a c k u p p a t h / m y s q l b a k " h a l o b a c k u p p a t h = " {backup_path}/mysql_bak" halo_backup_path=" backuppath/mysqlbak"halobackuppath="{backup_path}/halo_bak”
    datetime=$(date +%F_%H%M)

    创建备份目录

    if ! mkdir -p “ m y s q l b a c k u p p a t h " " mysql_backup_path" " mysqlbackuppath""halo_backup_path”; then
    echo “创建备份目录失败!”
    exit 1
    fi

    ----------------------------------配置校验-----------------------------------------------------

    检查邮件地址是否为空

    if [ -z “$mail_address” ]; then
    echo “邮件地址不能为空,请设置接收邮件地址。”
    exit 1
    fi

    ----------------------------------备份数据库-----------------------------------------------------

    halo_mysql_bak_name=“halo_sql_bak- d a t e t i m e . s q l . g z " e c h o " 开始导出 S Q L 文件并压缩 " i f ! / b i n / m y s q l d u m p − u " {datetime}.sql.gz" echo "开始导出SQL文件并压缩" if ! /bin/mysqldump -u " datetime.sql.gz"echo"开始导出SQL文件并压缩"if!/bin/mysqldumpu"u” -p" p " − h 127.0.0.1 − R − − o p t " p" -h 127.0.0.1 -R --opt " p"h127.0.0.1Ropt"database" | gzip > “ m y s q l b a c k u p p a t h / {mysql_backup_path}/ mysqlbackuppath/{halo_mysql_bak_name}”; then
    echo “数据库备份失败,请检查 mysqldump 命令或数据库连接”
    exit 1
    fi
    echo “数据库导出并压缩结束”

    ----------------------------------.halo2目录与SQL文件合并压缩-----------------------------------------------------

    echo “开始分卷压缩 .halo2 与 SQL 文件”
    if ! tar -jpcf - “ h a l o 2 p a t h " " halo2_path" " halo2path""{mysql_backup_path}/ h a l o m y s q l b a k n a m e " ∣ s p l i t − b 8 m − − n u m e r i c − s u f f i x e s = 1 − " {halo_mysql_bak_name}" | split -b 8m --numeric-suffixes=1 - " halomysqlbakname"∣splitb8mnumericsuffixes=1"{halo_backup_path}/ h a l o b a k n a m e − {halo_bak_name}- halobakname{datetime}.tar.bz2.part-”; then
    echo “分卷压缩失败,请检查 tar 和 split 命令”
    exit 1
    fi
    echo “分卷压缩结束”

    计算分卷数量

    total_parts=$(ls h a l o b a c k u p p a t h / {halo_backup_path}/ halobackuppath/{halo_bak_name}-${datetime}.tar.bz2.part* | wc -l)
    echo “本次总共分卷数: $total_parts”

    ----------------------------------发送备份文件-----------------------------------------------------

    send_backup_email() {
    local file=“$1”
    local total_parts=“$2”
    local mail_address=" 3 " l o c a l f i l e n a m e f i l e n a m e = 3" local file_name file_name= 3"localfilenamefilename=(basename “ f i l e " ) l o c a l s u b j e c t = " file") local subject=" file")localsubject="file_name”
    local content=“本次备份共计 ${total_parts} 卷; 当前第 ${file_name} 卷”

    # 发送邮件
    if ! printf "%s" "$content" | mutt -s "$subject" "$mail_address" -a "$file"; thenecho "发送文件 $file 失败,请检查邮件配置或连接"return 1
    fi
    echo "发送: $file_name to $mail_address"
    

    }

    遍历并发送所有分卷

    for file in h a l o b a c k u p p a t h / ∗ ; d o i f [ − f " {halo_backup_path}/*; do if [ -f " halobackuppath/;doif[f"file" ]; then
    send_backup_email “ f i l e " " file" " file""total_parts” “$mail_address” || { echo “发送失败: $file”; exit 1; }
    fi
    done
    echo “全部发送完毕”

    ----------------------------------清理工作-----------------------------------------------------

    清理mutt临时文件

    cat /dev/null > ~/sent

    清理备份文件夹

    echo “开始清理备份文件夹”
    rm -rf “${backup_path}”/* || { echo “清理备份文件夹失败!”; exit 1; }
    echo “清理备份文件夹结束”

    ----------------------------------结束脚本-----------------------------------------------------

    echo “执行结束”

if ! tar -jpcf - "$halo2_path" "${mysql_backup_path}/${halo_mysql_bak_name}" | split -b 8m --numeric-suffixes=1 - "${halo_backup_path}/${halo_bak_name}-${datetime}.tar.bz2.part-"; then

该部分根据邮箱不同可以将8M改成更大,QQ邮箱最大附件50M,可以设置成40M,也就是每一个压缩卷是40M

使用内置H2数据库的,可以不用填MYSQL数据库信息

其他数据库非MySQL,可以自己查找数据库导出命令替换if ! /bin/mysqldump -u "$u" -p"$p" -h 127.0.0.1 -R --opt "$database" 这部分

脚本测试

上面编写脚本完毕后,可以运行sh halo_backup.sh

以下是正确运行后的界面输出

收件邮箱会收到邮件,如图

合并收到的附件

关于邮件附件名和标题名的说明

halo_bak_archive-2024-11-25_0844.tar.bz2.part-18

表示备份于2024-11-25_0844,时间也是唯一标识;part-18 表示第18卷

邮件内容里会告诉你一共有多少卷

根据备份时间是唯一标识和part是第几卷,把所有的邮件下载下来放到一个文件夹,如图

Windows CMD命令执行,最简单的方法,在地址栏输入cmd回车进入命令行

执行如下命令将所有分卷合并成一个压缩文件

copy /b halo_bak_archive-2024-11-24_1400.tar.bz2.part-* halo_bak_archive-2024-11-24_1400.tar.bz2

如果你一个文件夹下只有一个时间的备份

直接运行copy /b * 合并后文件名.tar.bz2 也可

合并后的文件直接Windows一般的压缩文件就可以解压缩了,里面分别嵌套了好几层压缩文件需要解压(这个是我脚本没写好),解压出来就是.halo2目录和sql文件的备份了,到时候恢复的时候上传.halo2目录和恢复数据库即可

配置定时任务

安装定时任务软件包(一般debian都内置)

apt-get install cron

配置隔三天备份一次

创建定时任务

crontab -e

输入

0 5 */3 * * sh /home/forbackup/halo_backup.sh

定时任务怎么设置可以参考 Linux Crontab 定时任务

设置好后有一个验证定时任务执行时间的工具 crontab执行时间计算

巧用邮箱收信规则

邮箱一般都带有收信规则,所以我设置了如图所示,当收到的邮箱主题包含xxxxx,自动归档到博客备份文件夹

后记

如果嫌麻烦的(其实就装几个软件包,改几处)直接买官方的备份插件,另外这个其实编成halo插件更简单,不过我懒得看文档

当然你的站点如果几G十几G那算了,还是用官方的插件吧,估计有的邮箱会限制一天发送多少带有附件的邮件

对于附件那个大小我是设置8M,如果你的邮箱服务商对SMTP附件大小更大,可以自行修改,因为我的邮箱是15M,官方建议是8M,因为经过编码后会溢出到>8M

halo如果你不在本站存储图片等数据,其实容量占大头的是backup备份目录(尤其是你执行过备份)和插件plugins插件目录,以及themes主题目录,这些目录完全可以不用备份,插件只读取所有插件的名称输出存储成附件即可,主题目录同理;到时候自己找对应版本插件下载手动传上去即可。这部分脚本可以自己改一下

http://www.xdnf.cn/news/12851.html

相关文章:

  • 【C++】25. 哈希表封装unordered_map和unordered_set
  • Ubuntu系统多网卡多相机IP设置方法
  • 【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
  • MCP笔记:介绍和原理
  • Web3 借贷与清算机制全解析:链上金融的运行逻辑
  • 基于安卓的线上考试APP源码数据库文档
  • MAC-安装Homebrew、安装Git
  • c++ decltype关键字
  • 二叉数-100.相同的树-力扣(LeetCode)
  • LLMs 系列科普文(3)
  • 用于机器学习的 Podman 简介:简化 MLOps 工作流程
  • 从零开始的云计算生活——番外,实战脚本。
  • 【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
  • Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
  • 04.管理表
  • Linux系统的CentOS7发行版安装MySQL80
  • Spring Boot 整合 Apache Flink 的详细过程
  • 二、即时通讯系统设计经验
  • Flink CDC —部署模式
  • 微软PowerBI考试 PL300-使用 Power BI 准备数据以供分析【提供练习数据】
  • 【iOS】多线程NSOperation,NSOperationQueue
  • 【C++系列】模板类型特例化
  • DeepSeek12-Open WebUI 知识库配置详细步骤
  • 音视频——I2S 协议详解
  • 【LeetCode 热题100】网格路径类 DP 系列题:不同路径 最小路径和(力扣62 / 64 )(Go语言版)
  • 【python深度学习】Day 48 PyTorch基本数据类型与操作
  • ArkUI-X与Android桥接通信之消息通信
  • STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
  • PHP环境极速搭建
  • 【Blender】Blender 通过 Python 实现模型大小压缩