discourse を使ってみる
【概要】Ubuntu でDiscourseを手動インストールする基本的な手順である。公式サポートはDockerベースに限定されており、本方法は非推奨かつ古い情報が含まれる場合がある。Ruby 3.3以降、PostgreSQL 13/16、Redis 6.0以降などが必要である。
事前に決めておく事項
- データベースディレクトリ
データベースファイルを置くディレクトリのことである。 以下、次のようにする.
- データベースディレクトリ: /var/lib/postgresql/data
(注: Ubuntu標準のPostgreSQLパッケージでは、通常
/var/lib/postgresql/<バージョン>/<クラスタ名>
のようなパスが使用される。本記事ではカスタムパスを使用するが、公式には標準パスの使用が推奨される場合が多い。このカスタムパスを使用する場合は、PostgreSQLの設定ファイルでdata_directory
を変更するなど追加設定が必要である) - Postgres 用アカウント
Postgres 用アカウントは、Postgres サーバの起動、データベースファイルの 所有権の設定等に使う OS ユーザーである。
以下、このページでは、次のように書く. パスワードは、必ず、適切に設定する.
- ユーザ名: postgres
- postgres のパスワード: <パスワード>
- Discourse アカウント
Discourse アカウントは、Discourse のインストールや設定等に使う OS ユーザーである。Discourse アプリケーションの実行ユーザーとしても使われる。
- ユーザ名: discourse
- discourse のパスワード: <パスワード>
- Postgres データベース接続用のユーザ名とパスワード
以下、このページでは、次のように書く. パスワードは、必ず、適切に設定する.
- ユーザ名: discourse
- パスワード: <パスワード>
- 初期化するデータベースクラスタのサーバ・エンコーディングと,クライアント・エンコーディングとロケール
サーバ・エンコーディングは UTF-8 を使うことにする(PostgreSQL ではサーバ上のエンコーディングとしては,シフトJIS が使えないため).
- サーバ・エンコーディング: UTF-8
Discourse のダウンロードとインストール (Download and Install Discourse)
- Discourse の前提ソフトウェア
- redis server のインストール
(Install redis server)
# パッケージリストの情報を更新 sudo apt update sudo apt -y install redis-server
Redisは、Discourseのキャッシュやキュー管理に使われるインメモリデータ構造ストアである。Discourse 公式では Redis 6.0 以降が推奨されており、Ubuntu 24.04 の apt リポジトリで提供されるバージョン(通常 7.0 以降)はこれに該当する。
- Ruby のインストール
(Install Ruby)
# パッケージリストの情報を更新 sudo apt update sudo apt -y install ruby ruby-dev
(注: Discourse の最新バージョン(3.3+)は Ruby 3.3 以降で動作する。Ubuntu 24.04 の apt リポジトリで提供される Ruby バージョンは通常 3.3 以降であり互換性があるが、最新の Discourse の要件は変動する可能性がある。手動インストール自体が公式サポート外であるため、推奨される Docker インストールと比較してバージョンの追従や管理が複雑になる。)
- gem update --system の実行 (Execute 'gem update --system')
rubygems を最新の状態にするために実行する。
sudo REALLY_GEM_UPDATE_SYSTEM=YES gem update --system
- 'sudo gem install bundler' の実行
(Execute 'sudo gem install bundler')
bundler は Ruby プロジェクトの依存関係(gem)を管理するために必要である。
dpkg -l | grep bundle sudo gem install bundler
- redis server のインストール
(Install redis server)
- Discourse ユーザの設定
このときにDiscourse ユーザの パスワードを設定する.
sudo adduser --shell /bin/bash --gecos 'Discourse application' discourse
- /etc/sudoers に Discourse ユーザの設定
(注: セキュリティ上の理由から、特定のコマンドのみ sudo 実行可能にするなど、より限定的な設定を検討することを推奨する)
discourse ALL=(ALL:ALL) ALL
- Discourse のダウンロード
(Download Discourse)
「sudo su - discourse 」は、discourse ユーザーとして操作を行うためのコマンドである. これ以降の操作は、discourse ユーザーで行う.
sudo rm -rf /var/www/discourse sudo install -d -m 755 -o discourse -g discourse /var/www/discourse sudo su - discourse git clone https://github.com/discourse/discourse.git /var/www/discourse
この後の操作も、discourse ユーザーで行う.
- bundle の実行 (Execute bundle)
Discourse の動作に必要な gem をインストールする操作である.
エラーメッセージが出ていないことを確認する.
cd /var/www/discourse bundle install --deployment --without test
- sudo gem update の実行 (Execute 'sudo gem update')
sudo gem update gem list
- Discouse の設定開始
cd /var/www/discourse/config cp discourse_quickstart.conf discourse.conf cp discourse.pill.sample discourse.pill
- /var/www/discourse/config/discourse.conf の設定
(Edit /var/www/discourse/config/discourse.conf)
- database username: discourse (PostgreSQLに接続するときのユーザ名)
- database password: <パスワード> (PostgreSQLに接続するときのパスワード)
- hostname: ホスト名を設定
- Redisの部分:他のアプリケーションで Redis を使っていないならば、何も設定しなくて良い
◆ 設定例
- Discouse ユーザから元のユーザに戻る操作
exit
Web サーバ nginx のインストール (Install a Web Server nginx)
- 既存の nginx パッケージの削除 (Remove existing version of ngginx)
(必要に応じて実行する)
sudo apt-get remove '^nginx.*$'
- sources.list.d ファイルの設定 (Setup a sources.list.d file)
(最新版をインストールするため、Nginx公式リポジトリを追加する)
sudo rm -f /etc/apt/sources.list.d/nginx.list touch /etc/apt/sources.list.d/nginx.list echo "deb http://nginx.org/packages/ubuntu/ `lsb_release -sc` nginx" | sudo tee -a /etc/apt/sources.list.d/nginx.list echo "deb-src http://nginx.org/packages/ubuntu/ `lsb_release -sc` nginx" | sudo tee -a /etc/apt/sources.list.d/nginx.list sudo apt -y update sudo apt -y install nginx
PostgreSQL のインストールとデータベースファイルの生成 (Install PostgreSQL and Create Database Files)
インストール手順
- システムのアップデート操作
# パッケージリストの情報を更新 sudo apt update sudo apt -y upgrade
- PostgreSQL と関連パッケージのインストール
(Install PostgreSQL and related packages)
# パッケージリストの情報を更新 sudo apt update sudo apt -y install postgresql postgresql-client-common postgresql-common postgresql-contrib
(注: Ubuntu 24.04 の apt リポジトリでは PostgreSQL 16 がインストールされる。Discourse 公式サポートバージョンは PostgreSQL 13 であるが、PostgreSQL 16 も非公式ながら動作報告がある。PostgreSQL のインストールにより、デフォルトのデータベースクラスタと
postgres
OSユーザーは通常自動的に作成されるため、手動でのinitdb
実行は通常不要である。) - pgAdmin のインストール
(Install pgAdmin)
(注: pgAdmin III は開発が終了しており、現在は pgAdmin 4 が推奨される。apt でインストールできる pgAdmin3 は古いバージョンのため、最新の pgAdmin 4 を使用する場合は公式ウェブサイトからのダウンロードなど、別の方法でインストールする必要がある。)
- postgreSQL サーバの起動チェック
(Try to Start and Stop postgreSQL server)
(Ubuntu では systemd によるサービス管理が一般的である)
sudo systemctl restart postgresql sudo systemctl status postgresql
- Postgres 用アカウントが存在することの確認
(print the postgreSQL account)
パッケージを使って PostgreSQL をインストールすると、Postgres 用アカウント(OSユーザ名は「postgres」)が自動的に作成される.
sudo cat /etc/passwd | grep postgres
* 「x」はパスワードが設定されているが、そのハッシュが
/etc/shadow
に保存されていることを示す(パスワードがないという意味ではない) - データベースディレクトリの作成と権限の設定
(create a database directory)
ここでは、データベースディレクトリは /var/lib/postgresql/data とする.好きに決めていいが、日本語を含まないディレクトリ名にする.
(注: 前述の通り、通常はパッケージインストール時に作成される標準パスを使用することが推奨される)
sudo mkdir /var/lib/postgresql/data sudo chown -R postgres:postgres /var/lib/postgresql/data
discourse データベースの新規作成
- postgreSQL のログインに関する設定
(Settings of postgreSQL login)
discourse ユーザーで PostgreSQL にログインできるように、
/etc/postgresql/main/pg_hba.conf
を編集する.local all discourse peer
(注:
peer
認証は OS ユーザー名と DB ユーザー名が一致する場合に機能する。アプリケーションからの接続にはmd5
やscram-sha256
など、パスワード認証の設定が必要となる場合が多い) - postgreSQL サーバの再起動
(Restart postgreSQL server)
/etc/postgresql/main/pg_hba.conf
を書き換えたので再起動する.sudo systemctl restart postgresql sudo systemctl status postgresql
- ロールの新規作成
(Create a new role)
/var/www/discourse/config/discourse.conf
で設定したユーザ名(ここでは「discourse」)とパスワードを正しく設定する.sudo su - postgres psql -U postgres create role discourse with login password '<パスワード>'; \q exit
(注: アプリケーションが使用するDBユーザーに
SUPERUSER
権限を与えるのはセキュリティリスクが高い。Discourseに必要な権限(通常はデータベース作成権限など)のみを与えるべきであり、login
権限だけでも接続は可能である。)* 「間違えたので、ロールを削除したい」というときは「drop role discourse;」のように操作する.
- 試しに、いま作成したロールを使って PostgreSQL に接続してみる.
「sudo su - discourse 」は、discourse ユーザーとして操作を行うためのコマンドである.
sudo su - discourse psql -U discourse -d postgres \q
- /var/www/discourse/config/database.yml の設定
database: discourse_prod のように設定する.
◆ 設定例
- Discourse 用データベースの新規作成
(Create a database)
【関連する外部ページ】 https://github.com/discourse/discourse/blob/main/docs/INSTALL.md
cd /var/www/discourse createdb discourse_prod RUBY_GC_MALLOC_LIMIT=90000000 RAILS_ENV=production bundle exec rake db:migrate RUBY_GC_MALLOC_LIMIT=90000000 RAILS_ENV=production bundle exec rake assets:precompile
- データのベースの一覧表示
(List Databases)
psql -U discourse -l
- サーバの起動
bundle exec rails s
(注: このコマンドは開発用の軽量Webサーバを起動するものであり、プロダクション環境での運用には適さない。プロダクション環境ではPuma/UnicornなどのアプリケーションサーバをNginxと組み合わせて使用し、Sidekiqなどのバックグラウンドジョブも別途起動する必要がある。Discourseの公式ドキュメントではDockerでのデプロイが最も推奨されている。また、Discourseは多くのメモリ(最低2GB RAM推奨)を使用するため、適切なシステムリソースの確保とスワップ領域の設定が重要である。)
- http://localhost:3000 をWebブラウザで開いてみる
補足事項
本記事はDiscourseの手動インストール手順を解説しているが、Discourseの公式ドキュメントでは、管理やアップデートが容易なDockerイメージを用いたインストール方法を推奨している。Ubuntu 24.04 LTS は Docker インストールの公式サポート対象OSである。
プロダクション環境で運用する場合は、ファイアウォール(例: ufw)を設定して不要なポートを閉じ、Webアクセスに必要なポート(通常 80/443)のみを開ける必要がある。
また、セキュリティと信頼性の観点から、HTTPS (SSL/TLS) の設定が必須である。NginxでLet's Encryptなどの証明書を設定する方法を別途確認する必要がある。
Discourse の多くの機能はメールに依存するため、SMTP サーバの適切な設定が必須である。