借助云服务器实现hexo全自动部署

Catalogue
  1. 1. 借助云服务器实现hexo全自动部署
    1. 1.1. 云服务器安装Hexo
      1. 1.1.1. 安装git和Node.JS
      2. 1.1.2. 安装Hexo
      3. 1.1.3. 运行Hexo
      4. 1.1.4. 将本地配置好的wiki移动到云服务器
    2. 1.2. 实现到云服务器之间的文件实时同步
      1. 1.2.1. 安装davfs2
      2. 1.2.2. 配置&挂载davfs2
      3. 1.2.3. 通过脚本生成新的文章模板
    3. 1.3. 通过脚本和命令实现全自动化部署到Github Page
      1. 1.3.1. 配置云服务器ssh秘钥连接github
      2. 1.3.2. 一键脚本
      3. 1.3.3. 设置定时任务
    4. 1.4. 参考资料

借助云服务器实现hexo全自动部署

大家好,我是kn0sky,上一篇我们用hexo搭建了wiki主题个人博客,这次我们来讲讲部署hexo文章我们可以如何偷懒。不想直接把站点文件都传到github上,那自己发布hexo文章需要依次执行3条命令,懒惰的我觉得太麻烦了,于是简单写了个脚本将三条hexo命令简化成一条执行脚本命令,但发布文章还是要执行一条命令啊,还是太麻烦了,后来就在想啊,能不能一条命令也不用输入,完全自动发布文章呢,于是有了本文。

本文的实现思路如下:通过云服务器的定时任务以及和云服务器的实时同步文件来实现全自动部署工作。

本文内容分为如下几部分:

  • 云服务器安装hexo
  • 实现与云服务器的文件实时同步
  • 云服务器定时部署到github page

云服务器安装Hexo

安装git和Node.JS

首先通过ssh连接到云服务器,具体操作自行百度

我这里使用的云服务器系统是Ubuntu Linux系统,所以本文以Ubuntu Linux为例进行讲解

Ubuntu Linux默认自带git,所以我们还需要自行安装一下Node.JS:

1
2
3
4
5
6
7
8
$ wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
$ tar -xvf node-v12.16.1-linux-x64.tar.xz
$ sudo mv node-v12.16.1-linux-x64 /usr/local/node-v12
$ sudo ln -s /usr/local/node-v12/bin/node /bin/node
$ sudo ln -s /usr/local/node-v12/bin/npm /bin/npm
# 可使用如下命令检测node是否安装成功
$ node -v
$ npm -v

如果该云服务器是第一次使用git,记得添加一下名称和邮箱

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

安装Hexo

1
2
3
4
$ npm install -g hexo-cli
$ sudo ln -s /usr/local/node-v12/bin/hexo /bin/hexo
# 检测hexo是否安装成功
$ hexo -v

运行Hexo

我们需要先初始化一个hexo目录

1
$ hexo init <floder name>

初始化完成后,文件夹结构如下:

1
2
3
4
5
6
7
8
.
├── _config.yml
├── package.json
├── scaffolds
├── source
| ├── _drafts
| └── _posts
└── themes

其中_config.yml为站点配置文件,themes为主题文件目录

要运行hexo,在hexo的目录下使用如下命令即可:

1
2
3
$ hexo server
# 或者
$ hexo s

启动服务器后,默认在4000端口启动web服务,此时访问<ip>:4000即可访问到当前hexo站点,此时站点里默认会有一篇快速入门的文章帮助你快速熟悉hexo的使用

image-20200316153018470

image-20200316153018470

想将自己的hexo博客设置成wiki样式,可参考我的上篇文章《使用hexo搭建wiki》进行配置

将本地配置好的wiki移动到云服务器

将本地配置好的服务器打包,上传到云服务器,然后解压即可直接使用,有的插件可能要再次npm装一下

实现到云服务器之间的文件实时同步

为了方便我们写文章在本地保存完就直接同步到服务器上,我们可以想办法实现一下文件实时同步,将本地文件夹的修改实时同步到云服务器上,这里有一个现成的解决方案:使用坚果云实时同步文件夹。

这里我们使用坚果云软件,我们的主机上下载好坚果云软件,注册登录,建立一个同步文件夹,这里操作很无脑,就不演示了,接下来讲讲没有图形界面的Linux命令行如何同步坚果云:

坚果云提供WebDav接口,这里可以使用davfs工具去挂载WebDav目录

WebDav:WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GETPOSTHEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。有利于用户间协同编辑和管理存储在万维网服务器文档

总之,就是常用于网盘的一种网络协议。

davfs:一种连接WebDav网盘的工具

安装davfs2

1
$ sudo apt install davfs2

配置&挂载davfs2

编辑配置文件/etc/davfs2/davfs2.conf,找到如下内容将注释去掉,将0改成1

1
# ignore_dav_header 0

编辑配置文件/etc/davfs2/secrets,在配置文件最后添加如下内容:

