halo定时备份的方法

在网上查询了一下halo定时备份有三种方案:邮箱和Dropbox,以及github。

1. 备份到QQ邮箱

1.1. 安装邮件发送依赖组件

1.1.1. Centos 7

1
yum install sendmail mailx -y

1.1.2. Centos 8

1
2
3
yum -y install postfix sendmail-cf mailx
service postfix start
sudo systemctl enable postfix

1.2. 修改附件发送大小限制

看下现在邮件的大小限制:

1
sudo postconf message_size_limit
message_size_limit = 10240000

差不多是10M,放大10倍,应该差不多了。

1
sudo postconf -e "message_size_limit = 102400000"

1.3. 获得&编辑备份脚本

1
wget https://raw.githubusercontent.com/iwyang/scripts/master/halo_email_backup.sh

1.3.1. 创建备份文件夹

如果选择将文件备份到临时目录的话,这步可跳过,直接修改脚本即可。我直接跳过了这一步。
1
mkdir -p /home/back

1.3.2. 修改脚本

脚本原来模样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# 进入到备份文件夹
cd /home/back
#压缩网站数据
tar zcvf web_$(date +"%Y%m%d").tar.gz 网站目录
# 导出数据库到备份文件夹内
mysqldump -uroot -p数据库密码 数据库名称 > web_data_$(date +"%Y%m%d").sql
# 以附件形式发送数据库到指定邮箱
echo "Blog date"|mail -s "Backup$(date +%Y-%m-%d)" -a web_data_$(date +"%Y%m%d").sql 收件人邮箱
# 删除本地3天前的数据
rm -rf web_$(date -d -3day +"%Y%m%d").tar.gz web_data_$(date -d -3day +"%Y%m%d").sql
# 登录FTP
lftp ftp地址 -u ftp用户名,ftp密码 << EOF
# 进入FTP根目录
cd ftp根目录文件夹
# 删除3天前备份文件
mrm web_$(date -d -3day +"%Y%m%d").tar.gz
mrm web_data_$(date -d -3day +"%Y%m%d").sql
# 上传当天备份文件
mput web_$(date +"%Y%m%d").tar.gz
mput web_data_$(date -d -3day +"%Y%m%d").sql
bye
EOF

根据实际需求,改成下面模样:

1
vi halo_email_backup.sh
1
2
3
4
5
#!/bin/bash
cd /tmp
tar zcvf web_$(date +"%Y%m%d").tar.gz /root/.halo
echo "Blog date"|mail -s "Backup$(date +%Y-%m-%d)" -a web_$(date +"%Y%m%d").tar.gz 455343442@qq.com
rm -f web_$(date +"%Y%m%d").tar.gz

上面代码中最后的rm -f web_$(date +"%Y%m%d").tar.gz,表示删除本地的临时文件。

1.4. 设置定时任务

1.4.1. 赋予文件执行权限

1
chmod +x /root/halo_email_backup.sh

运行的时候就输入下面的代码即可:./halo_email_backup.sh

1.4.2. 设定自动任务

1
crontab -e
1
01 00 * * * /root/halo_email_backup.sh

意思是每天凌晨0:01运行这个脚本。

2. 备份到Dropbox

2.1. 创建Dropbox应用

首先,需要创建一个Dropbox应用,可以从该网址进行创建:https://www.dropbox.com/developers/apps/create

在这里,应用类型选择Dropbox API,数据存储类型选择App folder,然后命名创建。然后记录下App keyApp secrettoken,下面要用。

2.2. 下载dropbox_uploader.sh

dropbox_uploader 是一个第三方Dropbox备份脚本,首先下载脚本:

1
curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh

然后,为该脚本添加执行权限:

1
chmod +x dropbox_uploader.sh

执行该脚本,绑定APP:

1
./dropbox_uploader.sh

根据提示输入Dropbox应用中的token,然后输入y确认。

之后可以执行下面的命令测试上传,提示Done就是绑定成功了:

