Обзор — что охватывает раздел
Помимо консоли, находящейся за входом в систему, у InfraGuard есть публичная часть.
| Путь | Экран | Доступ |
|---|---|---|
/ |
маркетинговая посадочная страница | гости (аутентифицированная сессия перенаправляется на /console) |
/demo |
форма заявки на демо | гости |
/manual |
руководство пользователя | как гости, так и вошедшие пользователи |
/login · /lang/{locale} |
вход · переключение языка | гости |
Главная страница консоли находится по адресу /console. Этот перенос отдал / публичной части, не сломав ни имя маршрута (overview), ни существующие закладки.
Посадочная страница собирается отдельным бандлом (front.*). Если поместить её в бандл консоли, каждый посетитель будет скачивать Vue, ECharts, CodeMirror, Konva и xterm (по замерам: около 1,283KB у консоли против 24KB у публичной части). Для маркетинговой страницы первое впечатление и есть скорость загрузки. В
_shared-uiвынесен только минимальный общий интерфейс (кнопки-иконки, переключатель языка), чтобы обе стороны использовали одно и то же определение: при копировании одна из сторон со временем разошлась бы с другой.
Публичное руководство
/manual открывается без входа в систему. Тот, кто оценивает продукт, должен иметь возможность прочитать, как он на самом деле эксплуатируется, а публичная документация сама по себе является маркетинговым и SEO-активом. В документах нет ни секретов, ни живых данных.
- Один URL, две оболочки — гости получают публичную оболочку (шапка, подвал, переключатель языка), вошедшие пользователи — оболочку консоли, и обе выводят одно и то же содержимое. Представление и модуль страницы общие, поэтому разойтись они не могут.
- Гостям дополнительно отдаётся только отдельный подбандл руководства (
manual.*); бандл консоли им не отдаётся никогда. - Статьи о функциях с повышенными правами помечаются как заблокированные, а не скрываются. Гости считаются уровнем 1.
- Точки входа — призыв к действию [Руководство пользователя] в первом экране посадочной страницы и верхняя навигация.
Заявки на демо
Публичная форма (/demo)
Это приём заявок, а не демо в один клик. Обязательны только имя и рабочий адрес электронной почты; язык, источник перехода и IP записываются рядом.
Эта форма — единственный путь записи для гостей во всём приложении, поэтому она защищена четырьмя способами.
- Ловушка (honeypot) — если она заполнена, ничего не сохраняется, но ответ по-прежнему выглядит как успех (никогда не сообщайте об обнаружении).
throttle:8,1— девятый запрос в течение минуты получает 429.- CSRF-токен.
- Серверная проверка по белому списку —
statusиnoteдоступны только администраторам, поэтому публичная форма не может их задать.
Экран администрирования (Администрирование ▸ Заявки на демо)
/admin/demo-requests управляет входящими: CRUD в модальном окне, а также поиск, фильтры по статусу со счётчиками и постраничная навигация.
| Статус | Значение |
|---|---|
new |
получена, не обработана |
contacted |
связались |
qualified |
квалифицированная возможность |
closed |
завершена |
- Меняйте статус прямо в строке либо оставляйте внутреннюю заметку в модальном окне.
- Контекст приёма (IP, язык, источник, отметка времени) показывается только для чтения.
- Счётчики статусов считают всю таблицу независимо от активного фильтра — «сколько осталось необработанных» не должно исчезать из-за того, что применён фильтр.
Поиск экранирует подстановочные знаки LIKE (
%,_,\). Без этого ввод одного лишь%совпал бы с каждой строкой.
Теги аналитики (GA4 · GTM · Search Console)
Укажите идентификатор счётчика в .env, и тег появится только в публичной части. Когда значение пусто, <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-адреса, псевдонимы инстансов и заголовки инцидентов. Отправка этого в стороннюю аналитическую систему противоречит обещанию самостоятельного размещения и суверенитета данных, которое даёт сама посадочная страница, и раскрывает сведения об инфраструктуре клиента.
- Идентификаторы выводятся только после проверки формата (
G-…/GTM-…). Опечатка или значение с лишними кавычками приводит к состоянию «аналитики нет», а не к сломанному тегу. GA_PRODUCTION_ONLYпо умолчанию равенtrue— локальный и тестовый трафик, загрязнивший ресурс, потом уже не вычистить, и это самая частая причина, по которой цифрам GA4 перестают доверять.- Конверсия срабатывает на странице успеха, а не при отправке. Срабатывание при отправке засчитывает как конверсии и ошибки проверки, и попадания в ловушку, завышая показатель.
- Призывы к действию разделены по расположению (
hero,header,footer_cta,footer_nav,hero_manual), чтобы можно было оценить вклад каждого. - Если
gtagотсутствует, JS полностью бездействует — неудачная загрузка аналитики никогда не блокирует интерфейс.
GA4 не даёт поисковых запросов. Он сообщает канал (органический поиск) и на этом останавливается; сами запросы есть только в Search Console. Именно поэтому meta-тег подтверждения прав выводится независимо от GA4 — подтвердить права можно, вообще не включая GA4. Об отчётах по каждому сайту см. Аналитика посетителей и поиска.
Политика текстов
Цифры доверия на посадочной странице используют только то, что можно посчитать в коде, и они считаются во время отрисовки, а не прописаны вручную (число наборов правил, число проверок, число почтовых/SMS-адаптеров и так далее).
Эта политика выявила настоящую ошибку — проверок было 36, а не 37. И наоборот, наблюдаемые значения не используются никогда: число различных сигнатур составляет 43 за 24h, 67 за 7d и 79 за всё время, поэтому оно менялось бы от визита к визиту и подрывало бы доверие, а не укрепляло его. Поскольку страница публичная, она также никогда не обращается к БД — запрос на каждый визит не нужен, а маркетинговая часть должна пережить шатающуюся базу данных.
Источники данных
| Объект | Расположение | Роль |
|---|---|---|
infr_demo_request |
по умолчанию (000770) | входящие заявки на демо (status, note, locale, source, ip) |
config/analytics.php ← .env |
config | единый источник истины для идентификаторов счётчиков и их включения (App\Support\Analytics) |
public/brand/ |
статические файлы | логотип и изображения OG |
public/brand/обязательно должен быть в репозитории. Большая частьpublic/— сгенерированный вывод (build,hot,storageвнесены в gitignore), поэтому это легко упустить, но фирменные материалы не являются выводом Vite: их ничто не собирает, и без коммита логотип и OG-изображение в продакшене отдают 404. Изображение OG должно быть в формате PNG: многие поисковые роботы социальных сетей не отрисовывают предпросмотр в SVG.
Права доступа
- Посадочная страница, форма демо, руководство: публично.
- Администрирование ▸ Заявки на демо: уровень ≥ 10 (собственная проверка), при этом каждое изменение записывается в
infr_audit_log.
Устранение неполадок · Вопросы и ответы
/постоянно отправляет меня в консоль — так и задумано: аутентифицированная сессия перенаправляется на/console. Выйдите из системы или откройте приватное окно, чтобы увидеть посадочную страницу.- Тег так и не появляется — идентификатор пуст, не прошёл проверку формата, либо задано
GA_PRODUCTION_ONLY=true, хотя это не продакшен. Найдите в исходном коде страницыgoogletagmanager.com, чтобы это подтвердить. - GA4 ничего не собирает — проверьте, что идентификатор счётчика на сайте относится к тому ресурсу, который вы собираетесь смотреть (Администратор GA4 ▸ Потоки данных). Если данные попадают в другой ресурс, отчёты будут вечно показывать ноль.
- Заявка на демо не сохранилась — срабатывание ловушки возвращает успех без сохранения (так и задумано). Проверьте также ошибки проверки и ограничение в 8 запросов в минуту (429).
- В переключателе восемь языков, но переведены только ko/en — остальные откатываются на английский. Реальный спрос на непереведённые языки наблюдается через параметр аналитики
language. - 500 сразу после свежего развёртывания — nginx нужно настроить так, чтобы он дожидался завершения сборки Vite. Поскольку публичная посадочная страница — это
/, иначе поисковые роботы и потенциальные клиенты получат 500 в качестве первого впечатления.
См. также
- Аналитика посетителей и поиска — чтение собранных данных по каждому сайту
- Сервисы ▸ Веб — мониторинг зарегистрированных сайтов
- Язык и локализация — переключение языка и пакеты переводов
- Администрирование ▸ Журнал аудита — история обработки заявок на демо
