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

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 様。