fix(nodes): Normalize Router/Swapper endpoints and fix NODE2 display
Major changes: - Normalize get_node_endpoints to use ENV vars (ROUTER_BASE_URL, SWAPPER_BASE_URL) - Remove node_id-based URL selection logic - Add fallback direct API call in get_node_swapper_detail - Fix Swapper API endpoint (/models instead of /api/v1/models) - Add router_healthy and router_version to node_heartbeat fallback - Add ENV vars to docker-compose for Router/Swapper URLs Documentation: - Add TASK_PHASE_NODE2_ROUTER_SWAPPER_FIX.md with full task description - Add NODE2_GUARDIAN_SETUP.md with setup instructions This fixes: - Swapper models not showing for NODE1 and NODE2 - DAGI Router agents not showing for NODE2 - Router/Swapper showing as Down/Degraded when they're actually up
This commit is contained in:
222
docs/NODE2_GUARDIAN_SETUP.md
Normal file
222
docs/NODE2_GUARDIAN_SETUP.md
Normal file
@@ -0,0 +1,222 @@
|
||||
# Налаштування Node Guardian для НОДА2
|
||||
|
||||
## Контекст
|
||||
|
||||
Node Guardian — це сервіс, який періодично збирає метрики з DAGI Router та Swapper Service та оновлює їх в `node_cache` таблиці БД. Це дозволяє UI показувати актуальний стан нод.
|
||||
|
||||
## Налаштування для НОДА2 (MacBook)
|
||||
|
||||
### 1. Environment Variables
|
||||
|
||||
Створіть `.env` файл або додайте до існуючого:
|
||||
|
||||
```bash
|
||||
# Node Identity
|
||||
NODE_ID=node-2-macbook-m4max
|
||||
NODE_NAME=НОДА2
|
||||
NODE_ENVIRONMENT=development
|
||||
NODE_ROLES=gpu,ai_runtime
|
||||
NODE_HOSTNAME=$(hostname)
|
||||
|
||||
# City Service URL (HTTPS для проді)
|
||||
CITY_SERVICE_URL=https://daarion.space/api/city
|
||||
|
||||
# Node-specific service URLs (для НОДА2 - localhost)
|
||||
NODE_SWAPPER_URL=http://localhost:8890
|
||||
NODE_ROUTER_URL=http://localhost:9102
|
||||
|
||||
# Guardian interval (секунди)
|
||||
GUARDIAN_INTERVAL=60
|
||||
```
|
||||
|
||||
### 2. Запуск Node Guardian
|
||||
|
||||
#### Як фонове завдання (рекомендовано):
|
||||
|
||||
```bash
|
||||
# Створити systemd service
|
||||
sudo nano /etc/systemd/system/node-guardian.service
|
||||
```
|
||||
|
||||
Вміст файлу:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=DAARION Node Guardian
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=$USER
|
||||
WorkingDirectory=/path/to/microdao-daarion
|
||||
EnvironmentFile=/path/to/.env
|
||||
ExecStart=/usr/bin/python3 /path/to/microdao-daarion/scripts/node-guardian-loop.py
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Активувати:
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable node-guardian
|
||||
sudo systemctl start node-guardian
|
||||
sudo systemctl status node-guardian
|
||||
```
|
||||
|
||||
#### Або вручну:
|
||||
|
||||
```bash
|
||||
cd /path/to/microdao-daarion
|
||||
python3 scripts/node-guardian-loop.py
|
||||
```
|
||||
|
||||
### 3. Перевірка роботи
|
||||
|
||||
#### Перевірити логи:
|
||||
|
||||
```bash
|
||||
# Якщо systemd service
|
||||
sudo journalctl -u node-guardian -f
|
||||
|
||||
# Або якщо запущено вручну - дивитись stdout
|
||||
```
|
||||
|
||||
#### Перевірити в БД:
|
||||
|
||||
```sql
|
||||
-- Перевірити чи оновлюються метрики для НОДА2
|
||||
SELECT
|
||||
node_id,
|
||||
swapper_healthy,
|
||||
swapper_models_loaded,
|
||||
swapper_models_total,
|
||||
router_healthy,
|
||||
router_version,
|
||||
last_heartbeat,
|
||||
updated_at
|
||||
FROM node_cache
|
||||
WHERE node_id = 'node-2-macbook-m4max'
|
||||
ORDER BY updated_at DESC
|
||||
LIMIT 1;
|
||||
```
|
||||
|
||||
#### Перевірити Swapper State:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
node_id,
|
||||
swapper_state->'models' as models
|
||||
FROM node_cache
|
||||
WHERE node_id = 'node-2-macbook-m4max'
|
||||
AND swapper_state IS NOT NULL;
|
||||
```
|
||||
|
||||
### 4. Troubleshooting
|
||||
|
||||
#### Guardian не оновлює метрики
|
||||
|
||||
1. Перевірити з'єднання з city-service:
|
||||
```bash
|
||||
curl -v https://daarion.space/api/city/health
|
||||
```
|
||||
|
||||
2. Перевірити чи Swapper доступний:
|
||||
```bash
|
||||
curl http://localhost:8890/health
|
||||
curl http://localhost:8890/models
|
||||
```
|
||||
|
||||
3. Перевірити чи Router доступний:
|
||||
```bash
|
||||
curl http://localhost:9102/health
|
||||
```
|
||||
|
||||
4. Перевірити логи guardian на помилки:
|
||||
```bash
|
||||
sudo journalctl -u node-guardian --since "10 minutes ago" | grep -i error
|
||||
```
|
||||
|
||||
#### Помилки авторизації (401/403)
|
||||
|
||||
- Перевірити що `CITY_SERVICE_URL` правильний
|
||||
- Перевірити що немає старого токена в конфігурації
|
||||
- Перевірити що city-service доступний з MacBook
|
||||
|
||||
#### Swapper показує 0 моделей
|
||||
|
||||
1. Перевірити чи Swapper реально має моделі:
|
||||
```bash
|
||||
curl http://localhost:8890/models | jq
|
||||
```
|
||||
|
||||
2. Перевірити чи guardian правильно парсить відповідь:
|
||||
- Дивитись логи guardian на повідомлення про Swapper metrics
|
||||
|
||||
3. Перевірити чи `swapper_state` зберігається в БД:
|
||||
```sql
|
||||
SELECT swapper_state FROM node_cache WHERE node_id = 'node-2-macbook-m4max';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Налаштування для НОДА1 (Production Server)
|
||||
|
||||
На НОДА1 guardian зазвичай запускається автоматично через docker-compose або systemd.
|
||||
|
||||
### ENV змінні для НОДА1:
|
||||
|
||||
```bash
|
||||
NODE_ID=node-1-hetzner-gex44
|
||||
NODE_NAME=НОДА1
|
||||
NODE_ENVIRONMENT=production
|
||||
NODE_SWAPPER_URL=http://swapper-service:8890 # Docker service name
|
||||
NODE_ROUTER_URL=http://dagi-router:9102 # Docker service name
|
||||
CITY_SERVICE_URL=https://daarion.space/api/city
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Архітектура
|
||||
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ Node Guardian │ (на кожній ноді)
|
||||
│ (loop script) │
|
||||
└────────┬────────┘
|
||||
│
|
||||
├─→ Swapper API (/health, /models)
|
||||
├─→ Router API (/health)
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ City Service │
|
||||
│ /heartbeat │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ PostgreSQL │
|
||||
│ node_cache │
|
||||
└─────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ UI (Frontend) │
|
||||
│ Node Cabinet │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Важливі моменти
|
||||
|
||||
1. **Один Router/Swapper для всіх нод у проді**: На НОДА1 є один DAGI Router та один Swapper Service, які обслуговують всі ноди. Guardian на кожній ноді просто збирає метрики та пушить їх в БД з правильним `node_id`.
|
||||
|
||||
2. **ENV змінні мають пріоритет**: Guardian використовує `NODE_SWAPPER_URL` та `NODE_ROUTER_URL` з ENV, якщо вони встановлені. Це дозволяє для НОДА2 використовувати `localhost`, а для НОДА1 - Docker service names.
|
||||
|
||||
3. **Heartbeat оновлює node_cache**: Кожен heartbeat оновлює метрики в `node_cache` для конкретного `node_id`, тому дані не перетираються між нодами.
|
||||
|
||||
Reference in New Issue
Block a user