在腾讯Serverless Framework上部署Hugo静态博客

2021/1/23

Serverless 可以理解成是公有云上的一个运行函数的「机会」。这个「机会」在无人访问的时候不耗费计算资源,所以理论上 Serverless 可以价格非常低廉,只需要在请求来临的时候服务器算力花一点 CPU 时间完成计算即可。因此 Serverless 非常适合轻量、离散、静态的计算,比如计算一下密码算法、压缩一个文件、或者返回 HTTP 页面等,有种「用完即走」的飘逸感。

因此对于静态 web 页面而言,Serverless 是一个极好的应用实例。静态博客在计算平台完成静态页面生成后,将生成结果放到 Serverless 的平台上,当有 HTTP 请求的时候将页面数据返回给浏览器,就完成了一个静态页面的「计算」,或者说「交互」。

为了实验这一点(同时为了给架在 Bitcron 的博客找下家),跑腾讯 Serverless Framework 架了个静态站。页面生成用了 Hugo,一个 Go 语言写的渲染器,负责将 Markdown 文档从纯文本按照主题模板的逻辑,翻译成 HTML 页面。之前用 Bitcron 的逻辑是这样的:

  1. 用户写 Markdown 文档,放到 Dropbox
  2. Bitcron 的后台绑定了 Dropbox,当 Dropbox 发现有文件更新,通知 Bitcron 后台
  3. 后台抓取 MD 和文中包含的资源,放到自己的存储中
  4. 后台按照 Bitcron 中选择的模板逻辑,将 MD 渲染成网页
  5. 网页被部署到 Bitcron 对应的二级域名下,用户通过自定义域名的 CNAME 访问页面

到了 Hugo + Serverless,逻辑其实差不太多,只是要把 Bitcron 完成的内容拆出来,通过脚本或 webhook API 自动完成。在新的场景下,应用逻辑是这样的:

  1. 用户写 Markdown 文档,放到 Dropbox,该文件夹也是 Hugo 监控的文件夹
  2. Hugo 发现文件变更,自己进行重构,生成的 HTML 页面放到 <hugo-dir>/public
  3. /public 中的内容发生变化,触发自动化脚本,脚本将 <hugo-dir>/public 的变化内容拷贝到 <serverless-dir>/src
  4. <serverlesss-dir> 中执行 serverless deploy<serverless-dir>/src 中的数据上传到 serverless 的平台,拥有随机命名的 bucket 域名
  5. 用户访问自定义域名的 CNAME 跳转到 bucket 域名访问页面

在这样的部署中,有如下一些需要花时间解决的问题:

  1. Serverless 的静态托管设定。腾讯的文档写得不甚清晰,至少一上来我没看懂 serverless deploy 应该在哪里运行。其实在腾讯云的 GUI 网站上可以什么都不设置,直接在任意可计算设备上下载并调用 serverless 的二进制文件和 serverless.yml 的配置文件里构造并启动一个 serverless 实例。
  2. Dropbox 其实可以换成任意云协作平台。因为对于 MD 文件的内容监控是由 Hugo 完成的,因此只要 Hugo 能够在本机发现 MD 文件变化,就可以自动完成 HTML 构建。
  3. <hugo-dir>/public 中发现内容变化并拷贝到 <serverless-dir>/src 是较为繁琐的一步,必须自己手动完成。当然,可以在 Hugo 中直接手动指定输出目录到 <serverless-dir>/src,但触发 serverless deploy 始终是绕不过的一步
  4. Hugo 的 Front Matter(MD 文件中的格式头)与 Bitcron 不同,这个是最痛苦的,因为之前的日志里还有 Jekyll 的格式头。Bitcron 兼容 Jekyll,但 Hugo 好像二者都不兼容,搞不好要自己写 Python 批处理。

2021/1/31 更新

上个星期花了五六个小时,面向 Google 解决了上面的第四点——用 Python 做了个批处理,将不规范的 Bitcron 格式转为标准的 yaml 格式头,并且能够通过 Hugo 的编译。

而问题最大和不舒服的一步,反而成了 Tencent Serverless 的功能缺陷——无法从上传的目录中找到修改的文件,进行差量传输。这下要更新我这几百篇日志+几十张图片就傻了眼——每次上传几十兆的数据,不说流量浪费,时间上也极其不划算。整个 sls deploy 动作要花掉百余秒,用户体验实在是太差了。而为了缩小上传尺寸去找对象存储作图床,则又是另一个大坑。当前我对 Dropbox 上文字+图片同时同步的形式非常满意,如果为了每次传图还要用工具传到另一个地方再在 MD 里粘图片链接,想想就很痛苦。综上,恐怕当前只能暂时放弃在 serverless 上布 Hugo 的想法……没准,还是得回到 VPS 的坎坷老路上。

代码放在这里,又是一个没啥用的脚本: bitcron-hugo-front-formatter

Comments
Write a Comment