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