Hugo+Caddy打造个人博客,自动化构建博客系统,提交博客到Github即自动部署。

前言

很久之前就想要搭建个人博客,在各种模板引擎之间无限徘徊,WordPress、Hexo、Jekyll都多多少少接触过,但是由于各种原因吧,一直都没有落地。很多人都推荐通过github部署博客,但是由于伟大的长城访问速度实在堪忧,因此便有了在私有服务器上部署的念头。因个人原因,现在偏向于golang,就顺水推舟选择了Hugo,也有中文文档,使用起来还是挺方便的。同时因为做过DevOps的缘故,非常喜欢自动化部署,经过长时间的摸索,最终确定了Caddy+Hugo的模式。

Caddy的安装与配置

二进制安装

在Caddy官方下载页面下载可执行文件,记的勾选git与Hugo两个插件,会自编译生成压缩包,里面包含二进制包、安装指导还有自启动脚本等。

  • 将二进制包拷贝到系统路径,并付给相应的权限
sudo cp /path/to/caddy /usr/local/bin
sudo chown root:root /usr/local/bin/caddy
sudo chmod 755 /usr/local/bin/caddy
  • 设置caddy允许绑定80,443等端口
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy
  • 为Caddy设置专有用户、用户组与文件夹
sudo groupadd -g 33 www-data
sudo useradd \
  -g www-data --no-user-group \
  --home-dir /var/www --no-create-home \
  --shell /usr/sbin/nologin \
  --system --uid 33 www-data

sudo mkdir /etc/caddy
sudo chown -R root:www-data /etc/caddy
sudo mkdir /etc/ssl/caddy
sudo chown -R root:www-data /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy
  • 将自己的Caddy配置文件放到/etc/caddy,并修改权限
sudo cp /path/to/Caddyfile /etc/caddy/
sudo chown www-data:www-data /etc/caddy/Caddyfile
sudo chmod 444 /etc/caddy/Caddyfile
  • 创建服务器祝目录
sudo mkdir /var/www
sudo chown www-data:www-data /var/www
sudo chmod 555 /var/www
  • 添加Caddy服务(systemd版)
wget https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service
sudo cp caddy.service /etc/systemd/system/
sudo chown root:root /etc/systemd/system/caddy.service
sudo chmod 644 /etc/systemd/system/caddy.service
sudo systemctl daemon-reload
sudo systemctl start caddy.service
  • 设置Caddy自启动
sudo systenctl enable caddy.service

至此,Caddy的安装以及配置完成,只需要配置自己的Caddyfile即可。

  • 我的配置文件,以此为例修改为自己的即可
${your_domain} {
    log /var/log/caddy/access.log
    gzip
    root /var/www/${your_site}/public
    git github.com/${your_github_name}/${your_site}.git {
        path /var/www/${your_site}
        then hugo --destination=/var/www/${your_site}/public
        hook /webhook 87e1129469efab1ea287afcc418e0679
        hook_type github
        clone_args --recursive
        pull_args --recurse-submodules
    }
    hugo
}

通过Dcoker部署Caddy

  • 构建docker镜像

    • 浏览器打开docker store并搜索caddy找到其中下载量比较多的abiosoft/caddy,然而并不满足需求,因为没有hugo插件,需要修改Dockerfile。
    • 修改Dockerfile以满足需求,只需要修改ARG plugins="git..."这部分即可,修改后内容如下:
    #
    # Builder
    #
    FROM abiosoft/caddy:builder as builder
    
    ARG version="0.11.0"
    ARG plugins="git,hugo"
    
    # process wrapper
    RUN go get -v github.com/abiosoft/parent
    
    RUN VERSION=${version} PLUGINS=${plugins} /bin/sh /usr/bin/builder.sh
    
    #
    # Final stage
    #
    FROM alpine:3.7
    LABEL maintainer "Abiola Ibrahim <abiola89@gmail.com>"
    
    ARG version="0.11.0"
    LABEL caddy_version="$version"
    
    # Let's Encrypt Agreement
    ENV ACME_AGREE="false"
    
    RUN apk add --no-cache openssh-client git
    
    # install caddy
    COPY --from=builder /install/caddy /usr/bin/caddy
    
    # validate install
    RUN /usr/bin/caddy -version
    RUN /usr/bin/caddy -plugins
    
    EXPOSE 80 443 2015
    VOLUME /root/.caddy /srv
    WORKDIR /srv
    
    COPY Caddyfile /etc/Caddyfile
    COPY index.html /srv/index.html
    
    # install process wrapper
    COPY --from=builder /go/bin/parent /bin/parent
    
    ENTRYPOINT ["/bin/parent", "caddy"]
    CMD ["--conf", "/etc/Caddyfile", "--log", "stdout", "--agree=$ACME_AGREE"]

    只保留了git与hugo两个插件

    • 构建镜像 Dockerfile docker build -t abiosoft/caddy:latest .

    构建完成,因为golang有些包被墙,需要自备梯子。。。

  • 下载镜像

    本着不重复造轮子的原则,博主已经将构建好的镜像上传到阿里云,大家直接下载即可。

    docker pull registry.cn-hangzhou.aliyuncs.com/echoers/caddy:latest
  • 运行镜像启动服务

    docker run -it -d \ 
    -v ${your_path}/Caddyfile:/etc/Caddyfile \
    -v ${your_path}/${your_hugo_blog}:/home/${your_hugo_blog} \
    -p 80:80 \
    -p 443:443 \
    --name caddy registry.cn-hangzhou.aliyuncs.com/echoers/caddy:latest

    webhook配置

  • 将hugo生成的blog上传到github,之后点击“settings”: image

  • 找到“Webhooks” image

  • 添加webhook image

  • 设置webhook image

/webhook这个要跟Caddyfile中的配置保持同步

结语

这片文章酝酿了很久了,奈何种种原因吧,到现在才发出来,因为这方面的资料还比较少,基本上也是一路踩坑过来吧。不过效果还是不错的,码完字只需git push一下剩下的就先让子弹飞一会儿吧,基本上秒更。另外,广告一下博主自己的博客网站,欢迎访问!