balupton
(Benjamin Lupton)
1
我目前运营两个独立的 Discourse 论坛,每个都托管在各自的 Scaleway 实例上,并按如下方式升级:
# 更新 Discourse Docker 环境
cd /var/discourse
git pull origin master
# 重建 Discourse
/var/discourse/launcher rebuild app
每次升级都会导致论坛停机约 5 到 15 分钟。
其中一个站点通过 Cloudflare 代理,因此可以无缝提供离线缓存内容。但另一个站点未使用 Cloudflare。
我在想,Discourse 是否能导出一个静态站点,仅包含面向匿名用户公开的帖子,并禁用互动按钮,同时在顶部显示横幅:“本网站当前处于只读模式,正在进行升级。”在论坛升级期间提供该静态缓存,待论坛恢复在线后再删除该静态缓存。
1 个赞
j127
2
如果 DNS 由 Cloudflare 管理(即使未启用代理),通常会在几秒钟内完成更新。在更新期间,您可以将域名指向另一台服务器(例如部署在 Netlify/Vercel/Firebase/Surge 等平台上的维护页面,其中所有路径均指向一个 index.html 文件)。
我尚未尝试过,但或许可以通过 Cloudflare Worker(“无服务器”函数)中的 resolveOverride API 临时提供另一个后端服务。
1 个赞
balupton
(Benjamin Lupton)
3
是的,无论是更改 DNS,还是启动一个临时 Docker Nginx 容器监听同一端口并提供内容,这些都属于容易实现的部分。
目前最困难的是生成一个静态导出版本,禁用交互功能并添加横幅,同时需适配主题、帖子、分类和索引页面(搜索功能可以暂时停用)。接下来是将此替换流程整合到升级过程中,不过这相对容易实现。
在论坛中搜索“静态导出”相关内容,似乎并没有现成的方案。我之前曾为另一个项目编写过 Discourse API 客户端,因此可以自行开发一个方案,不过可能无法完全复刻现有设计风格。
另一个需要考虑的因素是,在提供静态导出内容时,需确保这些静态页面不会被浏览器缓存,也不会被搜索引擎缓存。
我在想,How do I export the complete forum as static html pages? - #3 by wangerin 这个方案是否可行,但看起来仍然需要禁用交互元素并注入横幅。
pfaffman
(Jay Pfaffman)
4
如果您运行的是双容器部署,停机时间将少于1分钟。或者,如果您愿意运行负载均衡器,则可以实现零停机。这比您所描述的方案更简单。
3 个赞
balupton
(Benjamin Lupton)
5
是的,我认为是的。能否指引我查看推荐的两个容器选项?
pfaffman
(Jay Pfaffman)
6
2 个赞