Я запутался в инструкциях по установке. Можно ли масштабировать Discourse горизонтально?
Например, запустить 2+ контейнера Docker на разных серверах, каждый из которых будет выполнять Discourse?
Настройка с несколькими контейнерами гораздо более гибкая и надежная, однако её сложнее настроить. Настройка с несколькими контейнерами позволяет вам:
Свести к минимуму время простоя при обновлении до новых версий Discourse. Вы можете запустить новые веб-процессы, пока ваш сайт работает, и переключиться на новый образ только после его сборки.
Масштабировать ваш форум на несколько серверов.
Добавить серверы для резервирования.
Запустить некоторые обязательные службы (например, базу данных) на более мощном оборудовании.
Если вы хотите использовать настройку с несколькими контейнерами, обратитесь к шаблонам data.yml и web_only.yml в каталоге samples. Чтобы упростить этот процесс, launcher внедрит переменную окружения DISCOURSE_HOST_IP, которая будет доступна внутри образа.
Есть ли где-то дополнительная информация о том, как запустить контейнеры на разных серверах, а не множество контейнеров на одном сервере?
Вы предоставляете внешние сервисы для PostgreSQL, Redis и балансировщика нагрузки и настраиваете app.yml для их использования, например, как описано в статье Запуск Discourse с отдельным сервером PostgreSQL.
В любом месте выполните команду ./launcher bootstrap app. В результате будет создан образ контейнера на локальной машине. Загрузите этот образ в ваш сервис реестра контейнеров.
Теперь вы можете запускать любое количество экземпляров, указав всем использовать образ, экспортированный на предыдущем шаге.
Вы можете использовать мультисайт, чтобы один контейнер обслуживал несколько сайтов (используя одни и те же плагины и версию Discourse). Здесь описано, как это сделать без внешнего обратного прокси-сервера. Если вы попробуете это сделать, пожалуйста, оставьте комментарий там и сообщите мне, получилось ли у вас. Я планирую опубликовать это здесь, когда буду достаточно уверен, что это работает.
Запуск контейнеров на нескольких серверах осуществляется так же, как и в любом из вышеописанных случаев. У вас будет несколько контейнеров, использующих общие Redis и Postgres, работающих за балансировщиком нагрузки.
В основном любые действия, отличные от официальной стандартной установки Discourse, не поддерживаются, поскольку существует бесконечное множество способов реализации таких решений.
Первый касается Sidekiq в случае запуска нескольких контейнеров web_only.yml Docker, каждый из которых находится на отдельной виртуальной машине (VM). В этом сценарии разные экземпляры Sidekiq, использующие один и тот же сервер Redis, могут выполнить одну и ту же задачу дважды. Насколько устойчива система Discourse к таким ошибкам? Не надежнее ли использовать один экземпляр Sidekiq на выделенной виртуальной машине (или в отдельном контейнере Docker)? Если да, то как его отделить от веб-интерфейса Discourse?
Касательно ваших последних замечаний о поддерживаемых способах установки: я понимаю, что существует бесконечное множество вариантов конфигурации с несколькими контейнерами, но, на мой взгляд, нам необходим поддерживаемый способ запуска нескольких экземпляров для горизонтального масштабирования и/или обеспечения высокой доступности в двух случаях: на основе виртуальных машин (разные контейнеры Discourse web_only на разных VM, а Redis и Postgres установлены на отдельных VM напрямую, без использования Docker) и на основе контейнеров (всё построено на контейнерах).