マルチサイトはDiscourseアプリケーションでサポートされていますが、これは高度なシステム管理者向けの設定です。何をしているか分からない場合は、マルチサイトを設定しないでください。Discourseチームはマルチサイトの設定サポートを提供できません。
1つの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
db_id: 2
host_names:
- b.discourse.example.com
after_bundle_exec:
- exec: cd /var/www/discourse && sudo -H -E -u discourse bundle exec rake multisite:migrate
3つのフックが使用されています。
-
after_postgresは、postgresがインストールされた後、適切な権限を持つ追加のDBb_discourseが作成されることを保証します。 -
before_bundle_execは、docker_managerが存在し、multisite.ymlファイル(データベースの場所を定義)が存在することを保証します。 -
after_bundle_execは、カスタムDBマイグレーションタスクrake multisite:migrateを実行します。これにより、すべてのDBが最新の状態になります。
設定に関する注意
上記のサンプルは、必要に応じてデータコンテナ/アプリコンテナに分割できます。after_postgres フックをデータコンテナで実行し、残りをWebコンテナで実行するだけです。
上記のサンプルを拡張して、さらに多くのDBをプロビジョニングすることもできます。これを行うには、DB作成などの呼び出しを複製してさらにDBをプロビジョニングし、multisite.yml に追加のサイトを追加するようにしてください。
multisite.yml の host_names ノードをホストしたい実際のホスト名と一致するように必ず変更してください。
また、HTTPSを実行する予定がある場合は、組み込みのletsencrypt機能はマルチサイトシナリオでは機能しないため、サイトの前面にプロキシを配置して処理する必要があります。