在群晖上复刻公网的Hexo

之前为了寻找一个稳定、可靠的服务器,已经折腾过很多次 Hexo

在GitHub上搭建Blog
在Netlify上部署Hexo
在Coding上部署Hexo并实现和Github双线访问
在Gitee上搭建Hexo Blog
Vercel上部署Hexo

而这次老苏是想在群晖上实现统一的编辑、预览、发布,这样做的好处是显而易见的,不再拘泥于某台机器才能发布,遇到节假日可以愉快的出去玩耍而不用担心放读者鸽子,经过仔细对比最终选择了内置 Hexo-admin 的镜像。

当然还有别的玩法,通过 Github Action 自动发布到 Github Page 仓库。也就是说每当你写完博客直接提交到源仓库即可自动触发构建。这个留待以后再研究。

什么是 hexo-admin ?

hexo-admin 是一个 Hexo 博客引擎的管理用户界面插件,能实现在线管理 hexo 博客。

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 hexo ,选择第三个 spurin/hexo,只发布过一个版本,所以双击直接下载了。

docker 文件夹中,创建一个新文件夹,并将其命名为 hexo,然后在 hexo 文件夹中再创建 一个新的子文件夹 blog

文件夹 装载路径 说明
docker/hexo/blog /app 存放设置

端口

端口不冲突就行

本地端口 容器端口
4000 4000

环境

可变
GIT_USER 修改为您自己的 Github 用户
GIT_EMAIL 修改为您自己的 Github 邮箱
HEXO_SERVER_PORT 如果前面没改端口,这里就不用改

用自己的 github 账号是为了后续向 github 发布,会根据你提交的用户和邮箱生成 SSH key,如果只是在群晖上编辑和预览,可以随意。

运行

在浏览器中输入 http://群晖IP:4000,开始并不能看到主界面,在日志中会显示在通过 git 拉取代码

github 在国内的访问并不稳定,所以存在失败的可能性

如果出现这种情况,请删空 blog 下的文件和目录,重新启动容器即可,注意观察日志

正常完成后的目录是这样的

当你看到日志中出现 Hexo is running at http://localhost:4000 . Press Ctrl+C to stop.

就可以在浏览器中输入 http://群晖IP:4000 看到主界面了

而在浏览器中输入 http://群晖IP:4000/admin 即可看到 hexo-admin 的后台管理界面

设置

安全设置

如果你是要把 hexo-admin 映射到公网使用,一定要设置密码,否则就变成谁都可以编辑了。这需要在 _config.yml 文件中添加以下参数

1
2
3
4
admin: 
username: 用户名
password_hash: md5密码
secret: 用于加密cookie的密码

打开 hexo-admin 界面,点击导航的 settings 选项,点击 Setup authentification here

依次输入 UsernamePasswordSecret

往下拉,找到生成的代码,复制到 _config.yml 文件中,然后重启 hexo

再打开 hexo-admin 就需要登录了

升级 hexo

升级不是必须的,只是为了保持和我的台式机上的版本一致,方便直接导入配置文件

升级 npm

假设容器名为 spurin-hexo1

1
2
3
4
5
# 进入容器
docker exec --user root -it spurin-hexo1 /bin/bash

# 检查 npm 版本
npm version

1
2
3
4
5
# 升级 npm
npm install -g npm

# 再次检查 npm 版本
npm version

可以看到 npm 已经从 6.14.4 升级到了 7.10.0

升级 hexo-cli

1
2
# 查看当前版本,判断是否需要升级
hexo version

1
2
3
4
5
# 全局升级hexo-cli  
npm i hexo-cli -g

# 再次查看版本,看hexo-cli是否升级成功
hexo version

可以看到 hexo-cli 已经从 3.1.0 升级到了 4.2.0

安装 npm-check

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装npm-check,若已安装可以跳过  
npm install -g npm-check