1
./dropbox_uploader.sh upload /etc/passwd /backup/passwd.old

2.3. 编写备份脚本

编写定时备份脚本,取名为backup.sh。代码原来模样如下:

1
vi backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
SCRIPT_DIR="/root" #这个改成你存放刚刚下载下来的dropbox_uploader.sh的文件夹位置
DROPBOX_DIR="/backup" #这个改成你的备份文件想要放在Dropbox下面的文件夹名称,如果不存在,脚本会自动创建
BACKUP_SRC="/home/wwwroot /usr/local/nginx/conf" #这个是你想要备份的本地服务器上的文件,不同的目录用空格分开
BACKUP_DST="/tmp" #这个是你暂时存放备份压缩文件的地方,一般用/tmp即可
MYSQL_SERVER="localhost" #这个是你mysql服务器的地址,一般填这个本地地址即可
MYSQL_USER="mysqluser" #这个是你mysql的用户名名称,比如root或admin之类的
MYSQL_PASS="password" #这个是你mysql用户的密码
# 下面的一般不用改了
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tar.gz"
# 备份mysql数据库并和其它备份文件一起压缩成一个文件
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --all-databases > "$NOW-Databases.sql"
echo "数据库备份完成,打包网站数据中..."
tar cfzP "$DESTFILE" $BACKUP_SRC "$NOW-Databases.sql"
echo "所有数据打包完成,准备上传..."
# 用脚本上传到dropbox
$SCRIPT_DIR/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$NOW.tar.gz"
if [ $? -eq 0 ];then
echo "上传完成"
else
echo "上传失败,重新尝试"
fi
# 删除本地的临时文件
rm -f "$NOW-Databases.sql" "$DESTFILE"

根据实际情况改成下面模样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
SCRIPT_DIR="/root"
DROPBOX_DIR="/backup"
BACKUP_SRC="/root/.halo"
BACKUP_DST="/tmp"
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tar.gz"
echo "打包网站数据中..."
tar cfzP "$DESTFILE" $BACKUP_SRC
echo "所有数据打包完成,准备上传..."
$SCRIPT_DIR/dropbox_uploader.sh delete "$DROPBOX_DIR"
$SCRIPT_DIR/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$NOW.tar.gz"
if [ $? -eq 0 ];then
echo "上传完成"
else
echo "上传失败,重新尝试"
fi
rm -f "$DESTFILE"

先用$SCRIPT_DIR/dropbox_uploader.sh delete "$DROPBOX_DIR"删除Dropbox备份文件夹,再上传文件。这样就保证Dropbox永远只有一个最新的备份文件,不用手动删除多余的备份文件了


