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
5.5 KiB
NODA1 Incident Log
INC-2026-002 | 2026-02-27 | Gateway Workers + SenpAI + facts/upsert
Severity: SEV-1 (всі агенти не відповідали користувачам) Status: RESOLVED Duration: ~3 дні (з 2026-02-21 09:55 по 2026-02-27 23:15)
Summary
Після апгрейду Redis до 8.6.1 та ряду змін у коді gateway два воркери зависли,
SenpAI повертав 500, а facts/upsert падав з InvalidColumnReferenceError.
В сукупності агенти не відповідали у Telegram.
Root Causes (3 незалежні)
| # | Компонент | Причина |
|---|---|---|
| 1 | dagi-gateway-worker-node1 |
Після Redis 8.6.1 upgrade старі TCP-сокети async-клієнта → ReadOnlyError у brpop() |
| 2 | dagi-gateway-reminder-worker-node1 |
Та сама проблема застарілих з'єднань після Redis upgrade |
| 3 | SenpAI webhook → Router |
.env: ROUTER_URL=http://dagi-staging-router:8000 (staging!) замість http://router:8000 |
| 4 | memory-service /facts/upsert |
ensure_facts_table() DDL застарілий: UNIQUE(user_id, team_id, fact_key) → asyncpg кешував старий prepared statement без agent_id; ON CONFLICT не знаходив matching constraint |
| 5 | get_doc_context() |
Підпис функції не мав agent_id=None параметра, хоча http_api.py передавав його |
Timeline
| Час (UTC+1) | Подія |
|---|---|
| 2026-02-21 09:55 | Остання успішна обробка (agromatrix) |
| 2026-02-26 13:09 | Початок ReadOnlyError у gateway-worker (Redis upgrade) |
| 2026-02-27 17:02 | Поновлення помилок worker після перезапусків |
| 2026-02-27 19:49 | Повна блокада gateway-worker (останній restart) |
| 2026-02-27 22:46 | Перезапуск dagi-gateway-worker-node1 → стабільний |
| 2026-02-27 22:47 | Перезапуск dagi-gateway-reminder-worker-node1 → стабільний |
| 2026-02-28 00:01 | Виправлено ensure_facts_table() → memory-service rebuilt |
| 2026-02-28 00:05 | Виправлено ROUTER_URL, get_doc_context() → gateway rebuilt |
| 2026-02-28 00:15 | Всі 14 агентів HTTP 200 ✓ |
Fixes Applied (на сервері /opt/microdao-daarion)
1. docker restart dagi-gateway-worker-node1 dagi-gateway-reminder-worker-node1
2. services/memory-service/app/database.py:
- ensure_facts_table() замінено на noop (таблиця управляється міграціями)
- Скопійовано відсутні файли: integration_endpoints.py, integrations.py, voice_endpoints.py
3. gateway-bot/services/doc_service.py:
- get_doc_context(session_id: str) → get_doc_context(session_id: str, agent_id: str = None)
4. .env:
- ROUTER_URL=http://dagi-staging-router:8000 → ROUTER_URL=http://router:8000
5. Rebuild + restart: memory-service, gateway, gateway-worker, gateway-reminder-worker
Verification
All 14 agents HTTP 200:
✓ senpai ✓ helion ✓ nutra ✓ daarwizz ✓ greenfood ✓ agromatrix
✓ alateya ✓ druid ✓ clan ✓ eonarch ✓ oneok ✓ soul
✓ yaromir ✓ sofiia
facts/upsert: {"status":"ok"}
Gateway: healthy, 14 agents
Action Items (TODO)
- Після Redis upgrade — завжди перезапускати workers (додати в runbook)
- Виправити
ensure_facts_table()в коді репозиторію (локально) - Виправити
get_doc_context()сигнатуру в локальному репо - Виправити
.envв репозиторії (або.env.example) — прибрати staging router URL - Додати liveness probe для workers: exit(1) при повторних ReadOnlyError
- Алерт: "No messages processed for X minutes"
INC-2026-003 | 2026-02-28 | Ollama resource crash → всі агенти 503
Severity: SEV-1 (всі агенти не відповідали у Telegram) Status: RESOLVED Duration: ~8 годин (з 07:53 по ~16:00 UTC+1)
Root Cause
Ollama впала з помилкою model runner has unexpectedly stopped, this may be due to resource limitations. Модель qwen3:8b (27.8B params, ~17GB) перевищила ресурси сервера під навантаженням → Router отримував 500 від Ollama → повертав 503 клієнту. Всі агенти були налаштовані на provider: ollama.
Fix Applied
Переключено всі агенти в router-config.yml з qwen3_*_8b профілів → cloud_deepseek:
- 14 агентів тепер використовують
deepseek-chatчерез DeepSeek API - Router перезапущено для підхвачення нового конфігу
Verification
helion: 🌐 Trying DEEPSEEK API → HTTP 200, 15222 tokens
All 14 agents: ✓ HTTP 200
Action Items
- Backup
router-config.yml.bak_20260228→ зберегти в репо - Розглянути переведення Ollama на меншу модель (smollm2:135m або qwen3-vl:8b) для vision-задач
- Додати fallback в Router: якщо Ollama 500 → автоматично cloud_deepseek
INC-2026-001 | (попередні інциденти)
(додати при потребі)