トップ / インストール方法

インストール方法

このページでできること

  • クヌギスキーマ(PHP + SQLite)をご自身のサーバへ最短で立ち上げる手順を確認できます。
  • 必須の Basic 認証設定、cron 設定、メール送信の動作確認までを把握できます。

1. 動作要件

項目要件
PHP8.1 以上(拡張: pdo_sqlite, mbstring, json, curl, dom, libxml, openssl
Web サーバApache 2.4+ + mod_rewrite(推奨)/Nginx 可(.htaccess 相当を別途記述)
SQLitePHP に同梱されているバージョンで可(WAL モードを利用します)
外部到達性クロール対象 URL(自社サイト)への HTTPS アウトバウンド/パスワード再発行メールを送るための SMTP 出口
SSL/TLSHTTPS 推奨(クロール対象が HTTPS のため、自身も HTTPS 配下で運用すると証明書まわりの挙動が揃いやすい)
PHP メモリ制限memory_limit = 256M 程度を推奨。HTML 解析(DOMDocument)で一時的にメモリを使います。
PHP 実行時間cron 用 CLI / 手動クロール画面とも、内部で set_time_limit(0) を呼んで無制限化します。ただしサーバ側で強制上限がある場合はそれに従います。
動作確認済み環境 本ツールの動作確認は エックスサーバー(Xserver)の PHP 8.3.30 で実施しています。Xserver の標準構成(Apache + mod_rewrite、SQLite 同梱)でそのまま動作します。
その他の環境(さくらのレンタルサーバ、ConoHa WING、自前 VPS など)でも、上記の要件を満たしていれば動作するはずですが、現時点では未検証です。

2. ファイル配置

  1. kunugi_schema_Ver1.zip をダウンロードします。
  2. 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/ を作成し、その中に展開。

  3. 展開後のディレクトリ構成(抜粋)。以降のドキュメント中の 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.dbWeb サーバから読み書き可初回起動時に自動作成されます。手動で空ファイルを置く必要はありません
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
  1. 適当な場所(例: /etc/apache2/htpasswd/kunugi_schema)に htpasswd ファイルを作成。
    htpasswd -c /etc/apache2/htpasswd/kunugi_schema your_user
  2. .htaccessAuthUserFile をそのファイルパスに書き換える。
  3. ブラウザで配置先 URL(例: https://<サーバ>/)を開き、Basic 認証ダイアログが出るかを確認。
  4. パスワード入力後にクヌギスキーマのログイン画面(auth/login.php)に進めることを確認。
なぜ Basic 認証が必要か クヌギスキーマ は SQLite DB に 登録ユーザーのパスワードハッシュパスワード再発行トークンクロール対象 URL の一覧を保持します。DB ファイル本体は同梱の .htaccess により HTTP からの直接ダウンロードは拒否していますが、それだけではアプリ側のログイン画面・各種フォームが不特定多数からアクセスできる状態になり、以下のリスクが残ります。
  • ログイン画面に対するパスワードの総当たり攻撃(ブルートフォース)を、Web サーバ手前で遮断できない。
  • 各種フォーム(プロダクト作成・URL 登録・クロール実行)に直接アクセスされ、未知のアプリ側脆弱性を突かれるリスクが残る。
  • パスワード再発行画面が、URL を知っているだけで開ける状態になる。
Basic 認証を入れて「Web サーバの段階で認証を通っていない人にはログイン画面すら見せない」二重の防御を作ってください。

5. 初回ブラウザアクセスと初期管理者の登録

  1. 配置先 URL(例: https://<サーバ>/)にアクセス → Basic 認証 → クヌギスキーマのログイン画面。
  2. まだユーザーが 1 件も登録されていない場合、ログイン画面は自動的に「初期セットアップ」モードに切り替わります(タイトル表示が「ログイン」から「初期セットアップ」に変わります)。
  3. メールアドレス」と「パスワード(8 文字以上)」を入力 → 「管理者を作成してログイン」を押下。
  4. 登録されたアカウントは自動的に「システム管理者(admin)」になります。以後はそのメールアドレス+パスワードで auth/login.php(配置先 URL からの相対)でログインしてください。
初期管理者のメールアドレスについて パスワード再発行メールは「初期セットアップで登録したメールアドレス」宛に送られます。必ず受信できるアドレスを指定してください。任意のローカル文字列(例: admin@example.local)でも作成自体はできてしまいますが、その場合はパスワード再発行が機能しません。

6. プロダクトと URL の登録

  1. ログイン後、上部メニュー右上の「プロダクト」セレクトには何もない状態です。先に 「プロダクト管理」 を開き、プロダクトを 1 件以上作成してください(自社サービス単位 / コーポレートサイトとプロダクト LP を分けるなど、任意の単位で OK)。
  2. 作成したプロダクトを上部の「プロダクト」セレクトで選択。以降のすべての画面で「現在のプロダクト」として扱われます(ページ遷移しても維持されます)。
  3. (任意)メタ情報の事前登録 で WebSite 期待値・パンくずセレクターを設定。
  4. (任意)構造化マークアップ検出設定 で提案・照合対象の種別を調整。
  5. URLの追加・修正・削除 に進み、解析したい URL を 1 行に 1 件ずつ入力 → 「URL を追加」。http(s):// は省略可(自動で https:// を付与)。
  6. 同じ URL を複数回追加しても、プロダクト内では重複排除されます。

7. 初回クロールと結果確認

  1. 「手動でクロール実行」 を開く。
  2. 「登録 URL の状況」カードで、本日 (JST) 時点での「全件 / 当日クロール済み / 当日未クロール」の件数を確認。
  3. 「クロール間隔(秒)」を入力(既定 5 秒・最低 1 秒以上を推奨)。必要なら「1 回のクロール件数の上限」で先頭 N 件だけに絞ることもできます。
  4. 本日未クロールの URL のみクロール」(推奨)・「全 URL を再クロール」・または一覧から URL を選んだ「選択した URL を再クロール」のいずれかを押下。
  5. 通常は pages/run_stream.php 経由のSSE ストリーミングで進捗バーが更新されます。接続が切れた場合は run_status.php をポーリングして完了を追跡します。
  6. 1 件ずつ取得 → 構造化マークアップの解析 → DB 保存を繰り返します。完了すると Run 単位の成功 / 失敗一覧が表示されます。結果一覧 から詳細を確認できます。
クロールが長時間に渡る場合 URL 件数 × クロール間隔(秒)でおおよその実行時間が決まります。URL が多い場合は1 回の上限を控えめにし、以降は cron 自動実行(1 時間に 1 回起動)に任せる運用を推奨します。当日中にまだ取得していない URL だけが対象になるため、上限件数を超えた分は次回の cron で自然に消化されます。

8. メール送信の確認(パスワード再発行用)

パスワードを忘れたユーザーは、auth/forgot_password.php でメールアドレスを入力 → 登録済みであればワンタイムリンクがメールで送られます。事前に以下を確認してください。

  1. サーバから外部 SMTP に到達できること。Xserver など共用レンタルサーバでは mail() 関数が標準で利用可能です。
  2. 送信元アドレス(From)はサーバ既定値が使われます。独自にしたい場合は src/Mailer.php 内の From: 設定箇所を編集してください。
  3. テストとして、ログイン画面の「パスワードをお忘れの方はこちら」から登録済みアドレスを入力 → 数分以内にメールが届くか確認。
  4. 届かない場合は、サーバの 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

エックスサーバー(Xserver)での Cron 設定例

本ツールの動作確認環境(Xserver / PHP 8.3.30)での具体的な手順です。GUI から登録できるので、crontab -e を直接編集する必要はありません。

  1. Xserver サーバーパネル にログイン。
  2. 「アカウント」セクションの 「Cron 設定」 をクリック。
  3. 初回のみ、上部の「Cron 結果の通知アドレス」にエラー通知用メールアドレスを設定して保存(推奨)。
  4. Cron 追加」タブを開き、以下のとおり入力(1 時間に 1 回叩く設定)。
    入力例
    0(毎時 0 分に実行)
    *(毎時、24 時間ぶん)
    日 / 月 / 曜日すべて *(毎日)
    コマンド下のコード参照
  5. 「確認画面へ進む」→「追加する」で登録完了。
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/ の親パスを実際の配置先に合わせて差し替えてください。

Xserver 特有の注意
  • 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 ページで本文が文字化けして検出される PageFetcherContent-Type の charset → <meta charset>mb_detect_encoding の順で判定します。HTML 側に <meta charset> を明示すると精度が大きく上がります。
cron が動かない / 実行されない 絶対パスで php を呼んでいるか/cron ユーザに配置ディレクトリ配下の data/ への書き込み権限があるか/data/cron.log にエラーが出ていないか確認。
パスワード再発行メールが届かない サーバから外部メール送信ができていない可能性。error_log に「mail() failed」が出ていないか、Gmail 等の迷惑メールフォルダに振り分けられていないかを確認。届かない場合はシステム管理者が アカウント管理 から直接パスワード再設定可能。
次に進む 動作確認ができたら、アカウント管理 で複数のロール(システム管理者/プロダクト管理者)を発行し、Google リッチリザルト対応 の判定ロジックや、マークアップ × ページ内容の一致確認 の仕組みを確認してください。