当然也可以通过脚本设置保留旧数据的时长。如下面一个脚本就是让旧数据在Dropbox保留7天,本地保留10天。(不过觉得没有必要,还是上面的方法简单,下面方法尝试过,老是出现问题,旧数据删除不了,不想折腾了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

# 定义需要备份的目录
WEB_DIR=/home/www # 网站数据存放目录

# 定义备份存放目录
DROPBOX_DIR=/$(date +%Y-%m-%d) # Dropbox上的备份目录
LOCAL_BAK_DIR=/home/backup # 本地备份文件存放目录

# 定义备份文件名称
DBBakName=DB_$(date +%Y%m%d).tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz

# 定义旧数据名称
Old_DROPBOX_DIR=/$(date -d -7day +%Y-%m-%d)
OldDBBakName=DB_$(date -d -10day +%Y%m%d).tar.gz
OldWebBakName=Web_$(date -d -10day +%Y%m%d).tar.gz

cd $LOCAL_BAK_DIR

#使用命令导出数据库
mongodump --out $LOCAL_BAK_DIR/mongodb/ --db bastogne

#压缩数据库文件合并为一个压缩文件
tar zcf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/mongodb
rm -rf $LOCAL_BAK_DIR/mongodb

#压缩网站数据
cd $WEB_DIR
tar zcf $LOCAL_BAK_DIR/$WebBakName ./*

cd ~
#开始上传
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName

#删除旧数据
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/

echo -e "Backup Done!"

2.4. 赋予文件执行权限

1
chmod +x backup.sh

运行的时候就输入下面的代码即可:./backup.sh

2.5. 设置定时任务

1
crontab -e
1
02 00 * * * /root/backup.sh

这样,就可以每天凌晨00:02自动备份到Dropbox了。

2.6. 修改时区

如果你不知道服务器当前时间,可以使用下面的命令,查看当前时间:

1
date -R

修改当前时区为上海(这步未进行):

1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3. 备份到github

3.1. 准备工作

首先当然是在服务器上安装GIt,配置ssh公钥,并且在github上添加服务器ssh公钥。具体过程略。

3.2. 初始化仓库

1
2
3
4
5
6
cd /root/.halo
git init
git remote add origin git@github.com:iwyang/halo.git
git add .
git commit -m "site backup"
git push --force origin master

注意要删除主题文件夹下的.git文件夹,不然的话就无法备份主题了。当然也可以不备份主题,因为主题所有配置选项都在数据库里。如果这样的话,命令要作如下调整:

1
git add application.yaml upload/ db/

3.3. 设置定时任务

3.3.1.编写备份脚本

1
2
cd /root
vi github.sh

脚本原来模样:

1
2
3
4
5
6
7
8
#!/bin/bash
#进入到网站根目录,记得修改为自己的站点
cd /home/xxx.com
#将数据库导入到该目录,这里以mysql为例,passwd为数据库密码,typecho为数据库名称,typecho.sql为备份的数据库文件
mysqldump -uroot -ppasswd typecho > typecho.sql
git add -A
git commit -m "backsite"
git push -u origin master

根据实际情况修改如下:

1
2
3
4
5
6
#!/bin/bash
echo -e "\033[0;32mDeploying updates to github...\033[0m"
cd /root/.halo
git add .
git commit -m "site backup"
git push --force origin master

为了防止服务器里.git文件夹过大,脚本可以作如下调整:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
echo -e "\033[0;32mDeploying updates to github...\033[0m"
cd /root/.halo
rm -rf .git
git init
git remote add origin git@github.com:iwyang/halo.git
git add .
git commit -m "site backup"
git push --force origin master
rm -rf .git

3.3.2. 赋予文件执行权限

1
chmod +x /root/github.sh

3.3.3. 设定自动任务

1
crontab -e
1
03 00 * * * /root/github.sh

意思是每天凌晨0:03运行这个脚本。

3.4. 还原博客

1
git clone git@github.com:iwyang/halo.git .halo

接下来就是配置个 Java 环境,下载个 Halo 运行包,配置域名访问。具体可参考官方文档

4. 总结

halo博客迁移后,最好删除logs文件夹下的日志文件。


5. SCP命令

5.1. 下载文件

从服务器下载文件到本地,在Git Bash执行:

1
scp root@104.224.191.88:/root/.ssh/mysite ssh

意思是将服务器/root/.ssh目录下的mysite文件复制到当前路径下ssh文件夹下。

5.2. 上传文件

从本地上传文件到服务器,在Git Bash执行:

1
scp .halo.zip root@137.220.43.191:/root/

意思是将当前目录下.halo.ip文件上传到服务器/root/目录下

6. wordpress常用命令

附录:wordpress常用mysql命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1.删除数据库
mysqladmin -u root -p drop wordpress
# 2.新建一个空数据库
mysqladmin -u root -p create wordpress
# 3.导入数据
mysql -uroot -p”你的密码” wordpress < 你的数据sql文件
# 4.更新Url
# 4.1.连接数据库
mysql -u root -p
# 4.2. 选择数据库
use wordpress
# 4.3.更新URL
SELECT * FROM wp_options WHERE option_name = 'home';
UPDATE wp_options SET option_value="https://new_url/" WHERE option_name = "home";

SELECT * FROM wp_options WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value="https://new_url/" WHERE option_name = "siteurl";

6. 参考链接