Discourse能否支持为两个具有不同风格的网站创建共享论坛?

您好 Discourse 社区,

我正在探索为我的博客和作品集这两个独立网站创建一个共享论坛的可能性。概念是拥有一个论坛数据库,同时服务于这两个网站,允许用户和主题在两个社区之间共享。但是,我希望论坛能够根据用户访问的网站不同而拥有不同的样式,这样每个社区都能感觉独立,同时又属于更大的共享空间。

我มี背景是网页开发,虽然有一段时间没有做过像这样的大型项目了。我愿意重新投入并学习实现这一目标所需的知识,但我希望得到关于 Discourse 是否可行的指导。

具体来说,我想知道:

  1. Discourse 是否支持基于引荐域名或 URL 的不同主题或样式?
  2. 是否可以配置 Discourse 来显示自定义品牌(徽标、颜色等),同时保持共享的用户数据库和主题池?
  3. 是否有可以简化此实现的插件或扩展?
  4. 在追求此类设置时,我应该考虑哪些挑战或限制?

这个项目仍处于概念阶段,我计划在年底开始构建。在投入之前,我想确保 Discourse 是实现这一愿景的正确平台。

提前感谢您提供的任何见解、建议或资源!

此致,
Chris

4 个赞

所以有两个论坛,一个用于你的博客,另一个用于你的作品集,但共享同一个数据库?

1 个赞

正确。
两个域共享一个论坛,位于一个数据库上。只有主题不同,如果可能的话。

1 个赞

我对此了解不多。但可能通过某种形式的多站点设置来实现。

但您需要获得我关于多站点设置知识和经验的人的反馈。

1 个赞

我还是不太清楚。
那么域名 a 指向论坛,域名 b 指向同一个论坛/不同的论坛但使用同一个数据库?如果是这样,也许是不同的论坛但使用同一个数据库?那样的话风格就可以不同。

也许这个指南会有帮助?

然后两个论坛都可以指向那里?

2 个赞

在这里快速搜索了一下,不确定是否能轻易完成。

也许更简单的途径是使用一个与主组绑定的开关,并设置两个组,从组 A 切换到组 B 可以切换主题,也许可以使用类似 #theme-component 的自定义主页来为组?或者也许使用两次安装的现代分类+组框(在 air 主题中使用),并根据主题/主组进行自定义。

虽然我自己不知道。我想知道运行两个 Discourse 实例是否会损坏数据库?不过有些人有暂存站点,但我认为暂存站点通常会定期备份主站点?

2 个赞

因此,如果用户打开网站 A,然后从网站 A 进入论坛,则应用主题 A。

然后,同一用户打开网站 B,从网站 B 进入论坛,并看到主题 B?

如果用户应用了主题 A,然后打开网站 B 并刷新论坛页面,会怎样?是应用主题 B,还是保留主题 A?

我的猜测是,您可以在同一个数据库上运行多个引擎(Discourse 安装)(因此您需要一个单独的数据库)。不过,我只会运行 1 个 sidekiq。否则,它们中的两个会开始争夺任务。除此之外,我认为 Discourse 是一个无状态应用程序,所以运行多少个应该无关紧要。

现在,一个关于根本问题的问题:为什么?这是否违反 SEO 规则?我认为 Google 不喜欢在多个网站上找到相同的内容。

3 个赞

实际上,有些功能可能无法按预期工作——例如,实时 UI 更新(如果有人更新了文章,而你在阅读时它会自动重新渲染)。我认为这两个站点不会互相通知,因此你需要用户刷新他们的浏览器。可能还有更多。例如,如果你在一个站点上更改了站点设置,我猜另一个站点也不会注意到,你可能需要重新启动另一个站点。

根据 Scaling up and sidekiq 的说法,我认为这实际上是可行的。Sidekiq 似乎可以处理这个问题,其余的将是正确配置 Redis 的问题。

2 个赞

