スタンドアロンコンテナから別々のWebおよびデータコンテナへの移行

Jay @pfaffman さん、ありがとうございます。

あなたは間違いなく、ここでの最高峰で価値あるリソースです!

まだ理解が限られている私の、もしかしたら突飛なアイデアについてどう思いますか?

フロントエンドにリバースプロキシとして nginx を設定する(このチュートリアルを参照):

その後、discourse_docker(スタンドアロン)を設定した 2 つのディレクトリ/インスタンスを用意します。例:

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

両方のインスタンスで、discourse_docker(スタンドアロン)が異なるソケットをリスンするように設定し、それぞれのインスタンスでこのテンプレートを修正します:

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

つまり、要するに、プロダクション環境を(静かな時間帯に)再構築し、異なるコンテナで異なるソケット(nginx.https.sock2)をリスンするように変更するだけです。これによりソケットの競合は発生しません。これはスタンドアロンモードでも構築可能です(目的は、dataweb-only の 2 つのコンテナの必要性を排除することです)。

例として(議論/説明用)、discourse1 内の web.socketed.template.yml では:

  - 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 を再起動します。その際、web.socketed.template.yml テンプレート内の replace: ディレクティブを削除します。

この提案された(もしかしたら突飛な)構成では、競合しない 2 つの異なるソケットをリスンする 2 つのスタンドアロンコンテナを持ち、接続したいソケットに nginx を設定し、nginx を再起動するだけで済みます。

これは明確で簡単であり、ライブインスタンスに新しい投稿がまったくない静かな期間において、単一の discourse インスタンス(アプリ)あたり 2 つのコンテナ(data と web-only)の複雑さを望まない(または必要としない)人々にとって有用かもしれません。

もちろん、データ観点から最も堅牢な構成、つまり繁忙サイトの「完璧さ」を求める場合は、「2 コンテナ」ソリューションが最適です。なぜなら、data インスタンスと web-only インスタンス(現在は socksock2 の 2 つの異なるソケットをリスン)を維持したいからです。

nginx フロントエンド付きの「2 コンテナ」ソリューションにおいて、「標準構成」は両方の web-only コンテナが同じソケットをリスンするように設定することですが、これでは同時に両方を実行できません。しかし、(例としてのみ)異なるソケットをリスンするように設定すれば、両方を同時に実行でき、nginx 設定ファイル(および nginx の再起動)を使って 2 つの間を切り替えることができます。

この理解は正しいでしょうか?

私は(ゆっくりですが、確実にかつ希望を持って)これを理解し始めているのでしょうか?

ありがとうございます!

追記のみ: 私のデスクトップ Mac の 1 台で「2 コンテナ」設定が動作しています:

Screen Shot 2020-04-11 at 12.41.24 PM

インストールにおける唯一の注意点として、スクリプトが何らかの理由でこれらのディレクトリを作成しないため、手動でこれらを作成し(所有権と権限を設定する必要があります):

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

また、当初はデータベースのパスワードを空欄にして試しましたが、それは機能しませんでした(手順にはパスワードを設定するよう記載されていますが、私は単に実験していました)。

次に、nginx フロントエンドを設定し、web-only アプリに対して websocket を使用してその構成へ移行するテストを行います。