vm:evolution_api:02-backup

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
vm:evolution_api:02-backup [2025/08/28 09:18] adminvm:evolution_api:02-backup [2025/08/29 09:01] (текущий) admin
Строка 1: Строка 1:
-====== Автоматическое резервное копирование Evolution API ======+====== Резервное копирование Evolution API ======
  
-===== Описание =====+===== Описание системы =====
  
-Данная инструкция описывает настройку автоматического ежедневного резервного копирования Evolution API с помощью bash скрипта и cron. Бекап выполняется каждый день в **3:00 утра** с временной остановкой сервисов.+Evolution API - это система для работы с WhatsApp Business API, развернутая в Docker контейнерах. Система состоит из: 
 +  * **evolution-api** - основное приложение API 
 +  * **evolution_postgres** - база данных PostgreSQL 15 
 +  * **redis** - кэш и хранилище сессий
  
-⚠️ **Важно:** Evolution API будет недоступен в течение 1-2 минут во время создания резервной копии.+<note important> 
 +Данная инструкция предназначена для систем с Evolution API, развернутой через Docker Compose в директории `/opt/evolution-api/`. 
 +</note>
  
-===== Что входит в резервную копию =====+===== Компоненты для резервного копирования =====
  
-  * **store/** - пользовательские данные Evolution API +Скрипт создает резервные копии следующих компонентов:
-  * **instances/** - инстансы и сессии WhatsApp +
-  * **postgres_data/** - база данных PostgreSQL +
-  * **redis_data/** - кеш Redis +
-  * **docker-compose.yml** - конфигурация контейнеров+
  
-===== Предварительные требования =====+^ Компонент ^ Описание ^ Расположение ^ 
 +| **store/** | Файлы и медиа сообщений | `/opt/evolution-api/store/` | 
 +| **instances/** | Конфигурации инстансов WhatsApp | `/opt/evolution-api/instances/` | 
 +| **postgres_data/** | Физические файлы базы данных | `/opt/evolution-api/postgres_data/` | 
 +| **redis_data/** | Данные Redis кэша | `/opt/evolution-api/redis_data/` | 
 +| **docker-compose.yml** | Конфигурация контейнеров | `/opt/evolution-api/docker-compose.yml` | 
 +| **database.sql** | SQL дамп базы данных | Создается автоматически |
  
-  * Docker и Docker Compose установлены +===== Требования =====
-  * Evolution API запущен в директории ''/opt/evolution-api/'' +
-  * Права root или sudo доступ +
-  * Достаточно места на диске для хранения бекапов+
  
-===== Шаг 1Создание директорий =====+==== Системные требования ==== 
 +  * **OS**Linux (тестировано на Ubuntu 20.04+) 
 +  * **Docker**: версия 20.10+ 
 +  * **Docker Compose**: версия 1.29+ 
 +  * **Свободное место**: минимум 2GB для бекапов 
 +  * **Права**: root или пользователь в группе docker
  
 +==== Необходимые пакеты ====
 <code bash> <code bash>
-Создайте директории для скрипта и бекапов +Ubuntu/Debian 
-sudo mkdir -p /opt/scripts +apt update && apt install -y curl tar gzip findutils
-sudo mkdir -p /opt/backups/evolution-api+
  
-Проверьте существование Evolution API +CentOS/RHEL 
-ls -la /opt/evolution-api/+yum install -y curl tar gzip findutils
 </code> </code>
  
-===== Шаг 2: Создание скрипта резервного копирования =====+===== Установка и настройка =====
  
-Создайте файл скрипта:+==== 1. Создание структуры директорий ====
  
 <code bash> <code bash>
-sudo nano /opt/scripts/evolution-backup.sh+# Создаем директории для скриптов и бекапов 
 +mkdir -p /opt/scripts 
 +mkdir -p /opt/backups/evolution-api 
 + 
 +# Устанавливаем права доступа 
 +chmod 750 /opt/scripts 
 +chmod 750 /opt/backups/evolution-api
 </code> </code>
  
-Скопируйте следующее содержимое в файл:+==== 2. Установка скрипта ====
  
-<file bash evolution-backup.sh+Создайте файл `/opt/scripts/evolution-backup.sh` и вставьте содержимое скрипта ниже.
-#!/bin/bash+
  
 +<code bash>
 +# Создаем скрипт
 +nano /opt/scripts/evolution-backup.sh
 +
 +# Делаем исполняемым
 +chmod +x /opt/scripts/evolution-backup.sh
 +
 +# Устанавливаем владельца (если нужно)
 +chown root:root /opt/scripts/evolution-backup.sh
 +</code>
 +
 +**Содержимое скрипта `/opt/scripts/evolution-backup.sh`:**
 +
 +<code bash>
 +#!/bin/bash
 + 
 # Скрипт резервного копирования Evolution API # Скрипт резервного копирования Evolution API
 # Запуск: /opt/scripts/evolution-backup.sh # Запуск: /opt/scripts/evolution-backup.sh
 + 
 # Настройки # Настройки
 COMPOSE_FILE="/opt/evolution-api/docker-compose.yml" COMPOSE_FILE="/opt/evolution-api/docker-compose.yml"
Строка 55: Строка 85:
 DATE=$(date +"%Y%m%d_%H%M%S") DATE=$(date +"%Y%m%d_%H%M%S")
 BACKUP_NAME="evolution_backup_${DATE}" BACKUP_NAME="evolution_backup_${DATE}"
-RETENTION_DAYS=30  # Храним бекапы 30 дней +RETENTION_DAYS=10  # Храним бекапы 10 дней 
 +  
 +# Настройки базы данных 
 +DB_CONTAINER="evolution_postgres" 
 +DB_USER="evolution_user" 
 +DB_PASSWORD="ВАШ_ПАРОЛЬ_БД"  # ⚠️ Замените на реальный пароль! 
 +DB_NAME="evolution_db" 
 + 
 # Логирование # Логирование
 LOG_FILE="${BACKUP_DIR}/backup.log" LOG_FILE="${BACKUP_DIR}/backup.log"
 + 
 # Функция логирования # Функция логирования
 log() { log() {
     echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"     echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
 } }
 + 
 # Создаем директорию для бекапов если не существует # Создаем директорию для бекапов если не существует
 mkdir -p "$BACKUP_DIR" mkdir -p "$BACKUP_DIR"
 + 
 log "=== Начало резервного копирования Evolution API ===" log "=== Начало резервного копирования Evolution API ==="
 + 
 # Проверяем что compose файл существует # Проверяем что compose файл существует
 if [ ! -f "$COMPOSE_FILE" ]; then if [ ! -f "$COMPOSE_FILE" ]; then
Строка 75: Строка 111:
     exit 1     exit 1
 fi fi
 + 
 # Переходим в директорию с Evolution # Переходим в директорию с Evolution
 cd "$EVOLUTION_DIR" || { cd "$EVOLUTION_DIR" || {
Строка 81: Строка 117:
     exit 1     exit 1
 } }
 +
 +# Проверяем что контейнеры запущены
 +log "Проверяем статус контейнеров..."
 +if ! docker-compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then
 +    log "ОШИБКА: Контейнеры не запущены! Запустите их перед созданием бекапа."
 +    exit 1
 +fi
 +
 +# Создаем дамп базы данных (пока контейнеры работают)
 +log "Создаем дамп базы данных..."
 +DB_DUMP_PATH="${BACKUP_DIR}/${BACKUP_NAME}_database.sql"
 +
 +# Экспортируем пароль для pg_dump
 +export PGPASSWORD="$DB_PASSWORD"
 +
 +docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" --no-password --verbose > "$DB_DUMP_PATH" 2>> "$LOG_FILE"
 +
 +if [ $? -eq 0 ] && [ -s "$DB_DUMP_PATH" ]; then
 +    log "Дамп базы данных создан: $DB_DUMP_PATH"
 +    
 +    # Получаем размер дампа
 +    DB_DUMP_SIZE=$(du -h "$DB_DUMP_PATH" | cut -f1)
 +    log "Размер дампа БД: $DB_DUMP_SIZE"
 +else
 +    log "ОШИБКА: Не удалось создать дамп базы данных или файл пуст"
 +    rm -f "$DB_DUMP_PATH"
 +    exit 1
 +fi
 +
 +# Очищаем переменную окружения
 +unset PGPASSWORD
  
 # Останавливаем контейнеры # Останавливаем контейнеры
 log "Останавливаем контейнеры Evolution API..." log "Останавливаем контейнеры Evolution API..."
 docker-compose -f "$COMPOSE_FILE" down docker-compose -f "$COMPOSE_FILE" down
 + 
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     log "Контейнеры успешно остановлены"     log "Контейнеры успешно остановлены"
Строка 92: Строка 159:
     exit 1     exit 1
 fi fi
 + 
 # Ждем пару секунд для полной остановки # Ждем пару секунд для полной остановки
 sleep 5 sleep 5
- +  
-# Создаем архив с данными+# Создаем архив с данными (включая дамп БД)
 log "Создаем архив данных..." log "Создаем архив данных..."
 BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
 + 
 tar -czf "$BACKUP_PATH" \ tar -czf "$BACKUP_PATH" \
     --exclude='*.log' \     --exclude='*.log' \
     --exclude='**/lost+found' \     --exclude='**/lost+found' \
 +    -C "$BACKUP_DIR" "${BACKUP_NAME}_database.sql" \
 +    -C "$EVOLUTION_DIR" \
     store/ \     store/ \
     instances/ \     instances/ \
Строка 108: Строка 177:
     redis_data/ \     redis_data/ \
     docker-compose.yml     docker-compose.yml
 + 
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     log "Архив создан: $BACKUP_PATH"     log "Архив создан: $BACKUP_PATH"
-    + 
     # Получаем размер архива     # Получаем размер архива
     BACKUP_SIZE=$(du -h "$BACKUP_PATH" | cut -f1)     BACKUP_SIZE=$(du -h "$BACKUP_PATH" | cut -f1)
     log "Размер архива: $BACKUP_SIZE"     log "Размер архива: $BACKUP_SIZE"
 +    
 +    # Удаляем отдельный файл дампа, так как он теперь в архиве
 +    rm -f "$DB_DUMP_PATH"
 +    log "Отдельный файл дампа БД удален (включен в архив)"
 else else
     log "ОШИБКА: Не удалось создать архив"     log "ОШИБКА: Не удалось создать архив"
