Discourseで複数のサイトを管理するためにNginx Proxy Managerを使用する

編集:@pfaffman 氏が、以前 @tophee 氏が書いた内容を基に、これを独立したトピックとして書き直しました。私はまだテストしていないため、Chris の言葉を移動させた結果、誤りがあればそれは @pfaffman の責任である可能性が高いです。

Run other websites on the same machine as Discourse に記載されているように手動で行う代わりに、NGINX Proxy Manager を使用しない理由はあるでしょうか?

私はすでにこれを使用しています。自宅サーバーでしばらく使っていたのですが、Discourse インスタンスを新しいクラウドサーバーに移行した際、4 年前に旧サーバーで行った NGINX リバースプロキシの設定のほとんどを忘れていたことに気づきました。「なら NGINX Proxy Manager でやろう」と思いました。驚いたことに、ここ meta ではあまり言及されていないことに気づき、見落としている欠点があるのではないかと考え始めました…

確かに、これは少し試行錯誤が必要でしたが、以下のように動作させることができました(これが最善の方法である保証はありません。実際、より良い方法があることは確かです。そのため、修正や改善の提案を大歓迎します):

まず、Discourse インスタンスにアクセスする方法は 2 つあります。1. ポートを公開する、2. WebSocket を経由する。このフォーラムのどこかで WebSocket の方が高速で効率的だと学びましたので、私はそれを使用していますが、ポートを公開する方がはるかに簡単です。したがって、ソケットが動作しない場合は、ポートを公開してみてください。混乱を避けるために:ポート経由で Discourse にアクセスするには、以下の手順 0、1、2、3、4、8 をfollowしてください。WebSocket を使用したい場合は、手順 0、1、5、6、7、8、9 を follow してください。

0. 出発点

まず、30 分間の標準インストール を完了したと仮定します。また、リバースプロキシを使用する場合は不要であるため、Discourse が Let’s Encrypt 証明書を取得していないと仮定します。NGINX Proxy Manager がそれを処理します。すでに証明書を持っている場合でも問題ありません。NGINX Proxy Manager が新しいものを取得するだけです。

1. NGINX Proxy Manager のインストール

次のステップは、NGINX Proxy Manager をインストールすることです。これにより、2 つの Docker コンテナ(NGINX Proxy Manager とそのデータベースコンテナ)が実行されます。

次に、あなたが尋ねている難しい部分があります。

最初の障害は、Discourse がデフォルトの Docker bridge ネットワークで実行されているのに対し、NGINX Proxy Manager はデフォルトで「ユーザー作成ネットワーク」(私の場合は npm_default と呼ばれます)で実行されていることです。つまり、NGINX Proxy Manager は Discourse を見ることができません。:cry:

2. すべてのコンテナをデフォルトの bridge ネットワークに移動させる

Discourse をカスタムネットワークに移動できるかどうか、またその方法がわからない 限り、NGINX Proxy Manager をデフォルトの bridge ネットワークに移動させる必要があります。これを行うには、docker compose ファイル 内の NGINX Proxy Manager の両方のコンテナに network_mode: bridge を追加します。

3. サービス名ではなく IP アドレスを使用する

次の問題は、デフォルトの docker compose ファイルを単に bridge ネットワークに移動しただけでは機能しなくなる点です。NGINX Proxy Manager はデータベースコンテナを見つけられなくなります。これは、サービス名の内部 DNS 解決(docker-compose ファイルが依存しているもの)は、ユーザー作成されたネットワークでのみ利用可能であり、デフォルトの Docker ネットワークでは利用できないためです。そのため、ハードコーディングされた IP アドレスに頼る必要があります(これは、コンテナの IP が変更された場合に機能しなくなるため、決して最適な解決策ではありません)。したがって、コンテナが機能しないことが分かっているにもかかわらず起動し、NGINX Proxy Manager のデータベースコンテナの IP アドレスをメモし、docker compose ファイル内の DB_MYSQL_HOST: "db"DB_MYSQL_HOST: "<db_container_IP>" に置き換える必要があります。

