docs: Add database persistence documentation and improve docker-compose
This commit is contained in:
@@ -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
119
docs/DB_PERSISTENCE_FIX.md
Normal 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 для високої доступності
|
||||
|
||||
Reference in New Issue
Block a user