環境変数を設定する

:notebook: これは、セルフホスト型 Discourse インストールで環境変数を設定するための how-to ガイドです。
:raising_hand: 必要なユーザーレベル: 管理者

環境変数は、Discourse インスタンスの設定において重要な役割を果たします。API キーやデータベースパスワードなどの機密データを格納できるため、インストールをより安全で柔軟にすることができます。Discourse では、環境変数は Docker コンテナ設定内の app.yml ファイルで設定されます。

.yml (YAML) ファイルに環境変数を追加するのは簡単です。基本的な例を次に示します。

# これは環境変数を含む YAML ファイルです
env:
  VARIABLE_NAME: "Variable Value"
  ANOTHER_VARIABLE: "Another Value"

Discourse Docker コンテナのコンテキストでは、環境変数は app.yml ファイルの env セクションに格納されます。

app.yml ファイルの例を次に示します:
## これはスタンドアロンの Discourse Docker コンテナテンプレートです
##
## このファイルを変更した後は、再構築する必要があります
## /var/discourse/launcher rebuild app
##
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## HTTPS の Let's Encrypt を追加したい場合は、これらの 2 行をコメント解除してください
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

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

params:
  db_default_text_search_config: "pg_catalog.english"

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

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

  ## 同時に処理できる Web リクエスト数はいくつですか?メモリと CPU コアに依存します。
  ## ブートストラップによって検出された CPU に基づいて自動的に設定されますが、オーバーライドすることもできます
  UNICORN_WORKERS: 3

  ## TODO: この Discourse インスタンスが応答するドメイン名
  DISCOURSE_HOSTNAME: 'discourse.example.com'

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

  ## TODO: 初期サインアップ時に管理者および開発者になるメールアドレスのカンマ区切りリスト
  ## 例: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@example.com'

  ## TODO: 新規アカウントの検証や通知の送信に使用される SMTP メールサーバー
  DISCOURSE_SMTP_ADDRESS: smtp.example.com         # (必須)
  DISCOURSE_SMTP_PORT: 587                        # (オプション)
  DISCOURSE_SMTP_USER_NAME: user@example.com      # (オプション)
  DISCOURSE_SMTP_PASSWORD: a_s3cr3t_p@ssword      # (オプション)
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (オプション、デフォルトは true)

  ## Let's Encrypt テンプレートを追加した場合は、無料 SSL 証明書を取得するために以下をコメント解除してください
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## この Discourse インスタンスの CDN アドレス (プル用に設定)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com
## 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 "カスタムコマンドを開始します"
  ## 初回登録の「差出人」メールアドレスを設定したい場合は、コメント解除して変更してください:
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  ## 初回サインアップメールを受け取った後、行を再度コメントアウトしてください。一度だけ実行する必要があります。
  - exec: echo "カスタムコマンドを終了します"

サイトに環境変数を追加しましょう!:mage:

:information_source: 以下の手順は、標準 Discourse インストール向けに記述されています。

サーバーにログインする

PuTTY のようなツールや Unix 系システムのターミナルを使用して、サーバーに SSH 接続します。

ssh username@your-server-ip

Discourse ディレクトリに移動する

サーバーにアクセスしたら、Discourse Docker セットアップが含まれるディレクトリに移動します。通常は /var/discourse にあります。

cd /var/discourse

app.yml ファイルを開く

テキストエディタで app.yml ファイルを開く必要があります。この例では nano を使用します。

nano containers/app.yml

環境変数を追加する

app.yml ファイルには env セクションがあります。ここに環境変数を追加できます。

env:
  DISCOURSE_HOSTNAME: 'discourse.example.com'
  DISCOURSE_SMTP_ADDRESS: smtp.example.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: user@example.com
  DISCOURSE_SMTP_PASSWORD: a_s3cr3t_p@ssword

たとえば、Cross-Origin Resource Sharing (CORS) を有効にするために DISCOURSE_ENABLE_CORS 環境変数を true に設定したい場合は、次の行を env セクションに追加します。

env:
  DISCOURSE_ENABLE_CORS: "true"
  ...

:hand_with_fingers_splayed: ここでの空白とフォーマットは重要なので、新しい行の正しいインデント (スペース 2 つ) を維持するようにしてください。

変数を変更したら、ファイルを保存して閉じます。

