15 KiB
15 KiB
Ignis Core Roadmap
Этот roadmap собран по итогам полного обзора текущего состояния ignis-core.
Он нужен как рабочий план, а не как абстрактный wishlist.
Цели проекта
- Сделать сервер безопасным по умолчанию.
- Убрать ложные успехи и хрупкое поведение при работе с лампами и сетью.
- Привести API, UI и документацию к одному контракту.
- Подготовить кодовую базу к развитию без накопления хаоса.
- Довести продукт до состояния "можно спокойно жить в проде дома".
Текущее состояние в двух словах
- Бэкенд маленький и понятный, но уже накопил архитектурный долг.
- Основная логика работает на in-memory state и прямых вызовах драйвера.
- Безопасность и роли реализованы опасно и неполно.
- Фронтенд функциональный, но монолитный и плохо масштабируется.
- Тестовой, миграционной и операционной инфраструктуры почти нет.
P0: Критично исправить прежде всего
P0.1 Безопасность по умолчанию
Проблемы:
- При пустом
IGNIS_API_KEYсервер открывает полный доступ всем. - Любой
admin-ключ может управлять всеми гостевыми ключами. - Полные API-ключи возвращаются из списка ключей.
- Текущий ключ хранится в
localStorage. - UI зависит от внешних CDN, что плохо и для безопасности, и для офлайна.
Что сделать:
- Перевести авторизацию в
fail-closed. - Явно разделить роли
master,admin,guest. - Разрешить управление API-ключами только мастер-доступу.
- Перестать возвращать полные ключи из
GET /api-keys. - Возвращать полный токен только в момент создания.
- Продумать более безопасное хранение ключа в браузере.
- По возможности убрать CDN-зависимости или хотя бы сделать локальный fallback.
Критерий готовности:
- Сервер без мастер-ключа не выдаёт админ-доступ.
- Гостевой
adminне может создавать или отзывать другие ключи. - Повторный запрос списка ключей не раскрывает секреты.
P0.2 Надёжность команд и статусов
Проблемы:
- Таймауты WiZ дают
None, а код затем вызывает.get(...). - Групповое управление отвечает
ok, даже если отправка провалилась. - Логирование фиксирует действие без подтверждения результата.
- Ошибка одной лампы может сломать групповой status endpoint.
Что сделать:
- Нормализовать ответ драйвера: success, timeout, error, payload.
- Привести все control/status endpoints к одному формату ошибок.
- Возвращать частичный результат по группам, а не фальшивый успех.
- Логировать отдельно intent и фактический outcome.
- Развести ошибки сети, таймауты, офлайн и ошибки протокола.
Критерий готовности:
- Один timeout не валит весь запрос.
- API честно сообщает, сколько устройств обработано успешно.
- Логи не врут о выполнении команды.
P0.3 Исправление расписаний
Проблемы:
cron-задачи могут затирать друг друга из-за конфликтующихjob_id.- Расписания умеют почти только
on/off. - Отсутствует нормальная модель хранения пользовательских задач.
- В коде есть мёртвая модель
ScheduleTask, не совпадающая с реальностью.
Что сделать:
- Исправить формирование
job_id. - Ввести явную доменную модель расписания.
- Решить, где источник истины: APScheduler jobstore, своя таблица или оба слоя.
- Добавить payload для brightness, temp, scene, color.
- Добавить валидацию cron/once запросов.
- Сделать idempotent CRUD для задач.
Критерий готовности:
- Разные задачи не затирают друг друга.
- Пользователь может создавать и редактировать полезные сценарии, а не только toggle.
- В модели и БД нет мёртвых или вводящих в заблуждение сущностей.
P1: Высокий приоритет
P1.1 Привести API к нормальному контракту
Проблемы:
- Почти все POST-эндпоинты принимают query-параметры.
- Нет явных request/response schemas.
- Нет нормальной валидации диапазонов и конфликтов полей.
openapi.json, код и README расходятся.
Что сделать:
- Перевести команды управления и расписаний на JSON body.
- Описать Pydantic-модели для всех запросов и ответов.
- Добавить строгую валидацию:
- brightness range
- temp range
- RGB range
- допустимые комбинации scene/temp/rgb
- Нормализовать коды ошибок и detail messages.
- Генерировать
openapi.jsonиз кода и перестать хранить его как случайный артефакт. - Обновить README под фактический API.
Критерий готовности:
- Фронт, бэк и OpenAPI описывают одно и то же.
- Внешнему клиенту не нужно угадывать, что именно принимает endpoint.
P1.2 Починить и переосмыслить discovery
Проблемы:
- README обещает broadcast, а код делает unicast по всей подсети.
- Фоновый discovery не удаляет офлайн-устройства.
- Автоопределение сети упрощённое и часто неверное.
- Большие подсети молча режутся.
Что сделать:
- Определиться с настоящей стратегией discovery.
- Привести README к реальной реализации.
- Добавить понятную стратегию offline detection.
- Развести initial scan, manual rescan и background refresh.
- Сохранять полезные метаданные устройства, если они доступны.
- Логировать сканирование структурированно, а не только строками.
Критерий готовности:
- Список устройств стабилен и предсказуем.
- Пользователь понимает, что именно сканируется и почему устройство исчезло.
P1.3 Привести event log и stats к реальности
Проблемы:
- Логируются почти только
toggle_on/off. - UI уже показывает аналитику по scene/color/brightness/temp, но backend её не считает.
- Оценка часов работы грубая и легко искажается.
Что сделать:
- Сделать нормальную модель событий:
- command_requested
- command_applied
- command_failed
- schedule_triggered
- Хранить полезные параметры структурированно.
- Переписать stats на основе реальных типов событий.
- Либо убрать из UI несуществующие метрики, либо реально их реализовать.
Критерий готовности:
- Статистика отражает то, что реально происходило.
- UI не обещает данные, которых нет.
P2: Поддерживаемость и развитие
P2.1 Разобрать архитектурный долг
Проблемы:
- В одном месте SQLAlchemy-модели, в другом in-memory state, в третьем прямые драйверные вызовы.
- Есть мёртвые модели и недоведённый дизайн.
- Границы между доменной логикой, API и интеграцией размыты.
Что сделать:
- Ввести сервисный слой:
- auth service
- device service
- group service
- control service
- schedule service
- stats service
- Отделить transport layer от доменной логики.
- Удалить или довести до конца мёртвые сущности.
- Вынести общие DTO и контракты.
- Перестать хранить SQLAlchemy-объекты прямо в
state_manager.
Критерий готовности:
- Роуты тонкие.
- Бизнес-логика тестируется без HTTP.
- Структура проекта подсказывает, где что живёт.
P2.2 Нормальный фронтенд-контур
Проблемы:
- Весь UI живёт в одном
static/index.html. - Нет компонентности, тестов, сборки и типизации.
- Интерфейс уже перерос формат одного файла.
Что сделать:
- Решить, остаётся ли UI встроенным SPA или выносится в отдельный frontend package.
- Если остаётся встроенным:
- разбить на компоненты
- завести build pipeline
- локализовать ассеты
- Если выносится:
- описать стабильный API-контракт
- организовать сборку и публикацию статики
- Добавить базовые UI-тесты хотя бы на критические потоки.
Критерий готовности:
- Добавление новой вкладки или формы не требует править гигантский HTML-файл.
P2.3 Тесты и инженерная обвязка
Сейчас не хватает:
- unit tests
- integration tests
- API smoke tests
- linting
- CI
- миграций
- health endpoint
- backup/restore стратегии
- нормальной операционной документации
Что сделать:
- Добавить
pytest. - Покрыть минимум:
- auth
- api keys permissions
- control param validation
- schedules
- stats aggregation
- Добавить миграции, вероятнее всего через Alembic.
- Добавить
/healthи/ready. - Добавить базовый CI pipeline.
- Описать развёртывание и обновление без потери данных.
Критерий готовности:
- Любое опасное изменение ловится до ручной проверки на живых лампах.
P3: Продуктовые улучшения
Фичи, которых явно не хватает
- Редактирование групп, а не только создание и удаление.
- Нормальные имена устройств и комнат.
- Управление отдельными устройствами из UI.
- Расписания с payload, а не только
on/off. - Шаблоны сценариев:
- bedtime
- morning
- away mode
- timer presets
- История действий и журнал ошибок в UI.
- Понятный onboarding при первом запуске.
- Индикация реального статуса подключения и последнего ответа лампы.
- Импорт/экспорт конфигурации групп и ключей.
- Более точное разграничение прав между домашними ролями.
Рекомендуемый порядок выполнения
Этап 1
- P0.1 Безопасность по умолчанию
- P0.2 Надёжность команд и статусов
Этап 2
- P0.3 Расписания
- P1.1 Контракт API
Этап 3
- P1.2 Discovery
- P1.3 Event log и stats
Этап 4
- P2.1 Архитектурная чистка
- P2.3 Тесты и инфраструктура
Этап 5
- P2.2 Фронтенд-контур
- P3 Продуктовые улучшения
Анти-цели
Пока не стоит:
- Бездумно наращивать фичи поверх текущих проблем безопасности.
- Делать косметический рефакторинг без закрытия P0.
- Добавлять новый клиентский функционал без фикса API-контракта.
- Трогать много слоёв сразу без тестового контура.
Definition of Done для проекта
Проект можно считать приведённым в сильное состояние, когда:
- Нет полного доступа без явной конфигурации безопасности.
- Команды и расписания честно отражают результат выполнения.
- API, фронтенд и документация синхронизированы.
- Есть тестовый минимум на критические сценарии.
- Нет мёртвых моделей и двусмысленных источников истины.
- UI и backend можно развивать без страха всё сломать.