概要 — 何をする画面か
InfraGuard のトップナビゲーションは 役割優先の情報アーキテクチャ(IA) です。まず 役割(業務領域)で分岐 し、その領域の 内側で 業務フローへ展開します。原則は3つあります。
- メニューはハードコードではなく DB 駆動です。 すべてのメニューノードは
infr_sitemapテーブル(アプリが独自に所有)から読み込まれます。Blade に埋め込まれたものはありません。 - 役割境界=権限境界。 各ノードの
min_req(最小user_level)が そのまま アクセス制御の線になります。ノードはuser_level >= min_reqのときだけ表示され、同じ規則がルート側のサーバーサイドでも強制されます(多層防御)。 - ラベルは常に翻訳キーを経由します。 画面上のテキストは
__()/Locales::menuLabel()によって8言語すべてで解決されます。
指標(CPU、ロード、5分窓 …)は トップレベルのメニュー項目ではありません — 各画面の中でエンティティタブやフィルターとして存在します。分割の軸は「どの指標か」ではなく「誰(どの役割)が何をするか」です。
InfraGuard において 「ドメイン」は Web の TLD のみ を指します(
aaa.bbb.com)。担当範囲で分けた業務区分は 「役割 / 領域」 と呼びます。8つのトップレベルメニュー項目は、まさにその役割領域です。
使う場面
- 初回ログイン時に、どこに何があるか を把握する。
- 画面が表示されない理由 を切り分ける(レベル不足か、言語フォールバックか)。
- メニューを 追加・再構成 してシーダーを再実行する必要があるとき(管理者・開発者)。
- 別のレベルのユーザーに 何が見えているか を確認する。
画面構成
メニューはトップバー(infr-topbar)に横並びで配置されます。左から右へ:
| 領域 | 内容 |
|---|---|
| ブランド | InfraGuard ロゴ(シールド+監視パルス)→ クリックで概要(/)へ |
| 役割メニュー | infr-nav — 8つの役割領域。ホバーでサブ項目パネルが開く |
| 右側アクション | モバイルメニュー切替 · 言語スイッチャー · テーマ切替 · ユーザーメニュー |
各トップレベル項目は MDI アイコン+ラベル+(子を持つ場合)シェブロンとして描画され、子項目はドロップダウンパネル(infr-nav__panel)に表示されます。現在のパスが子の href と一致すると、トップレベル項目に is-active が付きます(概要はパスがちょうど / のときだけアクティブになります)。
8つの役割領域
SitemapSeeder が構築するトップレベルのツリーです。body_class は領域に入るときに <body> へ適用され、ページのスタイルをスコープします。
| # | 役割領域 | 担当 | body_class |
最小 user_level |
|---|---|---|---|---|
| 1 | 概要 | 共通 | infr-overview |
1 |
| 2 | インフラ | インフラ運用 | infr-infra |
1 |
| 3 | サービス | サービス運用 | infr-service |
1 |
| 4 | セキュリティ | セキュリティ運用 | infr-security |
2 |
| 5 | バックアップ・復旧 | インフラ(兼任) | infr-backup |
2 |
| 6 | 資産 | 共通参照(CMDB) | infr-asset |
1 |
| 7 | 管理 | 管理者 | infr-admin |
10 |
| 8 | 開発 | super_admin | infr-dev |
9 |
領域ごとのサブ項目
各サブ項目は自身の min_req を持ちます(通常は親と同じですが、引き上げられている場合もあります)。
インフラ(min_req 1)
| 項目 | パス | min_req |
|---|---|---|
| ヘルス | /infra/health |
1 |
| サーバー | /infra/servers |
1 |
| ストレージ・RAID | /infra/storage |
1 |
| ポート接続 | /infra/traffic/ports |
1 |
| IP接続 | /infra/traffic/ips |
1 |
| トラフィック | /infra/traffic/net |
1 |
| 警報 | /infra/alert |
1 |
サービス(min_req 1)
| 項目 | パス | min_req |
|---|---|---|
| 概要 | /service |
1 |
| Web | /service/web |
1 |
| データベース | /service/database |
1 |
| セッション | /service/session |
1 |
| カタログ | /service/catalog |
1 |
| プロジェクト | /service/projects |
1 |
| 問題解決 | /service/resolution |
2 |
セキュリティ(min_req 2 — 全項目 2)
| 項目 | パス |
|---|---|
| 概要 | /security |
| 脅威 | /security/threats |
| 検知 | /security/detections |
| ルールセット | /security/rulesets |
| ファイアウォール | /security/firewall |
| ブロックリスト・評判 | /security/blocklist |
| ホワイトリスト | /security/whitelist |
| セキュリティ診断 | /security/diagnostics |
| 問題解決 | /security/resolution |
バックアップ・復旧(min_req 2): スケジュールボード /backup/board · バックアップスクリプト /backup/scripts · 保管庫 /backup/vaults · 復旧・検証 /backup/recovery。
資産(min_req 1): インベントリ /asset/inventory · インスタンス /asset/instances · ハードウェア /asset/hardware · ストレージ・ファイル /asset/storage。
管理(min_req 10 — 全項目 10): ユーザー・権限 /admin/users · コレクター /admin/collectors · 運用ポリシー /admin/ops-policy · APIキー /admin/api-keys · ルール・しきい値 /admin/rules · 評判API /admin/reputation-providers · AIアダプター /admin/ai-providers · メールアダプター /admin/mail-providers · SMSアダプター /admin/sms-providers · 多言語設定 /admin/localization · 監査 /admin/audit。
開発(min_req 9 — 全項目 9): Dev Overview /dev · Doctor /dev/doctor · Runtime & Leader /dev/leader · Slow Queries/Requests/Jobs/Outgoing · Exceptions · Cache · Servers · Usage · Pulse /pulse · Horizon /horizon。
使い方
メニューをたどる
トップレベル項目にホバーするとパネルが開きます。項目をクリックすると画面へ遷移し、その領域の body_class が <body> に適用されます。画面幅が狭いときは、右上のハンバーガー(data-nav-toggle)でメニューを展開します。
自分のレベルで見えるもの
ログイン時に InfrAuth ミドルウェアが users.user_level をセッションキー infr_user_level に同期します。描画時には Menu::for_user($level) がツリーをたどり、min_req > your level に当てはまるノードを 再帰的に隠します。例:
- レベル1(demo): 概要 · インフラ · サービス · 資産 は見えますが、セキュリティ(2)・バックアップ(2)・管理(10)・開発(9)は見えません。
- レベル5(staff): 上記に加えてセキュリティ · バックアップ・復旧(どちらも 2)。
- レベル10(admin): 管理(10)と開発(9)を含むすべて。
開発(9)と管理(10)はしきい値が異なります。ちょうどレベル9の super_admin は開発は見えますが管理は見えません。管理者(10)は両方見えます。
メニューの追加・再構成(管理者・開発者)
メニュー編集の UI はまだありません。ツリーの正本はコード(database/seeders/SitemapSeeder.php)であり、シーダーは実行のたびに 全行を削除して作り直します(正本の再同期)。
# ツリーを編集したら再同期します(infr_sitemap のみ変更 — レガシーデータは安全です)
php artisan db:seed --class=SitemapSeeder
シーダーは最後に Menu::flush() を呼ぶため、変更は即座に反映されます。新しい項目が生の(英語の)名前で表示される場合は、翻訳キーがありません。Str::slug(name, '_') の規則に従って resources/lang/{ko,en}/menu.php に追加してください(例: Storage & RAID → storage_raid)。
migrate:freshは絶対に実行しないでください。InfraGuard はレガシーの stats-design MySQL と接続を共有しています。メニューだけを更新するには、db:seed --class=SitemapSeederのみを使用してください。
データソース
infr_sitemap テーブル
アプリが独自に所有する独立したテーブルです(レガシーの接頭辞なし sitemap とは別物)。モデル: App\Models\Infr\InfrSitemap。
| カラム | 意味 |
|---|---|
parent_id |
0 = トップレベル、それ以外は親ノードの id |
seq |
兄弟間の並び順 |
depth |
0 = 役割領域、1 = サブ項目 |
name |
生の名前(ラベルキーの元) |
href |
リンク先パス(# = リンクしない親) |
icon |
MDI グリフ(例: mdi-server) |
body_class |
トップレベルのみ — 遷移時の <body> クラス |
is_view |
1 でツリーに含める |
min_req |
最小 user_level(権限境界) |
App\Support\Menu — ツリー構築+キャッシュ
Menu::tree()—is_view=1の行をseq,id順に読み、再帰的なツリーを組み立て、rememberForever(キーinfr:menu:v2)でキャッシュします。Redis が利用できない場合は、キャッシュなしのbuild()にフォールバックします。Menu::for_user($level)—min_req > $levelでツリーを再帰的に絞り込みます。Menu::flush()— キャッシュを無効化します(シーダーが呼び出します)。
キャッシュが保持するのは 生の
nameであり、翻訳は描画時にLocales::menuLabel()で行われます。したがって 言語を切り替えてもキャッシュのフラッシュは不要です。 逆に、ノードの追加や名称変更には再シード(フラッシュを伴う)が必要です。
ラベルの翻訳
App\Support\Locales::menuLabel($name) は menu. + Str::slug($name, '_') というキーを引きます。キーが存在すれば翻訳し、なければ生の名前を返します(安全なフォールバック)。パックは resources/lang/{locale}/menu.php にあります。
// 描画側(nav.blade.php)
{{ \App\Support\Locales::menuLabel($top['name']) }}
// "Storage & RAID" → __('menu.storage_raid') → "Storage & RAID" (en) / "ストレージ・RAID" (ja)
セッションとミドルウェア
InfrAuth— 認証時にusers.user_level→ セッションinfr_user_levelを同期します。これがメニューフィルターの入力になります。InfrLevel(infr.level:N) — ルートのゲートです。infr_user_level < Nなら 403 を返します(メニューの非表示とは別の、サーバーサイドでの強制)。InfrAdmin/InfrDev— 管理(10以上)と開発(9以上)のルートグループを保護します。
アクセス権限
レベル(user_level) |
別名 | メニューでの表示範囲 |
|---|---|---|
| 1 | demo/viewer | 概要 · インフラ · サービス · 資産(ほぼ閲覧のみ) |
| 5 | staff | + セキュリティ · バックアップ・復旧 |
| 9 | super_admin | + 開発 |
| 10 | admin | + 管理(および開発) |
- メニューの非表示は利便性と第一の防御線にすぎません。 実際の制御は、ルートごとの
infr.level:N/InfrAdmin/InfrDevミドルウェアによってサーバーサイドで強制されます(URL を直接入力しても 403 になります)。 - 破壊的・セキュリティ操作(ブロック、復元、ルール変更 …)は通常、各画面の内側で別の書き込みレベル(例: 書き込みは 2 以上、管理者は 10 以上)によって再度ゲートされ、監査ログに記録されます。
レベルの定義は RBAC レベル を、役割・チームの管理は 役割とチーム を参照してください。
トラブルシューティング・FAQ
メニュー項目が見当たりません。
たいていはレベル不足です。自分の user_level がそのノードの min_req 以上かを確認してください(上の表を参照)。管理者は ユーザーとチーム でレベルを調整します。
追加したばかりのメニュー項目が英語の(生の)名前で表示されます。
menu.php パックに翻訳キーがありません。Str::slug(name,'_') の規則に従って resources/lang/ko/menu.php と en/menu.php の両方に追加してください。キーがなくても、画面は生の名前のまま安全に動作します。
シーダーを実行したのにメニューが変わりません。
キャッシュが古い可能性があります。シーダーは最後に Menu::flush() を呼びますが、php artisan cache:clear を試すこともできます。Redis が停止している場合、Menu はリクエストごとに build() へフォールバックするため、キャッシュが原因ではありえません。
言語を切り替えたのに、メニューのラベルだけが変わりません。
ラベルは描画時に解決され、キャッシュされません。対象言語の menu.php にキーがあるか確認してください。なければ、多言語設定 ページで有効化・翻訳の状況を確認します。
隠れている画面に URL を直接入力して到達できますか?
いいえ。メニューが隠れていても、ルートのミドルウェア(infr.level:N など)がサーバーサイドで 403 を返します。
関連項目
- RBAC レベル —
user_levelとmin_reqの評価方法 - 役割とチーム — 役割・チーム・所有者
- 多言語設定 — 言語の切り替えとフォールバック
- テーマ — ライト/ダークのトークン
- ユーザーとチーム(管理) — レベルの調整
- 概要(ランディング) — 統合ヘルスのホーム画面