これで、すべてのコンテナがデフォルトの bridge ネットワークにあり、NGINX Proxy Manager が Discourse とそのデータベースの両方を見られるようになります。

4. Discourse をアクセス可能にする

しかし、「Discourse を見る」ことと「アクセスできる」ことは同じではありません。したがって、NGINX Proxy Manager が転送するトラフィックを Discourse が受け入れるようにする必要があります。WebSocket を使用することにこだわらない場合、NGINX Proxy Manager を Discourse コンテナの IP のポート 80(443 ではない)に指し示すだけでよいでしょう。以下のように:

ただし、これはテストしていません。前述の通り、私は WebSocket 設定を使用しており、それにはさらにいくつかのステップが必要です。上記のホスト名/IP とポートは、WebSocket を使用する場合無視されます。

5. app.yml を設定して WebSocket を使用する

これは OP で説明されていますので、ここでは深入りしません。

6. NGINX Proxy Manager コンテナに WebSocket をマウントする

NGINX Proxy Manager が WebSocket にアクセスできるように、それをボリュームとしてマウントする必要があります:- /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock。これがデフォルトの NGINX Proxy Manager docker compose ファイルへの最終的な変更です。以下に、私の環境で動作する最終バージョンを示します:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. NGINX Proxy Manager で WebSocket を使用するように設定する

最後のステップ:NGINX Proxy Manager に WebSocket を使用するように指示します。私の記憶では、「WebSocket サポート」をオンにするだけでは不十分だったため、OP の NGINX location を「高度な設定」タブにコピーしました。以下のように:

「カスタムロケーション」タブでは動作しませんでした。

8. SSL を有効にするのを忘れないでください

NGINX Proxy Manager 内の SSL 設定については言及していません。それは非常に自明であるように思われるため、プロセスのどの時点で有効化しても問題ないと思うからです。したがって、まだ行っていない場合は、私の設定は以下のようになります:


9. 注意点

tl;dr:Discourse コンテナを再起動するたびに、メインの NGINX Proxy Manager コンテナも再起動する必要があります(db の再起動は不要です)。
WebSocket を通じて Discourse にアクセスしている場合、Discourse コンテナを再構築する(ベースイメージを更新するために数ヶ月に一度必要とされる)と、以前の WebSocket が削除され、新しい WebSocket が作成されることに注意してください。その結果、NGINX Proxy Manager は Discourse インスタンスとの接続を失い、502 エラーを返します。将来の NGINX Proxy Manager のアップデートで新しい WebSocket を自動的に検出できるようになるかもしれませんが、現在(2022 年 1 月)では、NGINX Proxy Manager を再起動しない限り、再構築された Discourse コンテナを見つけることはできません。

解説

上記の手順が WebSocket とポートを組み合わせている理由が気になるかもしれませんが、単純な理由は、この投稿を書いている最中に、WebSocket を使用する際、NGINX Proxy Manager と Discourse が同じ Docker ネットワーク上にいる必要はないかもしれないとふと思ったからです。そしてこれが確認された後、誰も手順を完全に書き直す気分にならなかったのです。

サポートフォーラムの最も魅力的な側面は、問題をうまく説明することが、質問を投稿することなく解決策を見つけることにつながる点です。この場合、私は他の人の質問に答えていましたが、同時に自分自身の質問に対する答えも見つけたかもしれません。:smiley:

「いいね!」 9

どのリバースプロキシを使用すべきかという議論は、明らかにサポート対象の範囲を超えていますね。:wink: しかし、NGINX Proxy Manager を 12 秒以上見てみた限りでは、問題なく機能すると思います。以前にも議論されたことがある別の「自動 NGINX プロキシ」ツールもありますが、私の「広範な」NGINX Proxy Manager の知識に基づけば、そちらの方が優れているかもしれません。Traefik への不満が増しているため、そのツールも見てみるつもりです。

