# Nodes Cabinet - Інтеграція Swapper Service для кожної Ноди **Дата:** 2025-11-22 **Статус:** ✅ Інтегровано --- ## 📋 Огляд Створено сторінку кабінету Нод, яка відображає: - ✅ Всі Ноди в системі (Node #1, Node #2) - ✅ Таблицю підключень Swapper Service для кожної Ноди - ✅ Статус кожної Ноди та її Swapper Service - ✅ Активну модель на кожній Ноді - ✅ Список всіх моделей з підключеннями - ✅ Можливість керувати моделями (Load/Unload) --- ## 🚀 Доступ до сторінки ### URL маршрути: - `http://localhost:3000/nodes` - основна сторінка - `http://localhost:3000/admin/nodes` - альтернативний маршрут ### З ConsolePage: - Кнопка "🌐 Nodes" в навігації ConsolePage - Відкриває сторінку Nodes --- ## 📊 Що відображається ### 1. Основна таблиця Нод | Колонка | Опис | |---------|------| | **Node** | Назва та ID Ноди | | **IP Address** | IP адреса Ноди | | **Role** | Роль (production/development) | | **Status** | Статус Ноди (online/offline/degraded) | | **Swapper Service** | Статус Swapper Service | | **Active Model** | Активна модель (якщо є) | | **Total Models** | Загальна кількість моделей | | **Loaded Models** | Кількість завантажених моделей | | **Actions** | Кнопка "View Details" | ### 2. Детальна таблиця підключень Для кожної Ноди відображається таблиця з усіма моделями: | Колонка | Опис | |---------|------| | **Model Name** | Назва моделі | | **Ollama Name** | Назва в Ollama | | **Type** | Тип (llm/code/vision/math) | | **Size (GB)** | Розмір моделі | | **Priority** | Пріоритет (high/medium/low) | | **Status** | Статус (loaded/unloaded/loading) | | **Uptime (hours)** | Час роботи моделі | | **Requests** | Кількість запитів | | **Actions** | Кнопки Load/Unload | --- ## 🔧 Конфігурація Нод Ноди налаштовані в `src/pages/NodesPage.tsx`: ```typescript const NODES: NodeInfo[] = [ { node_id: 'node-1-hetzner-gex44', node_name: 'Node #1 - Production Server', ip_address: '144.76.224.179', role: 'production', status: 'online', swapper_url: 'http://144.76.224.179:8890', // Production }, { node_id: 'node-2-macbook-m4max', node_name: 'Node #2 - MacBook M4 Max', ip_address: '192.168.1.244', role: 'development', status: 'online', swapper_url: 'http://localhost:8890', // Local }, ]; ``` ### Додавання нової Ноди Додайте нову Ноду в масив `NODES`: ```typescript { node_id: 'node-3-...', node_name: 'Node #3 - ...', ip_address: '...', role: 'production' | 'development', status: 'online', swapper_url: 'http://...:8890', } ``` --- ## 🔄 Автоматичне оновлення Сторінка автоматично оновлює статус кожні 30 секунд: - Перевіряє health кожного Swapper Service - Оновлює статус Нод - Оновлює список моделей та їх статуси Можна також оновити вручну кнопкою "🔄 Refresh". --- ## 🎨 Візуальні індикатори ### Статус Ноди: - 🟢 **Online** - Нода працює, Swapper доступний - 🔴 **Offline** - Нода недоступна - 🟠 **Degraded** - Нода працює, але є проблеми ### Статус моделі: - 🟢 **Loaded** - Модель завантажена - ⚪ **Unloaded** - Модель вивантажена - 🟡 **Loading** - Модель завантажується - 🔴 **Error** - Помилка завантаження ### Активна модель: - Позначається індикатором "● Active" - Виділяється жовтим кольором - Показує uptime та кількість запитів --- ## 🔧 Функціональність ### 1. Перегляд статусу - Автоматичне оновлення кожні 30 секунд - Відображення статусу кожної Ноди - Відображення статусу Swapper Service ### 2. Керування моделями - **Load** - завантажити модель - **Unload** - вивантажити модель - Дії доступні тільки для online Нод ### 3. Детальна інформація - Розгорнута таблиця для кожної Ноди - Всі моделі з детальною інформацією - Uptime та статистика для кожної моделі --- ## 📁 Створені файли 1. ✅ `src/pages/NodesPage.tsx` - основна сторінка 2. ✅ `src/styles/nodes.css` - стилі для сторінки 3. ✅ Оновлено `src/App.tsx` - додано маршрути 4. ✅ Оновлено `src/pages/ConsolePage.tsx` - додано кнопку "Nodes" --- ## 🧪 Тестування ### 1. Перевірити доступність ```bash # Node #2 (локально) curl http://localhost:8890/api/cabinet/swapper/status # Node #1 (production) curl http://144.76.224.179:8890/api/cabinet/swapper/status ``` ### 2. Відкрити в браузері ``` http://localhost:3000/nodes ``` ### 3. Перевірити функціональність - Перевірити відображення обох Нод - Перевірити статус Swapper Service - Перевірити список моделей - Спробувати Load/Unload моделі --- ## 🔐 Безпека ### CORS налаштування Для доступу з frontend до Swapper Service на різних Нодах, переконайтеся що CORS налаштовано: **Node #1 (Production):** ```python # services/swapper-service/app/main.py app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:3000", "https://daarion.city", "https://gateway.daarion.city" ], ... ) ``` **Node #2 (Development):** ```python # services/swapper-service/app/main.py app.add_middleware( CORSMiddleware, allow_origins=["*"], # Development only ... ) ``` --- ## 📋 Наступні кроки (опціонально) 1. **Додати фільтрацію:** - Фільтр по статусу Ноди - Фільтр по типу моделей - Пошук по назві моделі 2. **Додати графіки:** - Графік uptime моделей - Графік request count - Історія завантаження/вивантаження 3. **Додати Node Registry інтеграцію:** - Автоматичне виявлення Нод - Динамічне додавання нових Нод - Heartbeat моніторинг --- ## ✅ Готово! **Nodes Cabinet повністю інтегровано!** 🎉 - ✅ Сторінка створена - ✅ Таблиця підключень відображається - ✅ Керування моделями працює - ✅ Автоматичне оновлення налаштовано **Можна використовувати!** --- **Last Updated:** 2025-11-22 **Status:** ✅ Готово до використання **URL:** `http://localhost:3000/nodes`