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

両方のコンテナが同じDockerネットワーク上にあることを確認する必要があります。NPMが機能していない場合、それは(まだ)Discourseの設定の問題ではありません。

「いいね!」 1

MariaDB Docker ネットワークを誤って忘れてしまいましたが、network_mode: bridge を追加した後も、Discourse データベースへの接続で npm エラーが発生します。

  environment:
      DB_MYSQL_HOST: "172.17.0.2" #データコンテナ - 有効にするとエラー ( error connect ECONNREFUSED 172.17.0.2:3306 ) が発生します。
#      DB_MYSQL_HOST: "db" デフォルトの npm データベース (Discourse の外部)。
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "h4xb0xr1z__0k"
      DB_MYSQL_NAME: "npm"

npm と MariaDB が起動して実行されているとき、MariaDB のログは良好ですが、npm は

error connect ECONNREFUSED 172.17.0.2:3306

何か不足しているものはありますか?

「いいね!」 1

私のdocker-composeファイル

version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    network_mode: bridge
    restart: unless-stopped
    ports:

      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port

    environment:
      DB_MYSQL_HOST: "172.17.0.2" #data container - but i receive error ( connect ECONNREFUSED 172.17.0.2:3306 ) when enabled.
#      DB_MYSQL_HOST: "db" default npm databse (outside discourse).
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "mypassword"
      DB_MYSQL_NAME: "npm"

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
#    depends_on:
#      - db

  db:
    image: 'mariadb:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'mypassword'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'mypassword'
    volumes:
      - ./data/mysql:/var/lib/mysql

npmとmariaのIPマッピングは次のようになっています。

data container IP: 172.17.0.2
web_only container IP: 172.17.0.3
npm container IP: 172.17.0.5
maria data (npm) IP: 172.17.0.4
「いいね!」 1

こんにちは @tophee さん

NPMでSQLiteを使用することについて、MariaDBよりも簡単で信頼性が高いというご意見をいただけますでしょうか。

NPMをSQLiteでセットアップし、すべて正常に動作しています(nginx仮想ホスト、SSLなど)。しかし、DiscourseサイトでNPMを設定した際に502エラーが発生するため、DiscourseのデータベースをNPMに接続する方法を確実にしたいのです。

私のdocker-compose

version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    network_mode: bridge    # <-- NPMがDiscourseと同じネットワークに存在し、互いに認識できるようにするために追加されたネットワークです。
    ports:
      # 公開HTTPポート:
      - '80:80'
      # 公開HTTPSポート:
      - '443:443'
      # 管理Webポート:
      - '81:81'
    environment:
      DB_SQLITE_FILE: "/data/database.sqlite"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

いいえ、おすすめは、ご自身が何をしているか分かっている場合を除き、NPMの標準設定を使用することです。それが私が標準設定を使用している理由です。

DiscourseコンテナをWebSocket経由で接続する場合、ステップ3は必要ありません。

これは、

172.17.0.2 はあなたのDBコンテナで間違いないですか? いずれにせよ、NPMを独自のネットワークに残し、DiscourseをWebSocket経由で接続することで、このトラブルを回避できます。

「いいね!」 2

@tophee、明確化ありがとうございます。すべて完了し、修正しました。ただし、Websocket を使用しておらず、npm セットアップと Discourse のコンテナのポートに焦点を当てていたようです。

NPM で直面した問題は、CloudFlared Argo Tunnel でした。NPM、SSL、すべてのセットアップを完了した後、CloudFlared Argo Tunnel を実行することに成功しましたが、CloudFlared はセカンダリプロキシとして実行できないという問題がありました。オリジン Web の前に NPM を配置しないようにする必要がありました。Cloudflare から得られたエラーは次のとおりです。

エラー 1000: DNS が禁止 IP を指しています

このエラーを Cloudflare で検索したところ、次の情報が得られました。

オリジンにリバースプロキシがあり、リクエストを Cloudflare プロキシに送り返しています。リバースプロキシを使用する代わりに、ホスティングプロバイダーまたはサイト管理者に連絡して、オリジンで HTTP リダイレクトを設定してください。

NPM をリバースプロキシとして無効にするにはどうすればよいですか?

私の目的は、NPM がインストールされて動作している「間」に、オリジン IP が NPM なしで機能するようにすることです。これにより、Cloudflared がサーバーと通信できるようになりますか?

「いいね!」 1

NPMをアンインストールしてください。NPMの全体的な目的はリバースプロキシとして機能することです。リバースプロキシが不要な場合は、無効にしてください。

よくわかりませんが、これについては何も知識がありません。NPMフォーラムなどで確認することをお勧めします。これはディスコースとは関係ありません。

「いいね!」 2

すでに開いて議論もしました。そして、2日間いじった後に無効にしました。しかし、このトピックはソケットnginxとnpmのみをサポートしているため、DiscourseとNPMでカスタムポートサポートを追加する方法を追加したいと思います。

よろしくお願いします。

「いいね!」 1