追記:3 分間見てみました。私は自動化を促進するツールを好むため、Docker コンテナにラベルや環境変数を追加するだけで Web インターフェースをクリックする必要がない Traefik や、https://hub.docker.com/r/jwilder/nginx-proxy(見つけました)の方が私の望むものに合っています。あちらのツールを動作させるには、Web インターフェースを使用するか、追加したいホストを手動でデータベースに更新する必要があるようです。しかし、もしあなたが「システム管理者」ではなく「普通の人間」として Web インターフェースをポチポチとクリックすることに抵抗がなければ、あちらのツールがまさに求めているものになるかもしれません。

「いいね!」 4

Nginx Proxy Manager のインストールは試みましたが、Discourse コンテナを「リンク」(プロキシ?システム管理にまだ不慣れなもので)して、Web から Discourse にアクセスできるようにする方法がわかりません。何かヒントをいただけますか?このフォーラムのトピックが示すように、Discourse コンテナは 80 ポートと 443 ポートを公開すべきでしょうか、それとも公開すべきではないでしょうか?

「いいね!」 1

確かに、これは少し試行錯誤が必要でしたが、以下のように動作させることができました(これが最善の方法である保証はありません。実際、より良い方法があることは確信しています。そのため、修正や改善のご提案を大歓迎します):

pfaffman さんが OP に移動させた手順

まず、Discourse インスタンスにアクセスする方法は 2 つあります。1. ポートを公開する、2. WebSocket を通じてアクセスする。このフォーラムのどこかで、WebSocket の方が高速で効率的であると学んだため、私はこれを使用していますが、ポートを公開する方がはるかに簡単です。したがって、ソケットが動作しない場合は、ポートを公開してみてください(詳細は後述します)。

まず、30 分の標準インストールを完了したと仮定します。また、リバースプロキシを使用する場合は、Discourse が Let’s Encrypt の証明書を取得する必要がないため、まだ取得していないと仮定します。NPM がそれを処理します。ただし、すでに証明書を持っている場合でも問題ありません。NPM は単に新しいものを取得します。

1. NPM のインストール

次のステップは、NPMをインストールすることです。これにより、NPM とそのデータベースコンテナの 2 つの追加 Docker コンテナが実行されるようになります。

次に、あなたが尋ねている難しい部分です。

最初の障害は、Discourse がデフォルトの Docker bridge ネットワーク上で実行されているのに対し、NPM はデフォルトで「ユーザー作成ネットワーク」(私の場合は npm_default と呼ばれます)上で実行されるため、NPM は Discourse を見ることができないという点です。:cry:

2. すべてのコンテナをデフォルトの bridge ネットワークに移動させる

Discourse をカスタムネットワークに移動できるかどうか、またその方法がわからない限り、NPM をデフォルトの bridge ネットワークに移動させる必要があります。これは、docker compose ファイル内の両方の NPM コンテナに network_mode: bridge を追加することで実現できます。

3. サービス名ではなく IP アドレスを使用する

次の問題は、単に bridge ネットワークに移動させただけでは、標準の docker compose ファイルが機能しなくなるという点です。NPM はデータベースコンテナを見つけられなくなります。これは、サービス名の内部 DNS 解決(docker-compose ファイルが依存しているもの)はユーザー作成ネットワークでのみ利用可能で、デフォルトの Docker ネットワークでは利用できないためです。そのため、ハードコードされた IP アドレスに頼る必要があります(コンテナの IP が変更された場合に機能しなくなるため、これは明らかに最適な解決策ではありません)。したがって、コンテナが機能しないことを知っていても起動し、NPM データベースコンテナの IP を確認してから、docker compose ファイル内の DB_MYSQL_HOST: "db"DB_MYSQL_HOST: "<db_container_IP>" に置き換える必要があります。

これで、すべてのコンテナがデフォルトの bridge ネットワーク上にあり、NPM が Discourse とそのデータベースの両方を見られるようになります。

4. Discourse にアクセス可能にする

しかし、「Discourse を見る」ことと「アクセスできる」ことは同じではありません。したがって、NPM が転送するトラフィックを Discourse が受け入れるようにする必要があります。WebSocket を使用することにこだわらない場合、NPM を Discourse コンテナの IP のポート 80(443 ではない)に指すだけでよいでしょう。以下のように:

