discourse を使ってみる

【概要】Discourse は Ruby on Rails で作られたフォーラムソフトウェアである。このページでは Ubuntu 上に手動でインストールする手順を示す。Discourse の公式サポートは Docker によるインストールに限定される。手動インストールでは、Ruby 3.4(Discourse の Gemfileruby "~> 3.4" を要求する)、PostgreSQL 18(公式 Docker イメージと同じメジャーバージョン)、pgvector 拡張、Redis 7 以降、Node.js 22、pnpm が必要である。ハードウェアは 64 ビット、メモリ 1GB 以上(スワップ併用)、ディスク 10GB 以上が公式の最低要件である。

事前に決めておく事項

前提ソフトウェアのインストール

  1. システムの更新

    次のコマンドを実行する。

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y upgrade
    
  2. ビルドツールとライブラリのインストール

    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
    
  3. 画像処理ツールのインストール

    Discourse はアップロード画像の変換に ImageMagicklibvips と各種最適化ツールを使う。次のコマンドを実行する。

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install imagemagick libvips-tools jpegoptim optipng pngquant gifsicle jhead
    
  4. PostgreSQL のインストール

    Ubuntu 26.04 LTS の apt リポジトリでは PostgreSQL 18 が提供される。 Discourse の移行スクリプトは hstorepg_trgmunaccentvector の拡張を使うため、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 に置かれる。

  5. 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
    
  6. 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
    
  7. nginx のインストール

    nginx は、Discourse のアプリケーションサーバの前に置くリバースプロキシとして使う。次のコマンドを実行する。

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install nginx
    sudo systemctl enable --now nginx
    sudo systemctl status nginx
    

Discourse ユーザの作成

  1. Discourse ユーザの作成

    Discourse を実行する OS ユーザーを作成する。このときに Discourse ユーザのパスワードを設定する。

    sudo adduser --shell /bin/bash --gecos 'Discourse application' discourse
    
  2. Discourse ユーザに sudo 権限を与える

    必要なときだけ与える。sudo visudo を実行し、次の行を追加する。

    discourse    ALL=(ALL:ALL) ALL
    

Ruby 3.4 のインストール

Discourse の Gemfileruby "~> 3.4" を要求する。Ubuntu 26.04 LTS の apt リポジトリで提供される Ruby は 3.3 であるため、apt の Ruby は使わず、rbenv を使って Ruby 3.4 を discourse ユーザのホームに入れる。

  1. discourse ユーザに切り替える

    「sudo su - discourse」は、discourse ユーザーとして操作を行うためのコマンドである。

    sudo su - discourse
    
  2. 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
    
  3. 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
    
  4. bundler のインストール

    bundler は Ruby プロジェクトの依存関係(gem)を管理する。

    gem install bundler
    bundler -v
    

Discourse のダウンロードと gem のインストール

  1. ディレクトリの作成

    Discourse のソースコードは /var/www/discourse に置く。次のコマンドは root 権限を持つユーザで実行する。

    sudo install -d -m 755 -o discourse -g discourse /var/www/discourse
    
  2. 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 stable
    

    stable ブランチは安定版である。開発版を使うときは main ブランチのままにする。

  3. gem のインストール

    Discourse の動作に必要な gem をインストールする。エラーメッセージが出ていないことを確認する。

    cd /var/www/discourse
    bundle config set --local deployment true
    bundle config set --local without 'development test'
    bundle install
    
  4. JavaScript パッケージのインストール

    Discourse のフロントエンドは pnpm で管理されている。

    cd /var/www/discourse
    pnpm install --frozen-lockfile
    

PostgreSQL の設定と discourse データベースの新規作成

  1. ロールとデータベースの作成

    「sudo -u postgres psql」は、PostgreSQL の管理者権限で psql を起動するコマンドである。 CREATEDB 権限は、Discourse がバックアップの復元時にデータベースを作成するために使う。

    sudo -u postgres psql
    

    psql の中で、次を実行する。

    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; のように操作する。

  2. 接続の確認

    Discourse は既定で UNIX ドメインソケット /var/run/postgresql 経由で接続する。Ubuntu の既定の pg_hba.conf では、ソケット接続は peer 認証であり、OS ユーザー名とロール名が一致する場合に接続できる。 「sudo su - discourse」は、discourse ユーザーとして操作を行うためのコマンドである。

    sudo su - discourse
    psql -d discourse -c '\dx'
    

    作成した 4 つの拡張が表示されることを確認する。

  3. データベースの一覧表示
    psql -l
    

Discourse の設定

  1. 設定ファイルの作成

    discourse_defaults.conf が既定値の一覧である。このファイルは編集せず、同じディレクトリに discourse.conf を作り、変更する項目だけを書く。

    cd /var/www/discourse/config
    cp discourse_defaults.conf discourse.conf
    
  2. /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)。

  3. メール(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
    

データベースの初期化とサーバの起動

  1. マイグレーションと資産のプリコンパイル

    「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
    
  2. 管理者アカウントの作成

    メールアドレス、パスワード、管理者権限の付与を対話的に指定する。

    cd /var/www/discourse
    RAILS_ENV=production bundle exec rake admin:create
    
  3. Sidekiq の起動

    Sidekiq は、メール送信、投稿の再構築、定期処理を行うバックグラウンドジョブの実行プロセスである。Discourse の動作に必須であり、Web サーバとは別に起動する。

    cd /var/www/discourse
    RAILS_ENV=production bundle exec sidekiq
    
  4. アプリケーションサーバの起動

    別の端末を開き、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 は開発用の起動方法であり、運用環境では使わない。

  5. 動作確認

    Webブラウザで http://localhost:3000 を開く。

  6. 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 installpnpm installrake db:migraterake assets:precompile を実行し、Sidekiq とアプリケーションサーバを再起動する。