マルチサイトはDiscourseアプリケーションでサポートされていますが、これは高度なシステム管理者向けのセットアップです。何をしているか分からない場合は、マルチサイトを設定しないでください。Discourseチームはマルチサイトの設定サポートを提供できません。
単一のDockerセットアップで複数のドメインをホストしたい場合は、マルチサイト設定が必要になります。以下にその基本的な構成要素を示します。
フックを理解する
マルチサイトはかなり高度なトピックです。マルチサイトの構築を試みる前に、それらについて学ぶ時間を取ってください。
Discourseテンプレートはpupsを使用しており、そのルールはシンプルで強力です。
実行する各ルールはフックを定義できます。
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
後でコンテナ内で、フックの前後にルールを挿入できます。
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
したがって、上記の例では、次のような出力が表示されます。
I ran before
1
I ran after
/var/discourse/templates 内のテンプレートを読み進めると、利用可能なフックを確認できます。
スタンドアロンコンテナを変更して2番目のサイトテナントをプロビジョニングする
hooksセクション全体を以下に置き換えます。
hooks:
after_postgres:
- exec: sudo -u postgres createdb b_discourse || exit 0
- exec:
stdin: |
grant all privileges on database b_discourse to discourse;
cmd: sudo -u postgres psql b_discourse
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'
after_code:
- exec:
cd: $home/plugins
cmd:
- mkdir -p plugins
- git clone https://github.com/discourse/docker_manager.git
before_bundle_exec:
- file:
path: $home/config/multisite.yml
contents: |
secondsite:
adapter: postgresql
database: b_discourse
pool: 25
timeout: 5000
host_names:
- b.discourse.example.com
after_bundle_exec:
- exec: cd /var/www/discourse && sudo -H -E -u discourse bundle exec rake multisite:migrate
4つのフックが使用されています。
-
after_postgresは、postgresがインストールされた後、適切な権限と必要な拡張機能を持つ追加のDBb_discourseが作成されることを保証します。 -
after_codeは、docker_managerがプラグインディレクトリにクローンされることを保証します。 -
before_bundle_execは、multisite.ymlファイルが配置されること(データベースの場所を定義します)を保証します。 -
after_bundle_execは、カスタムDB移行タスクrake multisite:migrateを実行します。これにより、すべてのDBが最新の状態に保たれます。
設定に関する注意
上記のサンプルは、必要に応じてデータコンテナとアプリコンテナに分割できます。after_postgres フックをデータコンテナで実行し、残りをwebコンテナで実行するだけです。
上記のサンプルは、さらに多くのDBをプロビジョニングするように拡張できます。これを行うには、DB作成などの呼び出しを複製してさらにDBをプロビジョニングし、multisite.yml に追加のサイトを追加してください。
multisite.yml ノードの host_names をホストしたい実際のホスト名と一致するように必ず変更してください。
また、HTTPSを実行する予定がある場合は、組み込みのletsencrypt機能はマルチサイトシナリオでは機能しないため、それを処理するためにサイトの前面にプロキシが必要になります。