feat(logs): добавить раздел логов с историей и живым потоком
Docker images / prepare-release (push) Successful in 9s
Docker images / backend-test (push) Successful in 4m35s
Docker images / frontend-image (push) Successful in 3m29s
Docker images / updater-image (push) Successful in 41s
Docker images / netflow-agent-image (push) Successful in 34s
Docker images / backend-image (push) Successful in 1m44s
Docker images / publish-release (push) Successful in 10s
Docker images / notify-webhook (push) Successful in 2s

This commit is contained in:
Denozordec committed 2026-10-16 22:13:48 +07:00
1 parent e461dc21bd
commit 5efd0339fb
37 files changed
+1399 -7

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
# Логи MikroTik
Раздел `/logs` использует общую панель выбора серверов, как `/filters` и `/firewall`.
История хранится в PostgreSQL; live читает уже сохранённые события через SSE.
## Включение
При следующем запуске backend автоматически применяется миграция `0014_router_logs.sql`.
В «Сбор данных → Логи MikroTik» администратор включает сбор. По умолчанию он выключен,
фоновый интервал — 10 секунд, хранение — 14 дней. Настройки требуют `mm:settings:admin`;
журнал, контекст, статистика и экспорт — `mm:servers:read` (также write/admin этой секции).
При открытом live выбранный включённый MikroTik опрашивается раз в 2 секунды.
Вкладки разделяют опрос; одновременно опрашиваются не более четырёх устройств.
Целевая задержка при штатной нагрузке — до 5 секунд. Ошибки сети вызывают backoff до минуты.
«Все серверы», выключенные и удалённые устройства доступны в режиме истории.
Коллектор читает только buffer=memory и не меняет правила RouterOS. После очистки,
перезагрузки или переполнения буфера возможны пропуски. Потеря пересечения снимков
помечается как возможный разрыв без выдуманного числа пропущенных событий. Время без
явного часового пояса не интерпретируется как UTC: журнал использует отмеченное время
получения и сохраняет исходную строку RouterOS.
События удаляются пакетами по времени получения. Очистка продолжает работать и при
выключенном сборщике. Дедупликация хранит SHA-256 отпечатки, а не копии сообщений.
Удаление устройства не удаляет его историю; повторно открыть её можно по ссылке
`/logs?server=<id>` или через общий журнал. Новые таблицы входят в полный `pg_dump`.
Планировщик и фоновые задачи ожидаются, а SSE закрываются перед обслуживанием БД.
Перед закрытием поток получает `reset`: интерфейс предлагает заново загрузить историю
после обслуживания, чтобы не продолжать старый курсор поверх восстановленной БД.
## Интерфейс и ReUI PRO
Сохранены компоненты и стиль проекта base-nova. Исходники блоков получены из
лицензионного реестра ReUI и адаптированы под RouterOS; демонстрационные данные,
изменения инфраструктуры и workflow review из блоков не используются.
- Основа таблицы, toolbar и графика: [Infra Audit Log](https://reui.io/blocks/solutions/dev-ops/solution-dev-ops-2), [превью](https://reui.io/preview/base/solution-dev-ops-2).
- Панель записи, исходные поля и контекст: [Audit Event Detail](https://reui.io/blocks/application/sheet/sheet-14), [превью](https://reui.io/preview/base/sheet-14).
- [Data Grid API](https://reui.io/docs/components/base/data-grid), [превью](https://reui.io/components/data-grid).
- [Filters API](https://reui.io/docs/components/base/filters), [превью](https://reui.io/components/filters).
- [Frame API](https://reui.io/docs/components/base/frame), [превью](https://reui.io/components/frame).
- [Badge API](https://reui.io/docs/components/base/badge), [превью](https://reui.io/components/badge).
Фильтры между полями соединяются AND, значения уровня/topics — OR. Поиск сообщения
регистронезависимый, буквальный. «Ошибки входа» — явно обозначенный текстовый шаблон.
Представления хранятся локально с привязкой к пользователю и backend. Экспорт CSV/JSON
применяет те же фильтры; выборки свыше 50 000 записей отклоняются с предложением сузить
период. Формулы spreadsheet в CSV нейтрализуются.
При прокрутке и открытии записи обновление видимой таблицы приостанавливается, но
сбор продолжается. Буфер отображения ограничен 5 000 строками; более ранние записи
доступны через период/экспорт. Смена сервера/источника/фильтров отменяет старые запросы.
## Проверки
- `npm --prefix backend run build` — contracts и backend.
- `npm --prefix backend run test:logs` — дедупликация, нормализация, фильтры, CSV, JWT/RBAC и REST-совместимость терминала.
- `npm --prefix backend run test:logs:pg` — интеграция с PostgreSQL и локальным HTTP-стендом RouterOS; используется отдельная случайная схема, которая удаляется после проверки.
- Для нагрузочной SQL-проверки установить `LOGS_PERFORMANCE=1` перед `test:logs:pg`: миллион событий, курсорная история и агрегация.
- `npm run test:logs` — Playwright: выбор серверов, детали, URL/поиск, экспорт, live-пауза, устаревшие ответы, 5 000 строк, mobile/desktop, светлая/тёмная темы.
Браузерный профиль использует Webpack и отдельный каталог `tmp/next-logs-test`, чтобы
не конфликтовать с кэшем запущенного dev-сервера. SQL-профиль требует доступного
`DATABASE_URL` и права создать временную схему; при недоступной БД завершится ошибкой,
а не выдаст пропуск за успешную проверку.