Discourse コンテナを再構築する

最後に、変更を有効にするために Discourse Docker コンテナを再構築する必要があります。次のコマンドで実行できます。

./launcher rebuild app

または、再構築せずに実行中のコンテナの環境変数を更新するには、次を使用することもできます。

./launcher destroy app
./launcher start app

再構築プロセスが完了すると、更新された環境変数が Discourse アプリケーションで使用できるようになります!:tada:

「いいね!」 4

環境変数を使用してシステム設定やデフォルトのグローバル変数ファイル内のグローバル設定を上書きする方法を説明すれば、はるかに役立つでしょう。(そして、それらの設定(Redisの難解な設定など)を見ることができるようにリンクしてください)

これは、Discourseとは何の関係もないため、混乱を招く例です。

Dockerでの設定のように、類似のコマンドを使用するのと同じであることに言及できるかもしれません。

Setup Cross-Origin Resource Sharing (CORS) を作成したためにこれを作成したようですので、例としてそれを使用してみてはいかがでしょうか。

「いいね!」 7

Discourse で使用されるすべての環境変数を検索できる場所はありますか?

それは、「環境変数は app.ymlenv: セクションに記述される」というトピックよりもはるかに役立つでしょう :laughing:

また、アプリケーションに変更された環境変数を「ロード」するために、rebuild する必要はなく restart するだけでよいと確信していますが、もし間違っていたら誰か訂正してください。

コンテナを破棄して起動すればよいです。それはOPに追加されたと思います。唯一の問題は、UXからアップグレードした場合、それらが失われることです。

DISCOURSE_SETTING_NAME を使用して任意のサイト設定を設定できます。デフォルト設定については、config も参照してください。discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

「いいね!」 4

@SaraDevさん、これらの環境変数がDiscourseの動作をどのように変更するのか教えていただけますか?例えば、この投稿 Available settings for global rate limits and throttling で言及されている変数は、Discourseのソースコードのどこにも見当たらないのですが、これらの変数はどのようにDiscourseにフックされているのでしょうか?よろしくお願いします!

こちらで見ることができると思います。

「いいね!」 3

@Arkshine、本当にありがとうございます。

「いいね!」 1

Docker を使用しない開発環境で環境変数を設定する方法はありますか?最終的には Docker でホストする予定ですが、現在は次のセットアップでローカル開発を行っています: Install Discourse on macOS for development
この場合、app.yml はありません。

Railsを起動する前にコマンドラインで設定できますが、それらのENV変数で何をしようとしていますか?

SSOのためにDISCOURSE_ENABLE_CORSをtrueに設定しようとしています。コマンドのサンプルを送っていただけますか?ディスコース/Rails開発は初めてです。また、それは最終的に何をするのですか?site_settingsテーブルにレコードを作成しますか?

Kubernetes内でDiscourseを自動セットアップしようとしています。そのため、カスタムDockerイメージ(DinD)をビルドする予定です。
しかし、Dockerfile内で./discourse-setup.shを実行すると、設定オプションを尋ねられます。これはDockerでは自動で回答できないため、問題となります。

app.ymlファイル内にそれらの環境変数を設定できることは理解していますが、./discourse-setupスクリプトがまだ実行されていないため、この時点ではapp.yamlファイルは一切存在しません。

そこで質問ですが、./discourse-setupでユーザー入力を必要としないように、Discourseを自分の目的に合わせて事前に設定するにはどうすればよいでしょうか?

discourse/docs/INSTALL-cloud.md at main · discourse/discourse (github.com) のインストールガイドには、事前設定や設定ファイルについては一切記載されていません。

よろしくお願いします!

「いいね!」 2

試してみてください

./launcher start-cmd app

これにより、コンテナを起動するために使用されるDockerの開始コマンドが表示されます。それを使用して、k8sで起動する方法を把握できるはずです。

「いいね!」 5

app.yml ファイルが存在する可能性のある他の一般的な場所はありますか、またはこのファイルを最初から作成する必要がある可能性はありますか?Docker コンテナ (docker exec -it discourse_dev /bin/bash) に「入って」みましたが、app.yml という名前のファイルを見つけることができませんでした。

app.yml ファイルは、コンテナ内ではなく、コンテナの外に配置する必要があります。

「いいね!」 2