Skip to content

Latest commit

 

History

History
552 lines (407 loc) · 16.9 KB

File metadata and controls

552 lines (407 loc) · 16.9 KB

Moch BBS セットアップガイド

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 最新安定版 ソース取得用

必須 PHP 拡張

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 を指定

セットアップ手順

1. ソースコードの取得

git clone https://github.com/presire/moch-bbs.git
cd moch-bbs

2. データベースの作成

scripts/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

対話形式で以下を順に入力します。

  1. データベース名 — 空Enterでデフォルト値 moch_bbs を使用
  2. データベースユーザ名 — 空Enterでデフォルト値 moch を使用
  3. データベースユーザのパスワード — 必須(空は不可)
  4. 接続元ホスト — 空Enterでデフォルト値 localhost を使用
  5. MariaDB/MySQL の root パスワード — DB管理者のパスワード(unix_socket認証なら空Enter)
  6. 確認 — 設定内容を確認して 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.sh

スクリプトが実行する SQL

CREATE 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 権限)で実行する必要があります。

3. アプリケーションのセットアップ

scripts/setup.sh を使用して、LaravelとReactの初期セットアップを行います。

本番環境(デフォルト)

bash scripts/setup.sh

開発環境

bash scripts/setup.sh --dev

本番モードと開発モードの違い

項目 本番モード 開発モード(--dev
Composer --no-dev --optimize-autoloader 開発依存を含む
キャッシュ config/route/view を最適化 キャッシュをクリア
React npm run build(本番ビルド) ビルドスキップ

どちらのモードでも以下は共通で実行されます。

  1. 前提条件チェック

    • PHP 8.2+、Composer、Node.js、npmの存在確認
    • PHPバージョン・拡張の確認
  2. Laravel セットアップ

    • Composer パッケージインストール
    • .env.example.env のコピー(既存の場合はスキップ)
    • APP_KEY の自動生成
    • storage/ ディレクトリの作成と権限設定(threads/, kako/ 含む)
    • storage:link の実行
  3. React セットアップ

    • npm ci(パッケージインストール)

4. .env の設定

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 のままだとエラー詳細が外部に公開されます。

5. マイグレーションの実行

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 ジョブキュー

6. 初期データの投入

php artisan db:seed

以下の初期データが作成されます。

  • システム設定(サイト名、デフォルト値など)
  • サンプルカテゴリ
  • サンプル掲示板

7. 管理者アカウントの作成

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 dev

Nginx設定例

server {
    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;
    }
}

cronジョブの設定

Moch BBSでは、Laravelスケジューラを使って定期実行タスクを管理します。 crontabに 1行追加するだけ で、すべてのスケジュールタスクが有効になります。

crontabの設定

# 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環境の場合

* * * * * docker compose -f /path/to/docker-compose.yml exec -T app php artisan schedule:run >> /dev/null 2>&1

スケジューラに登録済みのタスク一覧

schedule: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

推奨crontab(完全版)

# === 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

トラブルシューティング

init-db-mysql.sh / init-db-pgsql.sh で接続エラーが出る

エラー: 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 で実行

setup.sh で PHP 拡張の警告が出る

警告: PHP拡張 'pdo_mysql' が見つかりません

該当のPHP拡張をインストールしてください。 MariaDB/MySQL を使用する場合は pdo_mysql、PostgreSQL を使用する場合は pdo_pgsql が必要です。

マイグレーションで接続エラーが出る

SQLSTATE[HY000] [2002] Connection refused
  • .envDB_CONNECTIONDB_HOSTDB_PORTDB_USERNAMEDB_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の実行ユーザに合わせる