Files
microdao-daarion/docs/NODA1-VERIFICATION-REPORT-2026-02-03.md
Apple a46a70c014 fix(ops): Add network aliases and stabilize DNS for NODA1
- docker-compose.node1.yml: Add network aliases (router, gateway,
  memory-service, qdrant, nats, neo4j) to eliminate manual
  `docker network connect --alias` commands
- docker-compose.node1.yml: ROUTER_URL now uses env variable with
  fallback: ${ROUTER_URL:-http://router:8000}
- docker-compose.node1.yml: Increase router healthcheck start_period
  to 30s and retries to 5
- .gitignore: Add noda1-credentials.local.mdc (local-only SSH creds)
- scripts/node1/verify_agents.sh: Improved output with agent list
- docs: Add NODA1-AGENT-VERIFICATION.md, NODA1-AGENT-ARCHITECTURE.md,
  NODA1-VERIFICATION-REPORT-2026-02-03.md
- config/README.md: How to add new agents
- .cursor/rules/, .cursor/skills/: NODA1 operations skill for Cursor

Root cause fixed: Gateway could not resolve 'router' DNS name when
Router container was named 'dagi-staging-router' without alias.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 05:55:56 -08:00

165 lines
9.1 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.
# Звіт перевірки НОДА1 та виправлення
**Дата:** 2026-02-03
**Сервер:** node1-daarion (144.76.224.179)
**Статус:**ВСІ СИСТЕМИ ПРАЦЮЮТЬ
---
## Фінальний стан після виправлень
| Метрика | Значення |
|---------|----------|
| `agent_e2e_success{gateway_health}` | **1.0** ✅ |
| `agent_e2e_success{agent_ping}` | **1.0** ✅ |
| `agent_e2e_success{webhook_e2e}` | **1.0** ✅ |
| Router | **healthy** ✅ |
| Gateway | **healthy** ✅ |
| Memory | **healthy** ✅ |
| E2E `/debug/agent_ping` | `success: true, router: true, memory_service: true` ✅ |
---
## Результати перевірки (до виправлень)
### Що працювало
| Компонент | Статус |
|-----------|--------|
| **Gateway** (9300) | healthy, 9 агентів, prompt + Telegram токен налаштовані |
| **Router** (9102) | відповідає 200, NATS connected, обробляє infer |
| **Memory Service** (8000) | healthy |
| **Qdrant** (6333) | доступний |
| **Webhook Helion** | приймає POST, skipped (no_message) — очікувано |
| **Prober metrics** (9108) | доступні |
| **Prometheus** | prober у targets |
### Що було зламано (виправлено)
| Проблема | Причина | Виправлення |
|----------|---------|-------------|
| **E2E /debug/agent_ping** повертав `success: false`, помилка "Temporary failure in name resolution" | Gateway мав `ROUTER_URL=http://router:8000`, а контейнер Router на сервері називається **dagi-staging-router** — хост `router` не резолвився в мережі | У `.env` на NODA1 задано `ROUTER_URL=http://dagi-staging-router:8000`, Gateway перезапущено. У `docker-compose.node1.yml` додано підтримку змінної: `ROUTER_URL=${ROUTER_URL:-http://router:8000}` |
| **Router** у `docker ps` показував **unhealthy** | Healthcheck може тимчасово фейлити або використовувати інший порт; сам сервіс відповідає 200 | Можна переглянути healthcheck або збільшити start_period/retries; функціонально Router працює |
---
## Виправлення, які застосовано
1. **Репо:** у `docker-compose.node1.yml` для gateway:
- `ROUTER_URL=http://router:8000` замінено на `ROUTER_URL=${ROUTER_URL:-http://router:8000}`.
- Якщо на сервері Router запущений під ім’ям контейнера (наприклад `dagi-staging-router`), в `.env` задається `ROUTER_URL=http://dagi-staging-router:8000`.
2. **На NODA1:**
- У `/opt/microdao-daarion/.env` додано/встановлено `ROUTER_URL=http://dagi-staging-router:8000`.
- У `docker-compose.node1.yml` на сервері зроблено той самий патч для підтримки `${ROUTER_URL}`.
- Виконано `docker compose -f docker-compose.node1.yml up -d gateway --no-deps --force-recreate`.
Після цього **POST /debug/agent_ping** повертає `success: true`, `router: true`, `memory_service: true`.
---
## Виправлення Session 2 (детально)
### 1. Network alias `router` для dagi-staging-router
**Проблема:** Gateway очікував хост `router`, але контейнер Router називався `dagi-staging-router` без alias.
**Виправлення:**
```bash
docker network disconnect dagi-network dagi-staging-router
docker network connect --alias router --alias dagi-staging-router dagi-network dagi-staging-router
```
Тепер `getent hosts router` з Gateway повертає IP Router.
### 2. Healthcheck Router: `requests` → `urllib`
**Проблема:** Healthcheck у Dockerfile використовував `import requests`, якого не було в образі → `unhealthy` (FailingStreak: 13760).
**Виправлення в `services/router/Dockerfile`:**
```dockerfile
# Було:
HEALTHCHECK ... CMD python -c "import requests; requests.get('http://localhost:8000/health')"
# Стало:
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=5 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"
```
Router перебілджено та перезапущено → тепер `healthy`.
### 3. Prober: GATEWAY_URL з IP → DNS
**Проблема:** Prober мав `GATEWAY_URL=http://172.18.0.18:9300` (старий IP Gateway). Після recreate Gateway отримав новий IP → prober не міг підключитися.
**Виправлення:**
```bash
docker rm agent-e2e-prober-node1
docker run -d --name agent-e2e-prober-node1 --network dagi-network \
-p 9108:9108 -e GATEWAY_URL=http://gateway:9300 ...
```
Тепер prober використовує DNS `gateway`, яке стабільне.
### 4. Memory→Qdrant
**Статус:** Вже правильно налаштовано: `MEMORY_QDRANT_HOST=dagi-qdrant-node1`, резолвиться коректно.
---
## Рекомендації з архітектури та налаштування агентів
### 1. Єдине ім’я Router у мережі
- **Проблема:** у `docker-compose.node1.yml` сервіс називається `router` з `container_name: dagi-router-node1`, а на NODA1 фактично працює контейнер `dagi-staging-router` (інший compose/проект). Тому Gateway не міг резолвити `router`.
- **Рекомендація:** на NODA1 використовувати один compose (наприклад `docker-compose.node1.yml`) для Gateway і Router, щоб DNS-ім’я `router` з’являлось автоматично. Або завжди задавати в `.env` на ноді `ROUTER_URL=http://<фактичне ім’я контейнера>:8000` і документувати це в `docs/NODA1-AGENT-VERIFICATION.md` / `PROJECT-MASTER-INDEX.md`.
### 2. Healthcheck Router
- Якщо контейнер Router продовжує показувати **unhealthy** при робочому `/health`, перевірити на сервері:
- який саме healthcheck використовується (порт, шлях);
- чи не короткий `interval`/`timeout` або малий `start_period`.
- Можна вирівняти healthcheck з фактичним endpoint (наприклад `GET http://localhost:8000/health`) і при потребі збільшити `start_period` та `retries`.
### 3. Memory: Qdrant hostname
- У `docker-compose.node1.yml` Memory має `MEMORY_QDRANT_HOST=qdrant`; контейнер Qdrant — `dagi-qdrant-node1`. Переконатися, що в мережі є DNS-ім’я `qdrant` (наприклад через `networks`/alias), інакше в `.env` на ноді задати `MEMORY_QDRANT_HOST=dagi-qdrant-node1` (як у NODA1-CURRENT-STATUS).
### 4. Реєстр агентів (Gateway)
- Всі 9 агентів у реєстрі мають `prompt_loaded: true` і `telegram_token_configured: true` — конфігурація в порядку.
- Для додавання нових агентів дивитися `config/README.md` та `gateway-bot/http_api.py` (AGENT_REGISTRY + webhook + env).
### 5. Prober (agent_e2e_success)
- Метрика `agent_e2e_success{target="gateway_health"} 0.0` могла залишитися від попередніх запусків. Після виправлення E2E варто почекати наступного циклу prober або перезапустити prober, щоб метрика оновилась.
### 6. Документація
- У `docs/NODA1-AGENT-ARCHITECTURE.md` вже зазначено фактичні імена контейнерів (зокрема `dagi-staging-router`). Додати короткий пункт про те, що на ноді в `.env` має бути `ROUTER_URL=http://dagi-staging-router:8000`, якщо Router запущений під цим ім’ям.
- У `docs/NODA1-AGENT-VERIFICATION.md` та в скрипті `scripts/node1/verify_agents.sh` залишити поточні кроки; при потребі додати перевірку `POST /debug/agent_ping` з очікуванням `success: true`.
---
## Швидкі команди після змін
```bash
# На NODA1
ssh root@144.76.224.179
cd /opt/microdao-daarion
./scripts/node1/verify_agents.sh
# E2E probe
curl -s -X POST http://localhost:9300/debug/agent_ping -H "Content-Type: application/json" -d '{}'
# Очікується: "success":true, "checks":{"router":true,"memory_service":true}
```
---
## Пов’язані документи
- **PROJECT-MASTER-INDEX.md** — єдина точка входу
- **docs/NODA1-AGENT-VERIFICATION.md** — перевірка агентів
- **docs/NODA1-AGENT-ARCHITECTURE.md** — архітектура
- **config/README.md** — додавання агентів