vm:evolution_api:02-backup

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
vm:evolution_api:02-backup [2025/08/28 09:10] 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> +tail -f /opt/backups/evolution-api/backup.log
-# Каждый день в 2:30 +
-30 2 * * * /opt/scripts/evolution-backup.sh+
  
-Каждое воскресенье в 4:00 +Логи за сегодня 
-0 4 * * 0 /opt/scripts/evolution-backup.sh +grep "$(date '+%Y-%m-%d')/opt/backups/evolution-api/backup.log
- +
-# Дважды в день (6:00 и 18:00) +
-0 6,18 * * * /opt/scripts/evolution-backup.sh+
 </code> </code>
  
-==== Настройка уведомлений ==== +==== Проверка статуса бекапов ====
- +
-Для получения уведомлений в Telegram раскомментируйте и настройте строки в конце скрипта:+
  
 <code bash> <code bash>
-Получите токен бота и ID чата +Список всех бекапов 
-# Раскомментируйте и настройте: +ls -lah /opt/backups/evolution-api/evolution_backup_*.tar.gz
-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)" +
-</code>+
  
-==== Изменение периода хранения ==== +# Размер директории бекапов 
- +du -sh /opt/backups/evolution-api/
-Отредактируйте переменную в скрипте: +
- +
-<code bash> +
-# Хранить бекапы 60 дней +
-RETENTION_DAYS=60+
  
-Хранить бекапы 7 дней +Последний успешный бекап 
-RETENTION_DAYS=7+grep "завершено успешно" /opt/backups/evolution-api/backup.log | tail -1
 </code> </code>
  
 ==== Настройка ротации логов ==== ==== Настройка ротации логов ====
- 
-Создайте конфигурацию logrotate для управления размером логов: 
  
 <code bash> <code bash>
-sudo nano /etc/logrotate.d/evolution-backup +# Создаем конфиг для logrotate 
-</code> +cat > /etc/logrotate.d/evolution-backup << EOF
- +
-<file>+
 /opt/backups/evolution-api/backup.log { /opt/backups/evolution-api/backup.log {
-    daily +    weekly 
-    rotate 30+    rotate 8
     compress     compress
     delaycompress     delaycompress
-    missingok 
     notifempty     notifempty
     create 644 root root     create 644 root root
 } }
-</file>+EOF 
 +</code>
  
-===== Устранение неисправностей =====+===== Восстановление из резервной копии =====
  
-==== Частые проблемы ====+==== Полное восстановление системы ====
  
-**1. Скрипт не запускается:*+<note warning> 
-  * Проверьте права доступа: ''sudo chmod +x /opt/scripts/evolution-backup.sh'' +**Внимание!** Процедура восстановления полностью заменит текущие данные. Убедитесь что система остановлена. 
-  * Проверьте пути в скрипте +</note>
-  * Убедитесь что Docker запущен: ''sudo systemctl status docker''+
  
-**2Контейнеры не останавливаются:** +<code bash> 
-  * Проверьте что путь к docker-compose.yml правильный +# 1Останавливаем Evolution API 
-  * Убедитесь что файл существует: ''ls -la /opt/evolution-api/docker-compose.yml''+cd /opt/evolution-api 
 +docker-compose down
  
-**3Недостаточно места для бекапов:** +# 2Создаем резервную копию текущих данных (на всякий случай) 
-  * Проверьте свободное место: ''df -h /opt/backups/evolution-api/'' +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)
  
-**4Cron не запускается:** +# 3Распаковываем бекап 
-  * Проверьте статус: ''sudo systemctl status cron'' +cd /opt/evolution-api 
-  * Проверьте синтаксис crontab: ''sudo crontab -l'' +tar -xzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz
-  * Посмотрите системные логи: ''sudo journalctl -u cron''+
  
-**5Директория бекапов недоступна:** +# 4Запускаем контейнеры 
-  * Создайте директорию: ''sudo mkdir -p /opt/backups/evolution-api'' +docker-compose up -d
-  * Проверьте права доступа: ''sudo chmod 755 /opt/backups/evolution-api''+
  
-==== Диагностика ====+# 5. Ждем запуска и проверяем 
 +sleep 15 
 +docker-compose ps 
 +</code> 
 + 
 +==== Восстановление только базы данных ====
  
 <code bash> <code bash>
-Проверить последнее выполнение cron +1. Распаковываем дамп из архива 
-sudo grep -i evolution /var/log/syslog | tail -5+cd /tmp 
 +tar -xzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz evolution_backup_YYYYMMDD_HHMMSS_database.sql
  
-Проверить размер директории с данными +2. Восстанавливаем базу данных 
-du -sh /opt/evolution-api/+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>
  
-# Проверить доступность директории бекапов +===== Решение проблем =====
-ls -la /opt/backups/evolution-api/+
  