ただし、これはテストしていません。前述の通り、私は WebSocket 設定を使用しており、それにはさらにいくつかのステップが必要です。上記のホスト名/IP とポートは、WebSocket を使用する場合無視されます。

5. app.yml を設定して WebSocket を使用する

これはOP で説明されていますので、ここでは詳しく説明しません。

6. NPM コンテナに WebSocket をマウントする

NPM に WebSocket へのアクセス権を与えるために、これをボリュームとしてマウントする必要があります:- /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock。これがデフォルトの NPM docker compose ファイルへの最終的な変更です。以下が私にとって動作する最終バージョンです:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. NPM で WebSocket を使用するように設定する

最後のステップ:NPM に WebSocket を使用するように指示します。私の記憶では、「WebSocket サポート」をオンにするだけでは不十分だったため、OP からの NGINX 位置設定を「高度」タブにコピーしました。以下のように:

「カスタム場所」タブでは動作しませんでした。

8. SSL のアクティベーションを忘れないこと

NPM での SSL 設定については言及していません。それは非常に自明であるように思えるからです。また、プロセスのどの時点でアクティベートしても問題ないと思います。まだ行っていない場合は、私の設定は以下のようになります:


9. 最終的な免責事項

この投稿を書いている途中で、WebSocket を使用する際、NPM と Discourse は必ずしも同じ Docker ネットワーク上にいる必要はないのではないかという思いがふと浮かびました。現時点でこれを確認する時間はありませんが、もしこれが真実であれば、上記のステップ 2、3、4 を忘れるだけで動作するはずです。

サポートフォーラムの最も魅力的な側面は、問題をよく説明することで、質問を投稿しなくても解決策にたどり着くことがあるという点です。この場合、私は他の人の質問に答えつつ、自分自身の質問に対する答えも発見したかもしれません。:smiley:

「いいね!」 4

素晴らしい、かつ論理的なご回答をいただき、誠にありがとうございます!いただいたヒントはできるだけ早く試してみます。ところで、NPM に設定する IP アドレスは、サーバーの IP(つまりサーバーにアクセスするための外部 IP)でしょうか、それとも Docker の内部 IP(Docker がコンテナに 172… を使用しているのにお気づきかと思いますが)でしょうか?
私の質問が些細なものに思えるかもしれませんが、ネットワークに関する知識があまりないもので、お恥ずかしい限りです。

「いいね!」 1

WebSocket を使用することをお勧めします。そうすれば、IP には何を入力しても問題ありません(実際には使用されないため)。それ以外の場合は、ホストのパブリック IP ではなく、コンテナの内部 IP を設定してください。

余談ですが、メール返信による投稿が正しくレンダリングされていないようです。上記の投稿を編集して短くすることを検討されてはいかがでしょうか?

「いいね!」 2

はい、確認しました。メールの「返信」機能を使用すると、元のメッセージがすべて含まれてしまいますが、それを編集する方法が見つかりません。可能でしょうか?私はDiscourseのユーザーとしても初心者です… :pensive:

「いいね!」 1

メッセージの下部にある鉛筆アイコンを使って、投稿を編集できます。ただし…信頼レベル1以下の場合、編集可能な期間は24時間(デフォルト)のみで、信頼レベル2以上の場合、30日間(デフォルト)編集可能です。

現在、あなたはTL1(Basic)のようです。ただし、「レベルアップ」するために何をする必要があるかについては、信頼レベルの記事で詳しく確認できます。:+1:

「いいね!」 2

前回の質問からだいぶ時間が空いてしまい申し訳ありませんが、あなたのご提案を試そうとして多くの時間を費やしてしまいました。全く成功しませんでした。app.yml を変更し、あなたのご提案を反映してアプリを再構築したところ、ログに「config/unicorn_launcher: line 71: kill: (898) - No such process」と表示されるようになりました。どんな試みも、この挙動を止めることはできませんでした。また、アプリを元の状態(ポートを公開、WebSocket なし)で再構築し、npm を停止しようとしましたが、どうにもならず、「unicorn」は実行されていません。

