高可用性3サーバーの設定

Discourse は、単一のロードバランサーの背後に複数のマシン(それぞれに単一の Docker コンテナを備えた)をサポートしていますか?

Discourse のセットアップでサーバーの障害に対応できるようにする必要があります。そのため、標準的な対応として、ロードバランサー(SSL 証明書の処理を担当)の背後に 3 台のサーバーを構成します。

Discourse 用にスタンドアロンの外部 PostgreSQL サーバーと Redis サーバーを設定しました(すべて Google Cloud Platform 上です)。Discourse ランチャーを使用して、Web のみ用の Docker コンテナを構成しています。

  1. 各コンテナが異なるマシン上にある場合、Discourse は複数のコンテナを実行することをサポートしていますか?
  2. 最初のマシンで作成した Docker コンテナを他のマシンに単にコピーすればよいのでしょうか?
  3. アップロードされたロゴはどのように処理されますか?
  4. アップロードされたロゴやファビコンなどはデータベースに保存されますか?

ご支援いただき、ありがとうございます。

はい、当社のホスティングサービスでもそのように運用しています。

  1. はい
  2. はい
  3. アップロード用のオブジェクトストレージの使用 (S3 およびクローン)を設定する必要があります
  4. いいえ、3 で述べた通り、オブジェクトストレージに保存されます。

Rafael さん、ありがとうございます。大変助かりました。

ロードバランサーで 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’ でしょうか?

サンプルファイルには、Bootstrap でのサイト設定変更の例があります:

はい、そのコマンドはそこからコピーしました。

最後の質問です。Docker コンテナは監視されていますか?何かの原因で Docker コンテナが停止した場合、launcher が再起動するよう設定されていますか?

はい、launcher は Docker にコンテナの自動再起動を指示します。

はい、単一マシンでDiscourseが動作するようになりました。他にもう2台のマシンがあります。Dockerゲストの/sharedボリュームをNFSディレクトリに指すことで、すべてのマシンがアップロードファイル(特にロゴなど)にアクセスできるようにしています。

Dockerイメージをマシン2と3にコピーしました(docker save -o app-image local_discourse/app、その後docker load -i app-image)。

単純に./launcher start appを実行すれば動作すると思っていたのですが、containers/app.ymlのチェックを試みています。

マシン2と3でapp.ymlをチェック(変更を加える)ことを許可した場合、データベースに問題が発生するでしょうか?

3台のマシンで単一のセットアップを動かすより良い方法はあるでしょうか?

2 つの選択肢があります:

  • 完全にセットアップされたマシン(「ビルドマシン」)で ./launcher start-command app を使用して、完全な Docker コマンドラインを取得する
  • app.yml をコピーし、先ほど試した手順(launcher start)を実行する。

DISCOURSE_FORCE_HTTPS: true という ENV 変数を設定してください。