Discourse の設定 - 環境 AWS Linux 2 AMI および Apache2 (httpd)

皆様、こんにちは

ドキュメントを確認し、公開されている設定手順や推奨事項を読み込み、私の固有の状況に合わせて変更を試みました。

非常にシンプルに見えるこの課題に対して、提案された解決策のいずれも機能していないことは、信じられないほどイライラするものです。

私たちの環境:

  • AWS EC2 インスタンス(具体的には AWS Linux 2 AMI)を実行しています。
  • Apache2 が実行され、設定されています。
  • このインスタンスは、AWS ロードバランサーから参照される AWS ターゲットグループの一部です。
  • SSL/TLS 証明書は AWS によって提供され、ロードバランサーに関連付けられています。
  • ドメインプロバイダーは name.com です。
  • 設定の一環として、複数のサブドメインを CNAME レコードを使用してルーティングしており、これらはすべて AWS ロードバランサーを指しています。ロードバランサーはその後、EC2 インスタンスへのトラフィックを管理します。
  • ロードバランサーにルーティングされ、Web ユーザーに提供されるすべてのトラフィックは安全です。
  • サーバー上では、3 つの独立した Node.js Express アプリケーションを実行しています。
  • ポートは Express サーバーの設定の一部として定義されており、現在は 3000、4000、5000 です。
  • トラフィックは、Apache によってサブドメインに基づいて関連する Web アプリにルーティングされます。例:
