diff --git a/Promt.md b/Promt.md index d3873d5..dbbe78f 100644 --- a/Promt.md +++ b/Promt.md @@ -1,34 +1,92 @@ Контекст и задача: -Мне нужно разработать self-hosted веб-приложение для мониторинга и динамической визуализации топологии домашней сети и устройств умного дома. Сеть состоит из разнородного оборудования (гетерогенная среда): роутер Asus, точки доступа MikroTik и Ubiquiti, домашний Linux-сервер с Docker-контейнерами, NAS Synology, а также IoT-устройства (Zigbee и Matter), заведенные в Home Assistant. -Главная цель приложения — опрашивать все эти системы, приводить данные к единому формату "Узлы (Nodes)" и "Связи (Edges)" и отрисовывать интерактивную живую карту сети, где толщина линий зависит от текущей скорости сетевого интерфейса, а цвет линка нагрузку. Тап по элементу Node отображает его состояние и сервисы с вложениями (Node > docker > continer list, node > vm list ), тап по линку отображает график нагрузки. Отрисовка линка между узлами как по автоматичекому сопастовлению мак адресов устройств(например switch port 1 arp mac list есть мак сервера - рисуем линию в соответствии со скоростью линка 10g/1g/100m ) так и ручное редактирование на карте. +Необходимо разработать 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-адресов (например, между коммутатором и сервером) и ручного редактирования карты. + + Архитектура системы: -1. Backend (Python / FastAPI): Скрипт-коллектор, который по расписанию (раз в 30-60 секунд) собирает данные из источников. Должен иметь эндпоинт `/api/topology`, отдающий JSON для фронтенда. -2. База данных (Redis/SQLite): Для кэширования последнего состояния сети, чтобы не перегружать роутеры частыми запросами при обновлении страницы пользователем. -3. Frontend (HTML5 / JS): Одна страница с использованием библиотеки vis.js (или Cytoscape.js), которая запрашивает JSON и строит граф с поддержкой физики. -Требования к модулям сбора данных (Бэкенд): -- Модуль Роутеров и коммутаторов (Asus, MikroTik, Ubiquiti, OpenWRT, d-link, SNR, cisco): Реализуй абстрактный класс или универсальный метод сбора данных через SNMPv1/v2/v3 (используя библиотеку pysnmp или аналоги). Нужно собирать: список подключенных MAC-адресов по интерфейсам/портам сопоставляя с другими роутеми/коммутуторами и текущую утилизацию трафика (In/Out octets) на этих интерфейсах. Для MikroTik дополнительно предусмотри альтернативный сбор Wi-Fi клиентов через RouterOS v7 REST API. -- Модуль Docker: Используй официальный docker-py. Собирай список запущенных контейнеров, их ID, статус (running/stopped) и связывай их с "родительским" узлом — домашним сервером. -- Модуль Умного дома (Zigbee/Matter): Реализуй интеграцию с Home Assistant REST API. Скрипт должен запрашивать состояние объектов (`/api/states`), фильтровать устройства умного дома (например, по признаку интеграции zha или zigbee2mqtt в атрибутах) и привязывать их к узлу "Home Assistant". +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: + +Выходной JSON должен соответствовать формату для vis.js: +``` { "nodes": [ - {"id": "уникальный_ключ", "label": "Имя устройства (или IP/MAC)", "group": "категория_для_стилей", "status": "online/offline"} - ], - "edges": [ - {"from": "id_источника", "to": "id_приемника", "label": "Метрика трафика (например, 45 Mbps)", "value": "число_для_цвета_линии"} - ] - } + { + "id": "уникальный_ключ", + "label": "Имя устройства (или IP/MAC)", + "group": "категория_для_стилей", + "status": "online/offline" + } + ], + "edges": [ + { + "from": "id_источника", + "to": "id_приемника", + "label": "Метрика трафика (например, 45 Mbps)", + "value": "число_для_цвета_линии" + } + ] +} - Что нужно сгенерировать: - 1. Чистую архитектуру проекта (структуру файлов). - 2. Полный рабочий код бэкенда на FastAPI с реализацией вышеописанных модулей сбора данных (с заглушками под реальные IP/токены). - 3. Пример фронтенд-страницы (index.html), которая раз в 10 секунд запрашивает бэкенд и плавно обновляет граф без перезагрузки страницы. - 4. Docker-compose файл для быстрого деплоя всей системы (FastAPI + Redis + Frontend) в одну команду. +``` - Пиши код с соблюдением принципов SOLID, обработкой исключений (чтобы падение одного роутера не ломало весь сбор) и подробными комментариями на русском языке. - \ No newline at end of file +Что нужно сгенерировать: + +Чистая архитектура проекта — структура файлов +Полный рабочий код бэкенда на FastAPI с реализацией модулей сбора данных (с заглушками под реальные IP/токены) +Пример фронтенд-страницы (index.html) — обновление графа каждые 10 секунд без перезагрузки +Docker-compose файл — для быстрого деплоя всей системы (FastAPI + Redis + Frontend) одной командой +Дополнительные требования: + +Код должен быть написан с соблюдением принципов SOLID +Обработка исключений — чтобы падение одного устройства не ломало весь сбор +Подробные комментарии на русском языке \ No newline at end of file