通过 Caddy 实现 Hugo 博客的自动化更新部署

2020-01-20

概述

静态博客通常使用 Git 作为产物管理工具,会造成很大的 Git 仓库空间浪费。

Git 作为源码管理平台,固然还是适合存放源码,包括博客源码。

所以此时的一种工作流为:

  1. 用户在本地编辑博客源码

  2. 用户将本地源码提交到 Git 托管平台

  3. 服务器从托管平台拉取仓库

  4. 服务器将源码打包为静态博客产物,拷贝至 wwwroot

相比直接本地编译后将产物推送至 wwwroot (多为 github.io ),复杂很多。

但在 Caddy 的驱动下,该过程可以简化为 1 步,与传统方法持平。

Show the Code

GitHub 仓库: https://github.com/forewing/hugo-caddy

思路

利用 Caddy 的 Git 插件(提供被动拉取、Web Hook、Git Hook 等),实现以下自动化流程。

  1. 在用户向 Git 托管平台提交代码

  2. 托管平台调用 Web Hook,提醒 Caddy 仓库更新

  3. Caddy 拉取仓库

  4. Caddy 执行 post-receive,使用 Hugo 打包仓库(或 Hexo 等)

教程

1. 下载部署服务代码

GitHub 仓库: https://github.com/forewing/hugo-caddy

以下步骤默认在部署服务代码文件夹内执行。

2. 修改部署服务设置

  1. 生成部署密钥对

    $ ssh-keygen -f ./.ssh/id_rsa
    
  2. ./Caddyfile.example 移至 ./Caddyfile 并修改以下参数

  • {YOUR_REPO_URL}: 博客代码仓库 URL

  • {YOUR_HOOK_URL}: Web Hook 监听地址

    如设置为 /.hook,且根域名为 example.com,则需要 http[s]://example.com/.hook 可以从外部访问到

  • {YOUR_HOOK_SECRET}: Hook 密钥,可通过如下方法生成

    $ openssl rand -base64 32
    

3. 修改 Git 仓库设置

  1. 添加部署密钥

./.ssh/id_rsa.pub 内容添加入仓库的部署密钥中,并保证读权限。

以 GitHub 为例,访问 Settings -> Deploy Keys -> Add deploy key

key

  1. 设置 Web Hook

将之前设置的 Web Hook 地址填入设置。

以 GitHub 为例,访问 Settings -> Webhooks -> Add webhooks

key

字段内容:

  • Payload URL: Web Hook 监听地址

{YOUR_HOOK_URL} 设置为 /.hook,且根域名为 example.com,则此处设置为 http[s]://example.com/.hook

  • Content type:application/json

  • Secret: {YOUR_HOOK_SECRET}

  • Events: 仅限 push 操作

4. 测试部署

$ docker-compose up -d

之后,配置好反代转发,你应该已经可以发现自己的博客正确的部署好了。

向代码仓库提交一些修改,很快就会自动同步到部署服务器上了!

尾声

本文介绍了一种静态博客的服务器自动化部署方案,若想了解更多博客类型、部署方法之间的比较,推荐一个相关阅读:

Doowzs,《博客搭建详解教程》(https://doowzs.com/blog/2020-01-08-blog-tutorial/)