インストールガイド · 7 min read · Oct 21, 2025
Rocky Linux 9にNginxを使用してDiscourseフォーラムをインストールする方法

Discourseは、Ruby言語を使用して構築されたオープンソースのコミュニティディスカッションプラットフォームです。フォーラム、チャットソフトウェア、またはメーリングリストとして機能するように設計されています。他のプラットフォームと簡単に統合でき、プラグインを介して拡張できます。
このチュートリアルでは、Rocky Linux 9で実行されているサーバーにNginxサーバーを使用してDiscourseフォーラムをインストールする方法を学びます。
前提条件
- 最低1GBのRAMと1コアCPUを持つRocky Linux 9を実行しているサーバー。Discourseのセットアップは、1GB以下のRAMを持つシステムで自動的にスワップパーティションを作成します。したがって、少なくとも2GBのRAMを持つシステムにインストールすることをお勧めします。
sudo権限を持つ非ルートユーザー。- サーバーを指すドメイン名(
discourse.example.com)。 - すべてが更新されています。
$ sudo dnf update - システムに必要なパッケージがいくつかあります。
$ sudo dnf install wget curl nano unzip yum-utils -yこれらのパッケージのいくつかは、すでにシステムにインストールされている可能性があります。
ステップ1 - ファイアウォールの設定
最初のステップは、ファイアウォールを設定することです。Rocky LinuxはFirewalldファイアウォールを使用しています。ファイアウォールの状態を確認します。
$ sudo firewall-cmd --state
running
ファイアウォールは異なるゾーンで機能し、パブリックゾーンがデフォルトで使用されます。ファイアウォールでアクティブなすべてのサービスとポートをリストします。
$ sudo firewall-cmd --permanent --list-services
次の出力が表示されるはずです。
cockpit dhcpv6-client ssh
Discourseは機能するためにHTTPおよびHTTPSポートが必要です。それらを開きます。
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
アプリケーションが他のインスタンスに連絡するため、マスカレードを追加します。
$ sudo firewall-cmd --permanent --add-masquerade
変更を適用するためにファイアウォールを再読み込みします。
$ sudo firewall-cmd --reload
再度すべてのサービスをリストします。
$ sudo firewall-cmd --permanent --list-services
次の出力が得られるはずです。
cockpit dhcpv6-client http https ssh
SELinuxの設定
SELinuxのアクセスポリシーにより、ポートを開いてもDiscourseにはアクセスできません。ネットワーク接続を許可するようにSELinuxを設定します。
$ sudo setsebool -P httpd_can_network_connect 1
ステップ2 - Gitのインストール
Gitをインストールします。
$ sudo dnf install git
インストールを確認します。
$ git --version
git version 2.31.1
次のコマンドを実行してGitのインストールを設定します。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
ステップ3 - Dockerのインストール
Rocky Linuxには古いバージョンのDockerが付属しています。最新バージョンをインストールするには、まず公式のDockerリポジトリをインストールします。
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
最新バージョンのDockerをインストールします。
$ sudo dnf install docker-ce docker-ce-cli containerd.io
Dockerをインストールしようとすると、次のエラーが表示されることがあります。
ror:
Problem: problem with installed package buildah-1:1.26.2-1.el9_0.x86_64
- package buildah-1:1.26.2-1.el9_0.x86_64 requires runc >= 1.0.0-26, but none of the providers can be installed
- package containerd.io-1.6.9-3.1.el9.x86_64 conflicts with runc provided by runc-4:1.1.3-2.el9_0.x86_64
- package containerd.io-1.6.9-3.1.el9.x86_64 obsoletes runc provided by runc-4:1.1.3-2.el9_0.x86_64
- cannot install the best candidate for the job
上記のエラーが表示された場合は、次のコマンドを使用します。
$ sudo dnf install docker-ce docker-ce-cli containerd.io --allowerasing
Dockerデーモンを有効にして実行します。
$ sudo systemctl enable docker --now
実行中であることを確認します。
? docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2023-01-20 06:49:44 UTC; 6s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 99263 (dockerd)
Tasks: 8
Memory: 28.1M
CPU: 210ms
CGroup: /system.slice/docker.service
??99263 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
デフォルトでは、Dockerはroot権限を必要とします。dockerコマンドを実行するたびにsudoを使用したくない場合は、ユーザー名をdockerグループに追加します。
$ sudo usermod -aG docker $(whoami)
この変更を有効にするには、サーバーからログアウトして同じユーザーとして再ログインする必要があります。または、次のコマンドを使用します。
$ su - ${USER}
ユーザーがDockerグループに追加されたことを確認します。
$ groups
navjot wheel docker
ステップ4 - Discourseのダウンロード
公式のDiscourse Docker GitHubリポジトリを/var/discourseディレクトリにクローンします。
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
Discourseディレクトリに移動します。
$ cd /var/discourse
containersディレクトリから書き込みおよび実行権限を削除します。
$ sudo chmod 700 containers
ステップ5 - Discourseの設定
サンプルのstandalone.ymlファイルをコピーして設定ファイルapp.ymlを作成します。
$ sudo cp samples/standalone.yml containers/app.yml
app.ymlを編集のために開きます。
$ sudo nano containers/app.yml
ドメインの設定
変数DISCOURSE_HOSTNAMEをフォーラムのために選択したドメイン名に設定します。ドメイン名がない場合は、ここでIPアドレスを使用できます。
DISCOURSE_HOSTNAME: 'discourse.example.com'
公開ポートの設定
行"80:80を"8080:80"に変更します。これにより、Discourseの外部HTTPポートが8080に変更されます。Nginxをポート80で使用するためです。行"443:443"をコメントアウトします。外部でSSLをインストールするためです。
expose:
- "8080:80" # http
#- "443:443" # https
管理者のメールIDを設定する
管理者アカウントと開発者のメールを変数DISCOURSE_DEVELOPER_EMAILSを使用して設定します。このステップは必須です。そうしないと、フォーラムがブートストラップされません。
DISCOURSE_DEVELOPER_EMAILS: '[email protected],[email protected]'
SMTP設定の構成
使用しているトランザクションメールサービスに応じて、次の変数を記入します。
DISCOURSE_SMTP_ADDRESS: smtp.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: [email protected]
DISCOURSE_SMTP_PASSWORD: your_smtp_password
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true)
DISCOURSE_SMTP_DOMAIN: discourse.example.com # (required by some providers)
DISCOURSE_NOTIFICATION_EMAIL: [email protected] # (address to send notifications from)
メモリ設定(オプション)
サーバーのRAMが少ない場合は、Discourseのメモリフットプリントを減らすために、次の変数を適宜設定できます。
db_shared_buffers: '128MB'
UNICORN_WORKERS: 2
変数db_shared_buffersは通常、利用可能なメモリの25%に設定されます。
GeoLite2設定(オプション)
DiscourseでIPルックアップ機能を使用したい場合は、無料のMaxmind Geolite2アカウントにサインアップし、ライセンスキーを取得します。そのライセンスキーを次の変数の値として貼り付けます。
DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key
ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。
ステップ6 - Discourseのインストール
次のコマンドを実行してDiscourseコンテナをブートストラップします。
$ sudo ./launcher bootstrap app
Discourseアプリケーションを開始します。
$ sudo ./launcher start app
Discourseアプリケーションをテストするためにポートを開きます。
$ sudo firewall-cmd --permanent --add-port=8080/tcp
ブラウザでhttp://yourserver_IP:8080またはhttp://discourse.example.com:8080のURLにアクセスすると、フォーラムにアクセスできます。次の画面が表示されます。

