B-log


使用 Netlify 自动部署支持 HTTPS 的 Hugo 博客

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

自动部署静态站点的方法有很多, 例如我之前使用过的 Travis CI, 或是使用 github 原生支持的 jekyll, 即使是通过 webhook 来自己实现也很简单. 今天要介绍的 Netlify 在自动部署这一块并没有什么特别之处, 它的优势在于: 支持自定义域名的 HTTPS.

在知道 Netlify 之前, 我所了解的可以让静态站点使用 HTTPS 的方式有两种:

  1. 托管到自己的服务器上. 这样当然想怎么折腾都可以, 但这样总感觉失去了静态博客的意义, 而且有一定的门槛: 需要有自己的服务器. 而且我并不想为此耗费自己服务器的带宽和资源, 也不想暴露服务器的 ip.
  2. 使用 Cloudflare 的 NS 服务, 利用其提供的 Universal SSL 服务提供 HTTPS. 但是这样做需要把域名的 NS 服务迁到 Cloudflare, 也有点得不偿失了. 另外 Cloudflare CDN 连国内的速度貌似不怎么样, 也不知道 NS 服务又是什么情况.

而 Netlify 可以说是完美解决了以上两点, 首先, 站点是托管在 Netlify 的服务器上; 其次, 只需要加一条 CNAME 记录, 即可为站点加上 HTTPS 支持. 至少比较完美地满足了我的需求.

首先, 注册好 Netlify 账号后, 选择 New site from Git, 就可以通过 OAuth 的方式获取指定 repo 的访问权限, 同时也会向该 repo 增加一个 Deploy Key. 对于 Hugo 站点, 创建时的 Build command 应该填为 pip install -U pygments; hugo -v, 并且 Publish directory 填为 public. 创建成功之后就会开始第一次构建.

在一开始的测试中, 我发现回报这样一个错误: Unable to locate template for shortcode 'instagram', 按道理来说 instagram 这个 shortcode 是 hugo 内置的, 不应该找不到, 有可能是版本问题. 一查之下, 果然这个 shortcode 是在 Hugo 0.20 版本才加入的, 而 Netlify 默认使用的版本是 0.17. 解决方式是在项目 repo 中增加一个 netlify.toml 文件, 并加入以下内容:

[context.production.environment]
    HUGO_VERSION = "0.25.1"

就可以指定使用的 Hugo 版本.

配置好自动部署后, 再将自定义的域名 CNAME 到对应的 Netlify 二级域名下, 并在 Netlify 中配置好 Let’s Encrypt 证书就可以了.