-    + 
     # Пытаемся запустить контейнеры даже при ошибке     # Пытаемся запустить контейнеры даже при ошибке
     log "Запускаем контейнеры после ошибки..."     log "Запускаем контейнеры после ошибки..."
Строка 123: Строка 196:
     exit 1     exit 1
 fi fi
 + 
 # Запускаем контейнеры обратно # Запускаем контейнеры обратно
 log "Запускаем контейнеры Evolution API..." log "Запускаем контейнеры Evolution API..."
 docker-compose -f "$COMPOSE_FILE" up -d docker-compose -f "$COMPOSE_FILE" up -d
 + 
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     log "Контейнеры успешно запущены"     log "Контейнеры успешно запущены"
Строка 134: Строка 207:
     exit 1     exit 1
 fi fi
 + 
 # Ждем запуска сервисов # Ждем запуска сервисов
-sleep 10 +sleep 15 
 + 
 # Проверяем что все контейнеры работают # Проверяем что все контейнеры работают
 log "Проверяем статус контейнеров..." log "Проверяем статус контейнеров..."
-if docker-compose -f "$COMPOSE_FILE" ps | grep -"Up"; then +RUNNING_CONTAINERS=$(docker-compose -f "$COMPOSE_FILE" ps --services --filter "status=running" wc -l) 
-    log "Контейнеры работают корректно"+TOTAL_CONTAINERS=$(docker-compose -f "$COMPOSE_FILEps --services | wc -l) 
 + 
 +if [ "$RUNNING_CONTAINERS" -eq "$TOTAL_CONTAINERS" ]; then 
 +    log "Все контейнеры ($RUNNING_CONTAINERS/$TOTAL_CONTAINERS) работают корректно"
 else else
-    log "ПРЕДУПРЕЖДЕНИЕ: Некоторые контейнеры могут работать некорректно"+    log "ПРЕДУПРЕЖДЕНИЕ: Работают только $RUNNING_CONTAINERS из $TOTAL_CONTAINERS контейнеров"
 fi fi
  
 +# Проверяем доступность базы данных
 +log "Проверяем подключение к базе данных..."
 +export PGPASSWORD="$DB_PASSWORD"
 +if docker exec "$DB_CONTAINER" pg_isready -U "$DB_USER" -d "$DB_NAME" > /dev/null 2>&1; then
 +    log "База данных доступна и готова к работе"
 +else
 +    log "ПРЕДУПРЕЖДЕНИЕ: База данных может быть недоступна"
 +fi
 +unset PGPASSWORD
 + 
 # Удаляем старые бекапы # Удаляем старые бекапы
 log "Удаляем бекапы старше $RETENTION_DAYS дней..." log "Удаляем бекапы старше $RETENTION_DAYS дней..."
-find "$BACKUP_DIR" -name "evolution_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete +DELETED_COUNT=$(find "$BACKUP_DIR" -name "evolution_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete -print | wc -l) 
 +log "Удалено старых бекапов: $DELETED_COUNT" 
 + 
 # Показываем статистику бекапов # Показываем статистику бекапов
 BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/evolution_backup_*.tar.gz 2>/dev/null | wc -l) BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/evolution_backup_*.tar.gz 2>/dev/null | wc -l)
 +TOTAL_SIZE=$(du -sh "${BACKUP_DIR}" 2>/dev/null | cut -f1)
 log "Общее количество бекапов: $BACKUP_COUNT" log "Общее количество бекапов: $BACKUP_COUNT"
 +log "Общий размер папки бекапов: $TOTAL_SIZE"
  
