有人有运行两个独立的 Docker 容器而不是 secondsite 方法的经验吗?

我似乎无法再次使用 secondsite 方法,因此我现在考虑在同一服务器上的两个独立容器中运行我的两个站点。

如果有人有这方面的经验,请给我留言。

在尺寸合适的机器上基本可以完成。您至少需要一个反向代理来处理 SSL。并且可能需要使用 socketed 模板而不是暴露端口。

2 个赞

使用 Docker 网络是否合适?

如果你知道你在做什么,那么是的。应该不会有问题。

2 个赞

我已经用 traefik 和 nginx proxy 解决了这个问题。它比 multisite 消耗更多的资源。你仍然需要了解如何让 postgres 支持多个数据库(除非你想运行两个 postgres 实例,那将需要更多的资源)。

1 个赞

此服务器有 12 个处理器和 16 GB 内存,而且这些都不是高流量论坛,因此我不担心运行两个 PostgreSQL 容器会消耗额外的资源。

你需要再创建一个 yml 文件,例如 app2.yml,并更改所有与另一个文件冲突的内容。

您好 Jay

当您说

您的意思是,我应该将这两个容器视为一个单一站点,置于一个合理的 hostname 和故障转移设置(即相同的 DISCOURSE_HOSTNAME 和前端的负载均衡器/健康检查)之后,而不是尝试直接暴露这两个容器?

我想这两个配置都可以接受网络参数,而不是暴露端口,这样有助于避免潜在的冲突?

两个容器的卷绑定是否需要不同?

等等。你克隆了 Discourse 两次吗?你应该只克隆一次 Discourse,然后在 containers 目录中有多个 yml 文件。

也许可以看看 https://meta.discourse.org/t/use-nginx-proxy-manager-to-manage-multiple-sites-with-discourse/206344,不过 https://hub.docker.com/r/jwilder/nginx-proxy 是我用过的。你只需要在 YML 文件中添加一些 ENV 变量就可以让它连接起来,但仍然有很多东西需要理解才能让它正常工作。

每个站点都有自己的宿主机名。这才是这一切的意义所在,对吧?

我让反向代理连接到容器的 80 端口。其他人更喜欢使用套接字。你不应该暴露任何端口。

不。这些文件都不能共享。

每个站点都需要一个 postgres 数据库(如果你知道如何操作,可以放在同一个 postgres 服务器上)。

每个站点都需要自己的 redis。它们不能共享 redis,这是多站点设置的一个优势。

如果你想运行两个 postgres,只需更改宿主机名、smtp 和卷路径,并删除/注释掉 ssl 和 letsencrypt 模板。你甚至可以使用 discourse-setup,如果你在运行 ./discourse-setup 之前将 app.yml 重命名为,例如,hostname.yml

1 个赞

你能详细说明一下这一点吗?我已经根据下面的两个示例进行了调整,以适应第二个站点配置而不是单个站点配置。

##########################################
# app1.yml  (web + sidekiq)
##########################################

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  # - "templates/web.ssl.template.yml"
  # - "templates/web.letsencrypt.ssl.template.yml"

- docker_args: "--network=discourse-net"
+ docker_args: "--network=discourse-net-1"

expose:
  - "8001:80"

params:
  version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  DISCOURSE_HOSTNAME: "physicsyear2.site"
  DISCOURSE_DEVELOPER_EMAILS: "tvgazebo5@gmail.com"

  DISCOURSE_SMTP_ADDRESS: smtp-relay.brevo.com
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_USER_NAME: "YOUR_BREVO_USERNAME"
  DISCOURSE_SMTP_PASSWORD: "YOUR_BREVO_PASSWORD"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@physicsyear2.site"

  ## External Postgres
  DISCOURSE_DB_HOST: pg
  DISCOURSE_DB_PORT: 5432
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "REPLACE_ME_discordb_strong"
  DISCOURSE_DB_NAME: discourse
  DISCOURSE_DB_SOCKET: ""

  ## External Redis
  DISCOURSE_REDIS_HOST: redis
  DISCOURSE_REDIS_PORT: 6379
  DISCOURSE_REDIS_PASSWORD: "REPLACE_ME_redis_strong"

  ## MUST be identical on app1 and app2
  SECRET_KEY_BASE: "REPLACE_ME_secret_key_base"

volumes:
  - volume:
-      host: /var/discourse/shared/web-only
+     host: /var/discourse/shared/web-only-1
      guest: /shared
  - volume:
-      host: /var/discourse/shared/web-only/log/var-log
+     host: /var/discourse/shared/web-only/log/var-log-1
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

run:
  - exec: echo "App1 starting — Sidekiq ENABLED"
  # Note: NO sidekiq/down file here → Sidekiq runs
  - exec: echo "App1 ready"



##########################################
# app2.yml  (web + sidekiq)
##########################################

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  # - "templates/web.ssl.template.yml"
  # - "templates/web.letsencrypt.ssl.template.yml"

- docker_args: "--network=discourse-net"
+ docker_args: "--network=discourse-net-2"

expose:
  - "8002:80"

params:
  version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  DISCOURSE_HOSTNAME: "physicsyear2.site"
  DISCOURSE_DEVELOPER_EMAILS: "ppyem3@gmail.com"

  DISCOURSE_SMTP_ADDRESS: smtp-relay.brevo.com
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_USER_NAME: "YOUR_BREVO_USERNAME"
  DISCOURSE_SMTP_PASSWORD: "YOUR_BREVO_PASSWORD"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@physicsyear2.site"

  ## External Postgres
  DISCOURSE_DB_HOST: pg
  DISCOURSE_DB_PORT: 5432
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "REPLACE_ME_discordb_strong"
  DISCOURSE_DB_NAME: discourse
  DISCOURSE_DB_SOCKET: ""

  ## External Redis
  DISCOURSE_REDIS_HOST: redis
  DISCOURSE_REDIS_PORT: 6379
  DISCOURSE_REDIS_PASSWORD: "REPLACE_ME_redis_strong"

  ## MUST be identical on app1 and app2
  SECRET_KEY_BASE: "REPLACE_ME_secret_key_base"

volumes:
  - volume:
-      host: /var/discourse/shared/web-only
+     host: /var/discourse/shared/web-only-2
      guest: /shared
  - volume:
-      host: /var/discourse/shared/web-only/log/var-log
+     host: /var/discourse/shared/web-only/log/var-log-2
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

run:
  - exec: echo "App2 starting — Sidekiq ENABLED"
  # IMPORTANT: we DO NOT create /etc/service/sidekiq/down here
  # so Sidekiq also runs in app2
  - exec: echo "App2 ready"

这听起来不错,而且可能解释了为什么 .\discourse-setupapp.yml 而不是以预期的主机名命名的 yml 文件时不起作用?

1 个赞

我现在有两个独立的 Discourse 实例,至少目前是这样,可以让我稍微玩一下。正如我之前所说,这个系统足够大,而网站又足够小,我认为复制东西不是问题。

1 个赞

不是空间问题。只是令人困惑。它的设计是有一个单一的 discourse 克隆,以及 containers 目录中的所有容器。这就是为什么它被称为 containers。

明白了。我可能明天会修复它,听起来是个简单的修复。

1 个赞