Files
microdao-daarion/docs/NODA1_DEPLOY_STEPAN_V3.md
Apple 67225a39fa docs(platform): add policy configs, runbooks, ops scripts and platform documentation
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
2026-03-03 07:14:53 -08:00

198 lines
7.1 KiB
Markdown
Raw 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.
# НОДА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 на ~510 хвилин. Якщо SSH відмовляє — почекайте 10 хв і пробуйте через IPv6.
3. **DeepSeek модель** — за замовчуванням `deepseek-chat`. Можна змінити через `DEEPSEEK_MODEL=deepseek-reasoner`.
4. **`AGX_OPERATOR_IDS`** — це числові Telegram user_id. Дізнатись свій: написати @userinfobot у Telegram.