4.5 KiB
4.5 KiB
Виправлення періодичної втрати даних PostgreSQL
Проблема
База даних daarion втрачала дані періодично (другий раз за 4 години). При відновленні з бекапу зникали логотипи та банери.
Причини
-
Міграції не застосовуються автоматично:
/docker-entrypoint-initdb.dвиконується тільки при першому створенні БД (коли volume порожній). При перезапуску контейнера міграції не застосовуються. -
Конфлікт контейнерів: Старий
dagi-postgresконтейнер міг конфліктувати з новимdaarion-postgres. -
Відсутність перевірки цілісності: Немає автоматичної перевірки стану БД та застосування міграцій.
-
Втрата даних при відновленні: Бекап міг бути створений до додавання колонок
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
Запобігання втраті даних
- Регулярні бекапи:
db-backupсервіс створює бекапи кожні 12 годин - Періодична перевірка: Використовувати
db-health-check.shв cron - Моніторинг volume: Перевіряти розмір volume регулярно
- Логи: Відстежувати помилки в логах PostgreSQL
Наступні кроки
- Налаштувати cron для автоматичної перевірки
- Додати алерти при виявленні проблем
- Розглянути використання PostgreSQL replication для високої доступності