最近折腾 Discourse 从论坛的海量帖子获得了巨大的帮助,现在折腾告一段落来交个作业,顺便分享下挖坑填坑的心得血泪,刚从坑里爬出来,写的比较随意。
挖坑填坑
悲剧始末
在 24 年语言学习的过程中,发现交流还是很重要,但又不大喜欢群聊的方式,所以在考完 N2 开始报复性的折腾中,第一个目标就是搭一个能异步交流的小论坛。
之后刚好碰上黑五,蹲 VPS 还花了不少时间,不过这次好像没啥折扣……之前都能瞎鼓捣搭 Wordpress ,现在有 ChatGPT 那还不是更轻松?……五个小时后……偶然翻到了有论坛提到了一句「问下服务商,这家 VPS 有时候网络本身没配置好」……
VPS 搞好就是应用了,在 Discourse 和 Flarum 之间纠结了下,还是理智的听从了数据,选择了 Discourse,然后……我让 ChatGPT 给我挖的超级大坑开工了……
之前五个小时的折腾不仅没有让我重视文档,反而更是甘做复制粘贴的搬运工,在 ChatGPT 和 Xshell 之前无限 Ctrl+(Shift)+C/V(好像我现在还是这样……)。因为 Linux 基本不会,觉得 Nano 编辑那么长的 app.yml 太麻烦, ChatGPT 也不负众望的让我把原来的 app.yml 备份,直接新建一个新的,只用填必要的代码,嗯,nginx 好像也是这样,OK!
——在一个月之后,我才知道什么叫标准安装,什么叫容器,什么叫挂载——而在当时,我只是又被 Cloudflare 的 SSL 证书设置折腾了几小时,被什么证书链搞到崩溃……
嗯,我设置了 Rclone Onedrive 的外部备份,设置了 Discourse 自己的备份,没有什么问题……吧?
直到一个月以以后,打算装下插件 rebuild 一下的我鬼使神差的为脑抽复制的 discourse-setup 按下了回车……
当时还完全搞不清楚状况的我开始了漫长的抢救行动——其实现在(现在离当时也不过隔了几天)的我已经知道什么叫 .bash_history 了,看下就知道怎么回事了——我甚至把各种记录都塞到 Google AIStudio 里让它分析,直到 Gemini 跟我说了很多次「我们已经试过了所有办法,请接受现实……」
——总而言之,事实就是 ChatGPT 写的新 app.yml 里没有挂载!!!更悲剧的是本来只是打算 rebuild 一下的我完全没有去下载论坛的备份或者检查云备份——云备份又是另一个故事——事故,我确实配置了 Rclone,也部署了每日备份,不过那是在安装 Discourse 之前,完全没涉及 Discourse……
——即使涉及了,也没有意义,因为没有挂载,所有的内容在容器里,被一发 discourse-setup 完全的 destroy 了。当然,如果我在安装完 Discourse 之后能想起来云备份,那也能当时发现这个问题,可惜没有那么多如果……虽然论坛基本上没人发言,虽然有 9 成转贴,但将近一百篇帖子和 60+ 会员注册全部灰灰……
亡羊补牢
羊没了圈子还是得补,一边发致歉公告,一边重建论坛,人工恢复转贴和原创帖(原创帖恢复太要命了,没有底稿要疯),折腾备份,本来看到论坛上讨论的备份方案还觉得我抄的
Rclone+Restic+M365 Onedrive 性价比爆棚,但折腾了几个小时以后发现权限问题太头痛了,现在想想其实也可以解决,只备份 Discourse 的备份文件到云上就可以了,但当时想一劳永逸的解决所有问题,把 VPS 的各种设置也一起自动备份,结果被脚本权限问题各种折磨,最终在论坛的各种有理有据的安利中放弃了 Rclone,倒向 AWS S3(其实之前主要是怕天价账单)。
经过各种毒打之后的我终于知道要先看文档了,不过 S3 的文档还好(AWS 的设置还是看的头大,还好有 ChatGPT……),S3 CDN 的文档开头就提:「不使用 CDN可能会导致问题,因此不受支持」,这下又抓瞎了,迎着头皮继续和 ChatGPT 两个臭棋篓子捣鼓,居然搞定了。
另外设置 S3 之前的图片附件迁移报错的问题,感觉处理起来太复杂,我直接清空了 uploads,然后发现一般的帖子都正常,只有 Youtube 的 Onebox 图片出了问题,这种帖子不多,直接重新编辑帖子修正了。
设置好 S3 以后,直接开启 CloudFront,然后在 Discourse 的站点设置里直接填好 S3 CDN URL 就可以了,当然老的帖子需要 ssh rebake。我碰到的情况是,这个时候反而不能去修改 app.yml 添加 DISCOURSE_S3_CDN_URL,添加之后 rebuild 会失败。
中途还有个细节,因为用了 Cloudflare 的 SSL,所以在开始重建的时候 app.yml 中写了两个 volumes,像这样,结果安装一直失败,gpt-4o 和 Gemini 一直查不出原因,最后还是 o1 给力,给他看了一眼就有了答案——把两部分合起来……
volumes:
- volume:
volumes:
- volume:
意外之喜
之前只是被 @honeymoose 的帖子说服,觉得晚折腾不如早折腾,虽然论坛可能永远也不会多大,但是到时候体积大了处理起来麻烦,但实际设置以后,发现页面打开速度脱胎换骨,在初期这个相对于中后期的备份问题就是更大的利好了。
高兴的太早
才脱胎换骨个把小时,发现图片都打不开了,原来 Cloudfront 的域名早就被呵呵了,虽然也没准备一定要能免翻,但这还能抢救一下的问题还是要解决。没辙,继续逮着 ChatGPT 无限提问,总算把原来的 Cloudfront 域名换成了主域名的二级域名(才知道域名和二级域名可以各用各的证书),又要替换一次 S3 CDN URL,又学了一个新姿势,discourse remap,继续 rebake,终于告一段落。然后悲催的发现,速度好像还慢了一点(没挂代理?)……
Discourse 设置
水了那么久好歹要来点技术细节
主题
主题,第一遍的时候装了很多主题,后来发现都大同小异,还不如默认主题简约大方。另外,主题模块的预览功能好像是坏的,但是官网论坛提供了主题切换功能可以直接体验(左下角切换按钮)。
组件
- DiscoTOC 自动目录生成
- Discourse Avatar Component 头像变方
- Mobile OP Avatars (移动端)帖子头像显示发帖人而非回帖人
插件
- Solved 最佳答案? 基本是论坛必装吧
- Tooltips 可在列表页预览帖子内容
CSS
Discourse 爆丑的顶部横幅和 Search 连在一起,不动大工程好像改不掉,从 Graceful 抄来毛玻璃效果还行。
标签这个还是今天突然想到的,Discourse 为了规范同名标签只能强制小写,但是 CSS 可以把它变全大写(AI 总算不用写成 ai 了)
/* 使顶部横幅处与背景同色且半透明 */
.d-header {background-color:var(--secondary)}
.d-header {opacity:0.9}
/* 标签显示为全大写 */
.discourse-tags>a
,#sidebar-section-content-tags .sidebar-section-link-content-text
{ text-transform: uppercase}
/* 帖子行距 */
.cooked, .d-editor-preview {
line-height: 2;
}
网站文本
主要是把活动时间里的 分 小时 天 替换回了 m h d,关键是干掉了空格(搜索 js.dates.tiny.x ),另外为了顺眼什么的处理了一些「新建话题」改「发帖」、「浏览量」改「浏览」之类。
RSS 和 API keys
为了不用审核、尽量免翻(?)等等目标,直接将论坛设置为了登录可见,这种情况下,通用的 RSS 就失效了。可以生成单个用户级别的 API keys, 提供 /latest.rss?api_key=$ 的 RSS 绕开登录限制(Disourse 的 API 权限极大,所以这种场景应该生成只读 API,如果要提供多人使用,可以新建一个专门的 RSS 用户)。
用户全名
这个感觉也有必要提下,没有特殊要求建议在网站设置中关闭 Enable names 及相关的全名设置,这个设定(基本上可以理解为实名?)和以前论坛的用户名/昵称概念容易混淆,对于网络社区不仅没必要还比较混乱。
安利
都写到这了,顺便安利下论坛,对学习(广义)折腾(如上?……)、工具(AI、笔记工具等)应用(低阶)、二语习得(Refold、沉浸、日语)有兴趣的同学来串下门(需要注册)
Camfirium 一个以学习 · 折腾、工具 · 玩具、语言 · 语料为主题的小论坛