<VirtualHost *:80>
    ServerName subdomain.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • 直接的な関連性はあまりありませんが、サーバー再起動時に自動的に起動するように、Express アプリの管理に PM2 を使用しています。

  • 同じサーバーに Docker をインストールしました。

  • さらに、app.yaml をコピーして Discourse をインストールしました(ガイダンスとして Run other websites on the same machine as Discourse - #182 by angus を参照)。

現在の状況:

  • Docker が実行されています
  • Discourse アプリ(コンテナ)が実行されています
  • Express アプリはすべて実行されており、Apache によって正しくルーティングされています

注記:

  • 最初はドキュメントに従ってポートを公開せずにアプリをビルドしようとしましたが、機能しなかったため、HTTP ポート 80 に対してポート 8000 を公開しました。
  • 私の単純な理解では、Docker は家のようなもので、各種コンテナは各部屋です。Docker はアプリへのアクセス方法(どの部屋にアクセスするか)を決定します。ポート 8000 を公開したかった理由は、8000 が公開されたことで、他の Express アプリと同じようにポート 8000 を参照できると思ったからです。しかし、これは機能しません。以下は、Apache で試みた例です:
# FAQ (DISCOURSE ROUTES)

<VirtualHost *:80>
    ServerName discourse.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
  • 単純なテストとして、サーバー上のブラウザに localhost:8000 を入力して試みました。サーバーには Chromium がインストールされた AWS 環境です。これが即座に解決されないという事実は、何らかの問題があり、私の理解に根本的な欠落があることを示しています。私の Web アプリは、Express 設定で指定したポートで実行され、利用可能ですが、Docker コンテナについても同様であると思っていました。

追加の注記:

  • ローカルサーバー上で暴露されているポート(Docker コンテナ用)に discourse.domain.io からのトラフィックをルーティングし、*.domain.io からのすべてのトラフィックを Apache のポート 9000 にルーティングし、その後 VirtualHost 設定を変更してポート 9000 からトラフィックをルーティングするという、NGINX を Apache と Docker の「前面」に配置する潜在的な解決策があることは理解しています。つまり:
# EXPRESS APP ROUTING IN APACHE

<VirtualHost *:9000>
    ServerName other_sub_domains.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • 私には、これは完全に不要に思えます。ドメイン discourse.domain.io が Apache にルーティングされ、Apache がリクエストを受け取り、その後それをルーティングしようとする場合、Docker コンテナの公開ポートを指すだけで済むはずです。
  • また、サーバー自体の localhost:8000 が解決されない場合、この方法でも機能しません。

現在、Chrome で Discourse Docker コンテナに移動しようとすると、502 エラーが表示されます(上記のスクリーンショットを参照)。

app.yml の抜粋

## これはオールインワン、スタンドアロンの Discourse Docker コンテナテンプレートです
##
## このファイルを修正した後、必ず再ビルドしてください
## /var/discourse/launcher rebuild app
##
## 編集時は *非常に* 注意してください!
## YAML ファイルは、空白やアライメントの誤りに極めて敏感です!
## 必要に応じて http://www.yamllint.com/ でこのファイルを検証してください

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
## Lets Encrypt (https) を追加したい場合は、以下の 2 行のコメントアウトを外してください
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## このコンテナが公開すべき TCP/IP ポートはどれですか?
## Discourse を Apache や nginx などの他の Web サーバーとポートを共有したい場合は、
## https://meta.discourse.org/t/17247 を参照してください
expose:
  - "8000:80"   # http
  #- "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers を総メモリの最大 25% に設定します。
  ## ブートストラップによって検出された RAM に基づいて自動的に設定されますが、上書きすることもできます
  #db_shared_buffers: "256MB"

  ## ソートパフォーマンスを向上させることができますが、接続あたりのメモリ使用量が増加します
  #db_work_mem: "40MB"

  ## このコンテナが使用する Git リビジョンはどれですか?(デフォルト:tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 同時 Web リクエストのサポート数。メモリと CPU コア数に依存します。
  ## ブートストラップによって検出された CPU に基づいて自動的に設定されますが、上書きすることもできます
  #UNICORN_WORKERS: 3

  ## TODO: この Discourse インスタンスが応答するドメイン名
  ## 必須です。Discourse は IP アドレスのみでは動作しません。
  DISCOURSE_HOSTNAME: 'discourse.domain.io'

  ## コンテナを上記で指定した同じホスト名(-h オプション)で起動したい場合は、コメントアウトを外してください
  ## (デフォルトは "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期登録時に管理者および開発者に指定されるカンマ区切りのメールアドレスのリスト
  ## 例:'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'

  ## TODO: 新規アカウントの検証と通知の送信に使用する SMTP メールサーバー
  # SMTP アドレス、ユーザー名、パスワードが必要です
  # 警告:SMTP パスワードの文字 '#' は問題を引き起こす可能性があります!
  DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ******
  DISCOURSE_SMTP_PASSWORD: ******
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (オプション、デフォルトは true)
  #DISCOURSE_SMTP_DOMAIN: ******    # (一部のプロバイダーで必須)
  #DISCOURSE_NOTIFICATION_EMAIL: ******  # (通知を送信するアドレス)

  ## Lets Encrypt テンプレートを追加した場合、以下のコメントアウトを外して無料の SSL 証明書を取得してください
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## この Discourse インスタンスの http または https CDN アドレス(プルするように設定)
  ## 詳細は https://meta.discourse.org/t/14857 を参照
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## IP アドレス検索用の MaxMind 地理情報 IP アドレスキー
  ## 詳細は https://meta.discourse.org/t/-/137387/23 を参照
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker コンテナはステートレスです。すべてのデータは /shared に保存されます
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## プラグインはここに記述します
## 詳細は https://meta.discourse.org/t/19157 を参照
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## ビルド後に実行する任意のカスタムコマンド
run:
  - exec: echo "Beginning of custom commands"
  ## 最初の登録時の 'From' メールアドレスを設定したい場合は、コメントアウトを外して変更してください
  ## 最初のサインアップメールを受信した後、再度コメントアウトしてください。一度だけ実行すれば十分です
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

ドメイン、メールアドレス、メール設定は正しいです。前述の通り、SSL/TLS 設定は必要ありません。

ご要望:

  • NGINX による解決策が、この設定を機能させる唯一の方法でしょうか?もしそうなら、設定手順に関するより明確な説明は利用可能ですか?Discourse を動作させるために、保証もなくサーバーを最初から構築し直すことはできません。
  • Discourse behind reverse proxy and https - #2 by itsbhanusharma で、@Dark Matter 氏は以下の Apache2 解決策を提供しましたが、これは Node.js Express 環境を想定したものではないと考えており、localhost:8000 が解決されない現状では、これが機能するかどうか確信が持てません:
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  discourse.example.com
  DocumentRoot /website/discourse

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ErrorLog /var/log/apache2/discourse.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse.access.log combined

  RewriteCond %{SERVER_NAME} =discourse.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • ここでの問題は Discourse の設定にありますか?あるいは Apache のルーティングに問題があるのでしょうか(疑わしいですが)?それとも、より根本的な何かを見落としているのでしょうか?
  • この問題を解決することは、将来多くのユーザーの助けになると考えています。
  • 最善の解決策は、サーバー上でローカルに Discourse にルーティングすることです。
  • 次に、URL を介してルーティングすることです。

よろしくお願いいたします
マシュー・ルカス

これは私には完全に理解するには複雑すぎるため、解決策というよりは当てずっぽうと考えてください。問題がlocalhost経由で実行中のDockerコンテナに何かを接続できないということであれば、Docker IPを試してみる価値があるかもしれません。WebSocketテンプレートを使用して、ポートではなくソケットを使用することも可能です。いくつかの理由からこちらの方が好ましいと主張する人もいます。

MKJ’s Opinionated Discourse Deployment Configuration を読むと役立つかもしれません。

@pfaffman@Matthew_Lucas はすでにソケット化されたテンプレートを使用しています…\n\n外部プロキシには localhost を使用しており、これは expose 設定で機能するはずです。Docker IP を使用する必要があるとは思いません。また、その理由で Apache のみが Docker コンテナの前に置かれている場合にのみ失敗するとは思いません。\n\nヘッダー設定が必要になる場合があります — Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror を参照してください。\n\nApache の設定については、できる限り忘れるようにしていますが、nginx 設定のこの部分は、Apache で再現する方法を見つけたいと思うでしょう。\n\n\n proxy_set_header Host $http_host;\n proxy_http_version 1.1;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto https;\n proxy_set_header X-Real-IP $remote_addr;\n\n\n特に、Host ヘッダーなしでは正しく機能しないと思います。\n\nHTTPS を使用していないので、tcpdump を使用してパケットトレースをキャプチャし、何が問題になっているかを正確に確認できるはずです。\n\nしかし、なぜ Apache をそこに入れるのですか?単に追加のハードルです。もし私がこのようなことを試すなら、Amazon ロードバランサーに EC2 インスタンスのポート 8000 に直接話させるように設定します。HTTPS は ELB で終端していると仮定します。おそらく、ロードバランサーは指定する必要なしに通常のヘッダーを追加する方法を知っているでしょうが、そうでない場合は明らかに設定してください。ファイアウォール経由でポートにアクセスできることを確認してください。\n\nこれ以上価値のある貢献はあまりできないと思いますが、うまくいけば、その一部が設定に役立つでしょう。幸運を祈ります。

AWS EC2 Linux における既存の HTTPD リバースプロキシを伴う Docker と Discourse のインストール

こんにちは、皆様

解決しました。一からやり直し、クリーンな Docker と Discourse のインストールを再構築しました。私の手順を以下に詳述します。

前提条件

• すでに AWS EC2 Linux インスタンスをお持ちであること
• SSH を介して EC2 インスタンスにアクセス可能であること
• Apache 2 がサーバー上で既に設定され、実行されていること

SSH を使用して EC2 インスタンスにアクセス

  1. CMD / ターミナルを開く

  2. AWS EC2 インスタンスに SSH 接続

EC2 インスタンスに接続した後の画面の例

システムアップデートの実行

  1. コンソール / ターミナルで以下のコマンドを実行し、システムアップデートを実行する

$ sudo yum update

Docker のインストール

  1. コンソール / ターミナルで以下のコマンドを実行し、AWS Docker パッケージを検索する

$ sudo yum search docker

  1. コンソール / ターミナルで以下のコマンドを実行し、バージョン情報を取得する

$ sudo yum info docker

  1. コンソール / ターミナルで以下のコマンドを実行し、Docker をインストールする

$ sudo yum install docker

  1. コンソール / ターミナルで以下のコマンドを実行し、デフォルトの ec2-user にグループメンバーシップを追加して、sudo コマンドを使用せずにすべての Docker コマンドを実行できるようにする
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# ログアウトせずに Linux ユーザーの Docker へのグループ割り当てを再読み込み

$ newgrp docker
  1. コンソール / ターミナルで以下のコマンドを実行し、docker-compose をインストールする
# 1. pip3 (Python インストーラーパッケージ) を取得
$ sudo yum install python3-pip
 
# 2. 次に、以下のいずれかを実行
$ sudo pip3 install docker-compose # root アクセスあり
 
# または
 
$ pip3 install --user docker-compose # セキュリティ上の理由から root アクセスなし

# 権限を確認
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. コンソール / ターミナルで以下のコマンドを実行し、Docker サービスを起動時に自動的に開始するように有効化する

$ sudo systemctl enable docker.service

  1. コンソール / ターミナルで以下のコマンドを実行し、Docker サービスを起動する

$ sudo systemctl start docker.service

  1. コンソール / ターミナルで以下のコマンドを実行し、Docker サービスが実行されているか確認する。出力は以下に類似する

知っておくと便利な基本 Docker コマンド:

# Docker バージョン
$ docker version

# Docker Compose バージョン
$ docker-compose version

# Docker サービスの起動
$ sudo systemctl start docker.service

# Docker サービスの停止
$ sudo systemctl stop docker.service

# Docker サービスの再起動
$ sudo systemctl restart docker.service

# Docker サービスの状態確認
$ sudo systemctl status docker.service

Discourse のインストール

  1. Discourse フォルダを作成

$ sudo mkdir /var/discourse

  1. 新しく作成されたディレクトリに Discourse Docker イメージをクローン

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

  1. standalone.yml ファイルを containers フォルダにコピー

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. 新しい discourse.yml ファイルを以下のように編集する(重要な部分は HTTP の公開ポートと SMTP のメール詳細。ファイル内で修正を行い、コピー&ペーストは行わないこと)

編集オプション:

1. nano を使用してコマンドライン / ターミナルから編集可能 2. AWS で MATE と PLUMA を使用している場合、PLUMA を使用してファイルを編集可能 3. WINSCP を使用してマシンに SSH 接続し、Windows GUI を通じてファイルを編集可能

## これはオールインワンのスタンドアロン Discourse Docker コンテナテンプレートです
##
## このファイルを編集した後、必ず再構築してください
## /var/discourse/launcher rebuild app
##
## 編集時には非常に注意してください!
## YAML ファイルは空白やアライメントの誤りに極めて敏感です!
## 必要に応じて http://www.yamllint.com/ にアクセスしてこのファイルを検証してください

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## 次の行のコメントアウトを外すと IPv6 リスナーを有効化できます
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Lets Encrypt (https) を追加したい場合は、以下の 2 行のコメントアウトを外してください
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## このコンテナが公開する TCP/IP ポートはどれですか?
## Discourse を Apache や nginx などの他の Web サーバーとポートを共有したい場合は、
## 詳細については https://meta.discourse.org/t/17247 を参照してください
expose:
  - "8080:80"   # http (ローカルポート 8080、Docker ポート 80 で実行)
  #- "443:443" # https (コメントアウトされていることを確認してください)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers を総メモリの最大 25% に設定します。
  ## 検出された RAM に基づいてブートストラップによって自動的に設定されますが、上書きすることも可能です
  #db_shared_buffers: "256MB"

  ## ソートパフォーマンスを向上させることができますが、接続あたりのメモリ使用量が増加します
  #db_work_mem: "40MB"

  ## このコンテナで使用する Git リビジョンはどれですか?(デフォルト:tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 同時にサポートされる Web リクエストの数。メモリと CPU コア数に依存します。
  ## 検出された CPU に基づいてブートストラップによって自動的に設定されますが、上書きすることも可能です
  #UNICORN_WORKERS: 3

  ## TODO: この Discourse インスタンスが応答するドメイン名
  ## 必須です。Discourse は IP アドレスのみでは動作しません。
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## 上記で指定したホスト名と同じ (-h オプション) でコンテナを起動したい場合は、コメントアウトを外してください
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期登録時に管理者および開発者として登録されるカンマ区切りのメールリスト
  ## 例:'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 「メールをここに入力」

  ## TODO: 新しいアカウントの検証と通知の送信に使用する SMTP メールサーバー
  # SMTP アドレス、ユーザー名、パスワードは必須です
  # 警告:SMTP パスワードに含まれる文字 '#' は問題を引き起こす可能性があります!
  DISCOURSE_SMTP_ADDRESS: SMTP をここに入力
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ユーザー名をここに入力
  DISCOURSE_SMTP_PASSWORD: パスワードをここに入力
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (オプション、デフォルト true、Amazon SES を使用)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (一部のプロバイダーで必須)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (通知を送信するアドレス)

  ## Lets Encrypt テンプレートを追加した場合、以下のコメントを外して無料の SSL 証明書を取得
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## この Discourse インスタンスの http または https CDN アドレス(取得用に設定)
  ## 詳細については https://meta.discourse.org/t/14857 を参照してください
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## IP アドレス検索用の MaxMind 地理情報 IP アドレスキー
  ## 詳細については https://meta.discourse.org/t/-/137387/23 を参照してください
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker コンテナはステートレスです。すべてのデータは /shared に保存されます
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## プラグインはここに記述
## 詳細については https://meta.discourse.org/t/19157 を参照してください
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## ビルド後に実行する任意のカスタムコマンド
run:
  - exec: echo "カスタムコマンドの開始"
  ## 最初の登録時の「From」メールアドレスを設定したい場合は、以下のコメントを外して変更してください
  ## 最初のサインアップメールを受信した後、再度コメントアウトしてください。一度だけ実行すれば十分です
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "カスタムコマンドの終了"
  1. ファイルを編集して保存した後、ターミナルで以下のコマンドを実行して Discourse アプリを再構築する

$ /var/discourse/launcher rebuild discourse

注:YAML ファイルの名前が異なる場合は、discourse を YAML ファイル名に置き換えてください

再構築には時間がかかります。

  1. アプリの再構築が完了すると、アプリはポート 8080 で実行されているはずです。これを確認するために、ターミナルで以下のコマンドを実行します

$ sudo lsof -i -P -n | grep LISTEN

ポートの出力例

Docker がポート 8080 でリッスンし、httpd (Apache) がポート 80 でリッスンしていることに注意してください。

トラフィックルーティングの観点から、Apache が Web リクエストを受信し、適切な場合、ポート 8080 の Discourse コンテナにルーティングされます。

ルーティングが機能するようにするには、Apache 設定ファイルで仮想ホストを設定する必要があります。

Apache 仮想ホスト設定

  1. Apache 設定ファイルは /etc/httpd/conf.d/00-virtualhosts.conf にあります。httpd / apache / apache2 は異なる Apache バージョンです。httpd サービスを使用していない場合、ファイルの場所が異なる可能性がありますが、この場合の仮想ホスト設定は同じです。

編集オプション:

1. nano を使用してコマンドライン / ターミナルから編集可能 2. AWS で MATE と PLUMA を使用している場合、PLUMA を使用してファイルを編集可能 3. WINSCP を使用してマシンに SSH 接続し、Windows GUI を通じてファイルを編集可能

/etc/httpd/conf.d/00-virtualhosts.conf ファイルを以下を追加して編集します:

# FAQ (DISCOURSE ルート)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. サブドメインを AWS サーバー / ロードバランサーに指す関連する CNAME DNS レコードを作成する必要があります。

私たちの設定は少し複雑で、ドメインプロバイダーがすべてのトラフィックを AWS ロードバランサーにルーティングしています。

ロードバランサーは、AWS が提供する証明書を通じて SSL/TLS を処理します。

ロードバランサーはまた、トラフィックを AWS インスタンスにルーティングします。

Apache は AWS インスタンスにインストールされており、トラフィックを以下にルーティングします:

  • Node Express アプリケーション
  • Docker / Discourse アプリケーション

結論

これは一つの解決策に過ぎませんが、既存の設定で機能したものです。

大感謝:

Discourse に関する記事を提供してくださった @Kane York 氏、
必要な Discourse ファイルのダウンロードに関するメモを Medium に投稿してくださった @Axel Fernandes 氏、
AWS Linux 2 での Docker インストールに関する記事を提供してくださった nixCraft の @Vivek Gite 氏と cyberciti 様。