discourse を使ってみる
Gemfile が ruby "~> 3.4" を要求する)、PostgreSQL 18(公式 Docker イメージと同じメジャーバージョン)、pgvector 拡張、Redis 7 以降、Node.js 22、pnpm が必要である。ハードウェアは 64 ビット、メモリ 1GB 以上(スワップ併用)、ディスク 10GB 以上が公式の最低要件である。
事前に決めておく事項
- Discourse アカウント
Discourse アカウントは、Discourse のインストールと実行に使う OS ユーザーである。 以下、このページでは次のように書く。
- ユーザ名: discourse
- discourse のパスワード: <パスワード>
- PostgreSQL 接続用のユーザ名とパスワード
PostgreSQL のロール名とパスワードである。 以下、このページでは次のように書く。
- ユーザ名: discourse
- パスワード: <パスワード>
- データベース名
以下、このページでは discourse とする。
- ホスト名
フォーラムを公開するホスト名である。以下、このページでは example.com と書く。 Discourse はこのホスト名をリンクの生成などに使うため、実際に使うホスト名を設定する。
- データベースのエンコーディング
Discourse は
UTF-8のデータベースを必要とする。 Ubuntu の PostgreSQL パッケージが作成する既定のデータベースクラスタはUTF-8である。
前提ソフトウェアのインストール
- システムの更新
次のコマンドを実行する。
# パッケージリストの情報を更新 sudo apt update sudo apt -y upgrade - ビルドツールとライブラリのインストール
Ruby 本体と gem のビルドに必要である。次のコマンドを実行する。
# パッケージリストの情報を更新 sudo apt update sudo apt -y install git build-essential cmake pkg-config patch libtool \ libssl-dev libyaml-dev libffi-dev zlib1g-dev libreadline-dev \ libxml2-dev libxslt1-dev libcurl4-openssl-dev libunwind-dev libpq-dev - 画像処理ツールのインストール
Discourse はアップロード画像の変換に
ImageMagick、libvipsと各種最適化ツールを使う。次のコマンドを実行する。# パッケージリストの情報を更新 sudo apt update sudo apt -y install imagemagick libvips-tools jpegoptim optipng pngquant gifsicle jhead - PostgreSQL のインストール
Ubuntu 26.04 LTS の apt リポジトリでは PostgreSQL 18 が提供される。 Discourse の移行スクリプトは
hstore、pg_trgm、unaccent、vectorの拡張を使うため、pgvectorのパッケージも入れる。次のコマンドを実行する。# パッケージリストの情報を更新 sudo apt update sudo apt -y install postgresql postgresql-contrib postgresql-18-pgvector sudo systemctl enable --now postgresql sudo systemctl status postgresqlパッケージによるインストールでは、データベースクラスタと OS ユーザー
postgresが自動的に作成される。データベースファイルは/var/lib/postgresql/18/mainに置かれる。 - Redis のインストール
Redis は Discourse のキャッシュとジョブキューに使われる。Discourse は Redis 7 以降を必要とし、Ubuntu 26.04 LTS の apt リポジトリでは Redis 8.0 が提供される。次のコマンドを実行する。
# パッケージリストの情報を更新 sudo apt update sudo apt -y install redis-server sudo systemctl enable --now redis-server sudo systemctl status redis-server - Node.js と pnpm のインストール
Discourse の JavaScript 資産のビルドに使う。Ubuntu 26.04 LTS の apt リポジトリでは Node.js 22 が提供される。次のコマンドを実行する。
# パッケージリストの情報を更新 sudo apt update sudo apt -y install nodejs npm sudo npm install -g pnpm node -v pnpm -v - nginx のインストール
nginx は、Discourse のアプリケーションサーバの前に置くリバースプロキシとして使う。次のコマンドを実行する。
# パッケージリストの情報を更新 sudo apt update sudo apt -y install nginx sudo systemctl enable --now nginx sudo systemctl status nginx
Discourse ユーザの作成
- Discourse ユーザの作成
Discourse を実行する OS ユーザーを作成する。このときに Discourse ユーザのパスワードを設定する。
sudo adduser --shell /bin/bash --gecos 'Discourse application' discourse - Discourse ユーザに sudo 権限を与える
必要なときだけ与える。
sudo visudoを実行し、次の行を追加する。discourse ALL=(ALL:ALL) ALL
Ruby 3.4 のインストール
Discourse の Gemfile は ruby "~> 3.4" を要求する。Ubuntu 26.04 LTS の apt リポジトリで提供される Ruby は 3.3 であるため、apt の Ruby は使わず、rbenv を使って Ruby 3.4 を discourse ユーザのホームに入れる。
- discourse ユーザに切り替える
「sudo su - discourse」は、discourse ユーザーとして操作を行うためのコマンドである。
sudo su - discourse - rbenv と ruby-build の取得
git clone https://github.com/rbenv/rbenv.git ~/.rbenv git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc source ~/.bashrc - Ruby 3.4 のインストール
ビルドに数分かかる。
--enable-yjitは Ruby の JIT コンパイラを有効にするオプションである。RUBY_CONFIGURE_OPTS="--enable-yjit --enable-shared" rbenv install 3.4.10 rbenv global 3.4.10 ruby -v - bundler のインストール
bundler は Ruby プロジェクトの依存関係(gem)を管理する。
gem install bundler bundler -v
Discourse のダウンロードと gem のインストール
- ディレクトリの作成
Discourse のソースコードは /var/www/discourse に置く。次のコマンドは root 権限を持つユーザで実行する。
sudo install -d -m 755 -o discourse -g discourse /var/www/discourse - Discourse のダウンロード
「sudo su - discourse」は、discourse ユーザーとして操作を行うためのコマンドである。これ以降の操作は、discourse ユーザーで行う。
sudo su - discourse git clone https://github.com/discourse/discourse.git /var/www/discourse cd /var/www/discourse git checkout stablestableブランチは安定版である。開発版を使うときはmainブランチのままにする。 - gem のインストール
Discourse の動作に必要な gem をインストールする。エラーメッセージが出ていないことを確認する。
cd /var/www/discourse bundle config set --local deployment true bundle config set --local without 'development test' bundle install - JavaScript パッケージのインストール
Discourse のフロントエンドは pnpm で管理されている。
cd /var/www/discourse pnpm install --frozen-lockfile
PostgreSQL の設定と discourse データベースの新規作成
- ロールとデータベースの作成
「sudo -u postgres psql」は、PostgreSQL の管理者権限で psql を起動するコマンドである。
CREATEDB権限は、Discourse がバックアップの復元時にデータベースを作成するために使う。sudo -u postgres psqlpsql の中で、次を実行する。
CREATE ROLE discourse WITH LOGIN CREATEDB PASSWORD '<パスワード>'; CREATE DATABASE discourse OWNER discourse ENCODING 'UTF8'; \c discourse CREATE EXTENSION IF NOT EXISTS hstore; CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE EXTENSION IF NOT EXISTS unaccent; CREATE EXTENSION IF NOT EXISTS vector; \qこれらの拡張は Discourse のマイグレーションが使う。拡張の作成には管理者権限が必要なため、
postgresユーザで実行する。 ロールを作り直すときはDROP ROLE discourse;のように操作する。 - 接続の確認
Discourse は既定で UNIX ドメインソケット
/var/run/postgresql経由で接続する。Ubuntu の既定のpg_hba.confでは、ソケット接続はpeer認証であり、OS ユーザー名とロール名が一致する場合に接続できる。 「sudo su - discourse」は、discourse ユーザーとして操作を行うためのコマンドである。sudo su - discourse psql -d discourse -c '\dx'作成した 4 つの拡張が表示されることを確認する。
- データベースの一覧表示
psql -l
Discourse の設定
- 設定ファイルの作成
discourse_defaults.confが既定値の一覧である。このファイルは編集せず、同じディレクトリにdiscourse.confを作り、変更する項目だけを書く。cd /var/www/discourse/config cp discourse_defaults.conf discourse.conf - /var/www/discourse/config/discourse.conf の編集
次の項目を設定する。
db_socket = /var/run/postgresql db_host = db_name = discourse db_username = discourse db_password = <パスワード> hostname = "example.com" redis_host = localhost redis_port = 6379 serve_static_assets = true各設定は
DISCOURSE_を前に付けた環境変数でも指定できる(例:DISCOURSE_DB_POOL=200)。 - メール(SMTP)の設定
Discourse は、アカウント登録の確認、パスワード再設定、通知にメールを使う。SMTP の設定がないと、管理者アカウントの作成後にログインできない場合がある。同じ
discourse.confに次の項目を設定する。smtp_address = <SMTPサーバのホスト名> smtp_port = 587 smtp_user_name = <ユーザ名> smtp_password = <パスワード> smtp_enable_start_tls = true notification_email = noreply@example.com
データベースの初期化とサーバの起動
- マイグレーションと資産のプリコンパイル
「sudo su - discourse」は、discourse ユーザーとして操作を行うためのコマンドである。プリコンパイルは数分から十数分かかる。
sudo su - discourse cd /var/www/discourse RAILS_ENV=production bundle exec rake db:migrate RAILS_ENV=production bundle exec rake assets:precompile - 管理者アカウントの作成
メールアドレス、パスワード、管理者権限の付与を対話的に指定する。
cd /var/www/discourse RAILS_ENV=production bundle exec rake admin:create - Sidekiq の起動
Sidekiq は、メール送信、投稿の再構築、定期処理を行うバックグラウンドジョブの実行プロセスである。Discourse の動作に必須であり、Web サーバとは別に起動する。
cd /var/www/discourse RAILS_ENV=production bundle exec sidekiq - アプリケーションサーバの起動
別の端末を開き、discourse ユーザーで次を実行する。
config/unicorn_launcherは、Discourse が公式イメージ内で使っている起動スクリプトである。sudo su - discourse cd /var/www/discourse RAILS_ENV=production bundle exec config/unicorn_launcher -E production -c config/unicorn.conf.rb既定では TCP ポート 3000 で待ち受ける。
bundle exec rails sは開発用の起動方法であり、運用環境では使わない。 - 動作確認
Webブラウザで
http://localhost:3000を開く。 - nginx の設定
運用環境では、nginx をリバースプロキシとして前段に置く。Discourse に設定例が付属しているので、これをもとに設定する。
sudo cp /var/www/discourse/config/nginx.sample.conf /etc/nginx/sites-available/discourse.conf sudo ln -s /etc/nginx/sites-available/discourse.conf /etc/nginx/sites-enabled/discourse.conf sudo rm -f /etc/nginx/sites-enabled/default sudo nginx -t sudo systemctl reload nginx設定ファイル中の
server_nameとルートディレクトリを、自分のホスト名と/var/www/discourseに合わせて書き換える。
補足事項
Discourse の公式ドキュメントは、Docker イメージによるインストールだけをサポート対象としている。手動インストールでは、Ruby、PostgreSQL、Redis、Sidekiq、nginx の管理と、Discourse 更新時のバージョン追従を自分で行うことになる。
運用時は、systemd のユニットファイルを作成して Sidekiq とアプリケーションサーバを常駐させる。UNICORN_WORKERS(ワーカ数)と UNICORN_SIDEKIQS(Sidekiq プロセス数)を環境変数で指定できる。
ファイアウォール(ufw)では、Webアクセスに使うポート(80/443)と SSH のポートのみを開ける。
HTTPS (SSL/TLS) を設定する。nginx と Let's Encrypt を使う場合は certbot を用いる。
Discourse を更新するときは、git pull の後に bundle install、pnpm install、rake db:migrate、rake assets:precompile を実行し、Sidekiq とアプリケーションサーバを再起動する。