Настройка высокой доступности для 3 серверов

Поддерживает ли Discourse работу нескольких машин (каждая с одним контейнером Docker) за отдельным балансировщиком нагрузки?

Мне нужна конфигурация Discourse, способная выдержать отказ сервера, поэтому моё стандартное решение — настроить три сервера за балансировщиком нагрузки (при этом SSL-сертификат обрабатывается самим балансировщиком).

Я настроил внешние серверы PostgreSQL и Redis для Discourse в отдельном режиме. (Всё это развёрнуто на Google Cloud Platform). Для настройки веб-контейнера Docker я использую загрузчик Discourse.

  1. Поддерживает ли Discourse запуск нескольких контейнеров, если каждый из них находится на отдельной машине?
  2. Следует ли просто скопировать созданный контейнер Docker с первой машины на остальные?
  3. Как обрабатываются загруженные логотипы?
  4. Хранятся ли загруженные логотипы, фавиконы и т.п. в базе данных?

Большое спасибо за помощь.

Да, именно так мы запускаем его в нашем хостинг-сервисе.

  1. Да
  2. Да
  3. Вам следует настроить использование объектного хранилища для загрузок (S3 и клоны)
  4. Нет, они отправляются в объектное хранилище, как указано в пункте 3.

Спасибо, Рафаэль. Очень признателен.

У меня возникла проблема с SSL-терминацией на балансировщике нагрузки. Discourse указывает все свои ссылки как HTTP.

Есть ли способ заставить Discourse понимать, что его ссылки должны быть HTTPS?

Да, откройте консоль Rails и установите протокол на https с помощью:

cd /var/discourse
./launcher enter app
rails c
SiteSetting.force_https = true

Отлично. Еще раз спасибо.

Полагаю, я могу добавить в app.yml:
- exec: rails c "SiteSetting.force_https = true"

Я ничего не знаю о Rails. В моей команде выше должно быть ‘rails c’ или ‘rails r’?

У нас есть пример изменения настроек сайта на этапе запуска в нашем файле с образцом:

Да, именно отсюда я взял свою команду.

Один последний вопрос: отслеживается ли контейнер Docker? Если контейнер Docker остановится по какой-либо причине, настроил ли launcher его автоматический перезапуск?

Да, launcher просит Docker автоматически перезапускать контейнеры.

Хорошо. У меня теперь работает Discourse на одной машине. Есть ещё две машины. Общий том docker-гостя указывает на директорию NFS, чтобы все машины могли получать доступ к загруженным файлам (особенно логотипам и т.п.).

Я скопировал образы docker на машины 2 и 3 (docker save -o app-image local_discourse/app, а затем docker load -i app-image).

Мне казалось, что достаточно просто выполнить ./launcher start app, но он пытается проверить containers/app.yml.

Возникнут ли проблемы, если разрешить проверку app.yml (и внесение изменений) в БД с машин 2 и 3?

Есть ли лучший способ запустить три машины в рамках одной конфигурации?

У вас есть два варианта:

  • Используйте – я думаю, это ./launcher start-command app – на полностью настроенной машине (“сборочной машине”), чтобы получить полную командную строку Docker.
  • Скопируйте app.yml и выполните то, что вы только что пытались сделать (launcher start).

Я бы установил переменную окружения DISCOURSE_FORCE_HTTPS: true