# 检查系统插件是否需要升级
npm-check
```

![](https://cdn.jsdelivr.net/gh/wbsu2003/gitnote-images@master/picgo/2021/04/20210420142115.png)

### 安装 npm-upgrade

```bash
# 安装npm-upgrade,若已安装可以跳过
npm install -g npm-upgrade

# 更新 package.json
npm-upgrade

1
2
# 更新全局插件  
npm update -g

1
2
# 更新系统插件  
npm update --save

复刻

需要根据实际需要安装相应的主题和依赖的插件;

主题

默认用的主题是 landscape ,而我公网上用的是 Next,所以需要另外安装

1
2
# 安装主题  
npm install hexo-theme-next

  1. _config.yml  中的 theme 改为 next

  1.   将 _config.next.yml 放到 _config.yml 同目录
  2.   将自定义模板拷贝到 source 目录

  1. 重启容器后刷新页面,是不是已经跟公网上的一样了

插件

我用的插件应该不算多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 百度推送插件
npm install hexo-baidu-url-submit --save

# hexo-generator-index2 插件
npm install hexo-generator-index2 --save
npm uninstall hexo-generator-index --save

# symbols_count_time 插件
npm install hexo-symbols-count-time --save

# hexo-blog-encrypt 插件
npm install hexo-blog-encrypt --save

# hexo-deployer-git 插件
npm install hexo-deployer-git –save

正常启动后的日志

导入文档

导入 _posts 目录,其他包括一些左侧的菜单栏,按需要导入,比如 aboutcategories

刷新页面,前端页面

管理页面

常用命令

验证 ssh key

验证前需在平台已添加 SSH 公钥,如果你是按照我前面相同的卷设置, id_rsa.pub 密钥在 /docker/hexo/blog/.ssh 目录中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker exec --user root -it spurin-hexo1 /bin/bash

# 验证 github
ssh -T git@github.com

# 将 gitee.com 写入 known_hosts
ssh-keyscan gitee.com >> ~/.ssh/known_hosts 2>/dev/null

# 验证 gitee
ssh -T git@gitee.com

# 将 e.coding.net 写入 known_hosts
ssh-keyscan e.coding.net >> ~/.ssh/known_hosts 2>/dev/null

# 验证 Coding
ssh -T git@e.coding.net

# 复制
cp -r ~/.ssh /app

发布

1
2
3
4
5
# 生成 
docker exec -it spurin-hexo1 hexo generate

# 发布
docker exec -it spurin-hexo1 hexo deploy

上面的命令需要开启 ssh 客户端,所以更好的办法是利用 hexo-adminDeploy 功能来完成向 github 提交发布的工作,但是在设置前执行会返回错误。

  1. 在 hexo 的根目录下新建 hexo-pubish.sh 文件
1
2
3
4
5
# 在 blog 目录下执行
touch hexo-pubish.sh

# 打开脚本文件
vi hexo-pubish.sh

写入下面的内容

1
2
3
4
#!/usr/bin/env sh  
hexo clean
hexo g
hexo d
  1. 修改 _config.yml 文件

增加下面的内容

1
deployCommand: './hexo-pubish.sh'

  1. 修改 hexo-publish.sh 权限
1
2
# 添加执行权限
chmod +x hexo-pubish.sh
  1. 重启容器后再执行 Deploy

和台式机上 git bash 的输出是一致的。

小结

从流程上来说,写作-->预览-->发布 基本上是一气呵成,非常完美,但是还是有些小遗憾, 那就是 hexo-admin 的界面不太美观。

参考文档

spurin/docker-hexo: Docker container for running hexo with hexo admin 🐋
地址:https://github.com/spurin/docker-hexo

ssly/hexo-admin: 一个在线管理hexo博客的工具
地址:https://github.com/ssly/hexo-admin

GitHub+Hexo 搭建个人网站详细教程 - 知乎
地址:https://zhuanlan.zhihu.com/p/26625249