サーバー上にDiscourseインスタンスが1つしかない場合、Discourseのインストールは非常に簡単です。コストを削減するために同じサーバーに複数のDiscourseインスタンスをインストールする場合は、事態が複雑になります。
公式のDiscourseインストールは、通常のDockerの慣例に従っていません。 Discourseインストーラーは、最初にブートストラップと呼ばれる処理を実行します。これは、ホストのインストール手順として表示されます。ブートストラッププロセスが終了すると、ランチャーは、初回インストール時に受け取ったフィードバックに基づいて、「app」という名前のコンテナーを起動します。
このようなハイブリッドインストール手順は、WordPressなどの他のWebサービスやアプリケーションでセットアップする場合とは異なります。
このチュートリアルでは、単一のLinuxサーバーに他のDockerベースのアプリと一緒に複数のDiscourseインストールをインストールする方法を示します。 DockerとLinuxのコマンドラインの基本に精通していれば、まったく難しいことではありません。
一般に、複数の談話構成はマルチサイト構成として理解され、プロセスはここに示されています。
公式には、Discourseは単一サーバーへの複数のDiscourseインストールに関するドキュメントを提供していません。しかし、心配する必要はありません。 Nginxで実行されている3〜5個のスタンドアロンの個別コンテナのインストールプロセスを示します。各スタンドアロンコンテナはそれぞれのドメインに対応しています。
このチュートリアルではUbuntu18.04を使用しています。 Ubuntuまたは使用しているLinuxディストリビューションにDockerがインストールされていることを確認してください。
Linuxサーバーをクラウドにすばやくデプロイするには、Linodeなどのクラウドサーバープロバイダーを使用することをお勧めします。
チュートリアルでは、ドメイン名の例としてdomain.comを使用しました。自分のドメインまたはサブドメインに応じて変更してください。
1。ドメインのDNSレコードを変更する
ドメイン名プロバイダーのDNSレコードパネルで、ドメインとサブドメイン(wwwを含む)の両方がサーバーのIPアドレスを指していることを確認してください。
たとえば、ルートドメインの場合は、ホスト名フィールドを空白(または@)のままにし、サブドメインの場合は、サーバーIPを設定するときに「*」ワイルドカードを使用します。
2。スペースを交換する
すべてのコンテナアプリを使いやすくし、デプロイ後にメモリが不足しないようにするには、システムに必要なスワップスペースがあることが不可欠です。
システムで使用可能なRAMに応じて、いつでもスワップを調整できます。単一サーバー上のアプリコンテナのバンドルに基づいてスワップスペースを決定し、それらの累積RAM使用量を見積もることができます。 Discourseは、スワップをチェックして構成します。
3。 Dockerネットワークを作成する
このDockerネットワークにより、コンテナーは必要に応じて相互に通信できるようになります。それをチェーンと呼びましょう 理解しやすくするため。
すべてのコンテナを構成するときにこのネットワークを使用します。
docker network create chain
4。 Nginxリバースプロキシのセットアップ
次に、Nginxリバースプロキシの設定に進みます。これは、URLを介してアクセスできるように、すべての異なるコンテナポートをそれ自体にマップするインターフェイスとして機能することに注意してください。 「マザーコンテナ」と呼ぶこともできます。
docker run --name nginx-proxy --net chain -p 80:80 -p 443:443 -v ~/certs:/etc/nginx/certs -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /var/run/docker.sock:/tmp/docker.sock:ro --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy -d --restart always jwilder/nginx-proxy
5。セットアップLet'sEncryptNginxプロキシコンパニオン
最初のnginx-proxyコンテナですでに宣言されているボリュームを使用するようにdockerに指示していることに注意してください。手順3で作成したものと同じ「チェーン」ネットワークを使用しています。
docker run --name letsencrypt-nginx-proxy-companion --net chain -v ~/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro --volumes-from nginx-proxy -d --restart always jrcs/letsencrypt-nginx-proxy-companion
このnginx-proxyのコンパニオンコンテナは、Let’sEncryptを使用したSSL証明書の設定を処理します。最終的にDiscourseコンテナを設定しているときにそれがわかります。
6。 Nginxを介したWWWリダイレクト(CNAMEは不要、サブドメインを使用するためのオプションの手順)
他のサイトと同様に、domain.comリクエストをwww.domain.comに確実にリダイレクトするには、追加の手順を1つ実行する必要があります。
nginx-proxyコンテナを入力してください:
docker exec -ti nginx-proxy /bin/bash
次のようなルートプロンプトが表示されます:
[email protected]:/app#
手順4で説明した/etc/nginx/vhost.dの場所を覚えていますか?ルートドメイン名と同じ新しいファイルをここに作成します。 vimがありません またはnano ここ。 VimまたはNanoをインストールする代わりに、 cat コマンド。
cat >> /etc/nginx/vhost.d/domain.com
次のプロンプトで、あなたが書いたものは何でもファイルを編集します。したがって、必ずwww.domain.comを独自のドメインに置き換えてください 次の行:
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Enterキーを押してから、Ctrl+Dを押して保存します。コンテナから出るにはexitに入ります。
[email protected]:/app# exit
これまでに作成した上記のすべてのコンテナを(指定された順序で)停止しましょう。再起動は使用しません。各コンテナを再起動するときに他のコンテナがリッスンしないようにするため、再起動するだけです。
docker stop nginx-proxy
docker stop letsencrypt-nginx-proxy-companion
docker start nginx-proxy
docker start letsencrypt-nginx-proxy-companion
7。公式のDiscourseDockerイメージのクローンを作成する
公式ガイドに従って、公式の談話Dockerイメージを/ var/discourseディレクトリに複製します。これは、Discourseがセットアップ後にそれぞれのコンテナに属するすべてのDockerボリュームを保存できる場所です。
sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
8。スタンドアロン構成をコピーする
次のステップは、ファイル/var/discourse/standalone.ymlをapp.ymlとして/ var / discourse / containers /にコピーしてから、要件に応じて編集することです。
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml
典型的なstandalone.ymlは次のようになります。
9。スタンドアロン構成を準備する
構成はnginxに基づいているため、このファイルを編集する必要があります。
ポート80と443はすでに同じものによって使用されています。また、letsencryptコンテナがすでにあり、配置する既存のDockerネットワークをDiscourseに表示する必要があります。
ここでドメインを設定する際に、フォーラム通知メールを構成するためのメールサーバーも必要になります(ここではSendgridを使用しました)。
LETSENCRYPT_EMAIL(SSL更新を通知するため)とDISCOURSE_DEVELOPER_EMAILS(管理者用)は、必要に応じて異なる場合があることに注意してください。
nano /var/discourse/containers/app.yml
10。スタンドアロン構成をカスタマイズする
以下は、デモンストレーションのためにapp.ymlに名前を変更した編集済みファイルです。配置の問題を回避するために、独自のymlファイルを編集することをお勧めします。
this is the all-in-one, standalone Discourse Docker container template
#
After making changes to this file, you MUST rebuild
/var/discourse/launcher rebuild app
#
BE VERY CAREFUL WHEN EDITING!
YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
visit http://www.yamllint.com/ to validate this file as needed
templates:
"templates/postgres.template.yml"
"templates/redis.template.yml"
"templates/web.template.yml"
"templates/web.ratelimited.template.yml"
Uncomment these two lines if you wish to add Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
which TCP/IP ports should this container expose?
If you want Discourse to share a port with another webserver like Apache or nginx,
see https://meta.discourse.org/t/17247 for details
expose:
- "80"
#- "80:80" # http
#- "443:443" # https
docker_args:
- "--net chain"
params:
db_default_text_search_config: "pg_catalog.english"
## Set db_shared_buffers to a max of 25% of the total memory.
## will be set automatically by bootstrap based on detected RAM, or you can override
#db_shared_buffers: "256MB"
## can improve sorting performance, but adds memory usage per-connection
#db_work_mem: "40MB"
## Which Git revision should this container use? (default: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## How many concurrent web requests are supported? Depends on memory and CPU cores.
## will be set automatically by bootstrap based on detected CPUs, or you can override
#db_shared_buffers: "256MB"
## can improve sorting performance, but adds memory usage per-connection
#db_work_mem: "40MB"
## Which Git revision should this container use? (default: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## How many concurrent web requests are supported? Depends on memory and CPU cores.
## will be set automatically by bootstrap based on detected CPUs, or you can override
#UNICORN_WORKERS: 3
## TODO: The domain name this Discourse instance will respond to
## Required. Discourse will not work with a bare IP number.
DISCOURSE_HOSTNAME: 'domain.com'
VIRTUAL_HOST: 'domain.com,www.domain.com'
LETSENCRYPT_HOST: 'domain.com,www.domain.com'
LETSENCRYPT_EMAIL: '[email protected]'
## Uncomment if you want the container to be started with the same
## hostname (-h option) as specified above (default "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: List of comma delimited emails that will be made admin and developer
## on initial signup example '[email protected],[email protected]'
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
## TODO: The SMTP mail server used to validate new accounts and send notifications
# SMTP ADDRESS, username, and password are required
# WARNING the char '#' in SMTP password can cause problems!
DISCOURSE_SMTP_ADDRESS: smtp.sendgrid.net
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: apikey
DISCOURSE_SMTP_PASSWORD: yourpassword
DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true)
## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
#LETSENCRYPT_ACCOUNT_EMAIL: [email protected]
## The http or https CDN address for this Discourse instance (configured to pull)
## see https://meta.discourse.org/t/14857 for details
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
The Docker container is stateless; all data is stored in /shared
volumes:
volume:
host: /var/discourse/shared/standalone
guest: /shared
volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
Plugins go here
see https://meta.discourse.org/t/19157 for details
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
Any custom commands to run after building
run:
exec: echo "Beginning of custom commands"
## If you want to set the 'From' email address for your first registration, uncomment and change:
## After getting the first signup email, re-comment the line. It only needs to run once.
#- exec: rails r "SiteSetting.notification_email='[email protected]'"
exec: echo "End of custom commands"
次の詳細を再確認します:
ポート構成は次のようになります:
expose:
- "80"
# - "80:80" # http
# - "443:443" # https
上記のようにファイルで適切に構成された既存のネットワーク名。
docker_args:
- "--net chain"
そうしないと、インストール後にドメインを確認したときに空白のページが表示されます。
12。ブートストラップと起動
上記のファイルを保存した後、次のコマンドを実行します。
cd /var/discourse
./launcher bootstrap app
これにはかなりの時間がかかります。ブートストラッププロセスの最後に、次のことを求められます。
./launcher start app
ファイルにxyz.ymlという名前を付けた場合、それに応じてコマンドが変更されることに注意してください(./launcher start xyz)。
これは、「 docker ps」で確認できる実行中のコンテナの名前です。 「。これで、ブラウザでドメインにアクセスすると、次のページが表示されます。
13。 SSL設定
この時点から、登録プロセスは非常に簡単です。登録が完了したら、Docker管理ダッシュボードで[設定]> [セキュリティ]に移動し、[httpsを強制]を有効にします。
保存したら、コンテナを停止して再開します:
./launcher stop app
./launcher start app
しばらくすると、SSLがフォーラムで機能し始めます。 httpsの依存関係にも注意してください。
14。より多くのスタンドアロンコンテナにさらに多くのDiscourseインスタンスをインストールする
その他の談話コンテナについては、手順8から同じプロセスをもう一度繰り返す必要があります。 。
最初は、アプリを使用していました。ここで、app2、app3などの他の名前を使用する必要があります。
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app2.yml
Dockerボリュームのそれぞれのymlファイルで新しい場所(standalone2、standalone3など)を指定するには、それぞれに追加の手順が必要になります(手順10を確認してください)。もちろん、ドメイン名も変更する必要があります。
## The Docker container is stateless; all data is stored in /shared
volumes:
volume:
host: /var/discourse/shared/standalone2
guest: /shared
volume:
host: /var/discourse/shared/standalone2/log/var-log
guest: /var/log
これで、残りの手順を実行すると、同じサーバーにさらに多くのDiscourseがインストールされます。
この記事が、それぞれのDockerコンテナを使用して複数のDiscourseフォーラムを設定するのに役立つことを願っています。
ご質問やご提案がございましたら、下にコメントを残してください。