# TASK PHASE — NODE RUNTIME AUDIT (NODE1 & NODE2) Version: 1.0 Target: NODE1 (production), NODE2 (development) --- ## 1. Мета Гарантувати, що: 1. У БД рівно дві реальні ноди (NODE1, NODE2) з коректними полями. 2. DAGI-стек на NODE1 відповідає документації (ті сервіси, які мають працювати в проді). 3. NODE2 позначений як development-нода з правильними тегами. 4. UI Node Directory та Node Profile показують саме ці дані. --- ## 2. Перевірка БД (nodes + агенти на ноді) ### 2.1. Список нод ```sql SELECT id, slug, name, kind, environment, hostname, owner_microdao_id, guardian_agent_id, steward_agent_id FROM nodes ORDER BY id; ``` Очікування: - рівно 2 рядки: - NODE1 — `Hetzner GEX44 Production` (environment = `production`); - NODE2 — `MacBook Pro M4 Max` (environment = `development`). ### 2.2. Агенти, прив’язані до нод Якщо колонка `home_node_id` вже додана: ```sql SELECT id, slug, display_name, home_node_id, primary_microdao_id FROM agents WHERE home_node_id IS NOT NULL AND deleted_at IS NULL ORDER BY home_node_id, id; ``` Очікування: - NODE1: інфраструктурні/прод-агенти (router, gateway, guardians); - NODE2: core-team / AI-runtime агенти (якщо вже зареєстровані). > Якщо `home_node_id` поки немає — додати TODO у звіт і зафіксувати актуальний стан у README. --- ## 3. Перевірка DAGI-стека на NODE1 ### 3.0. Node Profiles (expected DAGI stack) #### NODE1 — `node-1-hetzner-gex44` Role: infra / city / production. Expected services (name mask): - `dagi-router*` - `gateway` / `dagi-gateway*` - `dagi-postgres` - `dagi-nats` - `daarion-city-service` - `daarion-web` - `dagi-stt-service` - `dagi-ocr-service` - `dagi-web-search-service` - `dagi-rag-service` - `dagi-vector-db-service` - інші prod-інтеграції (Matrix gateway, telegram bots, crew router, etc.) Forbidden / unexpected на NODE1: - важкі dev/LLM контейнери (ollama, vllm, test models), - експериментальні сервіси core-team (якщо це не задокументовані прод-сервіси). #### NODE2 — `node-2-macbook-m4max` Role: development / models / ai-runtime. Expected services: - `ollama`, `vllm`, `text-gen` або інші LLM runtime контейнери, - dev/test RAG, vision, STT модулі, - core-team agents / experimental gateways. Forbidden / unexpected на NODE2: - продакшн-сервіси міста (`daarion-city-service`, `dagi-router`, `dagi-postgres`, `dagi-nats`, тощо), - будь-які критичні інфра-компоненти, які повинні жити лише на NODE1. ### 3.1. Список контейнерів На NODE1 виконати: ```bash docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep -E "(dagi-|daarion-|gateway)" ``` Результат зберегти у файл `docs/debug/node1_containers_.txt`. Очікуваний перелік (орієнтовно, залежно від compose): - `dagi-router`, `dagi-gateway`, `dagi-postgres`, `dagi-nats`; - сервісні контейнери (`dagı-ocr-service`, `dagı-stt-service`, `dagı-web-search-service`, `dagı-rag-service`, `dagı-vector-db-service`, тощо за актуальним `docker-compose` файлом); - `daarion-city-service`; - `daarion-web` (якщо працює через docker run). ### 3.2. Healthcheck основних сервісів Створити скрипт `scripts/node1_healthcheck.sh`: ```bash #!/usr/bin/env bash set -e echo "== NODE1 HEALTHCHECK ==" > /tmp/node1_health_status.txt { curl -sf http://daarion-city-service:7001/health && echo "city-service OK" } || echo "city-service FAILED" >> /tmp/node1_health_status.txt { curl -sf http://gateway:9300/health && echo "gateway OK" } || echo "gateway FAILED" >> /tmp/node1_health_status.txt { nc -z dagi-nats 4222 && echo "NATS OK" } || echo "NATS FAILED" >> /tmp/node1_health_status.txt { PGPASSWORD=postgres psql -h dagi-postgres -U postgres -d daarion -c "SELECT 1" && echo "postgres OK" } || echo "postgres FAILED" >> /tmp/node1_health_status.txt ``` Перенести файл `/tmp/node1_health_status.txt` до `docs/debug/node1_health_.txt`. --- ## 4. Перевірка NODE2 (development) На NODE2 виконати: ```bash docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep -E "(dagi-|daarion-|ollama|models)" ``` Зберегти результат у `docs/debug/node2_containers_.txt`. Очікування: - NODE2 не має зайвих прод-сервісів (тільки dev/runtime контейнери); - у таблиці `nodes` для NODE2 стоять теги `development`, `gpu`, `ai_runtime` (або аналогічні). --- ## 5. Перевірка відповідності UI Після SQL та скриптів: 1. Відкрити `https://daarion.space/nodes` — має бути рівно 2 ноди з правильними даними. 2. Перевірити сторінки: - `https://daarion.space/nodes/node-1-hetzner-gex44` - `https://daarion.space/nodes/node-2-macbook-m4max` Переконатися, що: - сторінки рендеряться без `Failed to fetch`; - якщо dashboard ще WIP — показано попереджувальний банер, але базовий профіль працює. --- ## 6. Критерії завершення - У `nodes` — рівно дві ноди з коректними полями. - Контейнери DAGI на NODE1 відповідають очікуваному стеку. - NODE2 позначений як development-нода без лишніх прод-сервісів. - У `docs/debug/` збережені файли: - `node1_containers_.txt` - `node1_health_.txt` - `node2_containers_.txt` - UI `/nodes` та сторінки нод працюють без помилок і показують актуальні дані. --- ## 7. Запуск таска в Cursor В чаті Cursor (репозиторій `microdao-daarion`) надіслати: > Виконай, будь ласка, > `docs/tasks/TASK_PHASE_NODE_RUNTIME_AUDIT_NODE1_NODE2.md` > по кроках, як описано в документі. > Мета: підтвердити, що в БД рівно дві ноди, DAGI-стек на NODE1 відповідає очікуваному, NODE2 відмічений як development, і UI `/nodes` та сторінки нод показують ці дані. > Особливий акцент: порівняй реальний список контейнерів з розділом **Node Profiles**. Якщо є розбіжності (відсутній обов’язковий сервіс або запущено заборонений), створи файл `docs/debug/node_stack_mismatch_.md` з описом фактів і пропозицією дій (зупинити/додати сервіс, створити таск на майбутнє).