さらに、Google で見つかる関連情報(これは広範な問題のようです)をすべて試してみましたが、動作する Discourse コンテナを再構築する方法が全くわかりませんでした。現在の問題は(最も深刻なものの一つで、Discourse を諦めそうになっていますが)、理由が不明瞭で混乱しているため、内部の PostgreSQL が常に「再起動」を繰り返していることです。

なぜそうなったのか不明です。あなたのご提案を単純に適用し、アプリを再構築したところ、それ以来「unicorn」は :roll_eyes: 死んでしまいました。

この PostgreSQL の問題を解決する方法はありますか?なぜこのようなことが起きたのでしょうか?Discourse が動作していた際に私が行ったすべての変更を失わずに済む可能性はありますか(恐らくないとは思いますが)!

それに、小さな変更や問題の修正を試みるたびに、別のものが動かなくなるのは普通のことでしょうか?:rage:

怒っているわけではありません。これはあなたの提案に対するものではなく、Discourse 全体に対するものです。「一見」素晴らしいこのフォーラムを動作させるために多くの時間を費やしましたが、そのたびに別の問題が発生し、Discourse の信頼性が極めて低いという私の感覚が強くなるばかりです。

「いいね!」 1

標準的なインストールが正常に動作していた場合、元の状態に戻すことで、すべてが引き続き機能するはずです。

Postgres の問題は、PostgreSQL 13 アップデート に関連している可能性があります。

作業を開始する前にバックアップを取得していた場合は、新しいサーバーにインストールしてそのバックアップを復元することができます。これは最悪のケースシナリオとなるはずです。

「いいね!」 2

Postgres の問題がバージョン 13 の更新に関連しているかどうかをどうやって確認できますか?更新を選択したわけではありません。「./launcher rebuild app」と入力しただけで、すべてが…起こってしまいました。
はい、バージョンは 13 です。インターネットで同じ問題を抱えている他の人たちの記事を数時間読んだ結果、これが原因かもしれないと分かりましたが、Discourse を再び起動する方法は見つけられませんでした。

「いいね!」 1

では、それが問題ではないですね。すみません。

「いいね!」 1

このようなトラブルに巻き込まれてしまったとのこと、お気の毒に思います。何かを直すために何時間も費やしてイライラする気持ちはよく分かります。しかし、解決への道がまっすぐであることはめったにありませんが、毎回何かを学ぶことができます。

申し訳ありませんが、この件については私にお手伝いできることはできません。PostgreSQL やユニコーンについての経験がありません。このような「何も機能しない」状況を乗り切るには、以下の 3 つの方法があります。1. 元の状態に戻せるように常にバックアップを取る。2. 一度に一つのことだけを変更・試行し、本番環境ではないマシン(または重要度の低いフォーラム)で先に試す。3. 仕組みを理解するためにさらに多くの時間を費やす。

余談ですが、詳細な問題説明やサポートチケットを複数回書くことで、問題が解決したことがあります。チケットを提出するまでもなく、書く過程で解決策が見えてきました。

あなたのケースでは、app.yml を変更し、その後元の状態に戻すことで、なぜ元の結果とは異なる結果が生じるのかを理解しようとするのが良いと思います。これを探求する過程で、実際には正確な元の状態に戻せていなかったことに気づくか、機能させるために他に何を「リセット」する必要があるかを理解することになるでしょう。

「いいね!」 5

申し訳ありませんが、理解できませんでした。まず、Postgres の問題が PostgreSQL 13 のアップデートに関連する可能性について尋ねられ、私が「はい、バージョン 13 です」と回答しました(以前が何だったか知らなかったこと、アプリを再構築する時間が長かったことをお断りしておきます)。それにもかかわらず、あなたはそれが問題ではないと答えました。では、なぜ Postgres は常に「起動中」のままで、Discourse が起動しないのでしょうか?

「いいね!」 1