这有点离题了,我不想跑题,但我想表达我简单的赞赏。

我认为我们正处于一个互联网时代,人们需要考虑SEO或他们的用户。

我毫不怀疑,那些选择用户的公司将使用自托管的Discourse。

我一直在寻找这个功能,因为我有一些个人项目,拥有相同的受众和目标。多站点与SSO是最接近的,但我最终一无所获,因为它很慢,而且不方便。

我支持OP的想法,并开始关注这个 :+1:

2 个赞

也许可以根据推荐人更改用户的主题?我认为这需要一个插件。

您可以联系我或在 Marketplace 中提问。

4 个赞

各位,多站点无法正常工作。

这个也无法正常工作。

Discourse 不是无状态的,所有信息都在数据库中。因此,如果你在单个数据库之上运行多个实例,它们会自动看起来相同,并且一个实例中的更改会立即反映在另一个实例中。

这“仅仅”是切换主题的问题。也许可以利用现有的主题预览逻辑,让一个插件只查看主机名而不是 URL 参数。

在两个 URL 下托管同一个论坛可能是最难的部分,尤其是在 SEO 方面。这会给你带来各种重复内容和规范 URL 的麻烦。

5 个赞

您能澄清一下吗?我很想多了解一下它是如何工作的。我认为您这两句话是矛盾的?我认为反映一切实际上是 OP 所要求的。但如果另一个实例没有收到第一个实例所做的更改通知,它怎么会发生呢?是的,它存储在数据库中,但没有通知。

所以只是一个数据库 = 无状态。每次发出请求时,它都会再次查询数据库——没有内存状态。还是有?

否则,我真的很喜欢插件的想法。我同意这将是可行的方法,而且我仍然认为 SEO 不是您可以选择做的事情,而是为了吸引受众而必须做的事情。重复将是一种削减它的方法。即使从用户的角度来看,如果我看到我写的东西可能链接到另一个我一无所知的网站,我也会感到可疑,我会非常不安。内容重复通常是低质量网站使用的方法。这就是为什么它会被搜索引擎降级。但这更多是 Community 类别的话题。

我认为我们在这里对定义感到困惑。Discourse 服务器端代码(某种程度上*)是无状态的,但整个 Discourse 实例(Web 客户端、服务器端代码、Redis、缓存文件、数据库)不是。

事物的另一面是——鉴于服务器端代码是无状态的——这种设置无法完成 OP 所希望的,因为没有地方可以存储应该提供哪个 URL 和主题的信息。您描述的设置实际上是在负载均衡设置中发生的,其中有多个 Web 容器和一个单一的数据库/Redis 实例。这是一个单一站点。

* 我说“某种程度上”是因为在各种地方有很多缓存层

3 个赞

我明白了。主站点 URL 是否也存储在数据库中?所以这并非本地实例配置的问题?那样的话,两个实例都试图提供相同的内容就很清楚了。

而且你说得对,双服务器设置仍然无助于 Discourse 选择正确的主题。

现在我想起来,内容也会有问题。如果你将链接粘贴到 Discourse 中,它会将整个 URL 粘贴进去。因此,阅读其他站点编写的主题的人在点击链接时会被引导到该站点。上传也是如此,请参阅 https://meta.discourse.org/t/uploads-path-should-update-when-url-changes-in-app-yml-during-container-rebuild/315364。

另一个问题可能是电子邮件?通知电子邮件将从哪个域发送?另一个问题——社交插件(Facebook 等)或 Google 登录将重定向到错误的站点(或者可能拒绝登录)。

一个更简单的解决方案是设置一个单一实例,包含 2 个类别——每个父站点一个。这将绕过上述所有问题。

您可以通过简单的 CSS 和 category-category_slug 类来轻松设置类别和类别内主题的样式。

如果您想将其中一个设为一组用户的“默认”或主页,那么您需要使用 Custom Homepage for Groups 这个工具。

5 个赞