使用Docker部署Hexo博客

本文展示使用Docker部署Hexo博客(当然也可以是其他的服务)在服务器上的一种方案,主要用到是webhook来触发git pull操作。

概述

之前部署Hexo博客的时候好像配置蛮久的,想着能不能把这些东西都放进Docker里面,以后换服务器以后部署也方面,于是便有了这波操作。

这里使用的是webhook这个轮子来实现持续集成的。

工作示意图:
本地编辑—-git push—->Github—-webhook—->server—-get pull—->内容更新

使用到两个Docker:

  1. webhook: 当push新的commit到GitHub(或其他平台)时解析GitHub发过来的webhook执行脚本更新网站内容
  2. nginx: Web服务器,展示网站内容

Nginx

Nginx容器的配置比较简单,只需要修改nginx.conf配置,监听80端口就行了。(如果需要需要https,则需要配置要证书以及配置监听443端口)。

这里贴出我的docker-compose.yml文件:

1
2
3
4
5
6
7
8
9
10
11
12
version: '3'
services:
web:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./sites-enabled:/etc/nginx/sites-enabled
- /path-to-your-content:/var/www
- ./ssl:/ssl
ports:
- "80:80"
- "443:443"

ssl文件夹中的是证书,path-to-your-content是你静态页面的路径。

Webhook

Webhook任务是解析发过来的请求,然后执行脚本来从远程仓库中拉取更新。

首先是构建镜像:

1
2
3
4
5
6
7
8
9
10
FROM golang
MAINTAINER sixzeroo <sixzeroo60@gmail.com>
RUN mkdir -p /code/webhook \
&& touch /code/webhook/hook.json \
&& go get github.com/adnanh/webhook
WORKDIR /code/webhook
ENTRYPOINT /go/bin/webhook -hooks /code/webhook/hooks.json -verbose

成品:sixzeroo/webhook

之后就可以使用webhook来创建钩子任务了,其中配置文件在hooks.json中:

1
2
3
4
5
6
7
[
{
"id": "your-id",
"execute-command": "/code/webhook/work.sh",
"command-working-directory": "/code/webhook"
}
]

执行的脚本就是从GitHub中拉取更新而已,work.sh

1
2
3
4
5
6
7
8
9
10
11
#! /bin/sh
cd /var/www && git pull
curtime=`date +"%Y%m%d%H%M%S"`
if [ $? -eq 0 ];then
echo "$curtime pull success!" >> /code/webhook/git.log
else
echo "$curtime pull fail!" >> /code/webhook/git.log
fi

最后配置整个服务,docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
version: "3"
services:
webhook:
image: sixzeroo/webhook
volumes:
- ./:/code/webhook
- /path-to-your-content:/var/www
- /key-path:/root/.ssh
ports:
- "9000:9000"

其中key-path是你ssh文件夹路径

最后启动两个服务就可以工作了,设置GitHub当有push的时候发送http://your-host:9000/hooks/your-id这样的webhook就行了。

这里不把两个容器放到一个服务里面的原因是Nginx容器之后会有新的服务部署,里面会做一些修改。