Skip to content

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

    # Перевірка кожні 30 хвилин
    */30 * * * * /opt/microdao-daarion/scripts/db-health-check.sh

### Ручна перевірка

    cd /opt/microdao-daarion
    bash scripts/db-health-check.sh

### Застосування міграцій вручну

    cd /opt/microdao-daarion
    bash scripts/apply-migrations.sh

## Перевірка персистентності

### Перевірити volume

    docker volume inspect daarion_pgdata
    ls -la /var/lib/docker/volumes/daarion_pgdata/_data/

### Перевірити дані

    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;"

## Відновлення з бекапу

Якщо дані втрачені:

    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

## Моніторинг

Перевіряти логи:

    # Логи 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 для високої доступності