Files
microdao-daarion/docs/NODE2_GUARDIAN_SETUP.md
2026-02-16 03:47:51 -08:00

228 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Налаштування 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
```
---
## Архітектура
```text
┌─────────────────┐
│ 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`, тому дані не перетираються між нодами.