Skip to content

# 🚀 MVP Deployment на НОДА1 — Комплексний Аналіз

Версія: 1.0.0
Дата: 25 листопада 2025
Статус: Ready for Execution
НОДА1 IP: 144.76.224.179
Domain: gateway.daarion.city

## 📊 Executive Summary

Після аналізу інфраструктури маємо:

### ✅ Що готово:

1. Phase 1-3 код готовий (Frontend MVP, Agents Core, City MVP, Second Me)
2. Міграції БД готові (001-010)
3. Docker Compose готовий (`docker-compose.all.yml`)
4. Сервіси зібрані (agents, city, secondme, microdao)
5. Nginx/SSL працює на НОДА1 (`gateway.daarion.city`)

### ⚠️ Потенційні ризики:

1. Мультимодальна система в процесі (Router v1.1.0, Telegram Enhanced)
2. Щоденні зміни на обох нодах
3. Невідомий стан production БД на НОДА1
4. Можливі конфлікти портів (хоча перевірка показує що немає)

### 🎯 Рекомендована стратегія:

Staged Deployment з isolation + rollback plan

## 🗺️ Інфраструктурна Картина

### НОДА1 (Production)

    144.76.224.179 (Hetzner GEX44)
    ├── DAGI Stack (17+ сервісів) ✅ ПРАЦЮЄ
    │   ├── Router (9102) — в процесі оновлення до v1.1.0 multimodal
    │   ├── Gateway (9300) — Telegram Gateway Enhanced
    │   ├── DevTools (8008)
    │   ├── Swapper (8890-8891)
    │   ├── Frontend (8899) — існуючий
    │   ├── PostgreSQL (5432) ⚠️ PRODUCTION DB
    │   ├── Redis (6379)
    │   ├── Neo4j (7687, 7474)
    │   ├── Qdrant (6333, 6334)
    │   ├── Grafana (3000)
    │   └── Prometheus (9090)
    │
    ├── Nginx (80, 443) ✅ SSL Let's Encrypt
    │   └── gateway.daarion.city → працює
    │
    └── /opt/microdao-daarion (project root)

### НОДА2 (Development)

    192.168.1.244 (MacBook Pro M4 Max)
    ├── Розробка Phase 1-3 ✅
    ├── Мультимодальні сервіси (STT, OCR, Web Search, Vector DB)
    └── /Users/apple/github-projects/microdao-daarion

