💾 Docker Backups

Резервное копирование критично для PostgreSQL — это единственный источник истины. Volumes хранят данные независимо от контейнеров.

📊 Приоритеты бэкапа

P0 КРИТИЧНО
PostgreSQL

Все данные: пользователи, сессии, процессы, агенты, runtime policy, логи.

Volume: clowbot_postgres_data
P1 ВАЖНО
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 down
2
Восстановить данные
Для pg_dump: cat backup.sql | docker compose exec -T postgres psql
Для volume: tar xzf backup.tar.gz
3
Запустить сервисы
docker compose up -d
4
Проверить 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 для бинарного формата

🔗 Связанные страницы