Files
ros_control/docs/changes/001-initial-implementation/summary.md
T

32 lines
3.0 KiB
Markdown
Raw Normal View History

# Итоги: 001 — первая версия ros_control
## Сделано
- Control Server на FastAPI: JSON API `/api/v1` (Bearer-токен) и WEB UI (Jinja2 + HTMX, вход по логину/паролю).
- Local Metadata DB (SQLite): устройства с зашифрованными (Fernet) паролями, кэш статуса, бэкапы, задачи.
- RouterOS REST-клиент: статус (модель, канал, ROS, FW, uptime), бэкап, смена канала, обновление ROS и FW.
- Бэкап: `.backup` (без шифрования) + `.rsc` → устройство само загружает в S3 по presigned PUT → файлы удаляются с устройства.
- S3 (Yandex Object Storage): список, скачивание (presigned GET), удаление.
- Долгие и групповые операции через таблицу `jobs` с ограничением параллелизма (`MAX_CONCURRENCY`).
- Docker Compose, `venv` для разработки, README, 4 автотеста.
## Проверено
- `pytest`: 4 теста (шифрование, разбор статуса, порядок шагов бэкапа с моками RouterOS/S3, авторизация API и отсутствие пароля в ответах) — пройдены.
- Дымовой прогон сервера: редирект на логин, вход, добавление недоступного устройства (offline + причина), задача бэкапа завершается `failed` с понятной ошибкой, страница бэкапов открывается.
## НЕ проверено (нужно устройство и бакет)
- Реальная работа с RouterOS 7 и Yandex Object Storage. Главный риск — `/tool/fetch` с `http-method=put upload=yes` на целевой версии ROS.
- Обновления ROS/FW (поведение при обрыве соединения на перезагрузке реализовано по документации).
- Сборка и запуск Docker-образа не выполнялись.
## Отклонения от плана
- Администратор UI берётся из переменных окружения (`ADMIN_USER`/`ADMIN_PASSWORD`), таблицы `users` нет — достаточно для одного администратора.
- Кнопки в строке устройства и групповые кнопки используют `hx-include` вместо общей формы (иначе значения каналов разных устройств смешивались).
## Ограничения
- Только RouterOS 7.x. Один администратор. HTMX-скрипт лежит локально (`app/ui/static`), внешние CDN не нужны.
- Долгие задачи выполняются внутри процесса сервера; при перезапуске незавершённые помечаются `failed`.