diff --git a/docker-compose.db.yml b/docker-compose.db.yml index 98dcbfcb..a1bb409b 100644 --- a/docker-compose.db.yml +++ b/docker-compose.db.yml @@ -15,6 +15,7 @@ services: volumes: - pgdata:/var/lib/postgresql/data - ./migrations:/docker-entrypoint-initdb.d:ro + - ./scripts:/scripts:ro networks: - dagi-network healthcheck: diff --git a/docs/DB_PERSISTENCE_FIX.md b/docs/DB_PERSISTENCE_FIX.md new file mode 100644 index 00000000..29060f50 --- /dev/null +++ b/docs/DB_PERSISTENCE_FIX.md @@ -0,0 +1,119 @@ +# Виправлення періодичної втрати даних PostgreSQL + +## Проблема + +База даних `daarion` втрачала дані періодично (другий раз за 4 години). При відновленні з бекапу зникали логотипи та банери. + +## Причини + +1. **Міграції не застосовуються автоматично**: `/docker-entrypoint-initdb.d` виконується тільки при першому створенні БД (коли volume порожній). При перезапуску контейнера міграції не застосовуються. + +2. **Конфлікт контейнерів**: Старий `dagi-postgres` контейнер міг конфліктувати з новим `daarion-postgres`. + +3. **Відсутність перевірки цілісності**: Немає автоматичної перевірки стану БД та застосування міграцій. + +4. **Втрата даних при відновленні**: Бекап міг бути створений до додавання колонок `banner_url` та `logo_url`. + +## Виправлення + +### 1. Створено скрипти для автоматизації + +- **`scripts/apply-migrations.sh`**: Застосовує всі міграції автоматично +- **`scripts/ensure-db-persistence.sh`**: Перевіряє цілісність БД та додає відсутні колонки +- **`scripts/db-health-check.sh`**: Періодична перевірка здоров'я БД + +### 2. Оновлено docker-compose.db.yml + +- Додано налаштування для правильного завершення роботи PostgreSQL +- Додано монтування скриптів для використання в контейнері + +### 3. Видалено старий контейнер + +- Видалено `dagi-postgres` для уникнення конфліктів + +## Використання + +### Автоматична перевірка (рекомендовано) + +Додати в cron для періодичної перевірки: + +```bash +# Перевірка кожні 30 хвилин +*/30 * * * * /opt/microdao-daarion/scripts/db-health-check.sh +``` + +### Ручна перевірка + +```bash +cd /opt/microdao-daarion +bash scripts/db-health-check.sh +``` + +### Застосування міграцій вручну + +```bash +cd /opt/microdao-daarion +bash scripts/apply-migrations.sh +``` + +## Перевірка персистентності + +### Перевірити volume + +```bash +docker volume inspect daarion_pgdata +ls -la /var/lib/docker/volumes/daarion_pgdata/_data/ +``` + +### Перевірити дані + +```bash +docker exec daarion-postgres psql -U postgres -d daarion -c "SELECT COUNT(*) FROM microdaos;" +docker exec daarion-postgres psql -U postgres -d daarion -c "SELECT slug, logo_url IS NOT NULL as has_logo, banner_url IS NOT NULL as has_banner FROM microdaos;" +``` + +## Відновлення з бекапу + +Якщо дані втрачені: + +```bash +cd /opt/microdao-daarion + +# 1. Створити БД (якщо не існує) +docker exec daarion-postgres psql -U postgres -c "CREATE DATABASE daarion;" + +# 2. Відновити з бекапу +docker exec -i daarion-postgres psql -U postgres -d daarion < db_backups/pre_migration_2025-12-02_02-00.sql + +# 3. Застосувати всі міграції (включаючи нові) +bash scripts/apply-migrations.sh + +# 4. Перевірити цілісність +bash scripts/db-health-check.sh +``` + +## Моніторинг + +Перевіряти логи: + +```bash +# Логи PostgreSQL +docker logs daarion-postgres --tail 50 + +# Логи health check +tail -f /var/log/db-health-check.log +``` + +## Запобігання втраті даних + +1. **Регулярні бекапи**: `db-backup` сервіс створює бекапи кожні 12 годин +2. **Періодична перевірка**: Використовувати `db-health-check.sh` в cron +3. **Моніторинг volume**: Перевіряти розмір volume регулярно +4. **Логи**: Відстежувати помилки в логах PostgreSQL + +## Наступні кроки + +1. Налаштувати cron для автоматичної перевірки +2. Додати алерти при виявленні проблем +3. Розглянути використання PostgreSQL replication для високої доступності +