5.2 KiB
Контекст и задача:
Необходимо разработать 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 Обработка исключений — чтобы падение одного устройства не ломало весь сбор Подробные комментарии на русском языке