1
https://dav.jianguoyun.com/dav 你的坚果云账户 你的webdav应用密码

坚果云WebDav应用密码获取方式:

  1. 坚果云官网登录你的坚果云账号
  2. 依次点击账户信息安全选项,即可看到添加WebDav应用的按钮
  3. 点击添加应用,名称随意输入,然后就会自动生成一个密码

然后进行挂载

1
$ sudo  mount.davfs https://dav.jianguoyun.com/dav 你想要挂载的目录

接下来访问该目录即可发现目录里的内容已经和我们坚果云账号创建的实时同步文件夹同步了

接下来,我们将我们的hexo主目录source文件下的_post目录放到我们的坚果云实时同步文件夹下,然后在云服务器软链接(ln -s)到云服务器hexo目录的该位置即可,过于简单就不演示了

到此为止,我们在本地写完文章保存后,云服务器会自动同步文章,接下来在云服务器后台启动hexo s即可实时展示博客更新的内容了:

1
2
$ cd 你的hexo的目录
$ nohup /bin/hexo server >> ~/hexo.log 2>&1 &

命令含义详见参考资料

通过脚本生成新的文章模板

每次创建新的文章都需要通过命令hexo new name进行,hexo程序为我们生成一个文章模板,但是如果我想只在远程服务器上安装hexo,不想在本地安装hexo呢,这里我们通过一个脚本来实现hexo new的功能,这样即使本地没有hexo,也能写hexo的文章,这里直接给出代码了:

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
#!/usr/bin/python
import sys
import time
import os


if not sys.argv[1]:
print("请输入文章标题")
print("例如:python hexonew.py title")
sys.exit()

title = sys.argv[1]
time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

header = f"""
---
title: {title}
toc: true
date: {time}
tags:
categories:
---
"""

footer = """
## 参考资料

> - []()
> - []()
"""

text = header + '\n' + footer
url = os.getcwd() + '/' + title + '.md'

with open(url,'w') as f:
f.write(text)

通过脚本和命令实现全自动化部署到Github Page

为了全自动部署到Github Page,我们可以使用Linux的定时任务,比如每天晚上12点进行一次部署,部署的命令我们写成脚本方便一键执行,这样一来,我们只需要写完内容,然后保存,就能全自动部署到我们的博客上了,而且我们可以在任何机器上写文章,甚至不需要安装任何环境,非常方便。

配置云服务器ssh秘钥连接github

生成ssh秘钥

1
$ ssh-keygen -t rsa -C "github邮箱账号"

找到生成的秘钥,将公钥内容复制,在github上个人设置SSH and GPG keysNew SSH key添加秘钥

添加完秘钥可使用如下命令测试:

1
$ ssh -T git@github.com

这里我遇到了一个错误:git@github.com: Permission denied (publickey),解决方案我放在参考资料里了。

连接成功的话,会返回类似如下字样:

1
Hi kn0sky! You've successfully authenticated, but GitHub does not provide shell access.

此时我们到hexo主目录使用一下hexo d命令试一试,此时我们无需输入账号密码即可成功部署

一键脚本

使用一键部署脚本便于定时任务的设置,这里使用shell脚本进行部署

不知道什么原因,云服务器的hexo s启动服务器不会因为坚果云同步目录的变更而更新内容,所以这里也定时重启好了

PS:目录地址需要根据自己的情况进行修改

重启脚本:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
cd ~/hexo-wiki
num=`ps -elf | grep hexo | grep -v grep | wc -l`
if [ ${num} -ne 0 ];
then
ps -elf | grep hexo | grep -v grep | awk '{print $4}' | xargs kill -9
echo "[+]已杀死进程" >> ~/hexo.log
fi
echo "--------------" >> ~/hexo.log
echo `date -d now` >> ~/hexo.log
nohup /bin/hexo server -p 30808 >> ~/hexo.log 2>&1 &

部署脚本:

1
2
3
4
5
6
#!/bin/bash
cd ~/hexo-wiki
nohup hexo clean && hexo g && hexo d >> ~/crontab_script/hexo_auto_depoly.log 2>&1 &
echo '-----------------------'
echo `date -d 'now'` >> ~/crontab_script/blog_auto_deploy.log
echo "[+]完成部署!" >> ~/crontab_script/blog_auto_deploy.log

这里使用git进行自动部署,git会自动检测提交的内容同上次提交相比是否有变更,如果有,就部署,反之,不部署。

设置定时任务

使用crontab工具设置定时任务,使用如下命令进入编辑页面

1
$ crontab -e

在配置的最底下添加如下内容:

1
2
3
4
# 每天9点12分的时候运行部署脚本
12 9 * * * bash ~/crontab_script/blog_auto_deploy.sh
# 每15分钟运行一次hexo 服务重启脚本
*/15 * * * * bash ~/crontab_script/blog_auto_server.sh

到此,基本实现hexo全自动部署功能!

希望对读完的你有所帮助。

参考资料