コミュニティサイト?Discourseの構築手順です。けっこう大変でしたがドキュメントが充実しているので頑張って可動できるところまでいけました。
Discourse はDocker上で展開されます。よって今回もリバースプロキシを使用しますので前回投稿した「Nginx(https)コンテナをdocker composeで作る 」を参考にしてください。
今回構築するDiscourseはマルチサイト+SSLで構築します。また運用面で利点があるためフロントエンドとDBを別々のコンテナで可動させます。
なおDiscourseを動かすための条件としてメール配送環境が必要です。私の場合はG Suiteを利用しているのでGoogle経由でSMTPリレーする 方法を使用しました。同じくDNSへの登録も必要ですので事前に準備しておきましょう。
Discourse のインストール
Discourseをgit clone
でダウンロードします。ファイル展開先は/var/discourse
とします。
$ mkdir /var/discourse
$ git clone https://github.com/discourse/discourse_docker.git /var/discourse
$ cd /var/discourse
マルチサイト等を使用しないで普通に構築する場合は下記コマンドを実行します。実行した際にSMTP関連等の入力が求められるので事前に必要な情報を用意しておきましょう。
$ ./discourse-setup
マルチサイト+コンテナ分割 設定
マルチサイト+コンテナ分割でDiscourseを動かす場合は下記設定ファイルを用意します。
以下はマルチサイトとしてforum01.example.com
とforum02.example.com
を展開する設定です。コンテナ分割するためweb_only.yml
とdata.yml
の設定ファイルを用意します。
下記web_only.yml
ファイルにおいて、各環境に合わせて変更が必要な箇所はenv:
セクション配下のDISCOURSE_*
, VIRTUAL_*
, LETSENCRYPT_*
の箇所です。
/var/discourse/containers/web_only.yml
templates:
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
expose:
- "127.0.0.1:2836:80"
links:
- link:
name: data
alias : data
params:
env:
LANG: en_US.UTF-8
UNICORN_WORKERS: 2
DISCOURSE_HOSTNAME: forum01.example.com
DISCOURSE_DEVELOPER_EMAILS: 'hostmaster@example.com'
DISCOURSE_SMTP_ADDRESS: smtp-relay.gmail.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: hostmaster@example.com
DISCOURSE_SMTP_PASSWORD: "smtprelaypassword"
VIRTUAL_HOST: 'forum01.example.com,forum02.example.com'
VIRTUAL_PORT: '80'
LETSENCRYPT_HOST: 'forum01.example.com,forum02.example.com'
LETSENCRYPT_EMAIL: 'hostmaster@example.com'
DISCOURSE_DB_SOCKET: ''
DISCOURSE_DB_PASSWORD: SOME_SECRET
DISCOURSE_DB_HOST: data
DISCOURSE_REDIS_HOST: data
PGHOST: data
PGPASSWORD: SOME_SECRET
volumes:
- volume:
host: /var/discourse/shared/web-only
guest: /shared
- volume:
host: /var/discourse/shared/web-only/log/var-log
guest: /var/log
hooks:
after_code:
- exec :
cd : $home /plugins
cmd:
- 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:
- forum02.example.com
after_bundle_exec:
- exec : cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate
run:
- exec : echo "Beginning of custom commands"
- exec : echo "End of custom commands"
/var/discourse/containers/data.yml
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
params:
db_default_text_search_config: "pg_catalog.english"
db_shared_buffers: "128MB"
env:
LANG: en_US.UTF-8
volumes:
- volume:
host: /var/discourse/shared/data
guest: /shared
- volume:
host: /var/discourse/shared/data/log/var-log
guest: /var/log
hooks:
after_postgres:
- exec :
stdin: |
alter user discourse with password 'SOME_SECRET' ;
cmd: su - postgres -c 'psql discourse'
raise_on_fail: false
- 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;"'
設定ファイルが作成できたら下記コマンド実行でリビルドします。
$ ./launcher rebuild data
$ ./launcher rebuild web_only
Discourse へログイン
リビルドでエラーが無ければDiscourseのコンテナが2つ可動しているはずですので1番目のサイト(forum01.example.com)にブラウザで閲覧します。Adminアカウントの登録など色々聞かれますので入力すれば完了です。
この時点で2番目のサイト(forum02.example.com)も完成していますがAdminアカウントが設定されていないためログインできません。よって下記コマンドにてAdminアカウントを登録します。
$ cd /var/discourse
$ ./launcher enter web_only
$ RAILS_DB = secondsite rake admin:create
上記コマンド実行するとEmailアドレスやパスワードの入力を求められますので入力します。これで2番目サイトのAdminアカウントの作成完了です。