vm:evolution_api:02-backup

Это старая версия документа!


Автоматическое резервное копирование Evolution API

Данная инструкция описывает настройку автоматического ежедневного резервного копирования Evolution API с помощью bash скрипта и cron. Бекап выполняется каждый день в 3:00 утра с временной остановкой сервисов.

⚠️ Важно: Evolution API будет недоступен в течение 1-2 минут во время создания резервной копии.

  • store/ - пользовательские данные Evolution API
  • instances/ - инстансы и сессии WhatsApp
  • postgres_data/ - база данных PostgreSQL
  • redis_data/ - кеш Redis
  • docker-compose.yml - конфигурация контейнеров
  • Docker и Docker Compose установлены
  • Evolution API запущен в директории /opt/evolution-api/
  • Права root или sudo доступ
  • Достаточно места на диске для хранения бекапов
# Создайте директории для скрипта и бекапов
sudo mkdir -p /opt/scripts
sudo mkdir -p /opt/evolution-api/backups
 
# Проверьте существование Evolution API
ls -la /opt/evolution-api/

Создайте файл скрипта:

sudo nano /opt/scripts/evolution-backup.sh

Скопируйте следующее содержимое в файл:

evolution-backup.sh
#!/bin/bash
 
# Скрипт резервного копирования Evolution API
# Запуск: /opt/scripts/evolution-backup.sh
 
# Настройки
COMPOSE_FILE="/opt/evolution-api/docker-compose.yml"
EVOLUTION_DIR="/opt/evolution-api"
BACKUP_DIR="/opt/evolution-api/backups"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_NAME="evolution_backup_${DATE}"
RETENTION_DAYS=30  # Храним бекапы 30 дней
 
# Логирование
LOG_FILE="${BACKUP_DIR}/backup.log"
 
# Функция логирования
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
 
# Создаем директорию для бекапов если не существует
mkdir -p "$BACKUP_DIR"
 
log "=== Начало резервного копирования Evolution API ==="
 
# Проверяем что compose файл существует
if [ ! -f "$COMPOSE_FILE" ]; then
    log "ОШИБКА: Файл $COMPOSE_FILE не найден!"
    exit 1
fi
 
# Переходим в директорию с Evolution
cd "$EVOLUTION_DIR" || {
    log "ОШИБКА: Не удалось перейти в директорию $EVOLUTION_DIR"
    exit 1
}
 
# Останавливаем контейнеры
log "Останавливаем контейнеры Evolution API..."
docker-compose -f "$COMPOSE_FILE" down
 
if [ $? -eq 0 ]; then
    log "Контейнеры успешно остановлены"
else
    log "ОШИБКА: Не удалось остановить контейнеры"
    exit 1
fi
 
# Ждем пару секунд для полной остановки
sleep 5
 
# Создаем архив с данными
log "Создаем архив данных..."
BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
 
tar -czf "$BACKUP_PATH" \
    --exclude='*.log' \
    --exclude='**/lost+found' \
    store/ \
    instances/ \
    postgres_data/ \
    redis_data/ \
    docker-compose.yml
 
if [ $? -eq 0 ]; then
    log "Архив создан: $BACKUP_PATH"
 
    # Получаем размер архива
    BACKUP_SIZE=$(du -h "$BACKUP_PATH" | cut -f1)
    log "Размер архива: $BACKUP_SIZE"
else
    log "ОШИБКА: Не удалось создать архив"
 
    # Пытаемся запустить контейнеры даже при ошибке
    log "Запускаем контейнеры после ошибки..."
    docker-compose -f "$COMPOSE_FILE" up -d
    exit 1
fi
 
# Запускаем контейнеры обратно
log "Запускаем контейнеры Evolution API..."
docker-compose -f "$COMPOSE_FILE" up -d
 
if [ $? -eq 0 ]; then
    log "Контейнеры успешно запущены"
else
    log "ОШИБКА: Не удалось запустить контейнеры"
    exit 1
fi
 
# Ждем запуска сервисов
sleep 10
 
# Проверяем что все контейнеры работают
log "Проверяем статус контейнеров..."
if docker-compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then
    log "Контейнеры работают корректно"
else
    log "ПРЕДУПРЕЖДЕНИЕ: Некоторые контейнеры могут работать некорректно"
fi
 
# Удаляем старые бекапы
log "Удаляем бекапы старше $RETENTION_DAYS дней..."
find "$BACKUP_DIR" -name "evolution_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete
 
# Показываем статистику бекапов
BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/evolution_backup_*.tar.gz 2>/dev/null | wc -l)
log "Общее количество бекапов: $BACKUP_COUNT"
 
log "=== Резервное копирование завершено успешно ==="
 
# Отправляем уведомление (опционально)
# curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
#     -d chat_id="<CHAT_ID>" \
#     -d text="✅ Evolution API backup completed: $BACKUP_NAME ($BACKUP_SIZE)"
 
exit 0
# Сделайте скрипт исполняемым
sudo chmod +x /opt/scripts/evolution-backup.sh
 
# Проверьте права доступа
ls -la /opt/scripts/evolution-backup.sh

⚠️ Внимание: Тестирование временно остановит Evolution API на 1-2 минуты.

# Запустите тестовое резервное копирование
sudo /opt/scripts/evolution-backup.sh
 
# Проверьте создание бекапа
ls -la /opt/evolution-api/backups/
 
# Посмотрите логи
cat /opt/evolution-api/backups/backup.log

Ожидаемый результат:

