docs: Add database persistence documentation and improve docker-compose
This commit is contained in:
@@ -15,6 +15,7 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql/data
|
||||||
- ./migrations:/docker-entrypoint-initdb.d:ro
|
- ./migrations:/docker-entrypoint-initdb.d:ro
|
||||||
|
- ./scripts:/scripts:ro
|
||||||
networks:
|
networks:
|
||||||
- dagi-network
|
- dagi-network
|
||||||
healthcheck:
|
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