Files
microdao-daarion/NODE1_RUNBOOK.md
Apple 0c8bef82f4 feat: Add Alateya, Clan, Eonarch agents + fix gateway-router connection
## Agents Added
- Alateya: R&D, biotech, innovations
- Clan (Spirit): Community spirit agent
- Eonarch: Consciousness evolution agent

## Changes
- docker-compose.node1.yml: Added tokens for all 3 new agents
- gateway-bot/http_api.py: Added configs and webhook endpoints
- gateway-bot/clan_prompt.txt: New prompt file
- gateway-bot/eonarch_prompt.txt: New prompt file

## Fixes
- Fixed ROUTER_URL from :9102 to :8000 (internal container port)
- All 9 Telegram agents now working

## Documentation
- Created PROJECT-MASTER-INDEX.md - single entry point
- Added various status documents and scripts

Tokens configured:
- Helion, NUTRA, Agromatrix (existing)
- Alateya, Clan, Eonarch (new)
- Druid, GreenFood, DAARWIZZ (configured)
2026-01-28 06:40:34 -08:00

419 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🚨 NODE1 Recovery & Safety Runbook
**Version:** 1.0
**Last Updated:** 2026-01-26
**Target:** НОДА1 Production (144.76.224.179)
---
## 0. Golden Signals (що вважаємо нормою)
### Health Endpoints (HTTP 200)
| Сервіс | Порт | Endpoint | Container |
|--------|------|----------|-----------|
| Router | 9102 | `/health` | dagi-router-node1 |
| Gateway | 9300 | `/health` | dagi-gateway |
| Memory Service | 8000 | `/health` | dagi-memory-service-node1 |
| RAG Service | 9500 | `/health` | rag-service-node1 |
| Swapper | 8890 | `/health` | swapper-service-node1 |
| Qdrant | 6333 | `/healthz` | dagi-qdrant-node1 |
| Vision Encoder | 8001 | `/health` | dagi-vision-encoder-node1 |
| Parser Pipeline | 8101 | `/health` | parser-pipeline |
| Prometheus | 9090 | `/-/healthy` | prometheus |
| Grafana | 3030 | `/api/health` | grafana |
### By Design (норма — не є проблемою)
| Сервіс | Порт | Статус | Причина |
|--------|------|--------|---------|
| RBAC | 9200 | Internal only | Порт не опублікований, доступ через docker network |
| Image-gen | 8892 | Не запущено | Використовується swapper-service замість |
| Parser | 9400 | Відсутній | Замінено на parser-pipeline:8101 |
---
## 1. Тріаж за 2 хвилини
### 1.1 Підключення до НОДА1
```bash
ssh root@144.76.224.179
cd /opt/microdao-daarion
```
### 1.2 Статус контейнерів
```bash
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | head -30
```
### 1.3 Швидкий health check всіх сервісів
```bash
echo "=== HEALTH CHECK ===" && \
curl -sS -m 3 -o /dev/null -w "Router 9102: %{http_code}\n" http://127.0.0.1:9102/health && \
curl -sS -m 3 -o /dev/null -w "Gateway 9300: %{http_code}\n" http://127.0.0.1:9300/health && \
curl -sS -m 3 -o /dev/null -w "Memory 8000: %{http_code}\n" http://127.0.0.1:8000/health && \
curl -sS -m 3 -o /dev/null -w "RAG 9500: %{http_code}\n" http://127.0.0.1:9500/health && \
curl -sS -m 3 -o /dev/null -w "Swapper 8890: %{http_code}\n" http://127.0.0.1:8890/health && \
curl -sS -m 3 -o /dev/null -w "Qdrant 6333: %{http_code}\n" http://127.0.0.1:6333/healthz && \
curl -sS -m 3 -o /dev/null -w "Vision 8001: %{http_code}\n" http://127.0.0.1:8001/health && \
curl -sS -m 3 -o /dev/null -w "Parser 8101: %{http_code}\n" http://127.0.0.1:8101/health && \
curl -sS -m 3 -o /dev/null -w "Prometheus 9090: %{http_code}\n" http://127.0.0.1:9090/-/healthy && \
curl -sS -m 3 -o /dev/null -w "Grafana 3030: %{http_code}\n" http://127.0.0.1:3030/api/health
```
### 1.4 Логи ключових сервісів
```bash
# Router
docker logs dagi-router-node1 --tail 50
# Gateway
docker logs dagi-gateway --tail 50
# Memory Service
docker logs dagi-memory-service-node1 --tail 50
# Qdrant
docker logs dagi-qdrant-node1 --tail 50
```
---
## 2. Плейбуки відновлення
### A) Memory Service не може підключитися до Qdrant
**Симптоми:**
- Memory health → 500
- Логи: "Temporary failure in name resolution" або "connection refused"
**Діагностика:**
```bash
# Перевірити env
docker exec dagi-memory-service-node1 env | grep -E "QDRANT"
# Перевірити DNS resolution
docker exec dagi-memory-service-node1 python3 -c "import socket; print(socket.gethostbyname('dagi-qdrant-node1'))"
```
**Фікс:**
```bash
# 1. Зупинити і видалити контейнер
docker stop dagi-memory-service-node1
docker rm dagi-memory-service-node1
# 2. Запустити з правильним QDRANT_HOST
docker run -d \
--name dagi-memory-service-node1 \
--network dagi-network \
--network-alias memory-service \
-p 8000:8000 \
-e MEMORY_POSTGRES_HOST=dagi-postgres \
-e MEMORY_POSTGRES_PORT=5432 \
-e MEMORY_POSTGRES_USER=daarion \
-e MEMORY_POSTGRES_PASSWORD=DaarionDB2026! \
-e MEMORY_POSTGRES_DB=daarion_memory \
-e MEMORY_QDRANT_HOST=dagi-qdrant-node1 \
-e MEMORY_QDRANT_PORT=6333 \
-e MEMORY_DEBUG=false \
-e MEMORY_COHERE_API_KEY=nOdOXnuepLku2ipJWpe6acWgAsJCsDhMO0RnaEJB \
--restart unless-stopped \
microdao-daarion-memory-service:latest
# 3. Перевірити
sleep 5 && curl -sS http://127.0.0.1:8000/health
```
### B) Qdrant повільний/падає (диск/пам'ять)
**Симптоми:** latency, OOM-kill, 5xx
**Діагностика:**
```bash
# Логи
docker logs dagi-qdrant-node1 --tail 100
# Ресурси
df -h
free -m
docker stats --no-stream | grep qdrant
```
**Якщо диск майже повний:**
```bash
# Очистити старі логи
find /var/log -name "*.log" -mtime +7 -delete
# Список снапшотів Qdrant
curl -s http://localhost:6333/snapshots
# Видалити старі снапшоти (обережно!)
# curl -X DELETE "http://localhost:6333/snapshots/<snapshot_name>"
# Перезапустити Qdrant
docker restart dagi-qdrant-node1
```
### C) Parser Pipeline не обробляє jobs
**Симптоми:** черга не рухається, RAG не наповнюється
**Діагностика:**
```bash
docker logs parser-pipeline --tail 100
curl -sS http://127.0.0.1:8101/health
```
**Фікс:**
```bash
docker restart parser-pipeline
sleep 5 && curl -sS http://127.0.0.1:8101/health
```
### D) Grafana/Prometheus не працює
**Діагностика:**
```bash
curl -sS http://127.0.0.1:9090/-/healthy
curl -sS http://127.0.0.1:3030/api/health
docker logs prometheus --tail 50
docker logs grafana --tail 50
```
**Фікс:**
```bash
docker restart prometheus grafana
```
### E) Gateway не приймає webhook-и
**Симптоми:** Telegram боти не відповідають
**Діагностика:**
```bash
docker logs dagi-gateway --tail 100 | grep -E "error|webhook|telegram"
curl -sS http://127.0.0.1:9300/health
```
**Фікс:**
```bash
docker restart dagi-gateway
sleep 5 && curl -sS http://127.0.0.1:9300/health
```
---
## 3. Безпечний стандартний рестарт
**Порядок (від edge до core):**
```bash
# 1. Edge services
docker restart dagi-router-node1 dagi-gateway
# 2. Core services
docker restart rag-service-node1 dagi-memory-service-node1 swapper-service-node1
# 3. Processing pipelines
docker restart dagi-vision-encoder-node1 parser-pipeline
# 4. Observability (в кінці)
docker restart prometheus grafana
# 5. Verify all
sleep 10 && curl -sS http://127.0.0.1:9102/health && echo " Router OK"
```
**НЕ ЧІПАТИ БЕЗ ПОТРЕБИ:**
- `dagi-qdrant-node1` — vector DB з даними
- `dagi-postgres` — PostgreSQL з даними
- `dagi-neo4j-node1` — Graph DB з даними
---
## 4. Backup / Rollback
### Перед ризиковими змінами
```bash
# 1. Qdrant snapshot
curl -X POST "http://localhost:6333/snapshots"
# 2. Compose backup
cp docker-compose.node1.yml docker-compose.node1.yml.backup.$(date +%Y%m%d_%H%M%S)
# 3. Перевірити PostgreSQL бекапи
ls -la /opt/backups/postgres/
```
### Відкат compose
```bash
# Знайти останній бекап
ls -la docker-compose.node1.yml.backup.*
# Відкотити
cp docker-compose.node1.yml.backup.<timestamp> docker-compose.node1.yml
docker compose -f docker-compose.node1.yml up -d
```
### Відкат Qdrant (restore drill)
```bash
# 1. Список снапшотів
curl -s http://localhost:6333/snapshots
# 2. Відновлення (на тестовому інстансі спочатку!)
# УВАГА: це перезапише всі дані!
# curl -X POST "http://localhost:6333/snapshots/recover" \
# -H "Content-Type: application/json" \
# -d '{"location": "file:///qdrant/snapshots/<snapshot_name>"}'
```
---
## 5. Інцидентний протокол
### При виникненні проблеми:
1. **Зафіксувати** час + симптом
2. **Тріаж** (Section 1) — локалізувати проблему
3. **Backup** перед змінами (якщо торкаємось даних)
4. **Мінімальна дія** → перевірка health
5. **Задокументувати** в `NODA1-CURRENT-STATUS-YYYY-MM-DD.md`:
- Причина
- Що змінив
- Як перевіряв
- Що зробити щоб не повторилось
### Ескалація
- **Level 1:** Перезапуск сервісу
- **Level 2:** Перевірка логів, DNS, мережі
- **Level 3:** Відкат до backup
- **Level 4:** Повний rebuild з останнього golden snapshot
---
## 6. Контакти та ресурси
- **SSH:** `ssh root@144.76.224.179`
- **Grafana:** http://144.76.224.179:3030
- **Prometheus:** http://144.76.224.179:9090
- **Qdrant Dashboard:** http://144.76.224.179:6333/dashboard
### Документація
- `NODA1-README.md` — головний README
- `INFRASTRUCTURE.md` — повна інфраструктура
- `NODA1-CURRENT-STATUS-*.md` — поточний статус
---
---
## 7. Rate Limit / Proxy Recovery
### Архітектура захисту (після hardening)
```
Internet → [UFW] → Nginx:80/443 → Gateway:9300 (localhost)
[Rate Limit: 10 req/s]
[iptables DOCKER-USER]
Internal services (blocked from outside)
```
### Якщо Nginx не працює
```bash
# Перевірка статусу
systemctl status nginx
# Перегляд логів
tail -50 /var/log/nginx/error.log
# Перезапуск
systemctl restart nginx
# Якщо config broken
nginx -t
# Відновити з backup
cp /etc/nginx/conf.d/node1-api.conf.backup /etc/nginx/conf.d/node1-api.conf
nginx -t && systemctl reload nginx
```
### Якщо треба тимчасово відкрити порт (для діагностики)
```bash
# Тимчасово видалити блокування для порту 9300
iptables -D DOCKER-USER -p tcp --dport 9300 ! -s 127.0.0.1 -j DROP
# Повернути блокування
iptables -I DOCKER-USER -p tcp --dport 9300 ! -s 127.0.0.1 -j DROP
```
### Якщо rate limit занадто strict
```bash
# Змінити ліміт в nginx
vim /etc/nginx/conf.d/node1-api.conf
# Знайти: rate=10r/s → rate=20r/s
# Знайти: burst=20 → burst=40
nginx -t && systemctl reload nginx
```
### Відновити iptables після reboot
```bash
# Якщо правила зникли після reboot
iptables-restore < /etc/iptables.rules
# Перевірка
iptables -L DOCKER-USER -n | grep DROP
```
### Доступ до Grafana/Prometheus (через SSH tunnel)
```bash
# З вашого ноутбука:
ssh -L 3030:localhost:3030 -L 9090:localhost:9090 root@144.76.224.179
# Потім в браузері:
# Grafana: http://localhost:3030
# Prometheus: http://localhost:9090
```
---
## 8. Конфігураційні файли
| Файл | Призначення |
|------|-------------|
| `/etc/nginx/conf.d/node1-api.conf` | Nginx proxy + rate limit |
| `/etc/iptables.rules` | Firewall rules backup |
| `/opt/microdao-daarion/ops/status.sh` | Health check script |
| `/opt/microdao-daarion/ops/hardening/apply-node1-firewall.sh` | UFW hardening script |
| `/opt/microdao-daarion/monitoring/prometheus/rules/node1.rules.yml` | Alerting rules |
---
**Maintained by:** DAARION Team
**Last Review:** 2026-01-26