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
198 lines
7.1 KiB
Markdown
198 lines
7.1 KiB
Markdown
# НОДА1 — Deploy Humanized Stepan v3
|
||
|
||
**Дата підготовки:** 2026-02-25
|
||
**Статус:** ready-to-deploy
|
||
**LLM:** DeepSeek (primary) або OpenAI (fallback)
|
||
|
||
---
|
||
|
||
## Передумови
|
||
|
||
- SSH доступ до НОДА1 (root@144.76.224.179 або root@2a01:4f8:201:2a6::2)
|
||
- `DEEPSEEK_API_KEY` або `OPENAI_API_KEY` (хоча б один)
|
||
- Telegram user_id оператора для `AGX_OPERATOR_IDS`
|
||
|
||
---
|
||
|
||
## Крок 1 — Скопіювати файли на НОДА1
|
||
|
||
З локальної машини (де є репо):
|
||
|
||
```bash
|
||
cd /path/to/microdao-daarion
|
||
|
||
# Всі Stepan v3 модулі
|
||
scp -6 \
|
||
crews/agromatrix_crew/llm_factory.py \
|
||
crews/agromatrix_crew/depth_classifier.py \
|
||
crews/agromatrix_crew/memory_manager.py \
|
||
crews/agromatrix_crew/light_reply.py \
|
||
crews/agromatrix_crew/telemetry.py \
|
||
crews/agromatrix_crew/reflection_engine.py \
|
||
crews/agromatrix_crew/style_adapter.py \
|
||
crews/agromatrix_crew/session_context.py \
|
||
crews/agromatrix_crew/proactivity.py \
|
||
crews/agromatrix_crew/run.py \
|
||
crews/agromatrix_crew/stepan_system_prompt_v2.txt \
|
||
crews/agromatrix_crew/stepan_system_prompt_v2.7.txt \
|
||
"root@[2a01:4f8:201:2a6::2]:/opt/microdao-daarion/crews/agromatrix_crew/"
|
||
|
||
# Agents з DeepSeek LLM
|
||
scp -6 \
|
||
crews/agromatrix_crew/agents/stepan_orchestrator.py \
|
||
crews/agromatrix_crew/agents/operations_agent.py \
|
||
crews/agromatrix_crew/agents/iot_agent.py \
|
||
crews/agromatrix_crew/agents/platform_agent.py \
|
||
crews/agromatrix_crew/agents/spreadsheet_agent.py \
|
||
crews/agromatrix_crew/agents/sustainability_agent.py \
|
||
"root@[2a01:4f8:201:2a6::2]:/opt/microdao-daarion/crews/agromatrix_crew/agents/"
|
||
|
||
# gateway-bot http_api.py (з оновленим sys.path та stepan_enabled)
|
||
scp -6 \
|
||
gateway-bot/http_api.py \
|
||
"root@[2a01:4f8:201:2a6::2]:/opt/microdao-daarion/gateway-bot/"
|
||
```
|
||
|
||
---
|
||
|
||
## Крок 2 — Скопіювати crews у gateway-bot volume (на НОДА1)
|
||
|
||
```bash
|
||
# НА НОДА1:
|
||
# Синхронізуємо crews у gateway-bot volume
|
||
rsync -av /opt/microdao-daarion/crews/ /opt/microdao-daarion/gateway-bot/crews/
|
||
rsync -av /opt/microdao-daarion/packages/agromatrix-tools/ /opt/microdao-daarion/gateway-bot/agromatrix-tools/ 2>/dev/null || true
|
||
|
||
# Перевірити що файли є в контейнері
|
||
docker exec dagi-gateway-node1 ls /app/gateway-bot/crews/agromatrix_crew/ | head -20
|
||
```
|
||
|
||
---
|
||
|
||
## Крок 3 — Налаштувати env (секрети)
|
||
|
||
```bash
|
||
# НА НОДА1 — створити/оновити env файл
|
||
cat > /opt/microdao-daarion/.env.stepan.node1 << 'EOF'
|
||
DEEPSEEK_API_KEY=sk-ВАШИЙ_КЛЮЧ_DEEPSEEK
|
||
AGX_STEPAN_MODE=inproc
|
||
AGX_OPERATOR_IDS=ВАШ_TELEGRAM_USER_ID
|
||
TZ=Europe/Kyiv
|
||
EOF
|
||
|
||
chmod 600 /opt/microdao-daarion/.env.stepan.node1
|
||
```
|
||
|
||
Потім переконайтесь що `docker-compose.node1.yml` підключає цей файл у секції `gateway → env_file`:
|
||
|
||
```yaml
|
||
# У docker-compose.node1.yml, секція gateway/environment або після volumes:
|
||
env_file:
|
||
- .env.stepan.node1
|
||
```
|
||
|
||
> **Якщо env_file не хочете чіпати** — можна додати змінні прямо в секцію `environment:` compose файлу як `DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}` і export їх у shell перед `docker compose up`.
|
||
|
||
---
|
||
|
||
## Крок 4 — Перезапустити gateway
|
||
|
||
```bash
|
||
cd /opt/microdao-daarion
|
||
|
||
# Варіант А — простий restart (якщо volume і env вже на місці, без rebuild)
|
||
docker compose -f docker-compose.node1.yml restart dagi-gateway-node1
|
||
sleep 15
|
||
|
||
# Варіант Б — повний rebuild (якщо змінився Dockerfile або requirements)
|
||
docker compose -f docker-compose.node1.yml up -d --build gateway
|
||
sleep 30
|
||
|
||
# Health check
|
||
curl -s http://127.0.0.1:9300/health
|
||
```
|
||
|
||
---
|
||
|
||
## Крок 5 — Перевірити старт
|
||
|
||
```bash
|
||
# Лог старту (20 сек після restart)
|
||
docker logs dagi-gateway-node1 --since 3m 2>&1 | grep -E "Stepan|STEPAN|ImportError|ModuleNotFoundError|LLM:" | tail -20
|
||
|
||
# Env у контейнері (маскований)
|
||
docker exec dagi-gateway-node1 env | grep -E "DEEPSEEK|OPENAI|AGX_" | sed 's/=.*/=***/'
|
||
|
||
# Тест імпортів
|
||
docker exec dagi-gateway-node1 python3 -c "
|
||
import sys; sys.path.insert(0, '/app/gateway-bot'); sys.path.insert(0, '/app/gateway-bot/agromatrix-tools')
|
||
from crews.agromatrix_crew.session_context import load_session
|
||
from crews.agromatrix_crew.depth_classifier import classify_depth
|
||
from crews.agromatrix_crew.llm_factory import make_llm
|
||
print('imports OK')
|
||
llm = make_llm()
|
||
print('LLM:', type(llm).__name__ if llm else 'None - NO API KEY!')
|
||
"
|
||
```
|
||
|
||
---
|
||
|
||
## Крок 6 — 5 Smoketests (Telegram, оператор)
|
||
|
||
| # | Повідомлення | Очікування | Grep |
|
||
|---|---|---|---|
|
||
| 1 | `Привіт` | ≤80 символів, без "чим допомогти" | `depth=light, crew_launch=false` |
|
||
| 2 | `/whoami` | Показує user_id та is_operator=True | — |
|
||
| 3 | `Зроби план на завтра по полю 12` | Deep, crew запущений | `depth=deep, crew_launch=true` |
|
||
| 4 | `а на після завтра?` | Light (stability guard або follow-up) | `depth=light` |
|
||
| 5 | `Дякую` | ≤40 символів | `crew_launch=false` |
|
||
|
||
---
|
||
|
||
## Крок 7 — Telemetry моніторинг (перші 30 хв)
|
||
|
||
```bash
|
||
# Всі AGX_STEPAN_METRIC події
|
||
docker logs dagi-gateway-node1 --since 30m 2>&1 | grep "AGX_STEPAN_METRIC" | tail -80
|
||
|
||
# Depth розподіл
|
||
docker logs dagi-gateway-node1 --since 30m 2>&1 | grep "AGX_STEPAN_METRIC depth" | \
|
||
awk '{for(i=1;i<=NF;i++) if($i~/^depth=/) print $i}' | sort | uniq -c
|
||
|
||
# Session layer
|
||
docker logs dagi-gateway-node1 --since 30m 2>&1 | grep "AGX_STEPAN_METRIC session_"
|
||
|
||
# LLM (DeepSeek) active
|
||
docker logs dagi-gateway-node1 --since 30m 2>&1 | grep "LLM:" | tail -5
|
||
```
|
||
|
||
---
|
||
|
||
## Rollback (якщо щось пішло не так)
|
||
|
||
```bash
|
||
cd /opt/microdao-daarion
|
||
|
||
# Відновити попередній http_api.py
|
||
git checkout HEAD -- gateway-bot/http_api.py
|
||
|
||
# Видалити скопійовані crews з volume
|
||
rm -rf /opt/microdao-daarion/gateway-bot/crews
|
||
rm -rf /opt/microdao-daarion/gateway-bot/agromatrix-tools
|
||
|
||
# Restart без Stepan
|
||
docker compose -f docker-compose.node1.yml restart dagi-gateway-node1
|
||
```
|
||
|
||
---
|
||
|
||
## Важливі примітки
|
||
|
||
1. **Volume mount `:ro`** — `gateway-bot` монтується як read-only. Тому `crews/` і `agromatrix-tools/` скопійовані прямо в `/opt/microdao-daarion/gateway-bot/` (і відповідно видимі в контейнері як `/app/gateway-bot/crews/`).
|
||
|
||
2. **fail2ban** — при частих SSH-підключеннях сервер тимчасово блокує IP на ~5–10 хвилин. Якщо SSH відмовляє — почекайте 10 хв і пробуйте через IPv6.
|
||
|
||
3. **DeepSeek модель** — за замовчуванням `deepseek-chat`. Можна змінити через `DEEPSEEK_MODEL=deepseek-reasoner`.
|
||
|
||
4. **`AGX_OPERATOR_IDS`** — це числові Telegram user_id. Дізнатись свій: написати @userinfobot у Telegram.
|