💾 Docker Backups
Резервное копирование критично для PostgreSQL — это единственный источник истины. Volumes хранят данные независимо от контейнеров.
📊 Приоритеты бэкапа
P0 КРИТИЧНО
PostgreSQL
Все данные: пользователи, сессии, процессы, агенты, runtime policy, логи.
Volume:
clowbot_postgres_dataP1 ВАЖНО
n8n Data
Credentials, активные workflows, encryption key.
Ollama Models
Скачанные модели (~4GB каждая). Можно восстановить, но долго.
P2 ЖЕЛАТЕЛЬНО
.env— переменные окруженияdb/init/*.sql— миграции (уже в git)НЕ НУЖНО
voice_data— временные файлыprometheus_data— метрики пересоберутся🐘 Бэкап PostgreSQL
Сравнение методов
pg_dump
✅ Рекомендуется
✅ Переносимо
✅ Читаемый SQL
⚠️ Медленнее
Volume tar
✅ Быстро
✅ Полный бэкап
❌ Зависит от версии
❌ Требует остановку
pg_basebackup
✅ PITR
✅ Репликация
⚠️ Сложнее
⚠️ Overkill
Метод 1: pg_dump (рекомендуется)
# Полный дамп базы в SQL формате
docker compose exec postgres pg_dump -U clowbot clowbot > backup_$(date +%Y%m%d).sql
# Сжатый дамп (меньше места)
docker compose exec postgres pg_dump -U clowbot clowbot | gzip > backup_$(date +%Y%m%d).sql.gz
# Восстановление из SQL
cat backup.sql | docker compose exec -T postgres psql -U clowbot clowbot
# Восстановление из сжатого
gunzip -c backup.sql.gz | docker compose exec -T postgres psql -U clowbot clowbot
Плюсы:
- • Переносимо между версиями PostgreSQL
- • Читаемый SQL (можно редактировать)
- • Выборочное восстановление таблиц
- • Работает на живой базе
Минусы:
- • Медленнее на больших базах
- • Больше размер файла
- • Требует CPU для сжатия
Метод 2: Volume Backup
⚠️ Требует остановку сервисов! Не делайте на живой базе.
# 1. Остановить сервисы
docker compose down
# 2. Бэкап volume
docker run --rm \\
-v clowbot_postgres_data:/data \\
-v $(pwd)/backups:/backup \\
alpine tar czf /backup/postgres_$(date +%Y%m%d).tar.gz /data
# Восстановление
docker run --rm \\
-v clowbot_postgres_data:/data \\
-v $(pwd)/backups:/backup \\
alpine tar xzf /backup/postgres_20240308.tar.gz -C /
Важно: Volume backup зависит от версии PostgreSQL. При обновлении мажорной версии (14→15) бэкап может не работать.
📅 Retention Policy
Рекомендуемая политика хранения
7
дневных
daily
4
недельных
weekly
12
месячных
monthly
∞
годовых
yearly
# Скрипт ротации бэкапов
find /backups -name "clowbot_*.sql.gz" -mtime +7 -delete
🤖 Автоматизация
Cronjob для ежедневных бэкапов
# /etc/cron.d/clowbot-backup
# Ежедневный бэкап в 3:00 ночи
0 3 * * * root cd /opt/clowbot && docker compose exec -T postgres pg_dump -U clowbot clowbot | gzip > /backups/daily/clowbot_$(date +\%Y\%m\%d).sql.gz
# Удаление старых бэкапов (старше 7 дней)
0 4 * * * root find /backups/daily -name "clowbot_*.sql.gz" -mtime +7 -delete
💡 Совет: Используйте отдельные директории для daily/weekly/monthly бэкапов.
✅ Проверка бэкапов
🚨 Бэкап не существует, пока не проверен!
Ежемесячно:
- Восстанавливать бэкап на тестовом сервере
- Проверять целостность данных
- Документировать время восстановления
Еженедельно:
- Проверять размер файла (не пустой ли)
- Проверять возможность распаковки gzip
- Проверять наличие записей в SQL
# Быстрая проверка бэкапа
gunzip -t backup.sql.gz # проверка целостности gzip
head -100 backup.sql # проверка содержимого
grep "CREATE TABLE" backup.sql | wc -l # количество таблиц
🚑 План восстановления
5 шагов восстановления
1
Остановить
docker compose down
2
Восстановить
pg_restore / tar
3
Запустить
docker compose up -d
4
Проверить
health checks
5
Тест
Telegram бот
Детальная процедура
1
Остановить все сервисы
docker compose down2
Восстановить данные
Для pg_dump:
Для volume:
cat backup.sql | docker compose exec -T postgres psqlДля volume:
tar xzf backup.tar.gz3
Запустить сервисы
docker compose up -d4
Проверить health checks
docker compose ps— все должны быть "healthy"5
Тест в Telegram
Отправить
/health боту, проверить что он отвечает.🔧 Troubleshooting
pg_dump падает с ошибкой
- Проверьте что postgres контейнер запущен
- Проверьте connection string: -U clowbot clowbot
- Проверьте права пользователя в БД
Восстановление зависло
- Большой файл — подождите
- Проверьте место на диске: df -h
- Проверьте логи: docker compose logs postgres
Бэкап слишком большой
- Используйте gzip сжатие
- Исключите большие таблицы: --exclude-table=audit_logs
- Используйте --format=custom для бинарного формата