Hexo-Admin

不要看我了。Hexo-admin 基于 node:13-slim ( node:14+ 貌似有问题)。

内置 Hexo-admin 的镜像。

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

什么是 hexo-admin ?

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

安装及优化[^laosu-hexo-admin]

在群晖上以 Docker 方式安装。

编写 Dockerfile

基于 spurin/docker-hexo

基于 node:13-slim ( node:14 有问题,See Hexo 4275 )

在群晖的 docker 目录中新建 hexo-with-admin 目录,然后 SSH 客户端登录到群晖 ,执行下面的命令:

1
2
3
4
5
6
7
8
# 进入 hexo-with-admin 目录
cd hexo-with-admin/

# 创建空的 Dockerfile 文件
touch Dockerfile

# 编辑 Dockerfile 文件
vi Dockerfile

Dockerfile 中写入下面的内容并保存

  1. 基于 node:13-slim ( node:14 有问题,See Hexo 4275 )

  2. Dockerfile 中添加 淘宝源。[^npm-registry]

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

  3. git clone Next 主题。(个人偏向于 不使用 npm nodemoudle 的方式 npm install hexo-theme-next。)

    社区维护的版本:NexT v6 and v7 🚩 , 使用 自己改过的版本 : yafey/hexo-theme-next

    原作者已停止维护: https://github.com/iissnan/hexo-theme-next 本项目已停止维护。⚠️

    1
    2
    $ cd hexo
    $ git clone -b yafey_config https://github.com/yafey/hexo-theme-next.git themes/next
  4. 清楚缓存并检测文件变动。hexo clean && hexo generate -w & && (hexo g -w 后台运行)[^Linux后台运行的几种方式] 。 hexo g -w好像是线程阻塞的。

  5. 设置为中国时区。ENV TZ=CST-8

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
FROM node:13-slim

MAINTAINER James Spurin <james@spurin.com>

# set as China time zone , otherwise , default UTC timezone will 8 hours after CST.
ENV TIME_ZONE=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone

# Set the server port as an environmental
ENV HEXO_SERVER_PORT=4000

# Set the git username and email
ENV GIT_USER="Joe Bloggs"
ENV GIT_EMAIL="joe@bloggs.com"

# 指定 npm 使用 淘宝镜像
RUN npm config set registry https://registry.npm.taobao.org

# Install requirements
RUN \
apt-get update && \
apt-get install git -y && \
npm install -g hexo-cli

# Set workdir
WORKDIR /app

# Expose Server Port
EXPOSE ${HEXO_SERVER_PORT}

