Skip to content

# 🔴 КРИТИЧНЕ ВИПРАВЛЕННЯ: Періодична втрата даних

## Дата виявлення: 2025-12-05

## Симптоми

- Дані (MicroDAO, агенти) періодично зникають
- "MicroDAO не знайдено"
- "Агенти не знайдені" (0 агентів)
- Це відбувалось щодня

## Коренева причина

НЕСКІНЧЕННИЙ ЦИКЛ DROP DATABASE:

1. `monitor-db-stability.sh` (cron кожні 5 хвилин) перевіряв:

2. Якщо агентів < 50 → DROP DATABASE і відновити з бекапу

3. Проблема: Бекап від 2025-12-02 НЕ МАВ NODE2 агентів (50 агентів)

4. Після відновлення з бекапу: лише 9 MicroDAO, 9 core агентів

5. Monitor знову бачив < 50 агентів → знову DROP → НЕСКІНЧЕННИЙ ЦИКЛ!

    ┌─────────────────────────────────────────────────────────────────┐
    │  Monitor бачить: Agents=9 (< 50)                                │
    │  ↓                                                              │
    │  DROP DATABASE daarion                                          │
    │  ↓                                                              │
    │  Restore from backup (без NODE2 агентів)                        │
    │  ↓                                                              │
    │  Agents=9 знову                                                 │
    │  ↓                                                              │
    │  Monitor бачить: Agents=9 (< 50) → ЦИКЛ ПОВТОРЮЄТЬСЯ            │
    └─────────────────────────────────────────────────────────────────┘

## Виправлення

### 1. Змінено логіку monitor-db-stability.sh

Старе (ПОМИЛКОВЕ):

    # Якщо агентів < 50 → DROP DATABASE
    if [ "$AGENT_COUNT" -lt 50 ]; then
      DROP DATABASE
      RESTORE FROM BACKUP
    fi

Нове (ПРАВИЛЬНЕ):

    # CASE 1: CRITICAL - MicroDAOs missing → FULL RECOVERY (DROP)
    if [ "$MICRODAO_COUNT" -lt 5 ]; then
      DROP DATABASE
      RESTORE FROM BACKUP

    # CASE 2: SOFT - MicroDAOs exist but agents missing → just sync agents (NO DROP!)
    elif [ "$NODE2_AGENT_COUNT" -lt 45 ]; then
      # NO DROP DATABASE!
      python3 sync-node2-dagi-agents.py
    fi

### 2. Створено новий бекап з NODE2 агентами

    full_backup_with_node2_2025-12-05_02-41.sql  # 183KB з 59 агентами
    pre_migration_2025-12-02_02-00.sql           # 162KB без NODE2 агентів

### 3. Пріоритет бекапів

Monitor тепер спочатку шукає `full_backup_with_node2*.sql`, потім інші.

## Два режими відновлення

Ситуація | Режим | Дія
--- | --- | ---
MicroDAOs < 5 | 🔴 FULL RECOVERY | DROP DATABASE + restore + sync
MicroDAOs ≥ 5, NODE2 < 45 | 🟡 SOFT RECOVERY | Тільки sync NODE2 агентів (NO DROP!)
Все в нормі | ✅ OK | Нічого не робити

## Перевірка

    # Поточний стан
    docker exec daarion-postgres psql -U postgres -d daarion -c "
    SELECT
      (SELECT COUNT(*) FROM microdaos) as microdaos,
      (SELECT COUNT(*) FROM agents) as agents,
      (SELECT COUNT(*) FROM agents WHERE node_id = 'node-2-macbook-m4max') as node2_agents;
    "

    # Очікуваний результат:
    # microdaos | agents | node2_agents
    # ----------+--------+--------------
    #         9 |     59 |           50

## Логи monitor

    # Перевірити що monitor не робить DROP
    tail -50 /var/log/db-stability-monitor.log

    # Має показувати:
    # ✅ Data integrity OK
    # АБО
    # 🟡 WARNING: NODE2 agents missing. Starting SOFT RECOVERY (no DROP)...

## Cron jobs

    crontab -l
    # */5 * * * * /opt/microdao-daarion/scripts/monitor-db-stability.sh
    # */30 * * * * /opt/microdao-daarion/scripts/db-health-check.sh

## Файли, що були змінені

- `scripts/monitor-db-stability.sh` - головний фікс
- `db_backups/full_backup_with_node2_*.sql` - новий бекап

## Статус: ✅ ВИРІШЕНО

Проблема виникала через логічну помилку в monitor-db-stability.sh. Виправлено розділенням на два режими: FULL та SOFT recovery. Тепер DROP DATABASE відбувається тільки при критичній втраті MicroDAOs.