0%

使用SHOMT(Simple-Hexo-Online-Manage-Tool)在线管理、同步、备份hexo博客

Hexo作为一款优秀的静态博客广受好评。网上大多数的教程都是基于Hexo+Github Page来写的。这种模式有很多优点,但对我来说也有一些缺点。首当其冲的就是无法很好的适应多平台,随着移动互联网时代的到来,我们可以实现在移动设备上进行轻办公。同时我们每天都要流转于家、公司和路上。如果想在每一台设备上都能够进行无缝连接的使用Hexo,我们首先可以选择jaredlyhexo-admin项目,使用hexo-admin我们可以实现在线编辑博客并发布。但是,本文的主角并不是hexo-admin,而是SHOMT(Simple-Hexo-Online-Manage-Tool),一个基于Python Flask和Git,实现在线管理、自动备份Markdown文档到Git的Hexo在线管理备份系统。

本文主要介绍如何使用SHOMT在线管理、同步、备份Hexo博客内容。项目说明、配置参数等详细内容可以参考项目页面

使用方法

准备工作

  1. 一台vps,本文使用的操作系统为Ubuntu 16.04
  2. 一个空的git仓库(可以含有README),国外的vps可以选择Github,国内的vps可以选择Gitee

环境配置

环境配置部分分为两种方法:

  1. 不使用docker
  2. 使用docker

不使用docker

配置Hexo环境

这部分是按照官方教程进行安装的:
安装Node.js环境,可以参考:nodesource

1
2
3
4
5
6
7
8
# 这里如果安装最新的14.x会导致hexo出错,所以选择了相对稳定无错的12.x版本,如果本身为root用户则可删除"sudo -E"
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt install -y nodejs
# 默认nodejs使用的源在国内下载会比较慢,如果使用国内的vps,可以使用以下命令更换为淘宝镜像
# npm config set registry https://registry.npm.taobao.org
sudo npm install -g hexo-cli
# 配置git环境
sudo apt install -y git

至此,hexo所需要的基本环境已经搭建完毕。接下来需要初始化一个目录作为blog目录。此处以/home/blog为例,初始化的目录需要为空,否则会报错。

1
2
3
4
mkdir /home/blog && cd /home/blog
hexo init
# 安装hexo-server,之后我们需要使用hexo server命令启动服务
npm install hexo-server --save
配置git-ssh

配置git-ssh是为了在与git系统交互的过程中无需手动输入密码,这部分可以参考掘金上的帖子。使用码云参见官方文档

创建并拉取git备份仓库

拉取远程备份仓库,例如我这里创建的为https://github.com/lureiny/test_blog,其中仅包含一个README.md文件。

1
2
# 这里clone时一定要使用ssh的链接,否则git push时会需要输入用户名,这在配置git-ssh的链接中有提到
cd /home/ && git clone git@github.com:lureiny/test_blog.git "blog_bak"
配置python环境

这里使用miniconda进行配置

1
2
3
4
5
6
cd /home && wget "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" -O "miniconda.sh"
bash miniconda.sh
source ~/.bashrc
# 这两步是创建并切换虚拟环境,如果机器上只有这么一个项目使用了python,那此步可以选择省略
# conda create -n hexo python=3.6
# conda activate hexo

至此所需的python环境搭建完成。

安装screen

screen是用来解决终端断开时进程自动终止问题的一个程序,因为无论是python进程还是hexo server都不是后台进程,这就导致我们退出终端时进程会自动中断,因此使用screen来解决这个问题

1
sudo apt install screen

screen简单入门参考:菜鸟教程

使用Simple-Hexo-Online-Manage-Tool
1
2
3
4
cd /home && git clone git@github.com:lureiny/Simple-Hexo-Online-Manage-Tool.git "shomt" && cd shomt
pip install -i requestments.txt
# 修改配置文件
vim config.json

针对此用例的配置如下,详细的配置文件说明可以参考项目页面上的说明。

post_path: “/home/blog/source/_posts”

deploy_command: “cd /home/blog/ && hexo g”

remote_git: “git@github.com:lureiny/test_blog.git”

local_git_path: “/home/blog_bak”

webhook_secret: “test”

token: “token”

其他参数默认

1
2
3
4
5
6
7
8
9
10
# 新建一个screen窗口并启动hexo进程
screen -S hexo
cd /home/blog/
hexo server -s
# 退出当前screen窗口 ctrl+A+D,之后我们想重新进入窗口,我们只需要执行screen -r hexo
# 建一个screen窗口并启动Simple-Hexo-Online-Manage-Tool进程
screen -S shomt
cd /home/shomt
python3 hexo.py
# 退出当前screen ctrl+A+D
访问

至此,访问http(s)://{host}:5000可以看到管理页面,访问http(s)://{host}:4000可以看到博客页面,这里我建议使用Nginx作为网络服务器反向代理本地的4000和5000端口

配置webhook

