Спасибо, Джей @pfaffman,
Вы, несомненно, являетесь здесь ценнейшим ресурсом высшего класса!
Что вы думаете об этой, возможно, безумной идее (основанной на моём пока ещё ограниченном понимании):
Настроить nginx как обратный прокси на фронтенде; согласно этому руководству:
Затем создать два каталога / экземпляра с настроенным discourse_docker (standalone), например:
- /var/discourse1
- /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:
![]()
Единственные оговорки при нашей установке заключались в необходимости вручную создать эти каталоги (и установить владельца и права доступа), так как по какой-то причине скрипты не создают эти каталоги:
~discourse/discourse/shared/data
~discourse/discourse/shared/web-only
И, конечно, сначала я пробовал с пустым паролем для базы данных, и это не сработало (в инструкциях сказано установить пароль, но я просто экспериментировал).
Далее настрою фронтенд nginx и попробую перейти к этой конфигурации с использованием websocket для приложения web-only.