-log "=== Резервное копирование завершено успешно ==="+# Получаем информацию о свободном месте на диске 
 +BACKUP_DISK_USAGE=$(df -h "$BACKUP_DIR" | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)"}'
 +ROOT_DISK_USAGE=$(df -h / | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)"}')
  
-# Отправляем уведомление пционально) +log "Свободное место на диске бекапов$BACKUP_DISK_USAGE
-# curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage\ +if [ "$BACKUP_DIR" != "/] && [ "$(df "$BACKUP_DIR" | awk 'NR==2 {print $1}')" != "$(df / | awk 'NR==2 {print $1}')" ]; then 
-#     -d chat_id="<CHAT_ID>+    log "Свободное место на корневом диске: $ROOT_DISK_USAGE" 
-#     -d text="✅ Evolution API backup completed: $BACKUP_NAME ($BACKUP_SIZE)"+fi
  
-exit 0 +# Получаем процент заполнения диска с бекапами для предупреждений 
-</file>+BACKUP_DISK_PERCENT=$(df "$BACKUP_DIR" | awk 'NR==2 {print $5}' | sed 's/%//')
  
-===== Шаг 3: Настройка прав доступа =====+if [ "$BACKUP_DISK_PERCENT" -gt 90 ]; then 
 +    log "⚠️ ПРЕДУПРЕЖДЕНИЕ: Диск заполнен более чем на 90%!" 
 +elif [ "$BACKUP_DISK_PERCENT" -gt 80 ]; then 
 +    log "⚠️ ВНИМАНИЕ: Диск заполнен более чем на 80%" 
 +fi 
 +  
 +log "=== Резервное копирование завершено успешно ==="
  
