Skip to content

# 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. Список нод

    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` вже додана:

    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 виконати:

    docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep -E "(dagi-|daarion-|gateway)"

Результат зберегти у файл `docs/debug/node1_containers_<DATE>.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`:

    #!/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_<DATE>.txt`.

## 4. Перевірка NODE2 (development)

На NODE2 виконати:

    docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep -E "(dagi-|daarion-|ollama|models)"

Зберегти результат у `docs/debug/node2_containers_<DATE>.txt`.

Очікування:

- NODE2 не має зайвих прод-сервісів (тільки dev/runtime контейнери);
- у таблиці `nodes` для NODE2 стоять теги `development`, `gpu`, `ai_runtime` (або аналогічні).

## 5. Перевірка відповідності UI

Після SQL та скриптів:

1. Відкрити `https://daarion.space/nodes` — має бути рівно 2 ноди з правильними даними.
2. Перевірити сторінки:
3. `https://daarion.space/nodes/node-1-hetzner-gex44`
4. `https://daarion.space/nodes/node-2-macbook-m4max`

Переконатися, що:

- сторінки рендеряться без `Failed to fetch`;
- якщо dashboard ще WIP — показано попереджувальний банер, але базовий профіль працює.

## 6. Критерії завершення

- У `nodes` — рівно дві ноди з коректними полями.
- Контейнери DAGI на NODE1 відповідають очікуваному стеку.
- NODE2 позначений як development-нода без лишніх прод-сервісів.
- У `docs/debug/` збережені файли:
- `node1_containers_<DATE>.txt`
- `node1_health_<DATE>.txt`
- `node2_containers_<DATE>.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_<DATE>.md` з описом фактів і пропозицією дій (зупинити/додати сервіс, створити таск на майбутнє).