@Wanderer さん、こんにちは。問題の原因が何なのか特定できないため、Postgres のアップグレードに関する指摘は推測に過ぎません。Postgres 13 を実行されているのであれば、10 または 12 からのアップグレードで停止していることが問題ではないはずです。Postgres に何らかの問題がある可能性はありますが、Postgres 13 へのアップグレード自体が原因ではないでしょう。

こうした分野に詳しくない方への最善のアドバイスは、クリーンインストールを行い、最新のバックアップから復元することです。

より具体的なサポートを受けたい場合、かつ予算のご用意がある場合は、私までご連絡いただくか、Marketplace に投稿してください。

Nginx Proxy Manager の手順書改善に取り組む予定ですが、今回の問題は、この複雑な設定への移行を試みたことで表面化したものの、手順書自体に不備があるためではないかと推測しています(確証はありませんが、これが私の最善の推測です)。

「いいね!」 2

これが私のバージョンです。ほぼ諦めかけたところ、@tophee さんが私が(!?)書いた投稿へのリンクを紹介してくれ、必要な魔法を提供してくれたのです!これで Nginx Proxy Manager を Discourse 用に設定する直感的な方法ができました。これは Run other websites on the same machine as Discourse - #396 と同様のものになると思います。

公式の指示に従って Nginx Proxy Manager をインストール

SSL と Let’s Encrypt テンプレートを削除

yml ファイルの以下の行がコメントアウトされているか、削除されていることを確認してください。

## Uncomment these two lines if you wish to add Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

Discourse に npm-default ネットワークを使用させる

Nginx Proxy Manager のインストール手順をそのまま実行すると、npm_default という名前の Docker ネットワークが作成されます。

yml ファイルに以下の記述を追加してください。web_only コンテナと data コンテナが別々に存在する場合は、それぞれにこの記述を追加する必要があります(mail-receiver コンテナはテストしていません)。docker_args はインデントしないでください。

docker_args: |
  --network npm_default

ポートの公開は不要

yml ファイルから以下の行をコメントアウトするか削除してください。

# expose:
#  - "80:80"   # http
#  - "443:443" # https

その後、コンテナを再構築し、Nginx Proxy Manager を以下のように設定します。

image

2 番目の Discourse サイトを起動する簡単な(必ずしも推奨されるわけではありませんが)方法は以下の通りです。

cd /var/discourse/containers
cp app.yml othersite.yml
# 最低でも othersite.yml のホスト名を編集
./launcher rebuild othersite

その後、上記と同様に NPM に追加し、app の代わりに othersite を使用します。

私は app.yml に加えて 2 つの web_only 型コンテナ、単一の data コンテナ、そして redis テンプレートのみを含む data コンテナのコピーである個別の othersite-redis コンテナでテストしました。(ただし、より簡単な解決策として、追加の redis を web_only コンテナに配置することもできます)。

「いいね!」 2

少し苦労しましたが、何とかすべての機能を動作させることができました。

まず前提としてお伝えします。私は「古い世代」のデベロッパー(1980 年代生まれ)ですが、開発や管理には常に最新かつ最良の方法を探求してきました。そのため、2021 年になっても、古い CP/M や DOS のように難解なオプションが満載の奇妙なコマンドを書くのは本当に嫌いです。常に、私の生活をより簡単で明確にするインターフェースを求めてきました。

例えば、コンテナの管理には Portainer を使用しています。これを使えば、ファイルシステムを上下に探し回って「100 万分の 1」のファイルを探すような「バッシュ」操作をする必要なく、コンテナの起動・停止・編集・複製をその場で実行できます。例えば、コンテナのネットワークを変更するにはリストから選択してクリックするだけ。パラメータの追加や、@tophee さんが書かれた例のようなボリュームの追加も同様です。このため、Nginx プロキシを「コンテナ化」することを好む NPM を試してみました。いくつかのクリックで済むだけでなく、何をしているかはしっかり理解しつつ、新しい奇妙なコマンドやオプションのセットを覚える必要がないからです。

