- matrix-gateway: POST /internal/matrix/presence/online endpoint - usePresenceHeartbeat hook with activity tracking - Auto away after 5 min inactivity - Offline on page close/visibility change - Integrated in MatrixChatRoom component
262 lines
7.7 KiB
Markdown
262 lines
7.7 KiB
Markdown
# 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`
|
||
|