# 你如何横向扩展Discourse？

**URL:** https://meta.discourse.org/t/how-do-you-scale-discourse-horizontally/183701
**Category:** Self-hosting
**Created:** [2021年三月18日 21:42 UTC](https://meta.discourse.org/t/how-do-you-scale-discourse-horizontally/183701 "2021-03-18T21:42:47Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![dscat](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dscat/32/203656_2.png) [@dscat](https://meta.discourse.org/u/dscat)
#### Post date: [2021年三月18日 21:42 UTC](https://meta.discourse.org/t/how-do-you-scale-discourse-horizontally/183701/1 "2021-03-18T21:42:47Z")

</div>

你好，

我对安装说明感到困惑。Discourse 是否支持水平扩展？  
例如：在多台服务器上运行 2 个或更多 Docker 容器，每个容器都运行 Discourse？

在 [GitHub - discourse/discourse\_docker: A Docker image for Discourse · GitHub](https://github.com/discourse/discourse_docker) 提供的说明中：

> 多容器配置更加灵活和稳健，但设置起来也更复杂。多容器设置允许您：
> 
> - 在升级到 Discourse 新版本时最大限度地减少停机时间。您可以在网站运行时引导新的 Web 进程，仅在构建完成后切换新镜像。
> - 将论坛扩展到多台服务器。
> - 添加服务器以实现冗余。
> - 让某些必需的服务（例如数据库）在性能更强的硬件上运行。
> 
> 如果您需要多容器设置，请参阅 samples 目录中的 `data.yml` 和 `web_only.yml` 模板。为了简化此过程，`launcher` 将注入一个名为 `DISCOURSE_HOST_IP` 的环境变量，该变量将在镜像内部可用。

请问是否有地方可以找到更多关于如何在不同服务器上运行容器（而不是在同一台服务器上运行多个容器）的信息？

谢谢

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [2021年三月18日 21:53 UTC](https://meta.discourse.org/t/how-do-you-scale-discourse-horizontally/183701/2 "2021-03-18T21:53:53Z")

</div>

关于“Discourse 能否发布无需引导（bootstrap）的频繁 Docker 镜像？”有很多相关讨论，详见：[Can Discourse ship frequent Docker images that do not need to be bootstrapped?](https://meta.discourse.org/t/can-discourse-ship-frequent-docker-images-that-do-not-need-to-be-bootstrapped/33205)。

其核心要点如下：

1. 您需为 PostgreSQL、Redis 和负载均衡器提供外部服务，并配置 `app.yml` 以使用这些服务，例如参考 [使用独立 PostgreSQL 服务器运行 Discourse](https://meta.discourse.org/t/running-discourse-with-a-separate-postgresql-server/46375)。

2. 在任意位置运行 `./launcher bootstrap app`。这将在本地机器上生成一个容器镜像。将该镜像上传至您的容器镜像仓库服务。

3. 现在，您可以启动任意数量的实例，并让它们全部运行上一步中导出的镜像。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2021年三月19日 15:31 UTC](https://meta.discourse.org/t/how-do-you-scale-discourse-horizontally/183701/3 "2021-03-19T15:31:36Z")

</div>

您可以尝试类似[在 Apache 旁边运行 Discourse Docker](https://meta.discourse.org/t/running-discourse-docker-alongside-apache/161625) 的方案，并创建两个 Web 容器，其中一个是前置的反向代理。

您也可以使用多站点功能，让单个容器服务于多个站点（使用相同的插件和 Discourse 版本）。[这篇帖子](https://support.literatecomputing.com/t/multisite-configuration-with-lets-encrypt-and-no-reverse-proxy/632)介绍了如何在没有外部反向代理的情况下实现这一点。如果您尝试该方法，请在那里留言并告诉我是否成功。我计划在确认其确实可行后，在此处发布相关内容。

在多台服务器上运行容器与上述任一方案类似。您只需部署多个容器，让它们共享相同的 Redis 和 Postgres，并置于负载均衡器之后即可。

大多数情况下，除了[Discourse 官方标准安装](https://meta.discourse.org/t/discourse-official-standard-installation/142537)之外的其他配置均不受支持，因为实现这些方式的可能性无穷无尽。

---

<div class="post-metadata">

### Author: ![makehitec](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/makehitec/32/464376_2.png) [@makehitec](https://meta.discourse.org/u/makehitec)
#### Post date: [2024年十一月18日 22:37 UTC](https://meta.discourse.org/t/how-do-you-scale-discourse-horizontally/183701/4 "2024-11-18T22:37:43Z")

</div>

我有两个问题：

- 第一个关于 Sidekiq，在运行多个 `web_only.yml` Docker 并且每个都在不同的虚拟机中时：在这种第一种情况下，共享同一 Redis 服务器的不同 Sidekiq 实例可能会运行相同的作业[两次](https://github.com/sidekiq/sidekiq/issues/3303)，Discourse 对这种错误是否健壮？使用 **一个** Sidekiq 在专用 VM（或 Docker）中是否更可靠，如何将其与 `web_only` Discourse 分开？
- 关于您对支持的安装的最后 remarks：我明白人们可以有无限种方式来配置多个容器，但依我之见，我们需要一种 **受支持** 的方式来运行多个实例以实现水平扩展或/和高可用性，这两种情况是：基于 VM（不同 VM 中的不同 Discourse `web_only` Docker，Redis/Postgres 直接安装在其他单独的 VM 中，不使用 Docker）和基于容器（所有内容都基于容器）。