在github备份项目页面(本例中: https://github.com/lureiny/test_blog),webhook设置在Settings->Webhooks->Add webhook
Payload URL中填入回调链接:http(s)://{host}:5000/webhookContent type选择application/jsonSecret中填入配置文件中webhook_secret对应的值。使用码云参见官方文档。图文说明可参考简书上的文章中的步骤一。

使用docker(推荐)

项目还提供了使用docker的部署方法。具体步骤如下。

配置git-ssh

参见配置git-ssh

文件目录准备工作

需要将备份仓库本地目录、shmot本地目录、hexo blog目录(执行hexo inti的那个目录)放在同一个目录下,然后将这个目录挂载到容器的/home目录下,例如本例中将三个目录均放到宿主机的/home目录下。

  • 备份仓库本地目录: /home/blog_bak
  • shmot本地目录: /home/shomt
  • hexo blog目录: /home/blog

对应的命令如下:

1
2
3
4
cd /home
git clone {备份仓库远程地址,一定要使用`ssh`的地址} "blog_bak"
git clone git@github.com:lureiny/Simple-Hexo-Online-Manage-Tool.git "shomt"
mkdir /home/blog # 如果是新的blog才需要创建这个目录,如果已经有hexo init初始化后的blog目录,则跳过此步
配置docker

这里给出的是基于ubuntu16.04的安装命令,其他操作系统可以参考:官方文档

1
2
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

因为这里要使用到docker-compose命令,因此还需要安装docker-compose官方文档

国内vps的下载的速度可能会有一些慢,可以本地下载文件之后上传到/usr/local/bin目录下

1
2
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
修改docker-compose配置文件

docker-compse的配置文件在shomt/docker目录下,可以按照注释说明进行修改,其他保持默认即可。docker配置文件(docker-compose.yml)默认如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3"

services:
hexo:
build: ./
ports: # 冒号前数字为宿主机端口,冒号后为容器内端口
- "4000:4000" # 这里是Hexo server的端口,容器内端口为4000,如果宿主机4000端口没有被占用,则不需要修改
- "5000:5000" # 这里是Flask的端口,容器内端口默认为5000,这个端口和配置文件(shomt/config.json)中的port相同,如果宿主机5000端口没有被占用,则不需要修改
tty: true
command: /bin/sh /root/start.sh
container_name: hexo
environment:
- GIT_CONFIG_EMAIL="" # git的全局email设置,建议改成github注册用的邮箱
- GIT_CONFIG_NAME="" # git的全局name设置,建议改成github用户名
- HEXO_BLOG=/home/blog # 容器内对应的hexo blog目录 # 如果目录结构和示例的目录结构相同,则这里可以不改
- SHOMT=/home/shomt # 容器内对应的shmot目录 # 如果目录结构和示例的目录结构相同,则这里可以不改
volumes:
- /root/.ssh:/root/.ssh:ro # ssh密钥的目录,如果是root账户,这里可以不改;如果不是root账户,则应该修改第一个冒号前的路径为操作用户的根目录
- /home:/home # 备份仓库本地目录、shmot本地目录、hexo blog目录所在目录 # 如果目录结构和示例的目录结构相同,则这里可以不改
- /etc/localtime:/etc/localtime:ro
- ./start.sh:/root/start.sh
修改shomt配置文件

参考使用Simple-Hexo-Online-Manage-Tool

启动docker
1
2
cd /home/shomt/docker
sudo docker-compose up -d

如果是初始化一个空目录,这里需要等待一段时间对应的4000端口才能访问,等待时间视网络情况而定。

访问

至此,访问http(s)://{host}:5000可以看到管理页面,访问http(s)://{host}:4000可以看到博客页面,这里我建议使用Nginx作为网络服务器反向代理本地的4000和5000端口。

配置webhook

参见配置webhook

在网页上管理

管理页面链接:http(s)://{host}:5000/,打开后显示如下。在token输入框中输入配置文件中设置的token。如果token不正确,则无法在页面上进行任何操作。
管理页面

查看文件列表

输入好token后,点击显示文件列表,页面会动态加载出当前博客目录下的文件信息,效果如下。列表中包含文件名、title、发布时间、更新时间、以及提供了下载和删除的操作。
查看文件列表

上传

输入token->选择文件->上传文件,文件名可带空格,系统会自动处理这类文件名。上传成功后系统会自动刷新出文件列表。因为上传和删除时后台系统需要与远端git服务器进行沟通,如果使用github的话,需要等待的时间略久,并不是提交不成功。

下载

输入token->点击对应的下载按钮

删除

输入token->点击对应的删除按钮

强制生成静态文件

输入token->生成静态文件按钮,系统会强制重新生成静态文件

通过git管理

git clone备份仓库到本地。直接在本地进行修改、提交、推送即可。使用github会有一定的延迟,需要耐心等待,一般3-5s后刷新页面即可。

新增

在根目录下创建新的markdown文件,编辑->commit->push即可。

更新

git pull拉取最新的版本后,编辑->commit->push即可。

更新Front-matter时,新增的Front-matter仅需要直接添加即可,对于需要删除的项,在标签前面加上#后上传即可

删除

git pull拉取最新的版本后,删除文件->commit->push即可。

备份

通过引入blog备份仓库,实现了版本管理与博客的备份。全部发布过的博客都可以通过git系统进行备份和版本管理。

扩展/自定义

不同主题的Front-matters可能会略有不同。比如ButterFly主题与Heox官方默认主题相比,Front-matters中可选的多了top_imgcover_img等,在markdown.py中的Markdown_File_ButterFly类继承了Markdown_File类,并通过配置文件中extends来配置额外所需要的参数{"img_path": "/img/background_img", "imgs_path": "/home/blog/themes/Butterfly/source/img/background_img"},重写了_generate_front_matter方法,该方法主要功能就是生成默认Front-matters信息。通过这种形式,实现自定义,按照自己的需求来重新设计文件默认Front-matters格式。

结束语

至此,文章完成了对shomt的使用方法介绍以及功能介绍,大家如果在使用过程中有任何问题,欢迎到项目页面提交issue或者在此博客进行评论,我会第一时间回复解答各位的问题。

请作者喝咖啡