侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 703 篇文章
  • 累计创建 60 个标签
  • 累计收到 24 条评论

Hexo 部署 - 给 Halo 添加一个笔记本

张种恩
2022-01-25 / 0 评论 / 0 点赞 / 81 阅读 / 4,083 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

有朋友好奇我博客上的笔记本是怎么弄的,其实它就是另外部署了一个 Hexo 站点应用了一个树状结构的主题。

这里简单记录一下部署流程。


安装 Node

这里我们直接在 NodeJS 官网下载 Linux 二进制包安装:

$ wget https://npmmirror.com/mirrors/node/v16.13.2/node-v16.13.2-linux-x64.tar.xz

解压到一个目录,我习惯把程序部署在 /opt/apps 下:

$ tar xf node-v16.13.2-linux-x64.tar.xz -C /opt/apps/

为方便后续的版本升级给它做个软链接:

$ cd /opt/apps
$ ln -s node-v16.13.2-linux-x64 node

将二进制目录加到 PATH 变量:

$ echo 'export PATH=/opt/apps/node/bin:$PATH' >> /etc/profile
$ source /etc/profile

查看一下 node 的版本确认可以使用 node 命令了:

$ node --version 
v16.13.2

安装 Hexo

Hexo 是通过 npm 安装的,为加快安装速度我们可以设置一下 npm 的国内源:

$ npm config set registry http://registry.npm.taobao.org

该项配置会被保存到 ~/.npmrc

$ cat ~/.npmrc 
registry=https://registry.npm.taobao.org/

Hexo 是作为 Node 的一个模块安装的,对于没有特殊要求的同学来说直接全局安装它就行了:

$ npm install -g hexo-cli

安装完后我们就可以使用 hexo 命令了,它的二进制文件实际上在 Node 的安装目录的 bin 目录下:

$ which hexo 
/opt/apps/node/bin/hexo

$ hexo -V
hexo-cli: 4.3.0
os: linux 3.10.0-1160.45.1.el7.x86_64 CentOS Linux 7 (Core)
node: 16.13.2
v8: 9.4.146.24-node.14
uv: 1.42.0
zlib: 1.2.11
brotli: 1.0.9
ares: 1.18.1
modules: 93
nghttp2: 1.45.1
napi: 8
llhttp: 6.0.4
openssl: 1.1.1l+quic
cldr: 39.0
icu: 69.1
tz: 2021a
unicode: 13.0
ngtcp2: 0.1.0-DEV
nghttp3: 0.1.0-DEV

初始化站点

我们可以选择一个目录作为站点目录,我这里在 /opt/apps 下进行初始化:

$ hexo init note-site
INFO  Cloning hexo-starter https://github.com/hexojs/hexo-starter.git
INFO  Install dependencies
INFO  Start blogging with Hexo!

执行完后会在当前目录下生成一个 note-site 目录,其结构如下:

$ ls note-site/
_config.landscape.yml  _config.yml  node_modules  package.json  package-lock.json  scaffolds  source  themes

到这里 Hexo 其实已经基本安装完成了,后面我们进行一些基本的优化配置操作。

设置主题

Hexo 作为一个老牌开源博客站点,它提供了丰富的主题插件,主题列表可见:

我这里选定的就是名为 tree 这个主题了,Github 链接:

将它克隆到主题目录:

$ cd /opt/apps/note-site
$ git clone https://github.com/wujun234/hexo-theme-tree.git  themes/tree

修改配置文件指定主题为 tree

$ vim _config.yml
theme: tree

到这一步主题已经设置完成,后续操作如果你和我一样是使用 tree 这个主题就可以跟着做,其它主题自己看下 README

其它配置可参考官方文档:https://hexo.io/zh-cn/docs/configuration

安装一下作者推荐的代码渲染插件:

$ npm install markdown-it --save

禁用默认的代码渲染插件:

$ vim _config.yml
highlight:
  enable: false
  line_number: false
  auto_detect: false
  tab_replace: ''

启动服务

Hexo 站点已经初始化并且主题已经设置好后,我们就可以启动站点服务了,在站点目录下执行下面命令启动服务:

