最近折腾 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 证书设置又折腾了几小时,被什么证书链搞到崩溃,不过最后也解决了。
嗯,我还设置了 clone 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+m365onedrive 性价比爆棚,但折腾了几个小时以后发现权限问题太头痛了,现在想想其实也可以解决,只备份 discourse 的备份文件到云上就可以了,但当时想一劳永逸的一次性解决所有问题,把 vps 的各种设置也一起自动备份,结果被脚本权限问题各种折磨,最终在论坛的各种有理有据的安利中放弃了 rclone,倒向 S3(其实之前主要是怕天价账单)。
经过各种毒打之后的我终于知道要先看文档了,不过 S3 的文档还好(aws 的设置还是看的头大,还好有 ChatGPT……),S3 CDN 的文档开头就提:「不使用 CDN(或输入存储桶 URL 作为 CDN URL)可能会导致问题,因此不受支持」,这下又抓瞎了,迎着头皮继续和 ChatGPT 两个臭棋篓子捣鼓,居然搞定了。
另外设置 S3 之前的图片附件迁移报错的问题,感觉处理起来太复杂,我直接清空了 uploads,然后发现一般的帖子都正常,只有 ytb 的 onebox 的图片出了问题,这种帖子不多,直接重新编辑帖子修正了。
设置好 S3 以后,直接开启 CloudFront,然后在 Discourse 的页面设置里直接设置 S3 CDN URL 就可以,当然老的帖子需要 ssh rebake。我碰到的情况是,这个时候反而不能去修改 app.yml 添加 DISCOURSE_S3_CDN_URL,添加之后 rebuild 会失败。
中途还有个细节,因为用了 cloudflare 的 ssl,所以在开始重建的时候 app.yml 中写了两个,像这样,结果安装一直失败,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}
/* tag 全大写 */
.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),另外为了顺眼什么的 新建话题 改 发帖,浏览量改浏览 之类
API keys
为了不用审核、尽量免翻?等等目标,直接将论坛设置为了登录可见,这种情况下,可以生成 单个用户级别的 API keys,查了一下才知道,所有用户级别的 api 好像非常危险(而页面没有任何提示),使用 /latest.rss?api_key=$ 可以在登录可见的限制下生成 rss
用户全名
这个感觉也有必要提下,没有特殊要求建议在网站设置中关闭 Enable names 及相关的全名设置,这个设定(基本上可以理解为实名?)和以前论坛的用户名/昵称概念容易混淆,对于网络社区不仅没必要还比较混乱
安利
都写到这了,顺便安利下论坛,对 学习(广义)折腾(如上)、工具(AI)应用(低阶)、二语习得(日语)有兴趣的同学来串下门 (需要注册)
https://campfirium.info/
一个以学(折)习(腾)、工(玩)具(具)、语(语)言(料)为主题的小论坛