いいえ。ソケットの手順に従わない限り、ソケットのみをサポートしているわけではありません。

最後にテストしたとき、提案されたようにポートを使用して問題なく動作しました。

「いいね!」 1

これらの手順により、Nginx Proxy Manager を使用して Discourse をセットアップすることができました。
ただし、ブラウザで http からフォントや画像を読み込もうとすると、「混合コンテンツ」エラーが発生します。

ここで、「リンクで https を強制する」ことができます。

「いいね!」 1

すごい、それはたくさんの ifs and buts を伴うかなり複雑なトピックですね。

本日、私もセットアップを試みましたが、残念ながらひどく失敗しました。指示は良い意図を持っていますが、私の意見では、それらはそれほど簡単に理解/把握できるものではありません。

Docker を使用する場合、通常、コンテナは互いに個別に/分離して実行したいと考えます。依存関係、前提条件、「単一障害点」が多すぎるのは避けたいです。しかし、これらはまさにアプローチによって引き起こされる問題です。NPM は素晴らしいツールです。Discourse を満足させ、証明書を提供するために、Proxy Manager からその Docker 設定に特別な調整を加える必要がある理由がわかりません。自宅でも、DynDNS ドメインに NPM を使用しており、いつでもサービスやホストを柔軟に割り当てることができます。そして、それらの一部を公開します(Home Assistant、Grafana など)。

本日、2つの Discourse インスタンスをマージしたいと考えていました。Hetzner/ドイツからクラウドサーバーを特別に借りました。そのため、指示が想定しているように、Discourse はプリインストールされていませんでした。

Discourse がデフォルトで NPM によるインストールを公式に提供することを願っています。または、少なくとも ./discourse-setup スクリプトであまり手間がかからないようにしてほしいです。

「いいね!」 1

複数のインスタンスをインストールするための簡単なハウツー:disguised_face:

今回は、クリーンなサーバーインストールから始め、後で古いインスタンスを復元したい場合があります。

ステップ 0: バックアップ!!!

バックアップをダウンロードします。後で必要になります。

ステップ 1: NGINX Proxy Manager

mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager
nano docker-compose.yml
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    ports:
      - '80:80'    # http / reserved!
      - '81:81'    # web-admin port
      - '443:443'  # https / reserved!
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

そして最後に: docker-compose up -d

(私のように、さらに怠惰な人のために、casaOS を使用してください(ポート ≠ 80/81/443 のいずれか)。安全なログイン認証情報と、セキュリティを強化するためのSSL証明書を備えた追加のプロキシホストを使用していることを確認してください。もしあなたが何をしているか分かっているなら、ファイアウォールルールを設定することさえできます。)

ステップ 2: UbuntuサーバーへのDockerインストール

sudo apt update && apt upgrade -y

sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io

ステップ 3: Discourseインストールの準備

git clone https://github.com/discourse/discourse_docker.git /var/discourse

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app1.yml
nano /var/discourse/containers/app1.yml

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app2.yml
nano /var/discourse/containers/app2.yml

app.yml ファイルに必要な変更を加えます。これには、各インスタンスの異なる公開ポート(はい、メンテナンスにも使用できます)、メール設定などが含まれます。
例: app1 はポート 8080/1443 を取得し、app2 は http/https のポート 8081/2443 を取得します。

/var/discourse/launcher rebuild app1
/var/discourse/launcher rebuild app2

ステップ 4: 最後になりましたが、NGINX Proxy Managerの設定

NGINX Proxy Managerの使用に関する基本的な理解のために、これをご覧ください。

プロキシホストのエントリを各インスタンス(httpポート、例: 8080および8081、ローカルまたはパブリックIPを使用、これはあなたの決定です)にポイントするだけで、各インスタンスとドメインで無料のLet’s Encrypt証明書を取得できるようになります。SSLの強制などを有効にしていることを確認してください。

ステップ 5: 完了。コーヒーを一杯飲みましょう。

私の場合は完璧に動作します。

プリインストールされたソフトウェアの依存関係にいくつかのマイナーな問題があるかもしれませんが、解決策を見つけることができると確信しています。私のcasaOSのヒントを怒らないでください。しかし、サーバーで遊びたい人、利用可能なすべてのリソースを使いやすく安全な方法で使用したい人にとっては、このDocker管理は興味深いものになるでしょう。

ステップ 6: 最後に、以前のバックアップを復元します。

「いいね!」 1

ドメインのためにCloudflare Tunnelを使用してこれを組み合わせることはできますか?

「いいね!」 1

もちろんです。

Cloudflareトンネルで適切なポートを公開し、ドメイン用にこのポートを設定する必要があることを確認してください。

個人的には、Cloudflareに依存することになるため、このソリューションは好みません。また、各トンネルエージェントがファイアウォールに穴を開けるため、トロイの木馬をインストールしているような気分になります。

ファイアウォール管理はサーバー管理者にとって不可欠です。DMZにサイトを公開する前に、宿題をする必要があります。