• このエントリーをはてなブックマークに追加

コミュニティサイト?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.comforum02.example.comを展開する設定です。コンテナ分割するためweb_only.ymldata.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アカウントの作成完了です。

  • このエントリーをはてなブックマークに追加