ステップ7 - Nginxのインストール
Rocky Linux 9には古いバージョンのNginxが付属しています。最新バージョンをインストールするには、公式のNginxリポジトリをダウンロードする必要があります。
公式のNginxリポジトリを作成するために、/etc/yum.repos.d/nginx.repoファイルを作成して開きます。
$ sudo nano /etc/yum.repos.d/nginx.repo
次のコードを貼り付けます。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。
Nginxサーバーをインストールします。
$ sudo dnf install nginx
インストールを確認します。
$ nginx -v
nginx version: nginx/1.22.1
Nginxサーバーを有効にして開始します。
$ sudo systemctl enable nginx --now
サーバーの状態を確認します。
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2023-01-20 07:49:55 UTC; 1s ago
Docs: http://nginx.org/en/docs/
Process: 230797 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 230798 (nginx)
Tasks: 3 (limit: 12355)
Memory: 2.8M
CPU: 13ms
CGroup: /system.slice/nginx.service
??230798 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??230799 "nginx: worker process"
??230800 "nginx: worker process"
ステップ8 - SSLのインストール
Let’s Encryptを使用してSSL証明書をインストールするには、Certbotツールをインストールする必要があります。
そのためにSnapdパッケージインストーラーを使用します。Rocky Linuxにはそれが付属していないため、Snapdインストーラーをインストールします。これにはEPELリポジトリが必要です。
$ sudo dnf install epel-release
Snapdをインストールします。
$ sudo dnf install snapd
Snapサービスを有効にして開始します。
$ sudo systemctl enable snapd --now
Snapコアパッケージをインストールし、Snapdのバージョンが最新であることを確認します。
$ sudo snap install core && sudo snap refresh core
Snapdが動作するために必要なリンクを作成します。
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
次のコマンドを実行してCertbotをインストールします。
$ sudo snap install --classic certbot
次のコマンドを使用して、Certbotコマンドが/usr/binディレクトリで実行できるように、シンボリックリンクを作成します。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
インストールを確認します。
$ certbot --version
certbot 1.32.2
SSL証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d discourse.example.com
上記のコマンドは、サーバーの/etc/letsencrypt/live/discourse.example.comディレクトリに証明書をダウンロードします。
Diffie-Hellmanグループ証明書を生成します。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
SSL更新が正常に機能しているかどうかを確認するために、プロセスのドライランを行います。
$ sudo certbot renew --dry-run
エラーが表示されない場合は、すべて設定完了です。証明書は自動的に更新されます。
ステップ9 - Nginxの設定
編集のために/etc/nginx/conf.d/discourse.confファイルを作成して開きます。
$ sudo nano /etc/nginx/conf.d/discourse.conf
次のコードを貼り付けます。
# HTTPSを強制する
server {
listen 80;
listen [::]:80;
server_name discourse.example.com;
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name discourse.example.com;
access_log /var/log/nginx/discourse.access.log;
error_log /var/log/nginx/discourse.error.log;
# SSL
ssl_certificate /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/discourse.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/discourse.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 8.8.8.8;
http2_push_preload on; # HTTP/2サーバープッシュを有効にする
# TLSv1.3の0-RTTを有効にする。リバースプロキシを使用する場合は、$ssl_early_dataを使用して
# リプレイ攻撃を防ぎます。
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
# セキュリティ / XSS緩和ヘッダー
# 注意: X-Frame-OptionsはwebOSアプリに問題を引き起こす可能性があります
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header X-Early-Data $tls1_3_early_data;
client_max_body_size 100m;
location / {
proxy_pass http://discourse.example.com:8080/;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
# このブロックはTLS v1.3のデバッグに役立ちます。必要に応じてこれを削除し、
# NGINXによって直接公開された$ssl_early_data変数を使用してください。
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。
編集のために/etc/nginx/nginx.confファイルを開きます。
$ sudo nano /etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;の前に次の行を追加します。
server_names_hash_bucket_size 64;
ファイルを保存するには、Ctrl + Xを押し、プロンプトが表示されたらYを入力します。
Nginx設定ファイルの構文を確認します。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
新しい設定を有効にするためにNginxサービスを再起動します。
$ sudo systemctl restart nginx
ステップ10 - Discourseインストールのアクセスと完了
ブラウザでURL https://discourse.example.comにアクセスすると、フォーラムにアクセスできます。次の画面が表示されます。
登録ボタンをクリックして進みます。app.ymlファイルに設定されたメールIDが自動的に入力されます。

登録ボタンをクリックして管理者アカウントを登録します。メール確認画面に進みます。

SMTP設定が正しければ、アカウントをアクティブにするためのメールが届きます。メールからリンクをクリックしてアカウントの設定を完了します。

アクティブ化ボタンをクリックしてインストールを完了します。

Discourseのセットアップウィザード画面に移動します。フォーラム名、説明を入力し、言語を選択します。次へボタンをクリックして進みます。

次に、メンバーエクスペリエンスページに移動します。必要に応じてオプションを選択し、次へボタンをクリックして進みます。

次に、セットアップ完了ページに移動します。さらに設定するか、ジャンプインしてフォーラムを使用開始するかを選択できます。これらの設定は、管理者設定を使用してまだ構成できます。

チュートリアルのためにさらに設定するを選択します。ロゴやバナーをフォーラムに設定するように求められます。次へボタンをクリックして進みます。

次に、フォーラムのフロントエンドの基本スタイリングオプションを設定するように求められます。次へボタンをクリックして進みます。

次に、組織設定ページに移動します。適切な情報を入力します。

ジャンプイン!ボタンをクリックして進みます。フォーラムのホームに移動します。あなたのDiscourseフォーラムは使用する準備が整いました。

ステップ11 - Discourseコマンド
コマンドラインからDiscourse管理者をアクティブ化
アクティベーションメールが届かない場合は、コマンドラインから管理者アカウントをアクティブ化できます。
Discourseディレクトリに移動します。
$ cd /var/discourse
Discourseコンテナシェルに入ります。
$ sudo ./launcher enter app
Railsコマンドプロンプトにアクセスするためにrails cコマンドを入力します。
root@discourse-app:/var/www/discourse# rails c
次のプロンプトが表示されます。
[1] pry(main)>
管理者アカウントを見つけるためのコマンドを入力します。
[1] pry(main)> User.find_by_email("[email protected]")
=> #,
moderator: false,
title: nil,
uploaded_avatar_id: nil,
:
qを入力してプロンプトに戻り、次のコマンドを順番に入力します。
[2] pry(main)> user.approved = true
[3] pry(main)> user.save
[4] pry(main)> EmailToken.confirm(user.email_tokens.first.token)
exitを2回入力してシェルに戻ります。管理者アカウントがアクティブ化され、使用する準備が整いました。
Discourseのバックアップ
Discourseはデフォルトで7日ごとにデータベースをバックアップします。バックアップファイルは`/var/discourse/shared/standalone/backups/defaultディレクトリにあります。 $ ls /var/discourse/shared/standalone/backups/default -al total 1480 drwxr-xr-x. 2 navjot tape 4096 Jan 21 03:34 . drwxr-xr-x. 3 navjot tape 4096 Jan 20 12:01 .. -rw-r--r--. 1 navjot tape 1503748 Jan 21 03:34 howtoforge-forums-2023-01-21-033439-v20230119094939.tar.gz バックアップ設定は、Admin >> Settings >> Backupsセクションを訪れることで構成できます。Discourseは、バックアップをローカルに保存するか、Amazon S3スタイルのクラウドストレージに保存するオプションを提供します。
バックアップはAdmin >> Backupsページからダウンロードできます。復元はデフォルトで無効になっています。データベースを復元したい場合は、Admin >> Settings >> Backupsセクションから復元を許可オプションを有効にする必要があります。
### Discourseのアップグレード フォーラムをアップグレードするには、2つの方法のいずれかを使用できます。最初の方法は、管理者ダッシュボードを介してアップグレードすることです。2番目の方法は、コマンドラインを使用することです。 Discourseディレクトリに移動します。 $ cd /var/discourse GitHubから最新のファイルを取得してDiscourseインストールを更新します。 $ git pull Discourseを再構築します。 $ sudo ./launcher rebuild app app.ymlファイルに変更を加えるたびにDiscourseを再構築する必要があります。変更を加えた後は、上記のコマンドを実行します。これにより、古いコンテナが破棄され、新しいコンテナがブートストラップされ、起動します。 ### Discourseの停止 $ sudo ./launcher stop app ### Discourseのログを表示 $ sudo ./launcher logs app ブラウザでURL https://discourse.example.com/logs/にアクセスすることでも詳細なログを表示できます。似たような画面が表示されます。
### Rails / Unicornログ Ruby on Railsには非常に詳細なログがディスクに書き込まれます。さらに、WebサーバーのUnicornもディスクにログを記録します。これらはvar/discourse/shared/standalone/log/railsディレクトリで表示できます。 $ ls /var/discourse/shared/standalone/log/rails -al total 552 drwxr-xr-x. 2 navjot tape 4096 Jan 20 07:09 . drwxr-xr-x. 4 root root 4096 Jan 20 07:09 .. -rw-r--r--. 1 navjot tape 0 Jan 20 07:09 production_errors.log -rw-r--r--. 1 navjot tape 361031 Jan 21 11:46 production.log -rw-r--r--. 1 navjot tape 0 Jan 20 07:09 sidekiq.log -rw-r--r--. 1 navjot tape 60919 Jan 20 08:42 unicorn.stderr.log -rw-r--r--. 1 navjot tape 119403 Jan 21 03:34 unicorn.stdout.log ### Nginxログ DiscourseはDockerコンテナ内でNginxサーバーを実行します。次の場所でログを表示できます。 $ ls /var/discourse/shared/standalone/log/var-log/nginx -al total 1852 drwxr-xr-x. 2 33 tape 4096 Jan 20 07:39 . drwxrwxr-x. 5 root adm 4096 Jan 21 08:04 .. -rw-r--r--. 1 33 tape 1878744 Jan 21 12:18 access.log -rw-r--r--. 1 33 tape 1017 Jan 20 07:45 error.log ### Redisログ Redisデータベースサーバーのログは次の場所で取得できます。最新のログエントリはcurrentファイルにあります。 $ ls /var/discourse/shared/standalone/log/var-log/redis -al total 140 drwxr-xr-x. 2 root root 4096 Jan 20 07:39 . drwxrwxr-x. 5 root adm 4096 Jan 21 08:04 .. -rw-r--r--. 1 root root 127002 Jan 21 12:17 current -rw-------. 1 root root 0 Jan 20 07:39 lock ### PostgreSQLログ PostgreSQLデータベースのログは次の場所で表示できます。 ls /var/discourse/shared/standalone/log/var-log/postgres -al total 20 drwxr-xr-x. 2 root root 4096 Jan 20 07:39 . drwxrwxr-x. 5 root adm 4096 Jan 21 08:04 .. -rw-r--r--. 1 root root 11400 Jan 21 03:34 current -rw-------. 1 root root 0 Jan 20 07:39 lock 最新のエントリは、そのディレクトリのcurrentファイルにあります。 残りは/var/discourse/shared/standalone/log/var-log自体に見つかります。 ls /var/discourse/shared/standalone/log/var-log -al total 100 drwxrwxr-x. 5 root adm 4096 Jan 21 08:04 . drwxr-xr-x. 4 root root 4096 Jan 20 07:09 .. -rw-r--r--. 1 root adm 40943 Jan 21 12:17 auth.log -rw-r--r--. 1 root adm 0 Jan 20 08:41 kern.log -rw-r-----. 1 root adm 750 Jan 21 08:04 messages drwxr-xr-x. 2 33 tape 4096 Jan 20 07:39 nginx drwxr-xr-x. 2 root root 4096 Jan 20 07:39 postgres drwxr-xr-x. 2 root root 4096 Jan 20 07:39 redis -rw-r--r--. 1 root adm 23041 Jan 21 12:17 syslog -rw-r-----. 1 root adm 70 Jan 21 08:04 user.log ## 結論 これでチュートリアルは終了です。Rocky Linux 9サーバー上でNginxプロキシWebサーバーの背後にDockerを使用してDiscourseフォーラムをインストールしました。質問がある場合は、下のコメントに投稿してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。