Discourse コンテナに戻ると、再度「discourse-setup」を実行する必要がありました。すべて正常に動作し、Postgres はバージョン 13 が「悪魔」のようにインストールされましたが、「酔っ払ったユニコーン」は現れませんでした(ユニコーンがサーバーを走り回ることを想像すると笑えてしまいます!:laughing:)。要するに、すべてが順調に進みました。その後、Discourse を WebSocket で動作させるための変更を加えましたが、これも問題なく動作しました。幸運なことに、以前の Discourse 設定では自動バックアップが行われていたため、数回のクリックですべてを復元できました(Discourse を使うほど、ますます愛着が湧きます!)。

NPM の設定は数回試行しましたが、最初は証明書に関連する問題が発生しました。しかし、最終的にはこれも正常に動作しました。

次に、Wordpress コンテナを指す 2 番目のプロキシを追加しました(はい、私はすべてを「コンテナ化」しています。主要なパッケージすべてを管理された場所に収めた、よりクリーンなサーバーというアイデアが好きなのです)。これも問題なく動作しました。

結果として、私のサーバー(VPS)にはメールサーバー(これも「コンテナ化」しようと数週間激しく戦いましたが、断念しました)があり、Discourse がそれに接続し、Wordpress が別のコンテナで動作し、NPM が両方を管理しています。すべてが自サーバー上で完結しており、デプロイやメール送信などに、他社(そしてはるかに高額な)サービスに依存する必要がありません。

次のステップは、昔ながらの Phpbb から数十万件の投稿をインポートすることです。私の投稿がまた増える準備をしてください!:grinning_face_with_smiling_eyes:

@tophee さん、@pfaffman さん、ご支援いただき本当にありがとうございました。私のように非標準的な方法で作業する人々を支援することがいかに難しいか、よく理解できました。

「いいね!」 3

Websocket で動作させることができてよかったです。それについて困っている方のために、上記の @pfaffmanwebsocket なしで設定する方法の指示 を参照してください。

何が原因だったのかはわかりませんが、Discourse の管理にあまり慣れていない人にとっては明確にしておくべき点があると思います。デフォルトのインストール(外部プロキシなし)における Let’s Encrypt 証明書の仕組みと、NPM を使用する場合の仕組みの違いを理解する必要があります(なぜそれを「外部」プロキシと呼ぶのか疑問に思うなら、その理由も調べてみてください)。

私は当初、外部プロキシをマニュアルで設定し、Let’s Encrypt も手動で設定していたため、Discourse や NPM が HTTPS を自動的に動作させるために何をしているのかという「魔法」のすべてを理解していました。そのため、Discourse 管理の証明書から NPM 管理の証明書に切り替える際に、さまざまな落とし穴を避けることができました。

メールサーバーを NPM の背後に置く理由があまりわかりません…

「いいね!」 1

いいえ、クリストフ、NPM の背後ではなく、単にコンテナ上に配置しているだけです。Zimbra を試しましたが、大混乱でした。その後、シンプルな「コンテナ化された」Postfix も試しましたが、これも成功しませんでした。当時は Linux の経験が浅く(今でも初心者ですが、少なくともいくつかの管理概念については次第に自信がついてきています)、あきらめて直接サーバー上に設置しました。起動に大きな問題はありませんでしたので、その方法で進めました。Discourse をメールサーバーと連携させる設定は結構大変でしたが、今はすべて問題なく動いているようです。

「いいね!」 2

インストールは順調に進みましたが、Discourseホストとの通信のためにnpmで詰まってしまいました。npmのcomposeファイルで、MySQLホストにデータコンテナのIPアドレスを入力するように記載されています。

 environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

しかし、(DB_MYSQL_HOST) をデータコンテナに変更すると、「接続拒否」と表示されます。

connect ECONNREFUSED 172.17.0.2:3306 <-- npmがDiscourseネットワーク(network_mode: bridge)にある場合のエラー。
getaddrinfo ENOTFOUND db <-- MySQLがnpmのcomposeファイルで「db」として定義されている場合のエラー。

ステップ3を機能させるための提案はありますか?

「いいね!」 1