VPSなどのサーバにMoch BBSをデプロイするための手順書です。
| ソフトウェア | バージョン | 備考 |
|---|---|---|
| PHP | 8.2 以上 | CLI + PHP-FPM |
| Composer | 2.x | PHPパッケージ管理 |
| Node.js | 18 以上 | Reactビルド用 |
| npm | 9 以上 | Node.jsに付属 |
| MariaDB | 10.11 以上 | MySQL 8.0 / PostgreSQL 14+ でも可 |
| Nginx | 最新安定版 | リバースプロキシ |
| Git | 最新安定版 | ソース取得用 |
pdo, pdo_mysql (MariaDB/MySQL) または pdo_pgsql (PostgreSQL), mbstring, json, openssl, tokenizer, xml, ctype, fileinfo, bcmath
ディストリビューション別のインストール例:
# RHEL / AlmaLinux / Rocky Linux(Remi リポジトリ使用)
sudo dnf install php82 php82-php-fpm php82-php-mysqlnd php82-php-mbstring php82-php-xml php82-php-bcmath
# PostgreSQLを使用する場合は php82-php-mysqlnd の代わりに php82-php-pgsql を指定
# SUSE Linux Enterprise / openSUSE Leap
sudo zypper install php8 php8-mysql php8-mbstring php8-openssl php8-tokenizer
# PostgreSQLを使用する場合は php8-mysql の代わりに php8-pgsql を指定
# Debian
sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-tokenizer
# PostgreSQLを使用する場合は php8.2-mysql の代わりに php8.2-pgsql を指定git clone https://github.com/presire/moch-bbs.git
cd moch-bbsscripts/init-db-mysql.sh(MariaDB/MySQL用)または scripts/init-db-pgsql.sh(PostgreSQL用)を使用してデータベースとユーザを作成します。
# MariaDB/MySQL
bash scripts/init-db-mysql.sh
# PostgreSQL
bash scripts/init-db-pgsql.sh対話形式で以下を順に入力します。
- データベース名 — 空Enterでデフォルト値
moch_bbsを使用 - データベースユーザ名 — 空Enterでデフォルト値
mochを使用 - データベースユーザのパスワード — 必須(空は不可)
- 接続元ホスト — 空Enterでデフォルト値
localhostを使用 - MariaDB/MySQL の root パスワード — DB管理者のパスワード(unix_socket認証なら空Enter)
- 確認 — 設定内容を確認して
yで実行
=========================================
Moch BBS - データベース初期化
=========================================
環境変数で事前指定も可能です:
MOCH_DB_NAME / MOCH_DB_USER / MOCH_DB_PASS / MOCH_DB_HOST
データベース名 [moch_bbs]: my_board
データベースユーザ名 [moch]:
データベースユーザのパスワード(必須): ****
接続元ホスト [localhost]:
MariaDB/MySQL の root パスワード(なければ空Enter):
以下の設定でデータベースを作成します:
データベース名: my_board
ユーザ名: moch
接続元ホスト: localhost
続行しますか? (y/N): y
環境変数を設定すると、該当項目の対話入力がスキップされます。
自動化スクリプト や CI/CD環境で便利です。
| 環境変数 | デフォルト値 | 説明 |
|---|---|---|
MOCH_DB_NAME |
moch_bbs |
データベース名 |
MOCH_DB_USER |
moch |
データベースユーザ名 |
MOCH_DB_PASS |
(なし・必須) | データベースパスワード |
MOCH_DB_HOST |
localhost |
接続元ホスト |
# すべて環境変数で指定する例
MOCH_DB_NAME='my_board' \
MOCH_DB_USER='moch' \
MOCH_DB_PASS='YourSecurePassword123' \
bash scripts/init-db-mysql.sh # PostgreSQLの場合: init-db-pgsql.shCREATE DATABASE IF NOT EXISTS `moch_bbs`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'moch'@'localhost'
IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON `moch_bbs`.* TO 'moch'@'localhost';
FLUSH PRIVILEGES;注意: MariaDB/MySQL用スクリプトは root 権限(または
CREATE USER/GRANT権限を持つユーザ)、PostgreSQL用スクリプトは postgres ユーザー権限(またはCREATEDB/CREATEROLE権限)で実行する必要があります。
scripts/setup.sh を使用して、LaravelとReactの初期セットアップを行います。
bash scripts/setup.shbash scripts/setup.sh --dev| 項目 | 本番モード | 開発モード(--dev) |
|---|---|---|
| Composer | --no-dev --optimize-autoloader |
開発依存を含む |
| キャッシュ | config/route/view を最適化 | キャッシュをクリア |
| React | npm run build(本番ビルド) |
ビルドスキップ |
どちらのモードでも以下は共通で実行されます。
-
前提条件チェック
- PHP 8.2+、Composer、Node.js、npmの存在確認
- PHPバージョン・拡張の確認
-
Laravel セットアップ
- Composer パッケージインストール
.env.example→.envのコピー(既存の場合はスキップ)APP_KEYの自動生成storage/ディレクトリの作成と権限設定(threads/,kako/含む)storage:linkの実行
-
React セットアップ
npm ci(パッケージインストール)
setup.sh により backend/.env が生成されます。
データベース接続情報を、手順.2で設定した値に合わせて編集してください。
vi backend/.env# アプリケーション設定
APP_NAME="Moch BBS"
APP_ENV=production
APP_DEBUG=false
APP_TIMEZONE=Asia/Tokyo
APP_URL=https://your-domain.com
# データベース設定(init-db-mysql.sh / init-db-pgsql.sh で設定した値に合わせる)
# MariaDB: DB_CONNECTION=mariadb / DB_PORT=3306
# MySQL: DB_CONNECTION=mysql / DB_PORT=3306
# PostgreSQL: DB_CONNECTION=pgsql / DB_PORT=5432
DB_CONNECTION=mariadb
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=moch_bbs
DB_USERNAME=moch
DB_PASSWORD=YourSecurePassword123
# キャッシュ(ファイルキャッシュを使用、Redis は不要)
CACHE_STORE=file重要:
APP_DEBUG=falseを本番環境で必ず確認してください。trueのままだとエラー詳細が外部に公開されます。
cd backend
php artisan migrateすべてのテーブルが作成されます。
| テーブル | 用途 |
|---|---|
users |
管理者ユーザ |
categories |
掲示板カテゴリ |
bbs_boards |
掲示板(板) |
bbs_settings |
板ごとの設定 |
threads |
スレッド |
thread_attributes |
スレッド属性 |
ng_words |
NGワード |
access_rules |
アクセス制御 |
cap_groups |
キャップグループ |
caps |
キャップ |
ninja_passes |
忍者パス |
plugins |
プラグイン |
system_settings |
システム設定 |
bbs_notifications |
通知 |
sessions |
セッション |
cache / cache_locks |
キャッシュ |
jobs / job_batches / failed_jobs |
ジョブキュー |
php artisan db:seed以下の初期データが作成されます。
- システム設定(サイト名、デフォルト値など)
- サンプルカテゴリ
- サンプル掲示板
php artisan admin:create対話形式でメールアドレス、ユーザ名、パスワードを入力します。
詳細は、Admin-Account-Setup.md を参照してください。
ソースコード取得
│
▼
scripts/init-db-mysql.sh ← DB・ユーザ作成(MariaDB/MySQL)
scripts/init-db-pgsql.sh ← DB・ユーザ作成(PostgreSQL)
│
▼
scripts/setup.sh ← Composer, npm, .env, ストレージ準備
scripts/setup.sh --dev ← (開発環境の場合)
│
▼
.env を編集 ← DB接続情報を設定
│
▼
php artisan migrate ← テーブル作成
│
▼
php artisan db:seed ← 初期データ投入
│
▼
php artisan admin:create ← 管理者アカウント作成
│
▼
Nginx設定 ← Webサーバ設定
│
▼
crontab設定 ← schedule:run + notifications:cleanup
│
▼
運用開始
開発モードでセットアップした場合、以下のコマンドで開発サーバを起動します。
# ターミナル 1: Laravel API サーバ(:8000)
cd backend
php artisan serve
# ターミナル 2: React 開発サーバ(:5173)
cd frontend
npm run devまたは Laravel の全サービス同時起動:
cd backend
composer run dev # serve + queue + pail + npm devserver {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL証明書(Let's Encrypt 等)
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# Laravel API(バックエンド)
root /path/to/moch-bbs/backend/public;
index index.php;
# Reactビルド成果物(フロントエンド)
location / {
root /path/to/moch-bbs/frontend/dist;
try_files $uri $uri/ /index.html;
}
# APIリクエストをLaravelへ
location /api {
try_files $uri $uri/ /index.php?$query_string;
}
# 管理画面ログイン
location /admin {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP-FPM
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
# セキュリティ: .env や .git へのアクセスを拒否
location ~ /\. {
deny all;
}
}Moch BBSでは、Laravelスケジューラを使って定期実行タスクを管理します。 crontabに 1行追加するだけ で、すべてのスケジュールタスクが有効になります。
# crontab を編集
crontab -e以下の1行を追加:
* * * * * cd /path/to/backend && php artisan schedule:run >> /dev/null 2>&1/path/to/backend はサーバ上の backend/ ディレクトリの絶対パスに置き換えてください。
# 例
* * * * * cd /var/www/moch/backend && php artisan schedule:run >> /dev/null 2>&1* * * * * cd /var/www/moch/backend && php artisan schedule:run >> /var/log/moch-schedule.log 2>&1* * * * * docker compose -f /path/to/docker-compose.yml exec -T app php artisan schedule:run >> /dev/null 2>&1schedule:run により、以下のタスクが自動的に実行されます。
| コマンド | 実行頻度 | 説明 |
|---|---|---|
bbs:collect-active-users |
10分ごと | アクティブユーザ数を集計してキャッシュに保存 |
bbs:auto-archive |
毎時(0分) | 停止後24時間経過 or SUBMAX超過のスレッドを過去ログへ自動移動 |
sannan:rotate-nin-id |
プラグイン設定による | 忍法帖 nin_id のローテーション(デフォルト: 月次) |
機能を使っていない場合でも、スケジューラを設定して問題ありません。 各タスクは対象データがなければ0件処理で終了するため、副作用はありません。
sannan:rotate-nin-idはプラグインが無効の場合、自動的にスキップされます。
| コマンド | 機能無効時の動作 |
|---|---|
bbs:collect-active-users |
0人として集計するのみ(常に実行) |
bbs:auto-archive |
対象スレッドがなければ0件で終了(常に実行) |
sannan:rotate-nin-id |
プラグイン無効 or ローテーション無効の場合スキップ |
1. アクティブユーザ集計(bbs:collect-active-users)
掲示板ごとのアクティブユーザ数を集計し、ファイルキャッシュに保存します。 管理画面ダッシュボードや掲示板一覧での表示に使用されます。
2. 自動アーカイブ(bbs:auto-archive)
以下の2条件でスレッドを過去ログへ自動移動します。
- 上限レスに到達して停止後、24時間が経過したスレッド
- 掲示板のアクティブスレッド数がSUBMAX(デフォルト: 500)を超過した場合、古い順にアーカイブ
nopool 属性が設定されたスレッドは対象外です。
詳細は Auto-Archive-Setup.md を参照してください。
3. nin_idローテーション(sannan:rotate-nin-id)
忍法帖プラグイン(Sannan)のnin_id(忍者ID)を定期的にリセットします。 管理画面のプラグイン設定で実行間隔を変更できます。
| 設定値 | 実行タイミング |
|---|---|
weekly |
毎週月曜 午前3時 |
biweekly |
毎月1日・15日 午前3時 |
monthly(デフォルト) |
毎月1日 午前3時 |
quarterly |
1月・4月・7月・10月の1日 午前3時 |
詳細は Plugin-Sannan.md を参照してください。
以下のコマンドはスケジューラに登録されていないため、必要に応じて個別にcrontabへ追加してください。
| コマンド | 推奨頻度 | 説明 |
|---|---|---|
notifications:cleanup |
毎日1回 | 有効期限切れの通知をデータベースから削除(期限切れがなければ0件で終了) |
# 通知クリーンアップ(毎日午前4時に実行)
0 4 * * * cd /var/www/moch/backend && php artisan notifications:cleanup >> /dev/null 2>&1設定しなくても通知の表示には影響しませんが、期限切れデータが蓄積されるため定期実行を推奨します。 詳細は NotificationManagement.md を参照してください。
# crontab の登録確認
crontab -l
# Laravelスケジューラに登録されたタスク一覧
cd /path/to/backend
php artisan schedule:list出力例:
* * * * * php artisan bbs:collect-active-users .... Every ten minutes
0 * * * * php artisan bbs:auto-archive ........... Every hour
0 3 1 * * php artisan sannan:rotate-nin-id ....... Based on config
# === Moch BBS ===
# Laravelスケジューラ(全タスクを一元管理)
* * * * * cd /var/www/moch/backend && php artisan schedule:run >> /dev/null 2>&1
# 通知クリーンアップ(スケジューラ外)
0 4 * * * cd /var/www/moch/backend && php artisan notifications:cleanup >> /dev/null 2>&1エラー: MySQL/MariaDB に接続できません
- MariaDB/MySQL が起動しているか確認:
systemctl status mariadb(PostgreSQLの場合:systemctl status postgresql) - root パスワードが正しいか確認
unix_socket認証の場合はsudo bash scripts/init-db-mysql.shで実行- PostgreSQLで peer 認証の場合は
sudo bash scripts/init-db-pgsql.shで実行
警告: PHP拡張 'pdo_mysql' が見つかりません
該当のPHP拡張をインストールしてください。
MariaDB/MySQL を使用する場合は pdo_mysql、PostgreSQL を使用する場合は pdo_pgsql が必要です。
SQLSTATE[HY000] [2002] Connection refused
.envのDB_CONNECTION、DB_HOST、DB_PORT、DB_USERNAME、DB_PASSWORDが正しいか確認init-db-mysql.sh/init-db-pgsql.shで指定した値と一致しているか確認- MariaDB/MySQL/PostgreSQL が起動しているか確認
# 権限を再設定
cd backend
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache # Nginxの実行ユーザに合わせる