- 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>
9.1 KiB
Звіт перевірки НОДА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 працює |
Виправлення, які застосовано
-
Репо: у
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.
-
На 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.
Виправлення:
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:
# Було:
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 не міг підключитися.
Виправлення:
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.ymlMemory має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.
Швидкі команди після змін
# На 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 — додавання агентів