-<code bash> +Формируем сообщение для Telegram 
-Сделайте скрипт исполняемым +TELEGRAM_MESSAGE="✅ Evolution API backup completed 
-sudo chmod +x /opt/scripts/evolution-backup.sh+📁 Backup: $BACKUP_NAME ($BACKUP_SIZE) 
 +💾 DB dump: $DB_DUMP_SIZE   
 +📊 Total backups: $BACKUP_COUNT 
 +💿 Disk space: $BACKUP_DISK_USAGE"
  
-Проверьте права доступа +Добавляем предупреждение о месте, если нужно 
-ls -la /opt/scripts/evolution-backup.sh +if [ "$BACKUP_DISK_PERCENT" -gt 90 ]; then 
-</code>+    TELEGRAM_MESSAGE="$TELEGRAM_MESSAGE 
 +⚠️ WARNING: Disk >90% full!" 
 +elif [ "$BACKUP_DISK_PERCENT" -gt 80 ]; then 
 +    TELEGRAM_MESSAGE="$TELEGRAM_MESSAGE 
 +⚠️ ATTENTION: Disk >80% full" 
 +fi
  
-===== Шаг 4: Тестирование скрипта =====+# Отправляем уведомление в Telegram (опционально) 
 +curl -s -X POST "https://api.telegram.org/botВАШ_ТОКЕН_БОТА/sendMessage"
 +     -d chat_id="ВАШ_CHAT_ID"
 +     -d text="$TELEGRAM_MESSAGE" > /dev/null
  
-⚠️ **Внимание:** Тестирование временно остановит Evolution API на 1-2 минуты. +exit 0
- +
-<code bash> +
-# Запустите тестовое резервное копирование +
-sudo /opt/scripts/evolution-backup.sh +
- +
-# Проверьте создание бекапа +
-ls -la /opt/backups/evolution-api/ +
- +
-# Посмотрите логи +
-cat /opt/backups/evolution-api/backup.log+
 </code> </code>
  
-**Ожидаемый результат:** +==== 3. Настройка переменных ====
-<code> +
-/opt/backups/evolution-api/ +
-├── evolution_backup_20240828_123456.tar.gz +
-└── backup.log +
-</code>+
  
-===== Шаг 5: Настройка автоматического запуска (cron) ===== +После создания скрипта обязательно отредактируйте следующие переменные:
- +
-Откройте crontab для root:+
  
 <code bash> <code bash>
-sudo crontab -e+# Основные настройки (проверьте пути под вашу систему) 
 +COMPOSE_FILE="/opt/evolution-api/docker-compose.yml"  # Путь к docker-compose.yml 
 +EVOLUTION_DIR="/opt/evolution-api"                    # Директория Evolution API 
 +BACKUP_DIR="/opt/backups/evolution-api"              # Директория для бекапов 
 +RETENTION_DAYS=10                                     # Срок хранения бекапов 
 + 
 +# ⚠️ ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ эти параметры безопасности: 
 +DB_PASSWORD="ВАШ_ПАРОЛЬ_БД"        # Пароль от PostgreSQL (из docker-compose.yml) 
 +curl ... "botВАШ_ТОКЕН_БОТА" ...   # Токен Telegram бота 
 +chat_id="ВАШ_CHAT_ID"             # Ваш Telegram chat_id
 </code> </code>
  
-Добавьте следующую строку в конец файла:+<note warning> 
 +**Безопасность**: Обязательно замените все плейсхолдеры на реальные значения! Пароль должен совпадать с `POSTGRES_PASSWORD` из вашего `docker-compose.yml`. 
 +</note>
  
-<code> +==== 4. Настройка Telegram уведомлений (опционально) ====
-# Резервное копирование Evolution API каждый день в 3:00 +
-0 3 * * * /opt/scripts/evolution-backup.sh >/dev/null 2>&+
-</code>+
  
-Сохраните и выйдите из редактора.+Для получения уведомлений о результатах резервного копирования:
  
