Backend (FastAPI, SQLAlchemy 2, Alembic, PostgreSQL 16): - организации, VRF, префиксы (дерево, использование, автоназначение), адреса, операторы связи, устройства и типы устройств; JWT, роли admin/viewer; - VRF принадлежит организации (составной FK), смена VRF у префикса переносит поддерево, имя VRF уникально в организации; - журнал аудита: поиск и фильтры, ротация (срок/количество), очистка по паролю с блокировкой, IP клиента и метаданные запроса (X-Forwarded-For только от TRUSTED_PROXIES). UI (web/, без сборки): экраны и диалоги по макетам «IPAM Manager», кликабельные строки реестров, локальные шрифты IBM Plex, собственные выпадающие списки. Окружение: docker-compose (postgres + app), миграции Alembic 0001-0004, scripts/gen_env.py, scripts/seed_demo.py, 11 автотестов (pytest). Документация: README.md и docs/changes/001-005 (планы и итоги). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.9 KiB
3.9 KiB
Суммаризация: журнал — поиск, ротация, очистка, UI (изменение 003)
Сделано
- БД (миграция 0003):
audit_log+uid(UUID) иmessage(бэкфилл существующих записей), индекс(entity_type, action); таблицыapp_settings(настройки ротации, по умолчанию 90 дней / 100 000 записей) иclear_attempts(неудачные попытки очистки). Проверено:upgrade → check (без дрейфа) → downgrade → upgrade. - API:
GET /auditс поиском и фильтрами (текст/ID, тип события, сущность, актор, период UTC, «Показать ещё»),/audit/summary,/audit/facets,/audit/{uid};GET|PUT /journal/settings;POST /journal/clear(пароль, 5 попыток / блокировка 10 минут). - Ротация:
app/rotation.py— по сроку и по количеству; фоновая задача раз в час и сразу при сохранении настроек; PG advisory lock; сводная записьjournal.rotated(итог после ротации не превышает лимит). Экранирование спецсимволов LIKE в поиске. - События: добавлены
session.login/session.failed,journal.settings_updated/rotated/cleared; у каждой записи человекочитаемое сообщение. - UI: экран «Журнал» по макету Journal (строка «N записей · старейшая … · ротация …», фильтры Тип/Актор/Сущность/период/поиск, таблица, «Показать ещё 100»), окно записи (ID с копированием, данные JSON), окно «Настройки журнала», окно «Очистить журнал» (кнопка неактивна без пароля, счётчик попыток, блокировка). Настройки и очистка видны только admin.
Проверка
- 9 автотестов (3 новых: поиск и фильтры; ротация по сроку и по количеству; очистка — неверный пароль и блокировка на временном пользователе) — 9 passed (дважды подряд).
- Сценарий UI в браузере: фильтры, поиск, период, окно записи, копирование, настройки, ротация до 50 записей, неверный пароль → счётчик → блокировка,
успешная очистка (остаётся одна запись
journal.cleared), ошибок JS нет. Успешная очистка проверена на пересозданной БД; после проверки БД снова заполнена демо-данными. - Сверка с макетами Journal / JournalEntry / JournalSettings / JournalClear (они нарисованы для ROS Manager): сетка, размеры, цвета, состояния совпадают; отличия — предметные: колонка «Сущность» вместо «Устройство», типы событий IPAM.
Допущения и ограничения
- Запись
journal.rotatedсоздаётся только если что-то удалено. - Формат поля даты (
input type=date) зависит от локали браузера (в макете — ISO). - Записи
auth.failedотдельно не ограничиваются; рост от подбора паролей сдерживает ротация. - Экспорт журнала и управление пользователями не входят.