现在各代码托管平台均提供了静态页面展示功能,可以利用其搭建自己的个人博客。而这样的好处有:
- 不用自建服务器
- 不用网络备案
- 文档归档管理
- 自主选择主题
当然也有它的不足:
- 域名需按照特定的格式设置
- 有诸多限制(如需自行寻找图床搭配使用)
不过总的来说作为个人博客基本够用了,关键是免费呢。
诉求
如果为了向博客发布文章,还需要投入专门的时间在电脑上操作,甚至要部署一套Hexo环境的话,那么在时间碎片化严重的今天将显得非常的不实用。因此我们可以考虑利用docker,封装一套hexo环境。让其支持自动发布功能,并根据实际情况部署在云或个人电脑上(通过简单的脚本实现一键部署)。这样主要的精力就可以投入在内容创作上,充分利用各种碎片时间。
设计
大致设计了一下,期望中应该有两条业务流。
- 文章编辑流
该业务流重点关注碎片化编写的内容可实时保存,最好有云端存储,这样方便在任何时候、任何地点、任何环境下都可继续编写。 - 文章发布流
该业务流重点关注快速发布,且不受主机环境影响。
部分实现
本文仅针对日志发布业务流中,一键发布至Git仓库做详细描述。以下选择的是Gitee平台,相比较GitHub,除了不支持自动刷新页面以外,Gitee具有国内更快访问速度这一决定性的优势,想想看,如果打开你的博客需要2分钟才加载完成,又会有多少人愿意等待这2分钟呢?
首先在Hexo配置文件(_config.yml)中配置好deploy的仓库地址,建议选择SSH方式部署,这样可以做到免登陆验证。
deploy:
type: git
repo: git@gitee.com:yourname/yourname.git
branch: master
利用SSH上传的好处是可以免登陆,减少与用户的交互输入,但是缺点是首次上传时需要手动输入yes。后面我们也会提到这一问题。当然其余需要配置的信息,如:标题、主题、目录结构等等信息,若有需要也请一并在Hexo主配置文件中修改或添加,这里就不详细描述了。关于Hexo配置信息,请参考这里。
Docker
这里不再描述如何搭建Docker环境,相信在网上能找到很多相关的指导,下面详细介绍如何构建支持自动发布Hexo的Docker镜像。我们的目的很明确,这个镜像不需要做特别复杂的工作,只需要有node、ssh、hexo即可,因此选择以alpine作为基础镜像环境,因为它足够小。
FROM node:14-alpine
WORKDIR /var/www/hexo
RUN echo "Asia/Shanghai" > /etc/timezone \
&& echo "https://mirrors.aliyun.com/alpine/v3.9/main/" > /etc/apk/repositories \
&& npm config set registry https://registry.npm.taobao.org \
&& apk add --no-cache git \
&& apk add --no-cache openssh-client \
&& npm install hexo-cli -g \
&& hexo init \
&& npm install hexo-renderer-swig \
&& npm install \
&& npm install hexo-deployer-git --save \
&& rm -rf source themes \
&& git config --global user.email "yourname@yourmail" \
&& git config --global user.name "yourname" \
&& ssh-keygen -t RSA -C "hexo@docker.com" -P "" -N "" -f /root/.ssh/id_rsa \
&& echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config \
&& cat /root/.ssh/id_rsa.pub
ADD themes ./themes
ADD _config.yml ./
WORKDIR指明后以后该镜像在运行的时候所使用的工作目录,hexo环境以及日志目录都将在这里。然后依次安装git、openssh(不需要SSH服务端)、hexo以及hexo发布插件。这里我使用的主题是Next 5,而最新的hexo移除了swing,所以多安装了hexo-renderer-swig,可根据自己的需要增删软件。
rm -rf source themes
从hexo环境中移除source以及thems,因为我们需要用自己的文章以及主题环境去替代默认生成的内容。
在完成hexo init以及各种软件安装之后,还需要对环境做相关的初始化,初始化动作确实可以放在container之后再做,而不需要在镜像中完成,但是前文提到希望使用SSH进行文章发布,而container并不能保证每次container中生成的公私钥都一样(当然确保每次使用同一个container的话也不是不行,但是为了确保发布的准确性,就需要首先使用hexo clean再进行编译,或者使用hexo g -f -d),所以为了方便以后的工作,我们需要将ssh的公私钥固定下来。初始化的动作主要有:
- 初始化git配置
- 初始化RSA公私钥
echo “StrictHostKeyChecking no” >> /etc/ssh/ssh_config
这步很关键,它可以让SSH首次连接时跳过检查,即不要求与用户交互。这样可以确保首次执行hexo g -d时不会要求输入yes。
ADD themes ./themes
ADD _config.yml ./
使用修改好的hexo 主配置文件以及主题内容。其实在实际业务中,主题配置可能发生变化,因此这里即便不拷贝主题也没有关系,在后面将展示通过参数的形式动态指定主题。
至此Docker构造脚本准备好了,将上述内容保存为Dockerfile,并执行Docker build。根据网络情况,稍等一段时间即可完成构建。在构建的输出中一定发现打印出了一段长长的Base64代码。如:
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@xxx.xxx
请记下这段代码,后续要用到。这段代码是Dockerfile中打印的
cat /root/.ssh/id_rsa.pub
这段代码即是SSH公钥,请根据静态页面供应商的帮助,将公钥添加进仓库的SSH公钥管理当中,如Gitee中的相关帮助,GitHub的添加方式大同小异。
好了,到这里我们有了一个hexo环境的docker,下面介绍如何使用这个docker。
docker-compose
其实并不是一定要用docker-compose, 只使用docker也可以达到类似的效果。在这个场景下使用docker-compose唯一的好处是,不需要手工输入太多的参数。
hexo:
image: your-docker-name
volumes:
- /your-hexo/source:/var/www/hexo/source
- /your-hexo/themes:/var/www/hexo/themes
command: hexo g -d
简单来讲就是将source、themes动态挂载至container 对应的目录上。然后执行hexo发布命令即可。上面也讲到其实可以用docker命令代替,那么代替的命令如下:
docker run --rm -v /your-hexo/source:/var/www/hexo/source -v /your-hexo/themes:/var/www/hexo/themes hexo-git hexo g -d
--rm是指当container退出后自动销毁。如果不希望container销毁,那么请勿使用该参数。
最后
现在剩下的最后一个问题是,这个docker应该部署在什么地方。这个就看自己的环境以及习惯吧,可以放在私人云ECS上,也可放在家里的电脑上,需要用的时候执行一下docker-compose up或者上面的docker命令即可。当然这仅仅是最初规划两条业务流中很小的一部分。剩下的以后再慢慢补充和完善吧。至少目前可满足我一小部分的需求了。