八月 23, 2020

博客搭建小记(一)——Caddy 真香

博客搭建小记(一)——Caddy 真香

Blog Framework

我对博客的需求其实很简单,有一个基本的图床,基本的管理后台,能使用 Markdown 编辑博文即可。最开始博客用的是 WordPress,但是这玩意对于我来说太重了,我经常会陷入到找各种插件各种主题中,而非专注于写博客(还有一个很重要的原因是,我很讨厌 PHP)。

后来很长一段时间都打算自己操刀,写一个 Blog Framework,但是这个业务逻辑虽然不复杂,但是工作量也不算小,收效确实不大(其实主要还是自己懒)。

选来选去选了 Ghost,主要是够轻量,背后有商业公司背书,不愁后续维护问题。在使用过程中意外发现,Ghost 的开放性居然做的很好,API 文档很完善,还有 WebHook 机制,这令本猿惊喜不已,后面或许可以根据 Ghost 的 API 做一些好玩的东西。

我其实并不是很喜欢脚本语言搭起来的东西,诸如 python、nodejs 一类,部署太麻烦了,要往操作系统里面装一堆依赖,我还是喜欢 all in one binary 这样的纯粹。果不其然在部署 Ghost 的时候,很多 nodejs 的依赖不是很好装。不想纠结,直接用 docker 搞定了。Ghost 官方的 docker
image
写的还蛮清楚,部署过程不在此赘述。

反向代理

下面隆重为大家介绍反向代理工具 Caddy,什么?为什么不是 Nginx?因为 Caddy 香啊!自动配置 SSL 你敢信?省事即是生产力,即是王道!

我们先试想一下,如何使用 Let's encrypt + nginx 配置 HTTPS。

首先我们需要安装 ACME 客户端,一般 ACME 客户端会有一个引导程序帮你配置定时申请 SSL 证书,自动修改 nginx 配置等这个过程看起来并不是很麻烦,但现实往往很残酷。安装 ACME 客户端时,如果这玩意是 python 写的,那么恭喜你,你大概率要解决一揽子依赖问题。如果你的操作系统比较老或者比较冷门,这类自动配置大概率都不会奏效。这时候我们就需要手动配置 cron,隔一段时间自动去更新一下 SSL 证书,然后手动去修改 nginx 配置。现在有请 Caddy 出场:

Caddy 2是功能强大的企业级开源 Web 服务器,使用 Go 语言编写,可以自动配置 HTTPS。
——翻译自 Caddy 官网

Caddy 有多省事?

caddy reverse-proxy --from example.com --to localhost:9000

你看吧,反代有了,SSL 也有了,你还没反应过来,一切都搞定了,丝般顺滑。

前台模板

又到了搭建一个博客最激动人心的环节,选前台模板,官方的前台模板市场并不丰富,如果在加一个"免费"的条件,那剩下的模板就屈指可数了,不过这对于我来说是一个优点,避免我选恐。我使用的是 Editorial 没什么原因,随便选的。

Ghost + Github Action 实现前台模板的持续集成

Editorial 肯定也不能直接用的,至少是要汉化一波。偶然发现 Ghost 和 Github Action 居然可以很好地集成,可以做到将代码 push 到 master 分支后,自动的应用到博客。官网教程写的比较清楚,原理也很简单,就是基于 Ghost 提供的 Admin API,将打包好的模板 push 到博客上面。实际上任意 CI 工具都可以做到这点的,只不过官方将 Github Action 适用的脚本写好了,直接拿来用比较方便。

附:我的 Editorial fork 地址,对原版 Editorial 进行了一些本土化改造,增加了对 ICP 备案号显示的支持。

把后台藏起来

这年头,做脚本小子门槛越来越低,我可不想服务器被抓去当肉鸡。Ghost 会不会有什么 0Day 也不好说。所以干脆想办法吧 Admin 入口藏起来。浏览了一圈 Ghost 的文档,发现 Ghost 支持指定 Admin 入口的(详见官方文档),那么配合 caddy 的路由配置接口实现隐藏后台入口的能力了。

首先修改 config.production.json 中的 admin 配置项为新的 admin 访问入口 url,例如:

{
  "url": "http://localhost:2368",
  "server": {
    "port": 2368,
    "host": "0.0.0.0"
  },
  "admin": {
    "url": "https://admin.example.com"
  },
  ...
}

下面配置 caddy。caddy 要能做这样几件事:

  1. 反向代理新的 admin 入口域名
  2. 对新的 admin 入口域名进行访问控制
  3. 将原有的 admin 入口跳转 404

下面是我的 caddy 配置:

www.example.com {
	redir https://example.com{uri} 301
}

example.com {
	rewrite /ghost/* /404/
	redir /ghost /ghost/ 301
	reverse_proxy 127.0.0.1:2368
}

admin.example.com {
	redir / /ghost/ 301
	reverse_proxy 127.0.0.1:2368
}

总结

水了第一篇文,大致介绍了目前大家看到的博客的服务端结构,其实本文我主要就是想介绍一下 caddy 这个新兴的开源 server,非常抓我这种懒人的痛点。除此之外本文也没什么新奇之处。目前这个博客的服务端结构还有一点缺失,那就是备份。至少要搞一个定时的冷备,不然某云给我搞一个“磁盘静默错误”我可吃不消。下一篇文章会讲一下我的冷备方案。

最后还是要说一句,caddy 配置文件简洁明了,真香。