-===== Шаг 6: Проверка настройки cron =====+  - Создайте Telegram бота через [@BotFather](https://t.me/botfather) 
 +  - Получите токен бота 
 +  - Узнайте ваш chat_id (можно использовать [@userinfobot](https://t.me/userinfobot)) 
 +  - Замените токен и chat_id в конце скрипта
  
 <code bash> <code bash>
-Проверьте что задача добавлена +Замените эти значения на свои 
-sudo crontab -l +curl -s -X POST "https://api.telegram.org/bot[ВАШ_ТОКЕН]/sendMessage" \ 
- +     -d chat_id="[ВАШ_CHAT_ID]" \ 
-# Проверьте статус службы cron +     -d text="✅ Evolution API backup completed: $BACKUP_NAME ($BACKUP_SIZE)"
-sudo systemctl status cron +
- +
-# Убедитесь что cron запущен +
-sudo systemctl enable cron +
-sudo systemctl start cron+
 </code> </code>
  
-===== Структура файлов после установки =====+===== Использование скрипта =====
  
-<code> +==== Ручной запуск ====
-/opt/ +
-├── scripts/ +
-│   └── evolution-backup.sh +
-├── backups/ +
-│   └── evolution-api/ +
-│       ├── evolution_backup_20240828_030001.tar.gz +
-│       ├── evolution_backup_20240829_030001.tar.gz +
-│       └── backup.log +
-└── evolution-api/ +
-    ├── docker-compose.yml +
-    ├── store/ +
-    ├── instances/ +
-    ├── postgres_data/ +
-    └── redis_data/ +
-</code> +
- +
-===== Мониторинг и управление бекапами ===== +
- +
-==== Проверка последнего бекапа ====+
  
 <code bash> <code bash>
-Показать последний созданный бекап +Запуск с выводом в консоль 
-ls -lt /opt/backups/evolution-api/evolution_backup_*.tar.gz | head -1+/opt/scripts/evolution-backup.sh
  
-Размеры всех бекапов +Запуск в фоновом режиме 
-du -sh /opt/backups/evolution-api/evolution_backup_*.tar.gz +nohup /opt/scripts/evolution-backup.sh > /dev/null 2>&1 &
- +
-# Общий размер директории с бекапами +
-du -sh /opt/backups/evolution-api/+
 </code> </code>
  
-==== Просмотр логов ====+==== Автоматический запуск через Cron ====
  
 <code bash> <code bash>
-Последние 20 строк лога +Редактируем crontab 
-tail -20 /opt/backups/evolution-api/backup.log+crontab -e
  
-Поиск ошибок в логах +Добавляем задание (например, каждый день в 3:00 ночи) 
-grep "ОШИБКА" /opt/backups/evolution-api/backup.log+0 3 * * * /opt/scripts/evolution-backup.sh >/dev/null 2>&1
  
-Поиск успешных бекапов +Или с логированием cron ошибок 
-grep "успешно/opt/backups/evolution-api/backup.log+0 3 * * * /opt/scripts/evolution-backup.sh 2>> /var/log/evolution-backup-cron.log
 </code> </code>
  
-==== Очистка старых бекапов ====+**Примеры расписаний Cron:** 
 +  * `0 3 * * *` - каждый день в 3:00 
 +  * `0 2 * * 0` - каждое воскресенье в 2:00 
 +  * `0 1 1 * *` - 1 числа каждого месяца в 1:00 
 +  * `0 */6 * * *` - каждые 6 часов
  
-<code bash> +===== Процесс резервного копирования =====
-# Удалить бекапы старше 30 дней вручную +
-find /opt/backups/evolution-api/ -name "evolution_backup_*.tar.gz" -mtime +30 -delete+
  
-# Показать количество бекапов +Скрипт выполняет следующие операции:
-ls -1 /opt/backups/evolution-api/evolution_backup_*.tar.gz | wc -l+
  
-Показать самые старые бекапы +  - **Проверка окружения** - проверяет наличие файлов и запущенные контейнеры 
-ls -lt /opt/backups/evolution-api/evolution_backup_*.tar.gz | tail -5 +  - **Создание SQL дампа** - создает дамп базы данных PostgreSQL 
-</code>+  - **Остановка контейнеров** - корректно останавливает все сервисы 
 +  - **Создание архива** - упаковывает все данные в tar.gz 
 +  - **Запуск контейнеров** - восстанавливает работу системы 
 +  - **Проверка состояния** - проверяет что все сервисы запустились 
 +  - **Очистка старых бекапов** удаляет файлы старше указанного срока 
 +  - **Отправка уведомлений** - отправляет статус в Telegram
  
-===== Восстановление из резервной копии =====+<note> 
 +**Время простоя**: Обычно система недоступна 30-60 секунд во время создания бекапа. 
 +</note>
  
-🚨 **ОСТОРОЖНО:** Восстановление полностью заменит текущие данные!+==== Мониторинг дискового пространства ====
  
-==== Шаги восстановления ====+Скрипт автоматически отслеживает состояние дискового пространства:
  
-1. **Остановите Evolution API:** +^ Уровень заполнения ^ Действие ^ Сообщение ^ 
-<code bash> +| < 80% | Нормальная работа | Информация в логе | 
-cd /opt/evolution-api/ +| 80-90% | Предупреждение | "⚠️ ВНИМАНИЕДиск заполнен более чем на 80%" | 
-sudo docker-compose down +90% | Критическое предупреждение | "⚠️ ПРЕДУПРЕЖДЕНИЕ: Диск заполнен более чем на 90%!" |
-</code>+
  
-2. **Сделайте резервную копию текущих данных (опционально):** 
 <code bash> <code bash>
-sudo mv store store_old_$(date +%Y%m%d) +# Проверка свободного места вручную 
-sudo mv instances instances_old_$(date +%Y%m%d) +df -h /opt/backups/evolution-api
-sudo mv postgres_data postgres_data_old_$(date +%Y%m%d) +
-sudo mv redis_data redis_data_old_$(date +%Y%m%d) +
-</code>+
  
-3. **Восстановите данные из архива:** +# Расчет размера всех бекапов 
-<code bash> +du -sh /opt/backups/evolution-api/*
-# Выберите нужный бекап +
-ls -la /opt/backups/evolution-api/evolution_backup_*.tar.gz+
  
-Распакуйте архив (замените YYYYMMDD_HHMMSS на нужную дату+Принудительная очистка старых бекапов (осторожно!
-sudo tar -xzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz+find /opt/backups/evolution-api -name "evolution_backup_*.tar.gz" -mtime +7 -delete
 </code> </code>
  
-4. **Запустите Evolution API:** +**Рекомендации по управлению дисковым пространством:** 
-<code bash> +  * При заполнении 80% рассмотрите уменьшение срока хранения бекапов 
-sudo docker-compose up -d +  * При заполнении 90% - немедленно очистите старые бекапы или увеличьте дисковое пространство 
-</code>+  * Настройте отдельный диск для бекапов, если это критично
  
-5. **Проверьте работоспособность:** +===== Мониторинг и логи =====
-<code bash> +
-sudo docker-compose ps +
-sudo docker-compose logs -f +
-</code>+
  
-===== Настройки и оптимизация ===== +==== Просмотр логов ====
- +
-==== Изменение времени запуска ==== +
- +
-Для изменения времени запуска отредактируйте crontab:+
  
 <code bash> <code bash>
-sudo crontab -e +Последние 50 строк лога 
-</code> +tail -50 /opt/backups/evolution-api/backup.log
- +
-**Примеры расписания:** +
-<code> +
-# Каждый день в 2:30 +
-30 2 * * * /opt/scripts/evolution-backup.sh+
  
-Каждое воскресенье в 4:00 +Мониторинг в реальном времени 
-0 4 * * 0 /opt/scripts/evolution-backup.sh+tail -f /opt/backups/evolution-api/backup.log
  
-Дважды в день (6:00 и 18:00) +Логи за сегодня 
-0 6,18 * * * /opt/scripts/evolution-backup.sh+grep "$(date '+%Y-%m-%d')/opt/backups/evolution-api/backup.log
 </code> </code>
  
-==== Настройка уведомлений ====+==== Проверка статуса бекапов ====
  
-Для получения уведомлений в Telegram выполните следующие шаги:+<code bash> 
 +# Список всех бекапов 
 +ls -lah /opt/backups/evolution-api/evolution_backup_*.tar.gz
  
-**1. Создайте Telegram бота:** +# Размер директории бекапов 
-  * Найдите бота @BotFather в Telegram +du -sh /opt/backups/evolution-api/
-  * Отправьте команду ''/newbot'' +
-  * Следуйте инструкциям для создания бота +
-  * Сохраните полученный токен (например: ''123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw'')+
  
-**2. Получите CHAT_ID:**+Последний успешный бекап 
 +grep "завершено успешно" /opt/backups/evolution-api/backup.log | tail -1 
 +</code>
  
-Напишите своему боту любое сообщение в Telegram. После этого выполните запрос:+==== Настройка ротации логов ====
  
 <code bash> <code bash>
-Замените <ВАШ_ТОКЕН> на токен вашего бота +Создаем конфиг для logrotate 
-curl -s "https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates" +cat > /etc/logrotate.d/evolution-backup <EOF 
-</code> +/opt/backups/evolution-api/backup.log 
- +    weekly 
-В ответе найдите значение ''chat.id'': +    rotate 8 
-<code json> +    compress 
-+    delaycompress 
-  "ok": true, +    notifempty 
-  "result": [ +    create 644 root root
-    { +
-      "update_id": 123456789, +
-      "message":+
-        "message_id": 1, +
-        "from": { "id": 987654321, "first_name": "Ваше имя" }, +
-        "chat":+
-          "id": 987654321,    ← Это ваш CHAT_ID +
-          "first_name": "Ваше имя", +
-          "type": "private" +
-        }, +
-        "date": 1640995200, +
-        "text": "Hello" +
-      } +
-    +
-  ]+
 } }
 +EOF
 </code> </code>
  
-**3. Настройте уведомления в скрипте:**+===== Восстановление из резервной копии =====
  
-Раскомментируйте и настройте строки в конце скрипта ''/opt/scripts/evolution-backup.sh'':+==== Полное восстановление системы ====
  
-<code bash+<note warning
-# Замените <ВАШ_ТОКЕН> и <ВАШ_CHAT_ID> на реальные значения +**Внимание!** Процедура восстановления полностью заменит текущие данные. Убедитесь что система остановлена. 
-curl -s -X POST "https://api.telegram.org/bot<ВАШ_ТОКЕН>/sendMessage"+</note>
-    -d chat_id="<ВАШ_CHAT_ID>"+
-    -d text="✅ Evolution API backup completed: $BACKUP_NAME ($BACKUP_SIZE)" +
-</code> +
- +
-**4. Тест уведомлений:**+
  
 <code bash> <code bash>
-Проверьте отправку тестового сообщения +1. Останавливаем Evolution API 
-curl -s -X POST "https://api.telegram.org/bot123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw/sendMessage" \ +cd /opt/evolution-api 
-    -d chat_id="987654321"+docker-compose down
-    -d text="🔧 Тест уведомлений Evolution API бекапов" +
-</code>+
  
-**Примеры сообщений уведомлений:**+# 2. Создаем резервную копию текущих данных (на всякий случай) 
 +mv store store_backup_$(date +%Y%m%d) 
 +mv instances instances_backup_$(date +%Y%m%d) 
 +mv postgres_data postgres_data_backup_$(date +%Y%m%d) 
 +mv redis_data redis_data_backup_$(date +%Y%m%d)
  
-<code bash> +3. Распаковываем бекап 
-Успешный бекап +cd /opt/evolution-api 
-text="✅ Evolution API backup completed: $BACKUP_NAME ($BACKUP_SIZE)"+tar -xzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz
  
-Ошибка бекапа +4. Запускаем контейнеры 
-text="❌ Evolution API backup failed! Check logs: /opt/backups/evolution-api/backup.log"+docker-compose up -d
  
-Расширенное уведомление +5. Ждем запуска и проверяем 
-text="📦 Evolution API Backup +sleep 15 
-📅 Date: $(date '+%Y-%m-%d %H:%M:%S'+docker-compose ps
-📁 Archive: $BACKUP_NAME +
-💾 Size: $BACKUP_SIZE +
-📊 Total backups: $BACKUP_COUNT"+
 </code> </code>
  
-==== Изменение периода хранения ==== +==== Восстановление только базы данных ====
- +
-Отредактируйте переменную в скрипте:+
  
 <code bash> <code bash>
-Хранить бекапы 60 дней +1. Распаковываем дамп из архива 
-RETENTION_DAYS=60+cd /tmp 
 +tar -xzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz evolution_backup_YYYYMMDD_HHMMSS_database.sql
  
-Хранить бекапы 7 дней +2. Восстанавливаем базу данных 
-RETENTION_DAYS=7+cd /opt/evolution-api 
 +export PGPASSWORD="Fd6ffgdkF98hGf69" 
 +docker exec -i evolution_postgres psql -U evolution_user -d evolution_db < /tmp/evolution_backup_YYYYMMDD_HHMMSS_database.sql 
 + 
 +# 3. Перезапускаем API для применения изменений 
 +docker-compose restart evolution-api
 </code> </code>
  
-==== Настройка ротации логов ====+===== Решение проблем =====
  
-Создайте конфигурацию logrotate для управления размером логов:+==== Частые ошибки и решения ====
  
 +**Ошибка: "Контейнеры не запущены!"**
 <code bash> <code bash>
-sudo nano /etc/logrotate.d/evolution-backup+# Решение: Запустите контейнеры перед созданием бекапа 
 +cd /opt/evolution-api 
 +docker-compose up -d
 </code> </code>
  
-<file+**Ошибка: "Не удалось создать дамп базы данных"** 
-/opt/backups/evolution-api/backup.log { +<code bash
-    daily +# Проверяем статус PostgreSQL 
-    rotate 30 +docker exec evolution_postgres pg_isready -U evolution_user
-    compress +
-    delaycompress +
-    missingok +
-    notifempty +
-    create 644 root root +
-+
-</file>+
  
-===== Устранение неисправностей =====+# Проверяем логи PostgreSQL 
 +docker logs evolution_postgres
  
-==== Частые проблемы ====+# Проверяем подключение 
 +docker exec evolution_postgres psql -U evolution_user -d evolution_db -c "SELECT version();" 
 +</code>
  
-**1. Скрипт не запускается:** +**Ошибка: "Permission denied" при доступе к файлам** 
-  * Проверьте права доступа: ''sudo chmod +x /opt/scripts/evolution-backup.sh'' +<code bash> 
-  * Проверьте пути в скрипте +Проверяем и исправляем права 
-  * Убедитесь что Docker запущен: ''sudo systemctl status docker'' +sudo chown -R $(whoami):$(whoami) /opt/evolution-api/ 
- +sudo chmod -R 755 /opt/evolution-api/ 
-**2. Контейнеры не останавливаются:** +</code>
-  * Проверьте что путь к docker-compose.yml правильный +
-  * Убедитесь что файл существует: ''ls -la /opt/evolution-api/docker-compose.yml'' +
- +
-**3. Недостаточно места для бекапов:** +
-  Проверьте свободное место: ''df -h /opt/backups/evolution-api/'' +
-  * Уменьшите период хранения бекапов +
-  * Настройте ротацию логов +
- +
-**4. Cron не запускается:** +
-  * Проверьте статус: ''sudo systemctl status cron'' +
-  * Проверьте синтаксис crontab: ''sudo crontab -l'' +
-  * Посмотрите системные логи: ''sudo journalctl -u cron'' +
- +
-**5. Директория бекапов недоступна:** +
-  * Создайте директорию: ''sudo mkdir -p /opt/backups/evolution-api'' +
-  * Проверьте права доступа: ''sudo chmod 755 /opt/backups/evolution-api'' +
- +
-==== Диагностика ====+
  
 +**Контейнеры не запускаются после бекапа**
 <code bash> <code bash>
-# Проверить последнее выполнение cron +# Проверяем логи Docker 
-sudo grep -i evolution /var/log/syslog | tail -5 +docker-compose logs
- +
-# Проверить размер директории с данными +
-du -sh /opt/evolution-api/ +
- +
-# Проверить доступность директории бекапов +
-ls -la /opt/backups/evolution-api/ +
- +
-# Тест Docker команд +
-cd /opt/evolution-api/ +
-sudo docker-compose ps +
-sudo docker-compose config+
  
-# Проверить свободное место +# Принудительно пересоздаем контейнеры 
-df -h /opt/backups/+docker-compose down 
 +docker-compose up -d --force-recreate
 </code> </code>
  
-==== Мониторинг производительности ====+==== Проверка целостности бекапов ====
  
 <code bash> <code bash>
-Посмотреть время выполнения последних бекапов +Тест архива на целостность 
-grep "завершено успешно" /opt/backups/evolution-api/backup.log tail -5+tar -tzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz > /dev/null && echo "OK" || echo "CORRUPTED"
  
-# Посмотреть размеры последних бекапов +# Проверка размера бекапа (должен быть больше 1MB) 
-grep "Размер архива" /opt/backups/evolution-api/backup.log | tail -5 +if [ $(stat -f%z /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz) -gt 1048576 ]; then 
- +    echo "Размер бекапа нормальный" 
-# Статистика по времени выполнения +else 
-awk '/Начало резервного копирования/ {start=$1 " " $2} /завершено успешно/ {end=$1 " $2; print "Start:", start, "End:", end}' /opt/backups/evolution-api/backup.log | tail -3+    echo "Подозрительно маленький размер бекапа" 
 +fi
 </code> </code>
  
-===== Дополнительная безопасность =====+==== Тестирование восстановления ====
  
-==== Удаленное копирование бекапов ====+Рекомендуется периодически тестировать процедуру восстановления:
  
-Для дополнительной безопасности настройте копирование бекапов на удаленный сервер:+<code bash> 
 +# Создаем тестовую среду 
 +mkdir -p /tmp/evolution-test 
 +cd /tmp/evolution-test 
 + 
 +# Распаковываем последний бекап 
 +tar -xzf /opt/backups/evolution-api/evolution_backup_$(ls -t /opt/backups/evolution-api/evolution_backup_*.tar.gz | head -1 | cut -d'/' -f5)
  
-<code bash> +Проверяем содержимое 
-Добавьте в конец скрипта (перед exit 0): +ls -la 
-# Копирование на удаленный сервер +echo "Тест восстановления завершен. Проверьте содержимое папки /tmp/evolution-test"
-rsync -avz --delete /opt/backups/evolution-api/ user@remote-server:/path/to/remote/backups/+
 </code> </code>
  
-==== Шифрование бекапов ====+===== Рекомендации по безопасности =====
  
-Для шифрования бекапов используйте GPG: +  * **Шифрование бекапов**: Рассмотрите использование GPG для шифрования архивов 
- +  * **Удаленное хранение**: Копируйте бекапы на удаленный сервер или облачное хранилище 
-<code bash> +  * **Мониторинг доступа**: Следите за доступом к директории с бекапами 
-# Замените создание архива в скрипте на: +  * **Регулярное тестирование**Тестируйте восстановление минимум раз в месяц 
-tar -czf - \ +  * **Документирование изменений**: Ведите журнал всех изменений в системе
-    --exclude='*.log' \ +
-    --exclude='**/lost+found'+
-    store/ instances/ postgres_data/ redis_data/ docker-compose.yml | \ +
-    gpg --symmetric --cipher-algo AES256 --output "$BACKUP_PATH.gpg" +
-</code>+
  
-===== Заключение =====+===== Контакты и поддержка =====
  
-После выполнения всех шагов у вас будет настроено автоматическое ежедневное резервное копирование Evolution API. Система будет:+При возникновении проблем с резервным копированием:
  
-  * ✅ Автоматически создавать бекапы каждый день в 3:00 +  - Проверьте логи: `/opt/backups/evolution-api/backup.log` 
-  * ✅ Сохранять все критически важные данные +  - Проверьте системные ресурсы: `df -h` и `free -h` 
-  * ✅ Автоматически удалять старые бекапы +  - Обратитесь к системному администратору 
-  * ✅ Вести подробные логи операций +  - Создайте issue в системе отслеживания задач
-  * ✅ Обеспечивать быстрое восстановление при необходимости +
-  * ✅ Хранить бекапы в централизованной директории ''/opt/backups/evolution-api/''+
  
-💡 **Рекомендация:** Периодически тестируйте восстановление из бекапов на тестовой среде, чтобы убедиться в работоспособности системы резервного копирования.+--- 
 +//Документ создан: {{ CURRENT_DATE }} | Версия: 1.0 | Автор: System Admin//
  • vm/evolution_api/02-backup.1756372731.txt.gz
  • Последнее изменение: 2025/08/28 09:18
  • admin