Глобально уникальные ID (docs/changes/016):
- у устройств, групп, задач, резервных копий и записей журнала ID вида
<префикс>_<uuid7> (dev_, grp_, job_, bkp_, evt_): типы не пересекаются,
внутри типа ID не повторяются и сортируются по времени;
- миграция БД v1 заменяет числовые ID с пересчётом ссылок (копия файла БД
перед миграцией, сверка числа строк, одна транзакция);
- резервная копия = пара файлов с одним bkp_ ID, файлы в S3 получают
метаданные backup-id/device-id; синхронизация метаданных с бакетом;
- журнал событий в БД (events): создание/изменение/удаление, задачи, бэкапы,
смена online/offline, вход в UI; API чтения GET /api/v1/events.
Журнал в UI, ротация и очистка (docs/changes/017):
- страница «Журнал»: фильтры, подгрузка «Показать ещё», окно записи;
- настройки ротации (срок и максимум записей) хранятся в БД (схема v2),
ротация при старте, раз в час и после сохранения настроек;
- очистка журнала только через окно с паролем пользователя, блокировка
после 5 неверных попыток, остаётся запись о факте очистки; через API
очистки нет.
Тесты: 20 из 20.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Имя входит в ключи бэкапов в S3 (backups/<имя>/…), поэтому после создания
не меняется (docs/changes/015):
- API: PATCH с другим именем → 400 «Имя устройства нельзя изменить»,
то же имя допустимо;
- UI: в окне изменения поле имени только для чтения, форма изменения
присланное имя игнорирует;
- вёрстка: минимальная ширина таблиц устройств и файлов — в узком окне
колонка с именем не схлопывается, включается горизонтальная прокрутка.
Тесты: 12 из 12.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Групповое удаление бэкапов (docs/changes/013):
- страница «Резервные копии»: чекбоксы, «выбрать все», панель «Выбрано: N /
Удалить / Снять выбор» вместо фильтров, подтверждение, итог удаления;
- backups.delete_many: все ключи проверяются до удаления, удаление параллельное;
UI POST /backups/delete-many, API POST /api/v1/backups/delete;
- выбор строк в app.js обобщён (data-select) для устройств и бэкапов.
Поддержка CHR (docs/changes/014):
- у CHR нет /system/routerboard (HTTP 400): устройство больше не считается
недоступным, версия FW не показывается, обновление FW пропускается;
- «есть обновление ROS» определяется строгим сравнением версий (на канале
long-term последняя версия может быть старше установленной);
- в таблице указана причина недоступности: авторизация / ошибка ответа /
нет соединения.
Тесты: 11 из 11.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Control Server (FastAPI) с WEB UI (Jinja2 + HTMX) и JSON API для группового
администрирования устройств RouterOS 7 через REST.
- Устройства: список, статус (модель, канал, версии ROS/FW, uptime, доступные
обновления), примечания, пароли шифруются (Fernet); фоновый опрос каждые 30 с
и быстрое обнаружение недоступности (таймаут соединения 4 с).
- Группы устройств и фильтры (устройства, резервные копии).
- Резервные копии: .backup и .rsc (show-sensitive) создаются через REST,
скачиваются сервером и загружаются в S3 (Yandex Object Storage).
- Обновление ROS/FW и выбор канала, групповые операции задачами.
- Интерфейс по утверждённому макету: светлая/тёмная темы, окна, шрифты IBM Plex
локально. Docker Compose, SQLite в томе, минимальный набор тестов.
- Планы и итоги каждого изменения — в docs/changes/.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>