$ cd /opt/apps/note-site
# 默认占用 4000 端口,我这里指定 8080
$ hexo clean && hexo g && hexo server -p 8080

浏览器访问:

image20220125174821429.png

使用 Systemd 管理进程

由于 hexo server 这个命令会阻塞在前台,所以我们需要手动让它运行到后台,我这里就使用 Systemd 来管理它了。

给站点添加一个启动脚本:

$ vim /opt/apps/note-site/start.sh
#!/bin/bash
cd /opt/apps/note-site && hexo clean && hexo g && exec hexo server

添加执行权限:

$ chmod +x /opt/apps/note-site/start.sh

添加 Systemd unit 配置:

$ vim /usr/lib/systemd/system/hexo.service
[unit]
Description=blog site by hexo
After=network.target
 
[Service]
Environment="PATH=/opt/apps/node/bin:$PATH"
Type=simple
ExecStart=/opt/apps/note-site/start.sh
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

然后就可以使用 Systemd 管理 Hexo 服务了:

# 重载配置文件
$ systemctl daemon-reload
# 启动服务
$ systemctl start hexo
# 设置开机自启
$ systemctl enable hexo

Halo 后台添加菜单

如果你也想和我一样在 Halo 菜单添加一个笔记本,可以进入 Halo 后台,选择 外观 -> 菜单,添加一个笔记本的链接就可以啦:

image20220125180056091.png

图片支持相对路径

Hexo 其实是一个 Markdown 文档渲染工具,而我写 Markdown 时通常会把文章依赖的图片放在文章的同级并和文章同名的目录下,这种文档结构在 Hexo 渲染成 HTML 时,文章和图片的路径就不匹配,导致浏览器上看不到对应的图片。

要解决这种情况,可以使用 CodeFalling/hexo-asset-image 插件,步骤如下。


首先确认 _config.yml 中设置了 post_asset_folder: true

$ cat _config.yml| grep post_asset_folder
post_asset_folder: true

安装 hexo-asset-image 插件:

$ npm install https://github.com/CodeFalling/hexo-asset-image --save

编写文章可以使用 Typora,设置图片的路径为当前文档目录的文档同名文件夹下,如下:

image.png

也可以使用 VSCode,安装好 Markdown All in OneMarkdown Imagemarkdown lintMarkdown Preview Enhanced 这几个插件,设置粘贴的图片保存到当前文档目录的文档同名文件夹下:

b03d5ac06775c81f568c46bd1a34508c23f209a7430fbc1c2fd403860ec8fea1.png

Local: Path 设空标识使用相对路径:

aafcb133e58ccf75890defe4e0590cbc71bb6dfcbf14c70ca9b77cb41b658003.png

关于这几个插件的使用就自行摸索啦~ 只能说 VSCode 太给力了~

自动发布

现在这种部署形式我们每次更新文档文件后需要手动的执行下面命令完成发布操作:

cd /opt/apps/note-site && hexo clean && hexo g && exec hexo server

其实也就是服务启动时执行的命令,所以每次有更新文档文件后我们都需要执行下面命令重新发布:

$ systemctl restart hexo

能不能实现自动发布呢?其实可以间接的实现,思路如下:

  1. 将我们的文档目录也就是站点目录下 source/_posts/ 同步到 Git 仓库;
  2. 在服务器运行一个定时任务,每隔一段时间检查一下有没有新的提交,如果有,则执行重新发布操作。

同步到 Git 仓库我就不做演示啦,这里我写了一个 Shell 脚本以实现检查 Git 仓库变更和重新发布的功能,内容如下:

#!/bin/bash
cd /opt/apps/note-site/sources/_posts
commit_id1=$(git rev-parse HEAD)
git pull
commit_id2=$(git rev-parse HEAD)
[ "${commit_id1}" == "${commit_id2}" ] && exit 0
systemctl restart hexo

将该脚本添加到定时任务执行,我这里设置每五分钟执行一次:

$ crontab -l 
PATH="/bin:/usr/bin:/opt/apps/mysql/bin:/usr/local/bin"
*/5 * * * * /opt/apps/note-site/watch-change.sh

即你的每一次提交将在五分钟内自动发布。

0

评论区