Discourse 折腾指北(挖坑心得)

最近折腾 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/
一个以学(折)习(腾)、工(玩)具(具)、语(语)言(料)为主题的小论坛

4 Likes

非常感谢能提供如此详细的过程和心路历程。

这本身也是一个非常有趣的学习过程。

我也是不太喜欢群聊的方式,因为这种方式中的噪音太多了,无法沉入的了解和获取最重要的知识和内容。

Discourse 本身只是一个沟通的工具,我们是希望这个工具能够更多的帮助有需要的用户快速组建自己的小圈子。

针对使用的用户,我们想法是能少折腾工具就少折腾工具,毕竟不管是什么内容始终是最主要的。

尤其是对社区这种本身已经较为边缘话的产品来说,没有吸引人的内容,要获得访问量还是比较困难的。

1 Like

Discourse 的设计上就是使用前后端分离的方式。

所有数据的调用都是通过 API 来实现的,所以 Discourse 的 API 功能很强大。

在没有必要的时候,不要随意把自己网站的 API 给开放了。

对于一些我们老网站的内容,我们很多时候都可以通过数据库 Dump 数据,API 调用来重新恢复。

API 的 Key 一定要保管好。

1 Like

很详细,谢谢分享 :100:

1 Like

(°_°)…说了那么多 表示看不懂 我最近还在优化css 要不各位看看我的论坛看看还需要改什么吗

这个简直是帮大忙了,我今天刚想说来论坛问一下怎么指定移动端的头像为发帖人呢,哈哈哈,感谢~

1 Like

看看我论坛我弄了一个FPS显示

不错,还看到了米塔

之前就看过你论坛的全部社区更新帖 :grinning:

2 Likes

哈哈哈,谢谢你的访问 :heart_eyes:

1 Like