Обзор — назначение
Верхняя навигация InfraGuard построена как информационная архитектура (ИА) с приоритетом роли: сначала она ветвится по роли (рабочей области), а затем разворачивается в рабочие процессы внутри каждой области. Три принципа:
- Меню управляется базой данных, а не задано в коде. Каждый узел меню читается из таблицы
infr_sitemap(принадлежит приложению, независима). В Blade ничего не «зашито». - Граница роли = граница прав. Значение
min_reqкаждого узла (минимальныйuser_level) и есть линия контроля доступа. Узел показывается только приuser_level >= min_req, и то же правило принудительно применяется на стороне сервера для маршрута (эшелонированная защита). - Подписи всегда проходят через ключи перевода. Экранный текст разрешается через
__()/Locales::menuLabel()для всех 8 языков.
Метрики (CPU, load, пятиминутные окна, …) не являются пунктами меню верхнего уровня — они живут как вкладки сущностей и фильтры внутри каждого экрана. Разделение отвечает на вопрос «кто (какая роль) что делает», а не «какая метрика».
В InfraGuard «домен» означает только веб-TLD (
aaa.bbb.com). Разделение работы по зоне ответственности называется «роль / область». 8 пунктов меню верхнего уровня — это и есть те самые ролевые области.
Когда применять
- При первом входе — чтобы понять, где что находится.
- Чтобы разобраться, почему экран отсутствует (недостаточный уровень или откат языка).
- Когда нужно добавить или перестроить меню и заново выполнить сидер (админ/разработчик).
- Чтобы проверить, что доступно пользователям другого уровня.
Компоновка
Меню располагается горизонтально в верхней панели (infr-topbar). Слева направо:
| Зона | Содержимое |
|---|---|
| Бренд | Логотип InfraGuard (щит + пульс мониторинга) → переход к Обзору (/) |
| Меню ролей | infr-nav — 8 ролевых областей, при наведении раскрывается панель подпунктов |
| Действия справа | переключатель мобильного меню · переключатель языка · переключатель темы · меню пользователя |
Каждый пункт верхнего уровня отрисовывается как значок MDI + подпись + (если есть дочерние узлы) шеврон; дочерние узлы появляются в выпадающей панели (infr-nav__panel). Когда текущий путь совпадает с href дочернего узла, пункт верхнего уровня получает класс is-active (Обзор активен только при пути ровно /).
8 ролевых областей
Это дерево верхнего уровня, которое строит SitemapSeeder. При входе в область к <body> применяется body_class, ограничивая область действия стилей страницы.
| # | Ролевая область | Ответственный | 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 |
| Веб | /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 · ИИ-адаптеры /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) разные пороги. super_admin ровно с уровнем 9 видит Разработку, но не Администрирование. Администратор (10) видит и то и другое.
Добавление и перестройка меню (админ/разработчик)
Интерфейса для редактирования меню пока нет. Источник истины для дерева — код (database/seeders/SitemapSeeder.php), и при каждом запуске сидер удаляет все строки и создаёт их заново (каноническая пересинхронизация).
# После правки дерева выполните пересинхронизацию (затрагивает только infr_sitemap — унаследованные данные в безопасности)
php artisan db:seed --class=SitemapSeeder
В конце сидер вызывает Menu::flush(), поэтому изменения вступают в силу немедленно. Если новый пункт показывает исходное (английское) имя, значит для него нет ключа перевода — добавьте его в resources/lang/{ko,en}/menu.php по правилу Str::slug(name, '_') (например, Storage & RAID → storage_raid).
Никогда не запускайте
migrate:fresh. InfraGuard использует общее подключение с унаследованной MySQL от stats-design. Чтобы обновить только меню, применяйте исключительно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" (ru)
Сессия и промежуточные слои
InfrAuth— при аутентификации синхронизируетusers.user_level→ сессиюinfr_user_level. Это вход для фильтра меню.InfrLevel(infr.level:N) — шлюз маршрута. Возвращает 403, еслиinfr_user_level < N(принудительная проверка на сервере, отдельная от скрытия в меню).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; управление ролями и командами — в Роли и команды.
Диагностика и частые вопросы
Пункт меню отсутствует.
Обычно причина — недостаточный уровень. Убедитесь, что ваш user_level ≥ значения min_req этого узла (см. таблицы выше). Администраторы меняют уровни в разделе Пользователи и команды.
Только что добавленный пункт меню отображается английским (исходным) именем.
В пакете menu.php нет ключа перевода. Добавьте его и в resources/lang/ko/menu.php, и в en/menu.php по правилу Str::slug(name,'_'). Без ключа экран всё равно безопасно работает с исходным именем.
Я запустил сидер, но меню не изменилось.
Возможно, кеш устарел. В конце сидер вызывает Menu::flush(), но можно также выполнить php artisan cache:clear. Если Redis остановлен, Menu на каждый запрос откатывается к build(), поэтому кеширование не может быть причиной.
Я переключил язык, но не изменились только подписи меню.
Подписи разрешаются во время отрисовки и не кешируются. Проверьте, есть ли нужный ключ в menu.php целевого языка. Если нет, посмотрите состояние активации и перевода на странице Локализация.
Может ли кто-то попасть на скрытый экран, введя URL вручную?
Нет. Даже когда меню скрыто, промежуточный слой маршрута (infr.level:N и т. п.) возвращает 403 на стороне сервера.
Связанные материалы
- Уровни RBAC — как вычисляются
user_levelиmin_req - Роли и команды — роли, команды и владельцы
- Локализация — переключение языка и откат
- Тема — токены светлой и тёмной темы
- Пользователи и команды (администрирование) — изменение уровней
- Обзор (главная) — домашний экран сводного состояния

