Config policies (16 files): alert_routing, architecture_pressure, backlog, cost_weights, data_governance, incident_escalation, incident_intelligence, network_allowlist, nodes_registry, observability_sources, rbac_tools_matrix, release_gate, risk_attribution, risk_policy, slo_policy, tool_limits, tools_rollout Ops (22 files): Caddyfile, calendar compose, grafana voice dashboard, deployments/incidents logs, runbooks for alerts/audit/backlog/incidents/sofiia/voice, cron jobs, scripts (alert_triage, audit_cleanup, migrate_*, governance, schedule), task_registry, voice alerts/ha/latency/policy Docs (30+ files): HUMANIZED_STEPAN v2.7-v3 changelogs and runbooks, NODA1/NODA2 status and setup, audit index and traces, backlog, incident, supervisor, tools, voice, opencode, release, risk, aistalk, spacebot Made-with: Cursor
6.7 KiB
Sofiia Console — Operations Runbook
1. Rebuild & Deploy (NODA2)
cd /opt/microdao-daarion # or ~/github-projects/microdao-daarion on dev
# Rebuild sofiia-console (UI + backend)
docker compose -f docker-compose.node2-sofiia.yml build sofiia-console --no-cache
docker compose -f docker-compose.node2-sofiia.yml up -d sofiia-console
# Rebuild gateway (for agent registry changes)
docker compose -f docker-compose.node2-sofiia.yml build gateway --no-cache
docker compose -f docker-compose.node2-sofiia.yml up -d gateway
2. Confirm Build Version
# Via API
APIKEY=$(grep SOFIIA_CONSOLE_API_KEY .env | cut -d= -f2)
curl -s http://localhost:8002/api/meta/version -H "X-API-Key: $APIKEY"
# Expected: {"version":"0.4.0","build_sha":"dev","build_time":"local",...}
# In UI: header shows "v0.4.0 dev" badge (top right)
3. Verify Agents List
APIKEY=$(grep SOFIIA_CONSOLE_API_KEY .env | cut -d= -f2)
# NODA2 agents
curl -s "http://localhost:8002/api/agents?nodes=NODA2" -H "X-API-Key: $APIKEY" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(f'items={len(d[\"items\"])} stats={d[\"stats\"]} errors={d[\"node_errors\"]}')"
# NODA1 agents
curl -s "http://localhost:8002/api/agents?nodes=NODA1" -H "X-API-Key: $APIKEY" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(f'items={len(d[\"items\"])} stats={d[\"stats\"]} errors={d[\"node_errors\"]}')"
# All nodes
curl -s "http://localhost:8002/api/agents?nodes=NODA1,NODA2" -H "X-API-Key: $APIKEY" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(f'items={len(d[\"items\"])} stats={d[\"stats\"]} errors={d[\"node_errors\"]}')"
# Direct gateway check (NODA2)
curl -s http://localhost:9300/health | python3 -c "
import sys,json; d=json.load(sys.stdin)
print(f'agents={d[\"agents_count\"]}')
for k,v in sorted(d[\"agents\"].items()): print(f' {k}: badges={v.get(\"badges\",[])}')
"
4. UI Debug Panel
У вкладці 📁 Проєкти → Agents:
- Натисніть кнопку 🔍 Debug в панелі дій
- Debug panel показує:
fetch: час останнього запитуnodes: вибрані нодиitems: кількість агентівok/total: кількість успішних нодerrors: помилки нод (якщо є)
5. Troubleshooting
Агенти не відображаються в UI
- Перевірте API ключ у налаштуваннях UI
- Натисніть ↻ Sync
- Відкрийте 🔍 Debug — перевірте
errors - Перевірте gateway health:
curl http://localhost:9300/health
Gateway падає при старті
docker logs dagi-gateway-node2 --tail 50
Типова причина: ImportError у http_api_doc.py → doc_service.py
Рішення: перевірте що в doc_service.py є stub-функції (doc_service, update_document, list_document_versions, publish_document_artifact).
SQLite "no such column: last_applied_hash"
БД у volume має стару схему. Вирішення — міграції виконуються автоматично при старті через _MIGRATION_SQL_STMTS у db.py. Restart контейнера вирішує:
docker restart sofiia-console
NODA2 gateway_url недоступний з контейнера
У config/nodes_registry.yml NODA2 використовує host.docker.internal:9300.
Якщо UI запущений не в Docker — замініть на localhost:9300.
Monitor / AISTALK не відображаються
Перевірте що в gateway-bot/http_api.py:
MONITOR_CONFIGіAISTALK_CONFIGвизначені черезload_agent_config- Вони додані в
AGENT_REGISTRY - Файл
gateway-bot/monitor_prompt.txtіснує
docker exec dagi-gateway-node2 python3 -c "
from http_api import AGENT_REGISTRY
print(list(AGENT_REGISTRY.keys()))
"
6. Monitor Policy
Monitor (agent_id=monitor) є обов'язковим агентом на кожній ноді.
Перевірка
APIKEY=$(grep SOFIIA_CONSOLE_API_KEY .env | cut -d= -f2)
curl -s "http://localhost:8002/api/agents?nodes=NODA1,NODA2" -H "X-API-Key: $APIKEY" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print('missing:', d.get('required_missing_nodes'))"
required_missing=[]— все ОКrequired_missing=[{"node_id":"NODA1","agent_id":"monitor"}]— Monitor відсутній на NODA1 → перевірте gateway registry → rebuild gateway
Governance event
Якщо Monitor відсутній на онлайн-ноді — автоматично записується governance_event типу node_required_agent_missing (severity=high).
7. Voice & Telegram Capabilities
У вкладці Agents:
- 🎙 Voice badge — агент підтримує голос (AISTALK)
- 💬 Telegram badge — агент активний у Telegram
- Фільтри 🎙 Voice і 💬 Telegram — client-side фільтрація
API
curl -s "http://localhost:8002/api/agents?nodes=NODA1" -H "X-API-Key: $APIKEY" | \
python3 -c "import sys,json; d=json.load(sys.stdin);
voice=[a['agent_id'] for a in d['items'] if a.get('capabilities',{}).get('voice')]
print('voice:', voice)"
8. Document Versioning
API для версій документів (в межах Sofiia Console):
# Список версій
GET /api/projects/{project_id}/documents/{doc_id}/versions
# Оновити документ (зберігає нову версію)
POST /api/projects/{project_id}/documents/{doc_id}/update
{"content_md": "# Новий зміст", "author_id": "user", "reason": "оновлення", "dry_run": false}
# Відновити версію
POST /api/projects/{project_id}/documents/{doc_id}/restore
{"version_id": "...", "author_id": "user"}
9. Agent Registry SSoT
Canonical реєстр: config/agent_registry.yml
Gateway завантажує агентів з gateway-bot/http_api.py::AGENT_REGISTRY (Python dict).
Щоб додати нового агента:
- Додайте запис в
config/agent_registry.yml - Додайте
*_CONFIG = load_agent_config(...)і запис вAGENT_REGISTRYуgateway-bot/http_api.py - Створіть
gateway-bot/<agent_id>_prompt.txt - Rebuild gateway
10. Ports Reference
| Сервіс | Port | URL |
|---|---|---|
| Sofiia Console UI | 8002 | http://localhost:8002 |
| Gateway | 9300 | http://localhost:9300/health |
| Router | 9102 | http://localhost:9102/health |
| Memory | 8000 | http://localhost:8000/health |
| Qdrant | 6333 | http://localhost:6333/healthz |