之前都是手动进行备份即麻烦又不节能,于是今天心血来潮写了个脚本挂服务器上一到时间让它自己备份到GitHub。话不多说,具体做法如下

头图来源:青色の風-みふる-pixiv


初始化本地仓库

既然要将备份上传到GitHub,那就得先建一个仓库(ps:记得将仓库设置为private),这部分具体过程随便一搜就有于是省略。仓库目录大致如下

.
├── .git
├── backup.log #备份日志
├── db_bak #数据库备份(sql文件)所在路径
│   └── ***.sql
├── README.md
└── wwwroot
    └── yukinekoneko.com
        ├── config.inc.php
        ├── admin
        ├── index.php
        ├── install
        ├── install.php
        ├── LICENSE.txt
        ├── usr  #usr文件夹所在路径
        └── var

编写脚本

对于typecho博客,我们主要备份的就两样东西:数据库和usr文件夹,将这两样备份起来推送至远程仓库即可。为了方便调试排错,可将当前脚本执行动作输出打印至日志文件(backup.log)。采用https的方式推送至远程仓库(这里用ssh的话可能会更方便一点)

#! /bin/bash
cd 你本地仓库路径

INTERVAL=21 #删除现在距之前指定间隔天数的数据库备份
DB_BAK_DIR= 数据库备份(sql文件)所在路径
BLOG_BAK_DIR= usr文件夹所在路径
DATE=`date +%Y/%m/%d` #当前系统时间
DB_USER= 数据库账户
DB_PWD= 数据库密码
DATABASE= 所要备份的数据库(就是typecho所用的数据库)
DEL_DATE=`date -d "${DATE} -${INTERVAL} day" +%Y/%m/%d` 

#数据库备份
echo "-------$(date +%F_%T) start-------">>backup.log
mysqldump -u${DB_USER} -p${DB_PWD} ${DATABASE}>${DB_BAK_DIR}/data_backup_${DATE}.sql
echo "--- data backup completed">>backup.log

#删除早期的数据库备份
if [ -a "${DB_BAK_DIR}/data_backup_${DEL_DATE}.sql" ];then
    rm -f ${DB_BAK_DIR}/data_backup_${DEL_DATE}.sql
    echo "---delete data_backup_${DEL_DATE}.sql">>backup.log
fi

#推送至远程仓库
echo "---push to remote repository">>backup.log
git add ${DB_BAK_DIR}
git add ${BLOG_BAK_DIR}

echo `git commit -m "bak-${DATE}"`>>backup.log

echo `git push -u origin main`>>backup.log

echo "---git push completed">>backup.log

即使配置了GitHub账户和邮箱每次推送至远程仓库Github都还会再请求输入账户和Token,此时可以在GitHub配置中添加$ git config --global credential.helper store一项,这样只需输入一次用户名和Token之后就无需再输入

使用crontab制定定时任务

在编写好脚本之后接下来的就是重头戏了,关于crontab的用法这里有一篇文章讲得很仔细crontab 定时任务
做法就是输入命令$ crontab -e来设定你所需执行的定时任务,具体格式如下:

  • 第1列分钟0~59
  • 第2列小时0~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~7(0和7表示星期天)
  • 第6列要运行的命令
    至于备份的频率按各自喜好设定即可,我更博的频率比较佛系所以就设定一周执行一次备份
0 11 * * 3 /root/backup.sh #每周三十一点执行脚本

这里我是将备份脚本放在了根路径。设定好定时任务后重启一下crontab

systemctl restart crond.service

备份后通知(可做可不做)

这一步主要是通过在IFTTT上挂个webhook,这样每次自动备份到GitHub的时候能够通知你博客已经备份完成。

创建你的Applet

步骤非常简单,当然首先你需要有一个IFTTT帐号,没有的话快速申请一个。
进入IFTTT页面后单击右上角的create就能开始制定Applet了。
点进来后是这样一个页面
点击If This后面的Add来设置所要监听的Action,搜索github
Search a service
点进去之后会让你选择Action,我们需要的是仓库每次有新的commit时通知我们,所以这里我们选择Any new commit
Input repository name
输入仓库的名称后我们要监听的Action就设定好了,之后就是设置触发事件了,点击Then That后面的Add来设置所要触发的事件。可以选择邮箱、短信等,亦或者你愿意折腾的话也可以是其他任意你希望接收通知的方式,比较自由。具体做法就跟之前类似了,选择邮箱的话则会直接使用你IFTTT帐号所绑定的邮箱,邮件内容可以自定义,也能使用预设的变量(如commit message等)。
创建完Applet后,点击大大的connect激活它即可。
激活Applet

enjoy!

Last modification:September 4th, 2023 at 10:12 pm
If you think my article is useful to you, please feel free to appreciate