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

9.1 KiB
Raw Blame History

Звіт перевірки НОДА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.

Виправлення:

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: requestsurllib

Проблема: 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.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.

Швидкі команди після змін

# На 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 — додавання агентів