Files
microdao-daarion/docs/DB_DATA_LOSS_FIX.md

117 lines
4.5 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.
# Виправлення періодичної втрати даних
## Проблема
Дані (MicroDAO, агенти) періодично зникають з бази даних, що призводить до помилок на сайті:
- "MicroDAO не знайдено"
- "Агенти не знайдені" (0 агентів)
- "Помилка завантаження агентів"
## Причини
1. **PostgreSQL перезапускається** і втрачає дані через проблеми з персистентністю
2. **Міграції не застосовуються** при перезапуску (initdb.d працює тільки при першому створенні)
3. **Відновлення з бекапу не працює** через активні з'єднання до БД
4. **Monitor не виявляє втрату NODE2 агентів** (перевіряє тільки загальну кількість)
## Виправлення
### 1. Покращений monitor-db-stability.sh
- ✅ Виправлено обробку порожніх змінних
- ✅ Додано перевірку NODE2 агентів (має бути ≥45 з 50)
- ✅ Збільшено поріг для агентів (≥50 замість ≥10)
- ✅ Додано завершення активних з'єднань перед відновленням БД
- ✅ Покращено логування та верифікацію після відновлення
### 2. Автоматичне відновлення
Monitor працює кожні 5 хвилин через cron і:
1. Перевіряє кількість MicroDAO (має бути ≥5)
2. Перевіряє загальну кількість агентів (має бути ≥50)
3. Перевіряє кількість NODE2 агентів (має бути ≥45)
4. Якщо дані втрачені:
- Завершує активні з'єднання
- Відновлює БД з бекапу
- Застосовує міграції
- Синхронізує NODE2 агентів
- Видаляє тестових агентів
- Виправляє URLs логотипів та банерів
### 3. Налаштування PostgreSQL
В `docker-compose.db.yml` додано параметри для кращої персистентності:
- `checkpoint_timeout=15min` - частіші checkpoint'и
- `max_wal_size=1GB` - більший розмір WAL
- `wal_level=replica` - рівень логування для реплікації
## Перевірка
### Перевірити поточний стан
```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;
"
```
### Перевірити логи monitor
```bash
tail -50 /var/log/db-stability-monitor.log
```
### Перевірити cron job
```bash
crontab -l | grep monitor
# Має бути: */5 * * * * /opt/microdao-daarion/scripts/monitor-db-stability.sh >> /var/log/db-stability-monitor.log 2>&1
```
## Якщо дані все ще втрачаються
1. **Перевірити бекапи:**
```bash
ls -lh /opt/microdao-daarion/db_backups/
```
2. **Перевірити логи PostgreSQL:**
```bash
docker logs daarion-postgres --since 1h | grep -i "error\|fatal\|panic"
```
3. **Перевірити volume персистентність:**
```bash
docker volume inspect daarion_pgdata
```
4. **Запустити monitor вручну:**
```bash
cd /opt/microdao-daarion
bash scripts/monitor-db-stability.sh
```
## Очікуваний результат
- MicroDAO: 9
- Агенти: 59 (9 core + 50 NODE2)
- NODE2 агенти: 50
- Monitor працює кожні 5 хвилин
- Автоматичне відновлення при втраті даних
## Статус
✅ Monitor покращено
✅ Перевірка NODE2 агентів додана
✅ Автоматичне відновлення працює
✅ URLs логотипів/банерів виправляються автоматично
Проблема має бути вирішена. Якщо дані все ще втрачаються, потрібно перевірити:
- Чи працює cron job
- Чи є актуальні бекапи
- Чи є проблеми з volume персистентністю