Move from standalone container to separate web and data containers

Спасибо, Джей @pfaffman,

Вы, несомненно, являетесь здесь ценнейшим ресурсом высшего класса!

Что вы думаете об этой, возможно, безумной идее (основанной на моём пока ещё ограниченном понимании):

Настроить nginx как обратный прокси на фронтенде; согласно этому руководству:

Затем создать два каталога / экземпляра с настроенным discourse_docker (standalone), например:

  1. /var/discourse1
  2. /var/discourse2

В обоих этих экземплярах настроить discourse_docker (standalone) на прослушивание разных сокетов, модифицируя этот шаблон в каждом экземпляре:

 - "templates/web.socketed.template.yml"

Таким образом, по сути, мы просто пересобираем продакшн (в какое-то тихое время) для запуска в другом контейнере, слушающем другой сокет (nginx.https.sock2). Таким образом, конфликта сокетов не возникнет; при этом мы можем собирать его также в режиме standalone (с целью устранения необходимости в двух контейнерах: data и web-only).

Например (для обсуждения / иллюстрации), в файле web.socketed.template.yml в discourse1:

  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 80;/
     to: |
       listen unix:/shared/nginx.http.sock;
       set_real_ip_from unix:;
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen unix:/shared/nginx.https.sock ssl http2;
       set_real_ip_from unix:;

а в discourse2:

 - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 80;/
     to: |
       listen unix:/shared/nginx.http.sock2;
       set_real_ip_from unix:;
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen unix:/shared/nginx.https.sock2 ssl http2;
       set_real_ip_from unix:;

Однако, вместо того чтобы заставлять шаблон Discourse выполнять магию, мы просто вручную переключаем сокеты в файле /etc/nginx/conf.d/discourse.conf и перезапускаем nginx. Таким образом, мы уберём директиву replace: из шаблона web.socketed.template.yml.

В предлагаемой (возможно, безумной) конфигурации у нас будут два контейнера standalone, слушающих два разных сокета (не конфликтующих), и мы просто настроим nginx на подключение к нужному сокету и перезапустим nginx.

Это кажется понятным, простым и, возможно, полезным (в период затишья, когда в работающем экземпляре нет новых постов) для тех, кто не хочет (или не нуждается) в сложности двух контейнеров (data и web-only) для одного экземпляра Discourse (приложения).

Конечно, наиболее надёжная конфигурация (с точки зрения данных) и, так сказать, идеальное решение для нагруженных сайтов — это решение с «двумя контейнерами», поскольку нам потребуются экземпляры data и web-only (теперь слушающие два разных сокета: sock и sock2).

В решении с «двумя контейнерами» и фронтендом nginx «стандартная конфигурация» предполагает, что оба контейнера web-only слушают один и тот же сокет, поэтому они не могут работать одновременно; но если (например) заставить их слушать разные сокеты, они смогут работать одновременно, и мы сможем просто использовать файл конфигурации nginx (и перезапуск nginx) для переключения между ними.

Правильно ли я понял?

Начинаю ли я (медленно, но, надеюсь, верно) понимать это?

Спасибо!

Только примечание к продолжению: У меня работает конфигурация с «двумя контейнерами» на одном из моих настольных Mac:

Screen Shot 2020-04-11 at 12.41.24 PM

Единственные оговорки при нашей установке заключались в необходимости вручную создать эти каталоги (и установить владельца и права доступа), так как по какой-то причине скрипты не создают эти каталоги:

~discourse/discourse/shared/data
~discourse/discourse/shared/web-only

И, конечно, сначала я пробовал с пустым паролем для базы данных, и это не сработало (в инструкциях сказано установить пароль, но я просто экспериментировал).

Далее настрою фронтенд nginx и попробую перейти к этой конфигурации с использованием websocket для приложения web-only.