- 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>
165 lines
9.1 KiB
Markdown
165 lines
9.1 KiB
Markdown
# Звіт перевірки НОДА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** — додавання агентів
|