# 🔴 КРИТИЧНЕ ВИПРАВЛЕННЯ: Періодична втрата даних ## Дата виявлення: 2025-12-05 ## Симптоми - Дані (MicroDAO, агенти) періодично зникають - "MicroDAO не знайдено" - "Агенти не знайдені" (0 агентів) - Це відбувалось **щодня** ## Коренева причина **НЕСКІНЧЕННИЙ ЦИКЛ DROP DATABASE:** 1. `monitor-db-stability.sh` (cron кожні 5 хвилин) перевіряв: - Якщо агентів < 50 → **DROP DATABASE** і відновити з бекапу 2. **Проблема**: Бекап від 2025-12-02 **НЕ МАВ NODE2 агентів** (50 агентів) 3. Після відновлення з бекапу: лише 9 MicroDAO, 9 core агентів 4. 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 **Старе (ПОМИЛКОВЕ):** ```bash # Якщо агентів < 50 → DROP DATABASE if [ "$AGENT_COUNT" -lt 50 ]; then DROP DATABASE RESTORE FROM BACKUP fi ``` **Нове (ПРАВИЛЬНЕ):** ```bash # 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 агентами ```bash 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 | Нічого не робити | ## Перевірка ```bash # Поточний стан 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 ```bash # Перевірити що monitor не робить DROP tail -50 /var/log/db-stability-monitor.log # Має показувати: # ✅ Data integrity OK # АБО # 🟡 WARNING: NODE2 agents missing. Starting SOFT RECOVERY (no DROP)... ``` ## Cron jobs ```bash 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.