インストール方法
このページでできること
- クヌギスキーマ(PHP + SQLite)をご自身のサーバへ最短で立ち上げる手順を確認できます。
- 必須の Basic 認証設定、cron 設定、メール送信の動作確認までを把握できます。
1. 動作要件
| 項目 | 要件 |
|---|---|
| PHP | 8.1 以上(拡張: pdo_sqlite, mbstring, json, curl, dom, libxml, openssl) |
| Web サーバ | Apache 2.4+ + mod_rewrite(推奨)/Nginx 可(.htaccess 相当を別途記述) |
| SQLite | PHP に同梱されているバージョンで可(WAL モードを利用します) |
| 外部到達性 | クロール対象 URL(自社サイト)への HTTPS アウトバウンド/パスワード再発行メールを送るための SMTP 出口 |
| SSL/TLS | HTTPS 推奨(クロール対象が HTTPS のため、自身も HTTPS 配下で運用すると証明書まわりの挙動が揃いやすい) |
| PHP メモリ制限 | memory_limit = 256M 程度を推奨。HTML 解析(DOMDocument)で一時的にメモリを使います。 |
| PHP 実行時間 | cron 用 CLI / 手動クロール画面とも、内部で set_time_limit(0) を呼んで無制限化します。ただしサーバ側で強制上限がある場合はそれに従います。 |
mod_rewrite、SQLite 同梱)でそのまま動作します。その他の環境(さくらのレンタルサーバ、ConoHa WING、自前 VPS など)でも、上記の要件を満たしていれば動作するはずですが、現時点では未検証です。
2. ファイル配置
kunugi_schema_Ver1.zipをダウンロードします。- ZIP を解凍すると下記のファイル群が直接展開されます(ZIP の中に
schema/のような上位ディレクトリは含まれていません)。
これらをまるごと、クヌギスキーマ を公開したいディレクトリへ配置してください。配置先のディレクトリ名は任意です。例 1(ドメイン直下に公開):
https://example.com/を起点にする場合 → ドキュメントルート(/var/www/example.com/public_html/など)に直接展開。例 2(サブディレクトリに公開):
https://example.com/schema/として公開する場合 →/var/www/example.com/public_html/schema/を作成し、その中に展開。 - 展開後のディレクトリ構成(抜粋)。以降のドキュメント中の
data/・src/・cron/などのパスは、すべてこの配置ディレクトリを起点とした相対パスとして表記しています。index.php ← ブラウザで開く起点(未ログイン時はログイン画面へ自動誘導) .htaccess ← Apache 用:書換え+直接アクセス禁止 LICENSE ← MIT 本文(再配布時、内容を別の場所に転記しても可) favicon.ico assets/ ← 静的アセット(CSS / JS / 画像) css/style.css img/kunugi-logo.gif auth/ ← ログイン・パスワード再発行・ログアウト login.php logout.php forgot_password.php reset_password.php pages/ ← 認証後の業務画面群 dashboard.php products.php urls.php run.php results.php errors.php schedule.php csv.php users.php src/ ← 内部 require 専用(.htaccess で HTTP 直接アクセス禁止) bootstrap.php / Auth.php / Database.php / Repository.php PageFetcher.php / HtmlParser.php StructuredDataExtractor.php / StructuredDataSuggester.php StructuredDataConsistencyChecker.php SchemaAnalyzer.php / Crawler.php / GoogleSchemaRegistry.php Mailer.php / PasswordReset.php / layout.php cron/ ← CLI で動かす自動実行スクリプト(.htaccess で run_cron.php HTTP 直接アクセス制限・トークン保護付き) data/ ← SQLite DB / ログ(書込み権限が必要・ .htaccess で HTTP 直接アクセス禁止) schema.db (初回起動時に自動生成)
3. ディレクトリ権限
SQLite DB を含む data/ 配下は Web サーバプロセス(Apache/Nginx)が読み書きできる必要があります。共用サーバなどでは 755 / 644 程度から始め、書き込めなければ 775 / 664 へ緩めてください。
下表のパスは、いずれもクヌギスキーマ を配置したディレクトリ直下の相対表記です。
| パス | 必要な権限 | 備考 |
|---|---|---|
data/ | Web サーバから読み書き可 | SQLite DB(schema.db + WAL/SHM)と cron ログを格納します |
data/schema.db | Web サーバから読み書き可 | 初回起動時に自動作成されます。手動で空ファイルを置く必要はありません |
cron/ | 読み取りのみ(PHP CLI から実行) | Web 経由実行を許可したい場合は data/cron_secret.txt を作成(後述) |
.htaccess(ルート)により、以下は HTTP からの直接アクセスを禁止しています。Nginx で運用する場合は同等のロケーション拒否設定を必ず追加してください。
- ディレクトリ全体を拒否:
src/(内部 require 専用)、data/(SQLite DB・ログ)。 - 条件付きで拒否:
cron/はディレクトリ単位で拒否しますが、cron/run_cron.phpだけは Web トリガー用に開放されます(トークン保護あり)。 data/およびcron/の各ディレクトリにも、独自にRequire all denied相当を書いた.htaccessを同梱しています。削除・改変しないでください。
4. Basic 認証の設定(必須級)
同梱の .htaccess には Basic 認証の記述は入っていません(環境ごとに htpasswd パスが異なるため)。配置先の .htaccess 末尾に以下のような記述を追記して、ご自身のサーバの htpasswd ファイル絶対パスへ書き換えて有効化してください。
AuthUserFile "/path/to/htpasswd/.htpasswd"
AuthName "Schema Checker"
AuthType BASIC
require valid-user
- 適当な場所(例:
/etc/apache2/htpasswd/kunugi_schema)にhtpasswdファイルを作成。htpasswd -c /etc/apache2/htpasswd/kunugi_schema your_user .htaccessのAuthUserFileをそのファイルパスに書き換える。- ブラウザで配置先 URL(例:
https://<サーバ>/)を開き、Basic 認証ダイアログが出るかを確認。 - パスワード入力後にクヌギスキーマのログイン画面(
auth/login.php)に進めることを確認。
.htaccess により HTTP からの直接ダウンロードは拒否していますが、それだけではアプリ側のログイン画面・各種フォームが不特定多数からアクセスできる状態になり、以下のリスクが残ります。
- ログイン画面に対するパスワードの総当たり攻撃(ブルートフォース)を、Web サーバ手前で遮断できない。
- 各種フォーム(プロダクト作成・URL 登録・クロール実行)に直接アクセスされ、未知のアプリ側脆弱性を突かれるリスクが残る。
- パスワード再発行画面が、URL を知っているだけで開ける状態になる。
5. 初回ブラウザアクセスと初期管理者の登録
- 配置先 URL(例:
https://<サーバ>/)にアクセス → Basic 認証 → クヌギスキーマのログイン画面。 - まだユーザーが 1 件も登録されていない場合、ログイン画面は自動的に「初期セットアップ」モードに切り替わります(タイトル表示が「ログイン」から「初期セットアップ」に変わります)。
- 「メールアドレス」と「パスワード(8 文字以上)」を入力 → 「管理者を作成してログイン」を押下。
- 登録されたアカウントは自動的に「システム管理者(admin)」になります。以後はそのメールアドレス+パスワードで
auth/login.php(配置先 URL からの相対)でログインしてください。
admin@example.local)でも作成自体はできてしまいますが、その場合はパスワード再発行が機能しません。
6. プロダクトと URL の登録
- ログイン後、上部メニュー右上の「プロダクト」セレクトには何もない状態です。先に 「プロダクト管理」 を開き、プロダクトを 1 件以上作成してください(自社サービス単位 / コーポレートサイトとプロダクト LP を分けるなど、任意の単位で OK)。
- 作成したプロダクトを上部の「プロダクト」セレクトで選択。以降のすべての画面で「現在のプロダクト」として扱われます(ページ遷移しても維持されます)。
- (任意)メタ情報の事前登録 で WebSite 期待値・パンくずセレクターを設定。
- (任意)構造化マークアップ検出設定 で提案・照合対象の種別を調整。
- URLの追加・修正・削除 に進み、解析したい URL を 1 行に 1 件ずつ入力 → 「URL を追加」。
http(s)://は省略可(自動でhttps://を付与)。 - 同じ URL を複数回追加しても、プロダクト内では重複排除されます。
7. 初回クロールと結果確認
- 「手動でクロール実行」 を開く。
- 「登録 URL の状況」カードで、本日 (JST) 時点での「全件 / 当日クロール済み / 当日未クロール」の件数を確認。
- 「クロール間隔(秒)」を入力(既定 5 秒・最低 1 秒以上を推奨)。必要なら「1 回のクロール件数の上限」で先頭 N 件だけに絞ることもできます。
- 「本日未クロールの URL のみクロール」(推奨)・「全 URL を再クロール」・または一覧から URL を選んだ「選択した URL を再クロール」のいずれかを押下。
- 通常は
pages/run_stream.php経由のSSE ストリーミングで進捗バーが更新されます。接続が切れた場合はrun_status.phpをポーリングして完了を追跡します。 - 1 件ずつ取得 → 構造化マークアップの解析 → DB 保存を繰り返します。完了すると Run 単位の成功 / 失敗一覧が表示されます。結果一覧 から詳細を確認できます。
8. メール送信の確認(パスワード再発行用)
パスワードを忘れたユーザーは、auth/forgot_password.php でメールアドレスを入力 → 登録済みであればワンタイムリンクがメールで送られます。事前に以下を確認してください。
- サーバから外部 SMTP に到達できること。Xserver など共用レンタルサーバでは
mail()関数が標準で利用可能です。 - 送信元アドレス(
From)はサーバ既定値が使われます。独自にしたい場合はsrc/Mailer.php内のFrom:設定箇所を編集してください。 - テストとして、ログイン画面の「パスワードをお忘れの方はこちら」から登録済みアドレスを入力 → 数分以内にメールが届くか確認。
- 届かない場合は、サーバの
mail.log(環境による)または PHP のerror_logを確認。SPF / DKIM が未設定だと Gmail でブロックされるケースがあります。
9. cron による自動クロールの設定
cron は1 時間に 1 回叩く前提で組まれています。毎回起動するたびに「本日が実行日に該当するプロダクトのうち、まだ当日クロールしていない URL」を上限件数まで処理する設計です。サーバの cron に以下を登録してください。
# crontab -e の例(毎時 0 分に実行 / 配置先が /var/www/example.com/public_html/ の場合)
0 * * * * /usr/bin/php /var/www/example.com/public_html/cron/run_cron.php >> /var/www/example.com/public_html/data/cron.log 2>&1
- 実際にクロールが走るかは、各プロダクトの 「Cron スケジュール」 で選んだ「実行日(毎月 1〜31 日)」と一致した場合のみです。
- 例: スケジュールを
[1, 15]にすると、毎月 1 日と 15 日の毎時 cron 起動ごとに、当日未クロールの URL が上限件数まで取得されます。 - 1 回の cron 実行で処理する URL の上限は 「Cron スケジュール」画面のグローバル設定で変更できます(既定 500 件、0 で無制限)。1 万 URL のような規模でも、毎時の起動に分散して取得できます。
- 同じ URL が同日中に二重に走らないよう、URL レベルで
crawl_resultsを見て「JST の本日付ですでに行があるか」をチェックしています(旧last_triggered_dateによる日次ロックは撤廃済み)。 - 標準では CLI からの実行を想定しています。Web 経由で叩きたい場合は、
data/cron_secret.txtに 1 行で任意の文字列(例:openssl rand -hex 32の出力)を保存し、URL?secret=<その文字列>を付けて呼び出してください。
エックスサーバー(Xserver)での Cron 設定例
本ツールの動作確認環境(Xserver / PHP 8.3.30)での具体的な手順です。GUI から登録できるので、crontab -e を直接編集する必要はありません。
- Xserver サーバーパネル にログイン。
- 「アカウント」セクションの 「Cron 設定」 をクリック。
- 初回のみ、上部の「Cron 結果の通知アドレス」にエラー通知用メールアドレスを設定して保存(推奨)。
- 「Cron 追加」タブを開き、以下のとおり入力(1 時間に 1 回叩く設定)。
欄 入力例 分 0(毎時 0 分に実行)時 *(毎時、24 時間ぶん)日 / 月 / 曜日 すべて *(毎日)コマンド 下のコード参照 - 「確認画面へ進む」→「追加する」で登録完了。
cd /home/<サーバーID>/<ドメイン>/public_html && /usr/bin/php8.3 /home/<サーバーID>/<ドメイン>/public_html/cron/run_cron.php >> /home/<サーバーID>/<ドメイン>/public_html/data/cron.log 2>&1
サブディレクトリ(例 /public_html/schema/)に配置している場合は、cd 先と /cron/・/data/ の親パスを実際の配置先に合わせて差し替えてください。
<サーバーID>は契約時に決まる ID(例xs132374)。<ドメイン>は配置先の独自ドメイン(例example.com)。- PHP のフルパスは
/usr/bin/php8.3(Xserver の PHP 8.3 系 CLI)。詳細はサーバーパネルの「サーバー情報 → コマンドパス一覧」で確認できます。 cdでスクリプトのあるディレクトリに移動してから実行することで、require __DIR__ . '/...'等の相対 require が確実に解決されます。- 結果メールが不要な場合は末尾を
> /dev/null 2>&1に変更してください。
- Cron 実行ユーザーには通常の FTP ユーザーと同等の権限があり、配置ディレクトリ配下の
data/への書き込みは問題ありません(パーミッション 705/755 で OK)。 - 同時実行数や 1 回あたりの最大実行時間に制限がかかる場合があります(共用サーバの仕様)。大量 URL を扱うときは Cron スケジュール の「1 回あたりの URL 上限」を控えめ(例: 300〜500 件)にし、毎時の起動に分散させてください。プロダクト数が多い場合は「実行日」を
1, 11, 21のようにずらすことで、各日の負荷をさらに分散できます。 cron/run_cron.phpはサーバの sapi が「cli」であることを判定しますが、Xserver の/usr/bin/php8.3は CLI モードなので問題ありません。
10. よくあるトラブルと対処法
| 症状 | 対処 |
|---|---|
初回アクセスで「data ディレクトリを作成できません」 |
配置ディレクトリ配下の data/ に Web サーバプロセスが書き込めるか確認。chown/chmod を見直してください。 |
| ログインしても画面が真っ白 | サーバの PHP エラーログを確認。display_errors=Off が一般的なので、エラーログを必ず参照。memory_limit 不足が典型例。 |
| クロール対象 URL が「HTTP 0」「タイムアウト」 | サーバから対象 URL に到達できていない可能性。DNS / SSL 証明書 / 対象側ファイアウォールを確認。curl https://<対象URL> をサーバから実行して切り分けてください。 |
| SJIS / EUC-JP ページで本文が文字化けして検出される | PageFetcher は Content-Type の charset → <meta charset> → mb_detect_encoding の順で判定します。HTML 側に <meta charset> を明示すると精度が大きく上がります。 |
| cron が動かない / 実行されない | 絶対パスで php を呼んでいるか/cron ユーザに配置ディレクトリ配下の data/ への書き込み権限があるか/data/cron.log にエラーが出ていないか確認。 |
| パスワード再発行メールが届かない | サーバから外部メール送信ができていない可能性。error_log に「mail() failed」が出ていないか、Gmail 等の迷惑メールフォルダに振り分けられていないかを確認。届かない場合はシステム管理者が アカウント管理 から直接パスワード再設定可能。 |