# Build a base server and configuration if it doesnt exist, then start
CMD \
if [ "$(ls -A /app)" ]; then \
echo "***** App directory exists and has content, continuing *****"; \
else \
echo "***** App directory is empty, initialising with hexo and hexo-admin *****" && \
hexo init && \
npm install && \
npm install --save hexo-admin; \
fi; \
if [ ! -f /app/requirements.txt ]; then \
echo "***** App directory contains no requirements.txt file, continuing *****"; \
else \
echo "***** App directory contains a requirements.txt file, installing npm requirements *****"; \
cat /app/requirements.txt | xargs npm --prefer-offline install --save; \
fi; \
if [ "$(ls -A /app/.ssh 2>/dev/null)" ]; then \
echo "***** App .ssh directory exists and has content, continuing *****"; \
else \
echo "***** App .ssh directory is empty, initialising ssh key and configuring known_hosts for common git repositories (github/gitlab) *****" && \
rm -rf ~/.ssh/* && \
ssh-keygen -t rsa -f ~/.ssh/id_rsa -q -P "" && \
ssh-keyscan github.com > ~/.ssh/known_hosts 2>/dev/null && \
ssh-keyscan gitlab.com >> ~/.ssh/known_hosts 2>/dev/null && \
cp -r ~/.ssh /app; \
fi; \
echo "***** Running git config, user = ${GIT_USER}, email = ${GIT_EMAIL} *****" && \
git config --global user.email ${GIT_EMAIL} && \
git config --global user.name ${GIT_USER} && \
echo "***** Copying .ssh from App directory and setting permissions *****" && \
cp -r /app/.ssh ~/ && \
chmod 600 ~/.ssh/id_rsa && \
chmod 600 ~/.ssh/id_rsa.pub && \
chmod 700 ~/.ssh && \
echo "***** Contents of public ssh key (for deploy) - *****" && \
cat ~/.ssh/id_rsa.pub && \
\
echo "***** download theme next - *****" && \
if [ "$(ls -A /app/themes/next)" ]; then \
echo "***** themes/next directory exists and has content, continuing *****"; \
else \
echo "***** themes/next directory is empty, download themes/next from github *****" && \
git clone -b yafey_config https://github.com/yafey/hexo-theme-next.git themes/next ; \
fi; \
\
echo "***** Starting server on port ${HEXO_SERVER_PORT} *****" && \
hexo clean && hexo server -d -p ${HEXO_SERVER_PORT}

当然更简单的办法可以用你喜欢的编辑器保存为 Dockerfile 文件,再把 Dockerfile 文件上传到 hexo-with-admin 目录。

img

构建镜像

hexo-with-admin 目录执行生成镜像的操作

1
2
# 注意后面的小点
docker build -t yafey/docker-hexo-admin:v1 -f .

如果出现(肯定会出现)下面的错误:

1
2
admin@DiskStation:/etc/docker$ docker build -t yafey/docker-hexo-admin:v1 .
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/spurin-HexoWithAdmin/json": dial unix /var/run/docker.sock: connect: permission denied

原因是 docker 需要 root 运行权限。[^sudo-docker]

1
sudo docker build -t yafey/docker-hexo-admin:v1 .    # 提升为 root 运行 docker。

切换到 root 用户下 (不推荐此方法,建议用上面的方式。 ) https://blog.csdn.net/qq_35957944/article/details/116796522

1
sudo su -  # 切换到 root 用户。

完成后,在镜像中会找到

image-20220925013106818

配置&启动容器

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

文件夹 装载路径 说明
/docker/_Hexo/hexo-with-Hexon-and-admin /app 存放设置

img

端口

端口不冲突就行

本地端口 容器端口
4000 4000

img

环境

可变
GIT_USER 修改为您自己的 Github 用户
GIT_EMAIL 修改为您自己的 Github 邮箱

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

img

运行

在浏览器中输入 http://群晖IP:4000,开始并不能看到主界面,在日志中会显示在通过 git 拉取代码 , 如果容器异常停止, 删除 目录 hexo-with-Hexon-and-admin 后重新启动。

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

img

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

img

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

img


参考:

[^npm-registry]: npm 切换镜像源

1
2
3
4
5
6
7
查看当前源: npm config get registry
## 默认官方源: http://registry.npmjs.org/
npm切换源:
切换至淘宝源:npm config set registry=http://registry.npm.taobao.org/
切换至华为源:npm config set registry=https://mirrors.huaweicloud.com/repository/npm/
切换至npm源:npm config set registry=http://registry.npmjs.org
临时使用:npm --registry https://registry.npm.taobao.org install express

[^laosu-hexo-admin]: 在群晖上复刻公网的Hexo | @archive.org

[^Linux后台运行的几种方式]:  如何让Linux命令在后台运行 - 知乎

如何让Linux命令在后台运行

1
2
3
4
5
6
1、在你的命令后添加一个 &
2、使用bg向后台发送运行命令
3、使用 nohup 向后台发送命令
4、使用系统重定向运行后台命令
5、使用 disown 将 Linux 命令设置为后台运行
6、使用 Tmux 在后台运行 Linux 命令

[^sudo-docker]:  方法1:用sudo运行所有docker命令