hexo博客部署使用

背景

  hexo环境安装较为复杂,如果需要在每台写博客的机器上都安装对应的环境依赖,则需要耗费较多时间精力。现在需要在任意终端编辑md文件,推送到github后,之后就能自动部署到网站上。

解决方案

  在VPS上使用Docker方式部署hexo,映射出/var/www/hexo目录,并将ssh私钥放入容器内,用于拉取和推送github仓库。具体可用脚本start_hexo_docker.sh部署

1
2
3
4
5
6
7
8
9
10
11
12
# 移除旧容器
docker rm -f hexo
# 启动新容器
docker run -itd --net=host --name hexo --restart=always -v /var/www/hexo:/var/www/hexo hexo:2308
# 在容器内创建.ssh目录
docker exec hexo mkdir -p /root/.ssh
# 复制ssh私钥文件
docker cp ~/.ssh/id_rsa hexo:/root/.ssh/id_rsa
# 赋予私钥600权限
docker exec hexo chmod 600 /root/.ssh/id_rsa
# 进入容器内部
docker exec -it hexo bash

  容器内通过crontab每分钟拉取github仓库,判断_posts目录是否有更新,如果有更新,就需要重新生成网站静态资源文件,然后部署上去。通过crontab -l查看定时任务,有定时任务

1
*       *       *       *       *       /bin/bash /var/www/hexo/periodic_check.sh

  其中periodic_check.sh文件为

1
2
3
4
5
6
7
8
9
# 进入源文件目录,目录已在github建立对应仓库
cd /var/www/hexo/source/_posts
# 如果git pull显示结果为非最新,就进入hexo博客目录,执行清除、生成和部署三个步骤
if [ "$(git pull | tail -n 1)" != "Already up to date." ]; then
cd /var/www/hexo
hexo clean
hexo g
hexo d
fi

更新hexo docker镜像

  上一版本的docker镜像时区没有设置为中国,crond没有在容器内执行,通过docker build . -t hexo:2308构建新镜像,Dockerfile

1
2
3
4
FROM hexo:latest
RUN apk add -U tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "* * * * * /bin/bash /var/www/hexo/periodic_check.sh" >> /var/spool/cron/crontabs/root
CMD ["/usr/sbin/crond", "-f", "-d", "0"]