Files
microdao-daarion/docs/DB_PERSISTENCE_FIX.md

4.5 KiB

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