/opt/evolution-api/backups/
├── evolution_backup_20240828_123456.tar.gz
└── backup.log

Откройте crontab для root:

sudo crontab -e

Добавьте следующую строку в конец файла:

# Резервное копирование Evolution API каждый день в 3:00
0 3 * * * /opt/scripts/evolution-backup.sh >/dev/null 2>&1

Сохраните и выйдите из редактора.

# Проверьте что задача добавлена
sudo crontab -l
 
# Проверьте статус службы cron
sudo systemctl status cron
 
# Убедитесь что cron запущен
sudo systemctl enable cron
sudo systemctl start cron
/opt/
├── scripts/
│   └── evolution-backup.sh
└── evolution-api/
    ├── docker-compose.yml
    ├── store/
    ├── instances/
    ├── postgres_data/
    ├── redis_data/
    └── backups/
        ├── evolution_backup_20240828_030001.tar.gz
        ├── evolution_backup_20240829_030001.tar.gz
        └── backup.log
# Показать последний созданный бекап
ls -lt /opt/evolution-api/backups/evolution_backup_*.tar.gz | head -1
 
# Размеры всех бекапов
du -sh /opt/evolution-api/backups/evolution_backup_*.tar.gz
# Последние 20 строк лога
tail -20 /opt/evolution-api/backups/backup.log
 
# Поиск ошибок в логах
grep "ОШИБКА" /opt/evolution-api/backups/backup.log
# Удалить бекапы старше 30 дней вручную
find /opt/evolution-api/backups/ -name "evolution_backup_*.tar.gz" -mtime +30 -delete
 
# Показать количество бекапов
ls -1 /opt/evolution-api/backups/evolution_backup_*.tar.gz | wc -l

🚨 ОСТОРОЖНО: Восстановление полностью заменит текущие данные!

1. Остановите Evolution API:

cd /opt/evolution-api/
sudo docker-compose down

2. Сделайте резервную копию текущих данных (опционально):

sudo mv store store_old_$(date +%Y%m%d)
sudo mv instances instances_old_$(date +%Y%m%d)
sudo mv postgres_data postgres_data_old_$(date +%Y%m%d)
sudo mv redis_data redis_data_old_$(date +%Y%m%d)

3. Восстановите данные из архива:

# Выберите нужный бекап
ls -la /opt/evolution-api/backups/evolution_backup_*.tar.gz
 
# Распакуйте архив (замените YYYYMMDD_HHMMSS на нужную дату)
sudo tar -xzf /opt/evolution-api/backups/evolution_backup_YYYYMMDD_HHMMSS.tar.gz

4. Запустите Evolution API:

sudo docker-compose up -d

5. Проверьте работоспособность:

sudo docker-compose ps
sudo docker-compose logs -f

Для изменения времени запуска отредактируйте crontab:

sudo crontab -e

Примеры расписания:

# Каждый день в 2:30
30 2 * * * /opt/scripts/evolution-backup.sh

# Каждое воскресенье в 4:00
0 4 * * 0 /opt/scripts/evolution-backup.sh

# Дважды в день (6:00 и 18:00)
0 6,18 * * * /opt/scripts/evolution-backup.sh

Для получения уведомлений в Telegram раскомментируйте и настройте строки в конце скрипта:

# Получите токен бота и ID чата
# Раскомментируйте и настройте:
curl -s -X POST "https://api.telegram.org/bot<ВАШ_ТОКЕН>/sendMessage" \
    -d chat_id="<ВАШ_CHAT_ID>" \
    -d text="✅ Evolution API backup completed: $BACKUP_NAME ($BACKUP_SIZE)"

Отредактируйте переменную в скрипте:

# Хранить бекапы 60 дней
RETENTION_DAYS=60
 
# Хранить бекапы 7 дней
RETENTION_DAYS=7

1. Скрипт не запускается:

  • Проверьте права доступа: sudo chmod +x /opt/scripts/evolution-backup.sh
  • Проверьте пути в скрипте
  • Убедитесь что Docker запущен: sudo systemctl status docker

2. Контейнеры не останавливаются:

  • Проверьте что путь к docker-compose.yml правильный
  • Убедитесь что файл существует: ls -la /opt/evolution-api/docker-compose.yml

3. Недостаточно места для бекапов:

  • Проверьте свободное место: df -h /opt/evolution-api/backups/
  • Уменьшите период хранения бекапов
  • Настройте ротацию логов

4. Cron не запускается:

  • Проверьте статус: sudo systemctl status cron
  • Проверьте синтаксис crontab: sudo crontab -l
  • Посмотрите системные логи: sudo journalctl -u cron
# Проверить последнее выполнение cron
sudo grep -i evolution /var/log/syslog | tail -5
 
# Проверить размер директории с данными
du -sh /opt/evolution-api/
 
# Тест Docker команд
cd /opt/evolution-api/
sudo docker-compose ps
sudo docker-compose config

После выполнения всех шагов у вас будет настроено автоматическое ежедневное резервное копирование Evolution API. Система будет:

  • ✅ Автоматически создавать бекапы каждый день в 3:00
  • ✅ Сохранять все критически важные данные
  • ✅ Автоматически удалять старые бекапы
  • ✅ Вести подробные логи операций
  • ✅ Обеспечивать быстрое восстановление при необходимости

💡 Рекомендация: Периодически тестируйте восстановление из бекапов на тестовой среде, чтобы убедиться в работоспособности системы резервного копирования.

  • vm/evolution_api/02-backup.1756372198.txt.gz
  • Последнее изменение: 2025/08/28 09:09
  • admin