-# Тест Docker команд +==== Частые ошибки и решения ====
-cd /opt/evolution-api/ +
-sudo docker-compose ps +
-sudo docker-compose config+
  
-# Проверить свободное место +**Ошибка:онтейнеры не запущены!"** 
-df -h /opt/backups/+<code bash> 
 +# Решение: Запустите контейнеры перед созданием бекапа 
 +cd /opt/evolution-api 
 +docker-compose up -d
 </code> </code>
  
-==== Мониторинг производительности ==== +**Ошибка: "Не удалось создать дамп базы данных"**
 <code bash> <code bash>
-# Посмотреть время выполнения последних бекапов +# Проверяем статус PostgreSQL 
-grep "завершено успешно" /opt/backups/evolution-api/backup.log | tail -5+docker exec evolution_postgres pg_isready -U evolution_user
  
-# Посмотреть размеры последних бекапов +# Проверяем логи PostgreSQL 
-grep "Размер архива" /opt/backups/evolution-api/backup.log | tail -5+docker logs evolution_postgres
  
-Статистика по времени выполнения +Проверяем подключение 
-awk '/Начало резервного копирования/ {start=$1 " " $2} /завершено успешно/ {end=$1 " $2print "Start:", start, "End:", end}' /opt/backups/evolution-api/backup.log | tail -3+docker exec evolution_postgres psql -U evolution_user -d evolution_db -c "SELECT version();"
 </code> </code>
  
-===== Дополнительная безопасность =====+**Ошибка: "Permission denied" при доступе к файлам** 
 +<code bash> 
 +# Проверяем и исправляем права 
 +sudo chown -R $(whoami):$(whoami) /opt/evolution-api/ 
 +sudo chmod -R 755 /opt/evolution-api/ 
 +</code>
  
-==== Удаленное копирование бекапов ====+**Контейнеры не запускаются после бекапа** 
 +<code bash> 
 +# Проверяем логи Docker 
 +docker-compose logs
  
-Для дополнительной безопасности настройте копирование бекапов на удаленный сервер:+# Принудительно пересоздаем контейнеры 
 +docker-compose down 
 +docker-compose up -d --force-recreate 
 +</code> 
 + 
 +==== Проверка целостности бекапов ====
  
 <code bash> <code bash>
-Добавьте в конец скрипта (перед exit 0): +Тест архива на целостность 
-Копирование на удаленный сервер +tar -tzf /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz > /dev/null && echo "OK" || echo "CORRUPTED" 
-rsync -avz --delete /opt/backups/evolution-api/ user@remote-server:/path/to/remote/backups/+ 
 +Проверка размера бекапа (должен быть больше 1MB) 
 +if [ $(stat -f%z /opt/backups/evolution-api/evolution_backup_YYYYMMDD_HHMMSS.tar.gz) -gt 1048576 ]; then 
 +    echo "Размер бекапа нормальный" 
 +else 
 +    echo "Подозрительно маленький размер бекапа" 
 +fi
 </code> </code>
  
-==== Шифрование бекапов ====+==== Тестирование восстановления ====
  
-Для шифрования бекапов используйте GPG:+Рекомендуется периодически тестировать процедуру восстановления:
  
 <code bash> <code bash>
-Замените создание архива в скрипте на: +Создаем тестовую среду 
-tar -czf +mkdir -p /tmp/evolution-test 
-    --exclude='*.log' \ +cd /tmp/evolution-test 
-    --exclude='**/lost+found+ 
-    store/ instances/ postgres_data/ redis_data/ docker-compose.yml | \ +# Распаковываем последний бекап 
-    gpg --symmetric --cipher-algo AES256 --output "$BACKUP_PATH.gpg"+tar -xzf /opt/backups/evolution-api/evolution_backup_$(ls -t /opt/backups/evolution-api/evolution_backup_*.tar.gz | head -1 | cut -d'/' -f5) 
 + 
 +# Проверяем содержимое 
 +ls -la 
 +echo "Тест восстановления завершенПроверьте содержимое папки /tmp/evolution-test"
 </code> </code>
  
-===== Заключение =====+===== Рекомендации по безопасности ===== 
 + 
 +  * **Шифрование бекапов**: Рассмотрите использование GPG для шифрования архивов 
 +  * **Удаленное хранение**: Копируйте бекапы на удаленный сервер или облачное хранилище 
 +  * **Мониторинг доступа**: Следите за доступом к директории с бекапами 
 +  * **Регулярное тестирование**: Тестируйте восстановление минимум раз в месяц 
 +  * **Документирование изменений**: Ведите журнал всех изменений в системе 
 + 
 +===== Контакты и поддержка =====
  
-После выполнения всех шагов у вас будет настроено автоматическое ежедневное резервное копирование 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.1756372241.txt.gz
  • Последнее изменение: 2025/08/28 09:10
  • admin