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
113 lines
5.5 KiB
Markdown
113 lines
5.5 KiB
Markdown
# 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 | (попередні інциденти)
|
||
|
||
_(додати при потребі)_
|