92 lines
5.2 KiB
Markdown
92 lines
5.2 KiB
Markdown
Контекст и задача:
|
||
|
||
Необходимо разработать self-hosted веб-приложение для мониторинга и динамической визуализации топологии домашней сети и устройств умного дома. Сеть состоит из разнородного оборудования (гетерогенная среда):
|
||
|
||
Роутеры WiFi: Asus, MikroTik, Ubiquiti, OpenWRT
|
||
Коммутаторы: D-Link, SNR, Cisco
|
||
Серверы: Linux-сервер с Docker-контейнерами, серверы VM Proxmox
|
||
NAS: Synology
|
||
IoT-устройства: Zigbee и Matter, заведенные в Home Assistant
|
||
Главная цель приложения — опрашивать все системы, приводить данные к единому формату:
|
||
|
||
Узлы (Nodes)
|
||
Связи (Edges)
|
||
Отрисовка интерактивной живой карты сети:
|
||
|
||
Толщина линий зависит от скорости сетевого интерфейса (10G/1G/100M и т.д.)
|
||
Цвет линии отражает нагрузку
|
||
Тап по узлу показывает его состояние и сервисы (например, список Docker-контейнеров или VM)
|
||
Тап по линии — график нагрузки
|
||
Возможность автоматического сопоставления MAC-адресов (например, между коммутатором и сервером) и ручного редактирования карты.
|
||
|
||
|
||
|
||
Архитектура системы:
|
||
|
||
Backend (Python / FastAPI)
|
||
|
||
Скрипт-коллектор, который по расписанию (раз в 30–60 секунд) собирает данные из источников
|
||
Эндпоинт /api/topology — отдает JSON для фронтенда
|
||
База данных (Redis / SQLite)
|
||
|
||
Кэширование последнего состояния сети
|
||
Предотвращение частых запросов к роутерам при обновлении страницы
|
||
Frontend (HTML5 / JS)
|
||
|
||
Одна страница с использованием библиотеки vis.js или Cytoscape.js
|
||
Запрашивает JSON и строит граф с поддержкой физики
|
||
Требования к модулям сбора данных (Backend):
|
||
|
||
Модуль роутеров и коммутаторов (Asus, MikroTik, Ubiquiti, OpenWRT, D-Link, Cisco, SNR):
|
||
|
||
Реализовать абстрактный класс или универсальный метод сбора через SNMPv1/v2/v3 (используя pysnmp или аналоги)
|
||
Собирать:
|
||
Список подключенных MAC-адресов по интерфейсам/портам
|
||
Сопоставлять с другими устройствами
|
||
Утилизацию трафика (In/Out octets)
|
||
Для MikroTik — дополнительно собирать Wi-Fi клиентов через RouterOS v7 REST API
|
||
Модуль Docker:
|
||
|
||
Использовать docker-py
|
||
Собирать список запущенных контейнеров, их ID, статус и связывать с “родительским” узлом — сервером
|
||
Модуль умного дома (Zigbee/Matter):
|
||
|
||
Интеграция с Home Assistant REST API
|
||
Запрашивать /api/states, фильтровать устройства по признаку интеграции (например, zha, zigbee2mqtt)
|
||
Привязывать устройства к узлу “Home Assistant”
|
||
Требования к структуре данных (JSON вывода):
|
||
|
||
Выходной JSON должен соответствовать формату для vis.js:
|
||
```
|
||
{
|
||
"nodes": [
|
||
{
|
||
"id": "уникальный_ключ",
|
||
"label": "Имя устройства (или IP/MAC)",
|
||
"group": "категория_для_стилей",
|
||
"status": "online/offline"
|
||
}
|
||
],
|
||
"edges": [
|
||
{
|
||
"from": "id_источника",
|
||
"to": "id_приемника",
|
||
"label": "Метрика трафика (например, 45 Mbps)",
|
||
"value": "число_для_цвета_линии"
|
||
}
|
||
]
|
||
}
|
||
|
||
```
|
||
|
||
Что нужно сгенерировать:
|
||
|
||
Чистая архитектура проекта — структура файлов
|
||
Полный рабочий код бэкенда на FastAPI с реализацией модулей сбора данных (с заглушками под реальные IP/токены)
|
||
Пример фронтенд-страницы (index.html) — обновление графа каждые 10 секунд без перезагрузки
|
||
Docker-compose файл — для быстрого деплоя всей системы (FastAPI + Redis + Frontend) одной командой
|
||
Дополнительные требования:
|
||
|
||
Код должен быть написан с соблюдением принципов SOLID
|
||
Обработка исключений — чтобы падение одного устройства не ломало весь сбор
|
||
Подробные комментарии на русском языке |