本文展示使用Docker部署Hexo博客(当然也可以是其他的服务)在服务器上的一种方案,主要用到是webhook来触发git pull操作。
概述
之前部署Hexo博客的时候好像配置蛮久的,想着能不能把这些东西都放进Docker里面,以后换服务器以后部署也方面,于是便有了这波操作。
这里使用的是webhook这个轮子来实现持续集成的。
工作示意图:
本地编辑—-git push—->Github—-webhook—->server—-get pull—->内容更新
使用到两个Docker:
webhook
: 当push新的commit到GitHub(或其他平台)时解析GitHub发过来的webhook执行脚本更新网站内容nginx
: Web服务器,展示网站内容
Nginx
Nginx容器的配置比较简单,只需要修改nginx.conf
配置,监听80端口就行了。(如果需要需要https,则需要配置要证书以及配置监听443端口)。
这里贴出我的docker-compose.yml
文件:1
2
3
4
5
6
7
8
9
10
11
12version: '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
10FROM 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
之后就可以使用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
11version: "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容器之后会有新的服务部署,里面会做一些修改。