VPSにFlarumを構築する方法 PHPフォーラム設定
PHP、Composer、MariaDBでFlarum 1.8をVPSに構築します。nginxでは/publicだけを公開してTLS化し、メール設定や拡張機能更新で起きる落とし穴も解決します。
PHP と MariaDB で VPS に Flarum をインストールする
VPS に Flarum をインストールすると、Docker、Ruby、別個のジョブランナーを使わずに PHP と MariaDB で動作するフォーラムを構築できます。これが Flarum を選ぶ理由です。VPS に Discourse をインストールする場合は、Ruby、PostgreSQL、Redis、バックグラウンドワーカーを含む Docker スタックが必要です。バックアップやメールサービスを追加する前でも、実用上の最低ラインは 2 GB の RAM です。Discourse は、1 日に数千件の投稿がある活発なコミュニティなら、そのリソース消費に見合います。しかし、数百人規模のフォーラムでは、毎月料金を払いながら使わない機構になりがちです。Flarum は、すでに運用している可能性がある PHP スタックに収まります。そのため、nginx と MariaDB を備えた 1 GB の VPS で、既存の他のサービスと同じサーバーにホストできます。まだ選択肢を決めていない場合は、セルフホスト型フォーラムソフトウェアの詳しい比較で他の選択肢も確認できます。
このガイドでは、Flarum 1.x、現在の 1.8 系を対象にインストールします。2026 年 8 月時点で、Flarum 2.0 はまだリリース候補です。そのため、他の人が利用するフォーラムでは 1.8 を実行するのが適切です。ここではコアのバージョンよりも拡張機能の対応状況が重要です。拡張機能の作者の多くは、まだ 2.0 へ移行していません。
サーバー上で Flarum 1.8 に必要なもの
Flarum の公式要件は、PHP 7.3 以降、MySQL 5.6 以降または MariaDB 10.0.5 以降、そして mod_rewrite を備えた nginx または Apache です。Ubuntu 24.04 には PHP 8.3 と MariaDB 10.11 が含まれるため、サードパーティーリポジトリなしでディストリビューションのパッケージだけで両方の要件を満たせます。Flarum が必要とする PHP 拡張機能は curl、dom、fileinfo、gd、json、mbstring、openssl、pdo_mysql、tokenizer、zip です。また、シェルアクセスも必要です。ここでは Composer は必須であり、Flarum のすべての拡張機能が Composer パッケージとして提供されるため、Composer を実行せずに拡張機能を追加する方法はありません。
Flarum は一般的な PHP アプリケーションです。すでに Ubuntu 24.04 上で LAMP スタックを運用している場合、次の 2 つのセクションの大部分はインストール済みです。データベースの説明まで読み飛ばして構いません。
Flarum が必要とする PHP と拡張機能をインストールする
sudo apt update
sudo apt install -y nginx mariadb-server composer
sudo apt install -y php8.3-fpm php8.3-cli php8.3-curl php8.3-gd php8.3-mbstring php8.3-mysql php8.3-xml php8.3-zip
php -m | grep -E 'curl|dom|gd|mbstring|pdo_mysql|zip'
composer --versionパッケージ名は、Flarum の一覧と 1 対 1 には対応しません。dom 拡張機能は php8.3-xml に含まれています。また、fileinfo、json、openssl、tokenizer は Ubuntu の PHP 8.3 に組み込まれているため、これらをインストールするパッケージはありません。grep は 6 行を出力し、composer --version は 2.x リリースを示すはずです。拡張機能が不足している場合は、今のうちに修正してください。Composer は拡張機能がないと Flarum のインストールを拒否し、エラーで不足している拡張機能を示します。
Problem 1
- flarum/core[v1.8.0, ..., v1.8.17] require ext-gd * -> it is missing from your system.
Install or enable PHP's gd extension.コマンドライン PHP と FastCGI プロセスマネージャー(PHP-FPM)が同じバージョンであることを確認します。Composer はコマンドラインバイナリ上で実行され、フォーラムは FPM 上で動作するため、php -v と sudo php-fpm8.3 -v は一致している必要があります。サードパーティーリポジトリから複数の PHP バージョンを導入したマシンでは、両者のバージョンがずれることがあります。その場合、一方のバージョン用にインストールした拡張機能は、もう一方から認識されません。
データベースと専用のデータベースユーザーを作成する
sudo mariadb-secure-installation
sudo mariadbCREATE DATABASE flarum CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'flarum'@'localhost' IDENTIFIED BY 'use-a-long-random-password';
GRANT ALL PRIVILEGES ON flarum.* TO 'flarum'@'localhost';
FLUSH PRIVILEGES;
EXIT;rootではなく、Flarum専用のデータベースユーザーを使用します。この権限付与の対象はflarum.*だけであり、それ以外は対象になりません。そのため、自分で作成していない拡張機能にSQLインジェクションの脆弱性があっても、他のデータベースを読み取られることを防げます。文字セットも重要です。utf8mb4は絵文字やラテン文字以外の文字体系を正しく保存できます。一方、MySQLの古いutf8は3バイトのエンコーディングであり、4バイト文字が最初に現れた位置で投稿を切り詰めます。先に進む前に、ユーザーで接続できることを確認してください。
mariadb -u flarum -p flarum -e 'SELECT DATABASE();'flarumと表示されるはずです。ERROR 1045 (28000): Access denied for user 'flarum'@'localhost'の場合、パスワードが一致していないか、localhostとは異なるホストを対象にユーザーが作成されています。
Composer を使用して VPS に Flarum を 1.8 系で固定してインストールする
まず、コードを所有する system user を作成します。root で Composer を実行すると、vendor/ と storage/ に root 所有のファイルが残ります。そのため、後で PHP が自身のキャッシュに書き込めず、フォーラムがすべてのリクエストに対して 500 エラーを返します。
sudo useradd --system --home-dir /srv/flarum --shell /bin/bash flarum
sudo install -d -o flarum -g flarum -m 755 /srv/flarum
sudo -iu flarum最後のコマンドを実行すると、flarum user として /srv/flarum で shell が開始されます。ここからガイドの最後まで、sudo で始まるコマンドを除き、すべてのコマンドをこの user として実行します。
composer create-project flarum/flarum:^1.8.0 .^1.8.0 の制約がバージョン固定です。1.8.x の patch release は受け入れますが、2.0 は拒否します。2.0 が release candidate の間は、この指定を使用します。Composer は skeleton をダウンロードし、flarum/core とその依存関係を解決します。その結果、public/、storage/、vendor/、composer.json、および flarum の command line script が配置されます。
小規模な VPS では、この手順で問題が発生しやすく、異なる2つの障害が似た症状になります。PHP Fatal error: Allowed memory size of 134217728 bytes exhausted は PHP 自身の memory_limit です。コマンドの前に COMPOSER_MEMORY_LIMIT=-1 を付けると、その実行に限って上限を解除できます。PHP のエラーが表示されず、単独の Killed だけが行に表示される場合は、kernel の out-of-memory killer です。dmesg | tail で確認できます。この場合、マシンの RAM が実際に不足しています。swap を追加してください。PHP の上限を引き上げると、kernel が介入する前に PHP がさらに多くのメモリを要求するため、状況が悪化します。
Web に公開するのは /public だけにする理由
プロジェクトのルートには、データベースパスワードが平文で記載された config.php、すべての依存関係が記載された vendor/、ログとキャッシュ済みセッションが保存された storage/ があります。これらをパブリックインターネットに公開してはいけません。Flarum は Web からアクセス可能なファイルを public/ という 1 つのサブディレクトリにまとめています。そこには index.php、assets/ フォルダーなど、必要最小限のファイルしかありません。Web サーバーのルートを /srv/flarum/public に設定すれば、覚えておくべきルールに依存せず、構造上、ツリーの残りの部分に HTTP でアクセスできなくなります。
代わりにルートを /srv/flarum に設定すると、実際に被害につながります。/config.php をリクエストしても有用な内容は返りません。PHP がそのファイルを実行しますが、返すのは配列だけだからです。しかし /storage/logs/flarum.log によって、第三者はスタックトレースとデータベースエラーを取得できます。また /composer.lock は、使用しているすべてのパッケージの正確なバージョンを知らせます。これは、既知の脆弱性を試すための一覧になります。
PHP-FPM 専用のプールを作成する
Flarum には、3 つのパスへの書き込み権限が必要です。プロジェクトルートには、インストーラーが config.php を作成するための権限が必要です。storage/ にはログとキャッシュを保存します。assets/ にはアップロードされたアバターとロゴを保存します。ファイルの所有者は flarum ユーザーです。そのため、flarum として実行する PHP-FPM プールを用意するのが適切です。nginx は www-data として実行し、読み取りだけを行います。
/etc/php/8.3/fpm/pool.d/flarum.conf を記述します。
[flarum]
user = flarum
group = flarum
listen = /run/php/php8.3-fpm-flarum.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30s
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 16M
php_admin_value[post_max_size] = 17Msudo systemctl restart php8.3-fpm
ls -l /run/php/php8.3-fpm-flarum.sockソケットは srw-rw---- 1 www-data www-data として指定します。マスタープロセスは root として実行され、ソケットを作成します。そのため、ソケットの所有者を www-data に設定し、ワーカープロセスを flarum として実行できます。ソケットが存在しない場合、sudo journalctl -u php8.3-fpm -n 30 は FPM rejected という行を出力します。pm = ondemand はリクエストが到着したときだけワーカープロセスを起動するため、アクセスの少ないフォーラムでは訪問者がいない間のメモリ使用量をほぼゼロにできます。
nginx の server block
Flarum は、プロジェクトのルートに .nginx.conf という nginx 用の snippet を同梱しています。ここには rewrite rule、cache headers、compression settings が含まれています。内容をコピーせずに include してください。Flarum の upgrade で snippet が変更された場合も、手動編集なしでその変更がサーバーに反映されます。
server {
listen 80;
listen [::]:80;
server_name forum.example.com;
root /srv/flarum/public;
index index.php;
client_max_body_size 16M;
include /srv/flarum/.nginx.conf;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm-flarum.sock;
}
}これを /etc/nginx/sites-available/flarum として保存し、有効化します。
sudo ln -s /etc/nginx/sites-available/flarum /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxnginx -t は syntax is ok と test is successful に応答する必要があります。include の行は省略されがちですが、省略すると明確な症状が現れます。フロントページは正常に読み込まれる一方、すべての discussion link が nginx から 404 を返します。Flarum は /d/1-hello-world のような URL を PHP 内で routing します。この path はディスク上のファイルではありません。そのため、snippet の try_files $uri $uri/ /index.php?$query_string rule がないと nginx は d というディレクトリを探し、見つけられず、PHP に処理を渡す前に 404 を返します。Apache では、public/ にすでにある .htaccess file によって同じ routing が行われます。ただし、対応する <Directory> block で AllowOverride All が設定されている場合に限り、その設定が有効になります。
インストーラーを実行する前に TLS を追加する
証明書は後回しにせず、先に設定します。Flarum はインストール時に独自のベース URL を config.php に書き込み、その URL をブラウザーのアドレスから取得します。http:// 経由でインストールすると、その後に Flarum が生成するすべてのアセット URL は http:// で始まります。そのため TLS(トランスポート層セキュリティ)を追加すると、ブラウザーがこれらのリクエストを mixed content としてブロックし、フォーラムは JavaScript が動作しない、スタイルのないテキストとして表示されます。先に nginx で Let's Encrypt の certbot を設定する手順を実行し、https://forum.example.com でページが表示されることを確認してから戻ってきてください。
すでに HTTP でインストールしている場合、修正は 1 行で済みます。/srv/flarum/config.php を編集し、url キーの値を 'url' => 'https://forum.example.com', に変更してから、flarum ユーザーとして php flarum cache:clear を実行します。
インストーラーを実行し、config.php の設定を保護する
ブラウザーで https://forum.example.com を開きます。Flarum の Web インストーラーで、データベース名、作成したデータベースユーザーとパスワード、フォーラムのタイトル、管理者アカウントを入力します。インストーラーは config.php を書き込み、テーブルを作成します。完了したら、データベースパスワードを保持するようになったファイルの権限を厳格化します。
sudo chmod 640 /srv/flarum/config.phpこのファイルは、FPM が実行されるユーザーである flarum には読み取りと書き込みを許可し、それ以外のサーバー上のアカウントからは読み取れない状態にします。続いて、シェルからインストールを確認します。
php flarum infoコアのバージョン、PHP のバージョン、有効な拡張機能、メールドライバー、使用中のパスが表示されます。何か問題が発生したときに最初に実行するコマンドであり、支援を依頼した相手から最初に求められる情報でもあります。
サインアップとパスワードリセットのメールが何も表示せず失敗する理由
このセクションでは、フォーラムが最初の 1 週間を乗り切れるかどうかが決まります。新しいフォーラムが最初に送信する 2 通のメールは、サインアップ確認メールとパスワードリセットメールです。どちらも、知らない人がそのコミュニティを信頼できるか判断しているまさにその時点で送信されます。しかも、どちらもひそかに失敗します。メールを受け取れなかった人は、そのことを知らせられません。管理画面にも警告は表示されません。
Flarum には 4 つのメールドライバーがあり、Administration の Email で設定します。smtp、mail、mailgun、log です。smtp を選択し、実際に配信できるメールサービスを指定してください。mail ドライバーは、メッセージをローカルの sendmail バイナリに渡します。しかし、新しい Ubuntu VPS には通常そのバイナリが存在しないため、メッセージはどこにも届かず、エラーも発生しません。log ドライバーはメッセージ本文を storage/logs/ に書き込むだけで、メールはまったく送信しません。これは開発用に用意されているためです。
設定を保存し、同じページにある Send Test Mail ボタンを押してください。このボタンが得られる唯一のフィードバックなので、誰かを招待する前に必ず使用します。メッセージが届かない場合は、ログを確認してください。
tail -n 50 /srv/flarum/storage/logs/flarum.log接続拒否、ログイン拒否、TLS ネゴシエーションの失敗は、試行したホストとポートとともにすべてそこに記録されます。Connection could not be established with host smtp.example.com と表示された行は、ポートがブロックされているか、指定が誤っていることを示します。通常の原因は、プロバイダーが送信元ポート 25 をデフォルトでブロックしていることです。暗号化フィールドを tls に設定したポート 587 の組み合わせは、ほとんどすべてのメールサービスで機能します。
メールに問題がある場合、サインアップした訪問者には Flarum の一般的な失敗バナーである Oops! Something went wrong. Please reload the page and try again. が表示されます。確認メールの送信中にリクエストが失敗するためです。いずれにしても、その人はログインできず、その問題をあなたに知らせることもありません。
メールを送信できることと、メールが受信側に受け入れられることは別の問題です。VPS のアドレスから送信し、ドメインに SPF または DKIM レコードを公開していない場合、メールは迷惑メールフォルダーに入るか、バウンスメッセージなしで破棄されます。そのため、ログには送信成功と表示されても、受信者には何も届きません。自己ホスト型アプリからメールを確実に送信するでは、公開すべき DNS レコードと、利用する価値のあるリレーサービスについて説明しています。
拡張機能は Composer パッケージであり、アップグレードはコマンドで実行します
Flarum では、拡張機能は Composer パッケージです。アップロードボタンや、フォルダーに配置する zip ファイルはありません。これは意図的な設計です。バージョン同士の依存関係が解決され、正確な構成が composer.lock に記録され、拡張機能が依存する PHP ライブラリも正しくインストールされます。その代わり、追加するには flarum ユーザーとして3つのコマンドを実行します。
composer require 'fof/upload:*'
php flarum migrate
php flarum cache:clear次に、Administration の Extensions で有効化します。各コマンドにはそれぞれ異なる役割があります。composer require はコードをディスクに配置します。php flarum migrate は拡張機能に含まれるデータベースマイグレーションを実行します。これにより、拡張機能独自のテーブルが作成されます。php flarum cache:clear は、ブラウザーが読み込むコンパイル済みの JavaScript と CSS のバンドルを再構築します。最後のコマンドを省略すると、典型的な混乱が起きます。拡張機能は一覧に表示され、トグルも有効なのに、ブラウザーを何度再読み込みしても何も変わりません。
拡張機能を削除する場合は、逆の手順になります。まず管理画面で無効化し、その後でパッケージを削除します。Flarum は意図的に拡張機能のテーブルを残します。後で再び有効化してもデータが失われないようにするためです。テーブルも削除する場合は、コードを削除する前にマイグレーションをロールバックします。
php flarum migrate:reset --extension fof-upload
composer remove fof/upload
php flarum cache:clearそのコマンドで指定する拡張機能 ID は、パッケージ名のスラッシュをハイフンに置き換えたものです。入力せずにクリックしたい場合は、composer require 'flarum/extension-manager:*' により Composer をラップする公式の管理ページを追加できます。これは Web ユーザーと同じ操作を実行し、同じメモリと書き込み権限を必要とし、同じ原因で失敗します。そのため、問題が発生した場合も、コマンドラインが信頼できる方法です。
composer update で Flarum をアップグレードできない理由
Flarum とすべての拡張機能をアップグレードするには、Composer コマンドを 1 つ実行した後、Flarum コマンドを 2 つ実行します。最初にデータベースをバックアップしてください。
composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies
php flarum migrate
php flarum cache:clear成功したと決めつけず、出力を確認してください。特に注意が必要なのは、Composer が何も実行しない場合です。
Your requirements could not be resolved to an installable set of packages.このメッセージは、インストール済みの拡張機能の 1 つが、移行先のリリースを除外する flarum/core 制約を宣言していることを示します。Composer はこの制約に違反しないため、拡張機能の作者が動作しないと指定した組み合わせを構成する代わりに、インストール全体を古いバージョンのまま維持します。原因となっているパッケージを特定してください。
composer why-not flarum/core 1.8.17出力には、そのバージョンを妨げているすべてのパッケージと、それぞれが宣言している制約が一覧表示されます。対応方法は、作者が互換性のあるリリースを公開するまで待つか、拡張機能を削除して使わないことです。これは Composer のモデルに伴う制約です。ほかの利用者が依存するフォーラムに拡張機能を 15 個インストールする前に、この仕組みを理解しておく価値があります。最近リリースを公開した拡張機能を優先し、一覧を自分で確認できる程度に短く保ってください。
バックアップ対象
データベースとプロジェクトディレクトリをバックアップします。それ以外は再構築できます。
mariadb-dump -u flarum -p --single-transaction flarum > flarum-$(date +%F).sql
sudo tar czf flarum-files.tgz -C /srv flarum古いシステムでは mariadb-dump を mysqldump と呼びます。Ubuntu 24.04 ではどちらの名前も使用できます。データベースには、すべての投稿、ユーザー、設定が保存されています。プロジェクトディレクトリには、config.php、composer.json(実際に使用している拡張機能を記録するファイル)、アップロードしたアバターとロゴを含む assets/ が保存されています。vendor/ は省略できます。composer install が composer.lock から再構築し、storage/ も自動的に再生成されるためです。両方のファイルをサーバーの外部にコピーします。保護対象のマシン上だけにあるバックアップは、バックアップとはいえません。復元には、同じバージョンの新規 Flarum、composer install、元の場所に戻した保存ファイル、SQL ファイルの読み込みが必要です。
FAQ
1 GB VPS で Flarum を実行できますか?
小規模なコミュニティであれば実行できます。通常の Flarum は、リクエストに応答する PHP-FPM と MariaDB で構成されます。pm = ondemand により、PHP のワーカーは誰かが閲覧している間だけ存在します。最も負荷が高いのはインストール時です。composer create-project は依存関係全体をメモリ上で解決するため、out-of-memory killer に停止させられる可能性が最も高い処理です。インストール前に swap ファイルを追加するか、大きなマシンで Composer を一度実行して、生成されたツリーをコピーしてください。
トップページは表示されるのに、ディスカッションへのリンクが 404 になるのはなぜですか?
nginx の server block に include /srv/flarum/.nginx.conf; がありません。Flarum は /d/1-hello-world のような URL を PHP 内で処理します。このパスはディスク上のファイルではありません。スニペットの try_files $uri $uri/ /index.php?$query_string ルールがないと、nginx は d というディレクトリを探します。見つからないため、PHP を呼び出さずに nginx 自身が 404 を返します。Apache では、同じルーティングを public/.htaccess が提供します。ただし、<Directory> block で AllowOverride All を設定しない限り無視されます。
HTTPS を有効にした後、フォーラムのスタイルがすべて失われたのはなぜですか?
Flarum は、インストーラーの実行時に使用したアドレスをもとに、ベース URL を config.php に保存します。HTTP でインストールした場合、Flarum は http:// のアセット URL を生成し続けます。HTTPS のページではブラウザーがこれらを mixed content としてブロックするため、スタイルのないテキストだけが表示されます。/srv/flarum/config.php の url キーを https:// のアドレスに変更し、ファイルの所有者であるユーザーとして php flarum cache:clear を実行してください。
サインアップ確認メールを誰も受信できないのはなぜですか?
まず mail driver を確認してください。mail driver にはローカルの sendmail binary が必要ですが、新規の Ubuntu VPS には通常ありません。log driver は storage/logs/ に書き込むだけで、メールを送信しません。smtp に切り替え、暗号化を tls に設定して port 587 を使用してください。多くのプロバイダーは外向きの port 25 をブロックします。その後、Send Test Mail を押します。ログに送信成功が記録されてもメールが届かない場合、問題は設定ではなく到達性にあります。そのため、送信ドメインの SPF と DKIM レコードを公開してください。
Flarum 1.8 と 2.0 のどちらをインストールすべきですか?
1.8 をインストールしてください。2026 年 8 月時点で、Flarum 2.0 は release candidate です。さらに重要なのは、多くの extension が 1.x で終わる flarum/core constraint をまだ宣言していることです。現在 2.0 をインストールすると、extension をまとめて更新できないフォーラムを運用することになります。これは、composer why-not が診断対象とする典型的な障害です。flarum/flarum:^1.8.0 でバージョンを固定し、依存する extension が 2.0 のリリースを公開してから再検討してください。