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