docs: Add database persistence documentation and improve docker-compose

This commit is contained in:
Apple
2025-12-02 13:42:45 -08:00
parent 488dd13af2
commit 2bc00b99a8
2 changed files with 120 additions and 0 deletions

View File

@@ -15,6 +15,7 @@ services:
volumes:
- pgdata:/var/lib/postgresql/data
- ./migrations:/docker-entrypoint-initdb.d:ro
- ./scripts:/scripts:ro
networks:
- dagi-network
healthcheck:

119
docs/DB_PERSISTENCE_FIX.md Normal file
View File

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