概要 — 何を扱うか
ログインの背後にあるコンソールとは別に、InfraGuard には 公開面 があります。
| パス | 画面 | アクセス |
|---|---|---|
/ |
マーケティング用ランディング | ゲスト(認証済みセッションは /console へリダイレクト) |
/demo |
デモ申請フォーム | ゲスト |
/manual |
ユーザーマニュアル | ゲストもログインユーザーも同様に |
/login · /lang/{locale} |
ログイン · 言語切り替え | ゲスト |
コンソールのホームは /console にあります。この移動によって、ルート名(overview)も既存のブックマークも壊さずに / を公開面へ明け渡しました。
ランディングは独立したバンドル(front.*)としてビルドされます。 コンソールのバンドルに載せると、訪問者全員が Vue・ECharts・CodeMirror・Konva・xterm をダウンロードすることになります(実測: コンソール約 1,283KB に対しフロント 24KB)。マーケティングページにとって、第一印象 そのもの が読み込み速度です。共有が必要な最小限の UI(アイコンボタン、言語スイッチャー)だけを
_shared-uiに置き、両者が 同じ定義 を使うようにしています — コピー&ペーストにすると片方だけが直されて食い違います。
公開マニュアル
/manual は ログインなしで 開きます。製品を評価している人が実際の運用方法を読めるべきですし、公開ドキュメントそのものがマーケティングと SEO の資産です。ドキュメントには秘密情報もライブデータも含まれません。
- 1つの URL に2つのシェル — ゲストには公開シェル(ヘッダー、フッター、言語スイッチャー)、ログインユーザーにはコンソールシェルが表示され、どちらも同じ本文をレンダリングします。ビューとページモジュールは共有なので、両者が食い違うことはありません。
- ゲストにはさらに マニュアル専用のサブバンドル(
manual.*)だけが配信されます。コンソールのバンドルが配信されることはありません。 - 上位権限が必要な機能の記事は 隠すのではなくロック済みとしてバッジ表示 されます。ゲストはレベル1として扱われます。
- 入口は、ランディングのヒーローにある [ユーザーマニュアル] CTA と、上部ナビゲーションです。
デモ申請
公開フォーム(/demo)
これはワンクリックデモではなく、申請の受付です。必須は氏名と業務用メールアドレスだけで、ロケール・流入元・IP が併せて記録されます。
このフォームは アプリケーション内で唯一のゲスト書き込み経路 であるため、4重に防御されています。
- ハニーポット — 入力されていた場合は何も保存しませんが、レスポンスは 成功 のように見せます(検知したことを決して知らせません)。
throttle:8,1— 1分間で9件目のリクエストは 429 になります。- CSRF トークン。
- ホワイトリスト方式のサーバー検証 —
statusとnoteは管理者専用なので、公開フォームからは設定できません。
管理画面(管理 ▸ デモ申請)
/admin/demo-requests が受信箱として動きます。モーダルによる CRUD に加えて、検索、件数付きのステータスフィルター、ページネーションがあります。
| ステータス | 意味 |
|---|---|
new |
受付済み・未対応 |
contacted |
連絡済み |
qualified |
有望案件と判断 |
closed |
完了 |
- 行の上で直接ステータスを変更するか、モーダルで内部向けの メモ を残します。
- 受付時のコンテキスト(IP、ロケール、流入元、日時)は 読み取り専用 で表示されます。
- ステータスのファセットは 有効なフィルターに関係なくテーブル全体を数えます — 「未対応が何件あるか」がフィルターを掛けたせいで消えてはいけません。
検索は LIKE のワイルドカードをエスケープ します(
%、_、\)。これがないと%を1文字入力しただけで全行に一致してしまいます。
アナリティクスタグ(GA4 · GTM · Search Console)
.env に測定 ID を入れると、タグは 公開面にだけ 現れます。値が空のときは <script> 自体がレンダリングされないため、既定のデプロイでは外部へのリクエストがゼロ です。
| キー | 値 | 用途 |
|---|---|---|
GA_MEASUREMENT_ID |
G-XXXXXXXXXX |
gtag.js(GA4) |
GTM_CONTAINER_ID |
GTM-XXXXXXX |
Google Tag Manager(併用可) |
GOOGLE_SITE_VERIFICATION |
meta トークン | Search Console の所有権確認 |
GA_PRODUCTION_ONLY |
true(既定) |
本番環境でのみ発火 |
これらをコンソール(
layouts/app)に追加しては絶対にいけません。 コンソールの URL とタイトルには、ホスト名・IP・インスタンスの別名・インシデントのタイトルが含まれます。それらをサードパーティのアナリティクスプロパティへ送ることは、ランディングページ自身が掲げるセルフホスティングとデータ主権の約束に反し、顧客のインフラ情報を漏らします。
- ID は形式検証を通ったときだけ出力されます(
G-…/GTM-…)。タイプミスや引用符が紛れ込んだ値は、壊れたタグではなく 「アナリティクスなし」 に縮退します。 GA_PRODUCTION_ONLYの既定値はtrueです — ローカルやステージングのトラフィックがプロパティを汚染すると、後から取り除けません。GA4 の数値が信用されなくなる最も多い原因です。- コンバージョンは送信時ではなく完了ページで発火します。 送信時に発火させると、検証エラーやハニーポットへの引っかかりもコンバージョンとして数え、数値が水増しされます。
- CTA は位置ごとに分けられており(
hero、header、footer_cta、footer_nav、hero_manual)、貢献度を切り分けられます。 gtagが存在しない場合、JS は完全に no-op です — アナリティクスの読み込み失敗が UI を止めることはありません。
GA4 は検索キーワードを教えてくれません。 チャネル(オーガニック検索)までを報告してそこで止まり、クエリは Search Console にしかありません。だからこそ所有権確認の meta タグは GA4 とは独立して 出力されます — GA4 をまったく有効にしなくても所有権を確認できます。サイトごとのレポートについては 訪問者・検索インサイト を参照してください。
コピーの方針
ランディングに載せる信頼の数値は コードで数えられるものだけ を使い、ハードコードせず レンダリング時に数えます(ルールセット数、点検項目数、メール/SMS アダプター数など)。
この方針は実際の誤りを1件見つけました — 点検項目は 37 ではなく 36 でした。逆に 観測値は決して使いません: シグネチャの種類数は24時間で 43、7日で 67、全体で 79 となり、訪問のたびに変わって信頼を築くどころか損ないます。公開ページである以上 DB にも触れません — 訪問ごとのクエリは不要ですし、マーケティング面はデータベースが揺らいでも生き残るべきです。
データソース
| 対象 | 場所 | 役割 |
|---|---|---|
infr_demo_request |
default(000770) | デモ申請の受信箱(status、note、locale、source、ip) |
config/analytics.php ← .env |
config | 測定 ID とゲーティングの SOT(App\Support\Analytics) |
public/brand/ |
静的ファイル | ロゴと OG 画像 |
public/brand/は必ずコミットしてください。public/の大半は生成物であり(build、hot、storageは gitignore 済み)見落としやすいのですが、ブランド素材は Vite の出力ではありません — 誰もビルドしないため、コミットしないと本番でロゴと OG 画像が 404 になります。OG 画像は PNG でなければなりません: 多くの SNS クローラーは SVG のプレビューをレンダリングしません。
アクセス権限
- ランディング、デモフォーム、マニュアル: 公開。
- 管理 ▸ デモ申請: レベル10以上(自己ゲーティング)。すべての変更は
infr_audit_logに記録されます。
トラブルシューティング · FAQ
/がいつもコンソールに飛ばされる — 正しい動作です。認証済みセッションは/consoleにリダイレクトされます。ログアウトするか、プライベートウィンドウでランディングを確認してください。- タグがまったく現れない — ID が空か、形式検証に失敗しているか、本番環境でないのに
GA_PRODUCTION_ONLY=trueになっています。ページのソースをgoogletagmanager.comで検索して確認してください。 - GA4 が何も収集しない — サイトに入れた測定 ID が、読みたい プロパティ のものかを確認してください(GA4 の管理 ▸ データストリーム)。別のプロパティにデータが入っていると、レポートは永遠にゼロのままです。
- デモ申請が保存されていない — ハニーポットに引っかかった場合は 保存せずに成功を返します(意図した動作)。検証エラーと、1分あたり8件の上限(429)も確認してください。
- スイッチャーには8言語あるのに ko/en しか翻訳されていない — 残りは英語にフォールバックします。未翻訳ロケールの実際の需要は、アナリティクスの
languageパラメーターで観測します。 - 新規デプロイ直後に 500 になる — Vite のビルド完了を待つように nginx を配線する必要があります。公開ランディングが
/である以上、そうしないとクローラーや見込み客が第一印象として 500 に出会うことになります。
関連項目
- 訪問者・検索インサイト — サイトごとに収集したデータを読む
- サービス ▸ Web — 登録済みウェブサイトの監視
- 言語とローカライズ — 言語切り替えと翻訳パック
- 管理 ▸ 監査ログ — デモ申請対応の履歴
