# Виправлення періодичної втрати даних 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 для високої доступності