很久没有写博客了。几年前前把 raptium.net 放入归档模式以后,开了现在这个 hguan.me 站点。然而写了几篇烂尾的文章以后,整个站点都烂尾了,再也没有更新过🤦🏻‍♂️。

最近又想重启写博客和瞎折腾,所以就先把本站的部署方式更新了一下。

本站是一个 Jekyll 生成的静态站点,功能非常简单。原本是放在一个 Linode 机器上,在 Docker 容器中跑了 nginx,前面用了 CloudFlare。

之前的部署方式比较原始。我使用 nginxnginx-proxy 等容器组合的方式来跑多个站点,而容器编排则近乎手动:基本上一个站点写一个 docker-compose.yml,然后用 docker-compose 命令行启动。虚拟机重启之类的情况下,常常需要手动去重启容器(应该是可以配置自动,我不会……),容器多了还是挺麻烦的。另外 nginx-proxy 也时有配置不更新的情况发生,大概是我打开方式不对。

这回我希望找一个更加自动化的方案,另外我希望整体比较简单,现在折腾的动力大不如以前了。

我知道 Kubernetes 是当下最常用的容器编排系统,但一直没有时间去学,并且工作上也没有机会实际上手使用。这块知识其实是脱节了。而这次只是为了自己的博客网站,使用 k8s 没有什么必要,我的 VPS 也跑不动这么高级的系统。做了一些简单调研后,我决定用 Docker 自带的编排方式:Docker Swarm

我参照 https://dockerswarm.rocks/ 做了大部分配置工作。启用了 Docker Swarm 后,我安装了 Swarmpit,这是一个 Docker Swarm 的 Web UI;我还安装了 Traefik,这是一个 HTTP 网关,Traefik 本身自带 Web 控制面板,就不再需要另外找了。

这样基本上部署方案就齐了。之前的 docker-compose.yml 稍加修改,就能部署到 Docker Swarm 集群(尽管目前只有一个节点)上面。Traefik 作为 HTTP 网关,取代了之前用的 nginx-proxy,它可以从 Docker 的容器元信息上获取路由规则及配置,不需要额外的设置。

处理完部署,我想把 CI/CD 也都做完。现在 GitHub 有免费的 Action 可用,其实已经非常容易。在 GitHub Action 中,使用 Jekyll 生成站点 HTML 文件。因为最终需要部署到 Docker,产出最好是镜像,所以又在 Action 中加了一步,把 Jekyll 的产出放到一个 nginx 镜像中。GitHub Package 提供了免费的 Docker Image Registry,于是再加一行配置即可将构建好的 Docker 镜像推到 GitHub Package。这样只要我将站点的更新推送到 GitHub,就会触发构建流程,能在 GitHub Package 中拿到最新版的站点镜像。

最后真正的更新部署我还是用了手动,这个我觉得不麻烦。就是改一下 docker-compose.yml 中的镜像标签(版本),然后 docker stack deploy 一下。