### Phase 1-3 MVP (треба додати до НОДА1)

    Нові сервіси:
    ├── agents-service (7002) — Phase 2
    ├── city-service (7001) — Phase 3
    ├── secondme-service (7003) — Phase 3
    └── microdao-service (7004) — Phase 7

    Нові API endpoints:
    ├── /api/agents/* → 7002
    ├── /api/city/* → 7001
    ├── /api/secondme/* → 7003
    └── /api/microdao/* → 7004

    WebSocket:
    └── /ws/city/* → 7001

## 🔍 Аналіз Конфліктів

### ✅ Порти (Немає конфліктів!)

Існуючі (НОДА1) | Нові (MVP) | Статус
--- | --- | ---
9102 (Router) | 7002 (Agents) | ✅ OK
9300 (Gateway) | 7001 (City) | ✅ OK
8008 (DevTools) | 7003 (Second Me) | ✅ OK
8890 (Swapper) | 7004 (MicroDAO) | ✅ OK
8899 (Frontend) | - | ⚠️ Може потребувати оновлення

### ⚠️ База Даних (Критично!)

Ситуація: - НОДА1 має production PostgreSQL (`daarion_memory`) - MVP потребує нові таблиці (міграції 007-010) - Невідомо чи існуючі таблиці не конфліктують

Рішення: 1. Backup перед міграцією (обов'язково!) 2. Перевірити існуючі таблиці перед застосуванням міграцій 3. Rollback план готовий

### ⚠️ Nginx Config (Потребує оновлення)

Існуючий config:

    /etc/nginx/sites-available/daarion
    ├── /telegram/webhook → 9300
    └── /helion/telegram/webhook → 9300

Треба додати:

    location /api/agents/ { proxy_pass http://127.0.0.1:7002/; }
    location /api/city/ { proxy_pass http://127.0.0.1:7001/; }
    location /api/secondme/ { proxy_pass http://127.0.0.1:7003/; }
    location /api/microdao/ { proxy_pass http://127.0.0.1:7004/; }
    location /ws/city/ {
        proxy_pass http://127.0.0.1:7001/ws/city/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

## 🎯 Deployment Strategy: STAGED ROLLOUT

### Фаза 0: PRE-FLIGHT (На НОДА2)

Мета: Підготовка коду

    cd /Users/apple/github-projects/microdao-daarion

    # 1. Commit всі зміни
    git add .
    git commit -m "Phase 1-3: Ready for NODE1 deployment"
    git push origin main

    # 2. Перевірити що всі файли на місці
    ls -la services/{agents,city,secondme,microdao}-service/
    ls -la migrations/00{7,8,9,10}_*.sql

Checklist: - [ ] Git push виконано - [ ] Всі сервіси мають Dockerfile - [ ] Міграції 007-010 існують - [ ] docker-compose.all.yml оновлено (якщо потрібно)

### Фаза 1: BACKUP & ANALYSIS (На НОДА1)

Мета: Захистити production і зібрати інформацію

    # SSH на НОДА1
    ssh root@144.76.224.179
    cd /opt/microdao-daarion

    # 1. Backup PostgreSQL (КРИТИЧНО!)
    docker exec daarion-postgres pg_dump -U postgres daarion_memory > \
      /root/backups/daarion_memory_$(date +%Y%m%d_%H%M%S).sql

    # 2. Перевірити існуючі таблиці
    docker exec daarion-postgres psql -U postgres -d daarion_memory -c "\dt"

    # 3. Перевірити існуючі сервіси
    docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

    # 4. Перевірити порти
    sudo netstat -tulpn | grep LISTEN | grep -E "700[1-4]|9102|9300"

    # 5. Перевірити Nginx config
    cat /etc/nginx/sites-available/daarion

Checklist: - [ ] Backup БД створено (перевірити розмір файлу!) - [ ] Список таблиць збережено - [ ] Порти 7001-7004 вільні - [ ] Nginx config збережено

### Фаза 2: CODE SYNC (На НОДА1)

Мета: Синхронізувати код з GitHub

    cd /opt/microdao-daarion

    # 1. Перевірити поточний стан
    git status
    git log --oneline -5

    # 2. Pull нових змін
    git fetch origin
    git pull origin main

    # 3. Перевірити що файли прибули
    ls -la services/{agents,city,secondme,microdao}-service/Dockerfile
    ls -la migrations/007_*.sql migrations/008_*.sql migrations/009_*.sql migrations/010_*.sql

Checklist: - [ ] Git pull успішний - [ ] Нові сервіси присутні - [ ] Міграції 007-010 на місці

### Фаза 3: ENVIRONMENT CONFIG (На НОДА1)

Мета: Налаштувати змінні оточення

    cd /opt/microdao-daarion

    # 1. Backup існуючого .env
    cp .env .env.backup.$(date +%Y%m%d_%H%M%S)

    # 2. Додати нові змінні
    cat >> .env << 'EOF'

    # ============================================================================
    # PHASE 1-3 MVP SERVICES
    # ============================================================================

    # Service URLs
    AGENTS_SERVICE_URL=http://agents-service:7002
    CITY_SERVICE_URL=http://city-service:7001
    SECONDME_SERVICE_URL=http://secondme-service:7003
    MICRODAO_SERVICE_URL=http://microdao-service:7004

    # City Configuration
    CITY_DEFAULT_ROOMS=general,welcome,builders,science,energy
    SECONDME_AGENT_ID=ag_secondme_global

    # WebSocket
    WS_BASE_URL=wss://gateway.daarion.city/ws

    # Frontend (якщо потрібно оновити)
    VITE_API_BASE_URL=https://gateway.daarion.city/api
    VITE_WS_BASE_URL=wss://gateway.daarion.city/ws

    EOF

    # 3. Перевірити
    tail -20 .env

Checklist: - [ ] .env backup створено - [ ] Нові змінні додано - [ ] Синтаксис правильний

### Фаза 4: DATABASE MIGRATIONS (На НОДА1)

Мета: Застосувати міграції 007-010

⚠️ КРИТИЧНА ФАЗА — МОЖЛИВІСТЬ ROLLBACK

    cd /opt/microdao-daarion

    # Перевірити які міграції вже застосовані (якщо є tracking)
    # або вручну перевірити чи існують таблиці

    # Застосувати міграції (ПО ОДНІЙ!)
    echo "Applying 007_create_agents_tables.sql..."
    docker exec -i daarion-postgres psql -U postgres -d daarion_memory < \
      migrations/007_create_agents_tables.sql

    echo "Applying 008_create_microdao_core.sql..."
    docker exec -i daarion-postgres psql -U postgres -d daarion_memory < \
      migrations/008_create_microdao_core.sql

    echo "Applying 009_create_dao_core.sql..."
    docker exec -i daarion-postgres psql -U postgres -d daarion_memory < \
      migrations/009_create_dao_core.sql

    echo "Applying 010_create_city_backend.sql..."
    docker exec -i daarion-postgres psql -U postgres -d daarion_memory < \
      migrations/010_create_city_backend.sql

    # Перевірити що таблиці створені
    docker exec daarion-postgres psql -U postgres -d daarion_memory -c "\dt" | \
      grep -E "agents|city|secondme|microdao"

Якщо помилка:

    # ROLLBACK: Відновити з backup
    docker exec -i daarion-postgres psql -U postgres -d daarion_memory < \
      /root/backups/daarion_memory_YYYYMMDD_HHMMSS.sql

Checklist: - [ ] Міграція 007 успішна - [ ] Міграція 008 успішна - [ ] Міграція 009 успішна - [ ] Міграція 010 успішна - [ ] Нові таблиці підтверджені

### Фаза 5: DOCKER BUILD (На НОДА1)

Мета: Зібрати нові сервіси

    cd /opt/microdao-daarion

    # Build нових сервісів (один за одним для діагностики)
    docker compose -f docker-compose.all.yml build agents-service
    docker compose -f docker-compose.all.yml build city-service
    docker compose -f docker-compose.all.yml build secondme-service
    docker compose -f docker-compose.all.yml build microdao-service

    # Перевірити що образи створені
    docker images | grep -E "agents-service|city-service|secondme|microdao"

Checklist: - [ ] agents-service образ створено - [ ] city-service образ створено - [ ] secondme-service образ створено - [ ] microdao-service образ створено

### Фаза 6: SERVICE STARTUP (На НОДА1)

Мета: Запустити нові сервіси (БЕЗ перезапуску існуючих!)

    cd /opt/microdao-daarion

    # Запустити ТІЛЬКИ нові сервіси
    docker compose -f docker-compose.all.yml up -d agents-service city-service secondme-service microdao-service

    # Моніторити старт (перші 30 секунд критичні)
    docker compose -f docker-compose.all.yml logs -f agents-service city-service secondme-service microdao-service

    # В окремому терміналі перевірити health
    watch -n 2 "docker ps | grep -E 'agents-service|city-service|secondme|microdao'"

Що моніторити: - [ ] Контейнери запустилися (не в Restarting стані) - [ ] Логи не містять критичних помилок - [ ] БД з'єднання успішні - [ ] Health endpoints відповідають

### Фаза 7: NGINX UPDATE (На НОДА1)

Мета: Додати нові endpoints до Nginx

    # Backup існуючого config
    sudo cp /etc/nginx/sites-available/daarion \
      /etc/nginx/sites-available/daarion.backup.$(date +%Y%m%d_%H%M%S)

    # Додати нові location blocks (ПЕРЕД останньою фігурною дужкою сервера)
    sudo vim /etc/nginx/sites-available/daarion

Додати цей блок:

        # ========================================================================
        # PHASE 1-3 MVP API ENDPOINTS
        # ========================================================================

        location /api/agents/ {
            proxy_pass http://127.0.0.1:7002/;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Request-Id $request_id;
        }

        location /api/city/ {
            proxy_pass http://127.0.0.1:7001/;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Request-Id $request_id;
        }

        location /api/secondme/ {
            proxy_pass http://127.0.0.1:7003/;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Request-Id $request_id;
        }

        location /api/microdao/ {
            proxy_pass http://127.0.0.1:7004/;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Request-Id $request_id;
        }

        # WebSocket для City
        location /ws/city/ {
            proxy_pass http://127.0.0.1:7001/ws/city/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_read_timeout 86400;
        }

    # Перевірити синтаксис
    sudo nginx -t

    # Якщо OK — reload
    sudo systemctl reload nginx

    # Перевірити статус
    sudo systemctl status nginx

Checklist: - [ ] Backup Nginx config створено - [ ] Нові location blocks додано - [ ] `nginx -t` успішний - [ ] `systemctl reload nginx` успішний

### Фаза 8: SMOKE TESTS (На НОДА1)

Мета: Перевірити що все працює

    # 1. Health checks (локально)
    curl http://localhost:7001/health  # City
    curl http://localhost:7002/health  # Agents
    curl http://localhost:7003/health  # Second Me
    curl http://localhost:7004/health  # MicroDAO

    # 2. Health checks (через Nginx/SSL)
    curl https://gateway.daarion.city/api/city/health
    curl https://gateway.daarion.city/api/agents/health
    curl https://gateway.daarion.city/api/secondme/health
    curl https://gateway.daarion.city/api/microdao/health

    # 3. City Rooms API
    curl https://gateway.daarion.city/api/city/rooms | jq

    # 4. WebSocket (через wscat або websocat)
    websocat wss://gateway.daarion.city/ws/city/rooms/general

Expected Results: - [ ] Всі health endpoints → 200 OK - [ ] City Rooms API → 5 default rooms - [ ] WebSocket → connection established

### Фаза 9: MONITORING (На НОДА1)

Мета: Переконатися що система стабільна

    # 1. Перевірити логи (перші 5 хвилин)
    docker compose -f docker-compose.all.yml logs --tail=100 -f agents-service city-service

    # 2. Перевірити ресурси
    docker stats --no-stream

    # 3. Перевірити Prometheus metrics (якщо доступний)
    curl http://localhost:9090/api/v1/query?query=up | jq

    # 4. Grafana (якщо налаштований)
    # Відкрити http://localhost:3000 і перевірити дашборди

Checklist: - [ ] Немає error логів (перші 5 хвилин) - [ ] CPU/RAM в нормі - [ ] Prometheus бачить нові таргети - [ ] Grafana показує метрики

## 🚨 Rollback Plan

### Якщо Фаза 6 (Service Startup) failed:

    # 1. Зупинити нові сервіси
    docker compose -f docker-compose.all.yml stop agents-service city-service secondme-service microdao-service

    # 2. Видалити контейнери
    docker compose -f docker-compose.all.yml rm -f agents-service city-service secondme-service microdao-service

    # 3. Відкатити БД
    docker exec -i daarion-postgres psql -U postgres -d daarion_memory < \
      /root/backups/daarion_memory_YYYYMMDD_HHMMSS.sql

    # 4. Система повернулась до початкового стану

### Якщо Фаза 7 (Nginx Update) failed:

    # Відновити Nginx config
    sudo cp /etc/nginx/sites-available/daarion.backup.YYYYMMDD_HHMMSS \
      /etc/nginx/sites-available/daarion

    # Reload
    sudo systemctl reload nginx

## 📋 Final Checklist

### Pre-Deployment:

- [ ] Git push з НОДА2 виконано
- [ ] Backup БД на НОДА1 створено (і перевірено!)
- [ ] .env файл оновлено
- [ ] Nginx backup створено

### Deployment:

- [ ] Git pull на НОДА1 успішний
- [ ] Міграції 007-010 застосовані
- [ ] Нові сервіси зібрані
- [ ] Нові сервіси запущені
- [ ] Nginx config оновлено
- [ ] Nginx reload успішний

### Post-Deployment:

- [ ] Health checks: 4/4 ✅
- [ ] City Rooms API працює
- [ ] WebSocket підключення працює
- [ ] Логи без критичних помилок
- [ ] Існуючі DAGI сервіси працюють стабільно
- [ ] Monitoring налаштовано

## 🎯 Success Criteria

MVP вважається успішно задеплоєним якщо:

1. ✅ Всі 4 нові сервіси запущені і healthy
2. ✅ API endpoints доступні через `https://gateway.daarion.city/api/*`
3. ✅ WebSocket працює через `wss://gateway.daarion.city/ws/city/*`
4. ✅ City Rooms API повертає 5 default rooms
5. ✅ Існуючі DAGI сервіси НЕ постраждали
6. ✅ Prometheus/Grafana бачать нові сервіси
7. ✅ Немає критичних помилок в логах (перші 30 хвилин)

## 🔮 Next Steps (Після успішного deployment)

1. Frontend Integration — Оновити Frontend (port 8899) для роботи з новими API
2. Multimodal Integration — Коли документи готові, інтегрувати STT/OCR/Web Search
3. Load Testing — Перевірити навантаження на нові сервіси
4. Documentation Update — Оновити INFRASTRUCTURE.md з новими сервісами
5. Monitoring Dashboards — Створити Grafana дашборди для Phase 1-3

## 📞 Emergency Contacts

Якщо щось йде не так: - Backup БД: `/root/backups/daarion_memory_*.sql` - Rollback command: `docker compose -f docker-compose.all.yml stop ...` - Nginx restore: `sudo cp /etc/nginx/sites-available/daarion.backup.* ...`

Документ створено: Cursor AI Assistant
Для проєкту: MicroDAO DAARION
Останнє оновлення: 2025-11-25