Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| vm:evolution_api:02-backup [2025/08/28 09:09] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 | vm:evolution_api:02-backup [2025/08/29 09:01] (текущий) – admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Резервное копирование Evolution API ====== | ||
| + | ===== Описание системы ===== | ||
| + | |||
| + | Evolution API - это система для работы с WhatsApp Business API, развернутая в Docker контейнерах. Система состоит из: | ||
| + | * **evolution-api** - основное приложение API | ||
| + | * **evolution_postgres** - база данных PostgreSQL 15 | ||
| + | * **redis** - кэш и хранилище сессий | ||
| + | |||
| + | <note important> | ||
| + | Данная инструкция предназначена для систем с Evolution API, развернутой через Docker Compose в директории `/ | ||
| + | </ | ||
| + | |||
| + | ===== Компоненты для резервного копирования ===== | ||
| + | |||
| + | Скрипт создает резервные копии следующих компонентов: | ||
| + | |||
| + | ^ Компонент ^ Описание ^ Расположение ^ | ||
| + | | **store/** | Файлы и медиа сообщений | `/ | ||
| + | | **instances/ | ||
| + | | **postgres_data/ | ||
| + | | **redis_data/ | ||
| + | | **docker-compose.yml** | Конфигурация контейнеров | `/ | ||
| + | | **database.sql** | SQL дамп базы данных | Создается автоматически | | ||
| + | |||
| + | ===== Требования ===== | ||
| + | |||
| + | ==== Системные требования ==== | ||
| + | * **OS**: Linux (тестировано на Ubuntu 20.04+) | ||
| + | * **Docker**: версия 20.10+ | ||
| + | * **Docker Compose**: версия 1.29+ | ||
| + | * **Свободное место**: | ||
| + | * **Права**: | ||
| + | |||
| + | ==== Необходимые пакеты ==== | ||
| + | <code bash> | ||
| + | # Ubuntu/ | ||
| + | apt update && apt install -y curl tar gzip findutils | ||
| + | |||
| + | # CentOS/RHEL | ||
| + | yum install -y curl tar gzip findutils | ||
| + | </ | ||
| + | |||
| + | ===== Установка и настройка ===== | ||
| + | |||
| + | ==== 1. Создание структуры директорий ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Создаем директории для скриптов и бекапов | ||
| + | mkdir -p / | ||
| + | mkdir -p / | ||
| + | |||
| + | # Устанавливаем права доступа | ||
| + | chmod 750 / | ||
| + | chmod 750 / | ||
| + | </ | ||
| + | |||
| + | ==== 2. Установка скрипта ==== | ||
| + | |||
| + | Создайте файл `/ | ||
| + | |||
| + | <code bash> | ||
| + | # Создаем скрипт | ||
| + | nano / | ||
| + | |||
| + | # Делаем исполняемым | ||
| + | chmod +x / | ||
| + | |||
| + | # Устанавливаем владельца (если нужно) | ||
| + | chown root:root / | ||
| + | </ | ||
| + | |||
| + | **Содержимое скрипта `/ | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | # Скрипт резервного копирования Evolution API | ||
| + | # Запуск: | ||
| + | |||
| + | # Настройки | ||
| + | COMPOSE_FILE="/ | ||
| + | EVOLUTION_DIR="/ | ||
| + | BACKUP_DIR="/ | ||
| + | DATE=$(date +" | ||
| + | BACKUP_NAME=" | ||
| + | RETENTION_DAYS=10 | ||
| + | |||
| + | # Настройки базы данных | ||
| + | DB_CONTAINER=" | ||
| + | DB_USER=" | ||
| + | DB_PASSWORD=" | ||
| + | DB_NAME=" | ||
| + | |||
| + | # Логирование | ||
| + | LOG_FILE=" | ||
| + | |||
| + | # Функция логирования | ||
| + | log() { | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | # Создаем директорию для бекапов если не существует | ||
| + | mkdir -p " | ||
| + | |||
| + | log "=== Начало резервного копирования Evolution API ===" | ||
| + | |||
| + | # Проверяем что compose файл существует | ||
| + | if [ ! -f " | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Переходим в директорию с Evolution | ||
| + | cd " | ||
| + | log " | ||
| + | exit 1 | ||
| + | } | ||
| + | |||
| + | # Проверяем что контейнеры запущены | ||
| + | log " | ||
| + | if ! docker-compose -f " | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Создаем дамп базы данных (пока контейнеры работают) | ||
| + | log " | ||
| + | DB_DUMP_PATH=" | ||
| + | |||
| + | # Экспортируем пароль для pg_dump | ||
| + | export PGPASSWORD=" | ||
| + | |||
| + | docker exec " | ||
| + | |||
| + | if [ $? -eq 0 ] && [ -s " | ||
| + | log " | ||
| + | | ||
| + | # Получаем размер дампа | ||
| + | DB_DUMP_SIZE=$(du -h " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | rm -f " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Очищаем переменную окружения | ||
| + | unset PGPASSWORD | ||
| + | |||
| + | # Останавливаем контейнеры | ||
| + | log " | ||
| + | docker-compose -f " | ||
| + | |||
| + | if [ $? -eq 0 ]; then | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Ждем пару секунд для полной остановки | ||
| + | sleep 5 | ||
| + | |||
| + | # Создаем архив с данными (включая дамп БД) | ||
| + | log " | ||
| + | BACKUP_PATH=" | ||
| + | |||
| + | tar -czf " | ||
| + | --exclude=' | ||
| + | --exclude=' | ||
| + | -C " | ||
| + | -C " | ||
| + | store/ \ | ||
| + | instances/ \ | ||
| + | postgres_data/ | ||
| + | redis_data/ \ | ||
| + | docker-compose.yml | ||
| + | |||
| + | if [ $? -eq 0 ]; then | ||
| + | log " | ||
| + | |||
| + | # Получаем размер архива | ||
| + | BACKUP_SIZE=$(du -h " | ||
| + | log " | ||
| + | | ||
| + | # Удаляем отдельный файл дампа, так как он теперь в архиве | ||
| + | rm -f " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | |||
| + | # Пытаемся запустить контейнеры даже при ошибке | ||
| + | log " | ||
| + | docker-compose -f " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Запускаем контейнеры обратно | ||
| + | log " | ||
| + | docker-compose -f " | ||
| + | |||
| + | if [ $? -eq 0 ]; then | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Ждем запуска сервисов | ||
| + | sleep 15 | ||
| + | |||
| + | # Проверяем что все контейнеры работают | ||
| + | log " | ||
| + | RUNNING_CONTAINERS=$(docker-compose -f " | ||
| + | TOTAL_CONTAINERS=$(docker-compose -f " | ||
| + | |||
| + | if [ " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | |||
| + | # Проверяем доступность базы данных | ||
| + | log " | ||
| + | export PGPASSWORD=" | ||
| + | if docker exec " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | unset PGPASSWORD | ||
| + | |||
| + | # Удаляем старые бекапы | ||
| + | log " | ||
| + | DELETED_COUNT=$(find " | ||
| + | log " | ||
| + | |||
| + | # Показываем статистику бекапов | ||
| + | BACKUP_COUNT=$(ls -1 " | ||
| + | TOTAL_SIZE=$(du -sh " | ||
| + | log " | ||
| + | log " | ||
| + | |||
| + | # Получаем информацию о свободном месте на диске | ||
| + | BACKUP_DISK_USAGE=$(df -h " | ||
| + | ROOT_DISK_USAGE=$(df -h / | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)" | ||
| + | |||
| + | log " | ||
| + | if [ " | ||
| + | log " | ||
| + | fi | ||
| + | |||
| + | # Получаем процент заполнения диска с бекапами для предупреждений | ||
| + | BACKUP_DISK_PERCENT=$(df " | ||
| + | |||
| + | if [ " | ||
| + | log " | ||
| + | elif [ " | ||
| + | log " | ||
| + | fi | ||
| + | |||
| + | log "=== Резервное копирование завершено успешно ===" | ||
| + | |||
| + | # Формируем сообщение для Telegram | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | 📁 Backup: $BACKUP_NAME ($BACKUP_SIZE) | ||
| + | 💾 DB dump: $DB_DUMP_SIZE | ||
| + | 📊 Total backups: $BACKUP_COUNT | ||
| + | 💿 Disk space: $BACKUP_DISK_USAGE" | ||
| + | |||
| + | # Добавляем предупреждение о месте, если нужно | ||
| + | if [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ WARNING: Disk >90% full!" | ||
| + | elif [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ ATTENTION: Disk >80% full" | ||
| + | fi | ||
| + | |||
| + | # Отправляем уведомление в Telegram (опционально) | ||
| + | curl -s -X POST " | ||
| + | -d chat_id=" | ||
| + | -d text=" | ||
| + | |||
| + | exit 0 | ||
| + | </ | ||
| + | |||
| + | ==== 3. Настройка переменных ==== | ||
| + | |||
| + | После создания скрипта обязательно отредактируйте следующие переменные: | ||
| + | |||
| + | <code bash> | ||
| + | # Основные настройки (проверьте пути под вашу систему) | ||
| + | COMPOSE_FILE="/ | ||
| + | EVOLUTION_DIR="/ | ||
| + | BACKUP_DIR="/ | ||
| + | RETENTION_DAYS=10 | ||
| + | |||
| + | # ⚠️ ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ эти параметры безопасности: | ||
| + | DB_PASSWORD=" | ||
| + | curl ... " | ||
| + | chat_id=" | ||
| + | </ | ||
| + | |||
| + | <note warning> | ||
| + | **Безопасность**: | ||
| + | </ | ||
| + | |||
| + | ==== 4. Настройка Telegram уведомлений (опционально) ==== | ||
| + | |||
| + | Для получения уведомлений о результатах резервного копирования: | ||
| + | |||
| + | - Создайте Telegram бота через [@BotFather](https:// | ||
| + | - Получите токен бота | ||
| + | - Узнайте ваш chat_id (можно использовать [@userinfobot](https:// | ||
| + | - Замените токен и chat_id в конце скрипта | ||
| + | |||
| + | <code bash> | ||
| + | # Замените эти значения на свои | ||
| + | curl -s -X POST " | ||
| + | -d chat_id=" | ||
| + | -d text=" | ||
| + | </ | ||
| + | |||
| + | ===== Использование скрипта ===== | ||
| + | |||
| + | ==== Ручной запуск ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Запуск с выводом в консоль | ||
| + | / | ||
| + | |||
| + | # Запуск в фоновом режиме | ||
| + | nohup / | ||
| + | </ | ||
| + | |||
| + | ==== Автоматический запуск через Cron ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Редактируем crontab | ||
| + | crontab -e | ||
| + | |||
| + | # Добавляем задание (например, | ||
| + | 0 3 * * * / | ||
| + | |||
| + | # Или с логированием cron ошибок | ||
| + | 0 3 * * * / | ||
| + | </ | ||
| + | |||
| + | **Примеры расписаний Cron:** | ||
| + | * `0 3 * * *` - каждый день в 3:00 | ||
| + | * `0 2 * * 0` - каждое воскресенье в 2:00 | ||
| + | * `0 1 1 * *` - 1 числа каждого месяца в 1:00 | ||
| + | * `0 */6 * * *` - каждые 6 часов | ||
| + | |||
| + | ===== Процесс резервного копирования ===== | ||
| + | |||
| + | Скрипт выполняет следующие операции: | ||
| + | |||
| + | - **Проверка окружения** - проверяет наличие файлов и запущенные контейнеры | ||
| + | - **Создание SQL дампа** - создает дамп базы данных PostgreSQL | ||
| + | - **Остановка контейнеров** - корректно останавливает все сервисы | ||
| + | - **Создание архива** - упаковывает все данные в tar.gz | ||
| + | - **Запуск контейнеров** - восстанавливает работу системы | ||
| + | - **Проверка состояния** - проверяет что все сервисы запустились | ||
| + | - **Очистка старых бекапов** - удаляет файлы старше указанного срока | ||
| + | - **Отправка уведомлений** - отправляет статус в Telegram | ||
| + | |||
| + | < | ||
| + | **Время простоя**: | ||
| + | </ | ||
| + | |||
| + | ==== Мониторинг дискового пространства ==== | ||
| + | |||
| + | Скрипт автоматически отслеживает состояние дискового пространства: | ||
| + | |||
| + | ^ Уровень заполнения ^ Действие ^ Сообщение ^ | ||
| + | | < 80% | Нормальная работа | Информация в логе | | ||
| + | | 80-90% | Предупреждение | " | ||
| + | | > 90% | Критическое предупреждение | " | ||
| + | |||
| + | <code bash> | ||
| + | # Проверка свободного места вручную | ||
| + | df -h / | ||
| + | |||
| + | # Расчет размера всех бекапов | ||
| + | du -sh / | ||
| + | |||
| + | # Принудительная очистка старых бекапов (осторожно!) | ||
| + | find / | ||
| + | </ | ||
| + | |||
| + | **Рекомендации по управлению дисковым пространством: | ||
| + | * При заполнении > 80% - рассмотрите уменьшение срока хранения бекапов | ||
| + | * При заполнении > 90% - немедленно очистите старые бекапы или увеличьте дисковое пространство | ||
| + | * Настройте отдельный диск для бекапов, | ||
| + | |||
| + | ===== Мониторинг и логи ===== | ||
| + | |||
| + | ==== Просмотр логов ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Последние 50 строк лога | ||
| + | tail -50 / | ||
| + | |||
| + | # Мониторинг в реальном времени | ||
| + | tail -f / | ||
| + | |||
| + | # Логи за сегодня | ||
| + | grep " | ||
| + | </ | ||
| + | |||
| + | ==== Проверка статуса бекапов ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Список всех бекапов | ||
| + | ls -lah / | ||
| + | |||
| + | # Размер директории бекапов | ||
| + | du -sh / | ||
| + | |||
| + | # Последний успешный бекап | ||
| + | grep " | ||
| + | </ | ||
| + | |||
| + | ==== Настройка ротации логов ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Создаем конфиг для logrotate | ||
| + | cat > / | ||
| + | / | ||
| + | weekly | ||
| + | rotate 8 | ||
| + | compress | ||
| + | delaycompress | ||
| + | notifempty | ||
| + | create 644 root root | ||
| + | } | ||
| + | EOF | ||
| + | </ | ||
| + | |||
| + | ===== Восстановление из резервной копии ===== | ||
| + | |||
| + | ==== Полное восстановление системы ==== | ||
| + | |||
| + | <note warning> | ||
| + | **Внимание!** Процедура восстановления полностью заменит текущие данные. Убедитесь что система остановлена. | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | # 1. Останавливаем Evolution API | ||
| + | cd / | ||
| + | docker-compose down | ||
| + | |||
| + | # 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) | ||
| + | |||
| + | # 3. Распаковываем бекап | ||
| + | cd / | ||
| + | tar -xzf / | ||
| + | |||
| + | # 4. Запускаем контейнеры | ||
| + | docker-compose up -d | ||
| + | |||
| + | # 5. Ждем запуска и проверяем | ||
| + | sleep 15 | ||
| + | docker-compose ps | ||
| + | </ | ||
| + | |||
| + | ==== Восстановление только базы данных ==== | ||
| + | |||
| + | <code bash> | ||
| + | # 1. Распаковываем дамп из архива | ||
| + | cd /tmp | ||
| + | tar -xzf / | ||
| + | |||
| + | # 2. Восстанавливаем базу данных | ||
| + | cd / | ||
| + | export PGPASSWORD=" | ||
| + | docker exec -i evolution_postgres psql -U evolution_user -d evolution_db < / | ||
| + | |||
| + | # 3. Перезапускаем API для применения изменений | ||
| + | docker-compose restart evolution-api | ||
| + | </ | ||
| + | |||
| + | ===== Решение проблем ===== | ||
| + | |||
| + | ==== Частые ошибки и решения ==== | ||
| + | |||
| + | **Ошибка: | ||
| + | <code bash> | ||
| + | # Решение: | ||
| + | cd / | ||
| + | docker-compose up -d | ||
| + | </ | ||
| + | |||
| + | **Ошибка: | ||
| + | <code bash> | ||
| + | # Проверяем статус PostgreSQL | ||
| + | docker exec evolution_postgres pg_isready -U evolution_user | ||
| + | |||
| + | # Проверяем логи PostgreSQL | ||
| + | docker logs evolution_postgres | ||
| + | |||
| + | # Проверяем подключение | ||
| + | docker exec evolution_postgres psql -U evolution_user -d evolution_db -c " | ||
| + | </ | ||
| + | |||
| + | **Ошибка: | ||
| + | <code bash> | ||
| + | # Проверяем и исправляем права | ||
| + | sudo chown -R $(whoami): | ||
| + | sudo chmod -R 755 / | ||
| + | </ | ||
| + | |||
| + | **Контейнеры не запускаются после бекапа** | ||
| + | <code bash> | ||
| + | # Проверяем логи Docker | ||
| + | docker-compose logs | ||
| + | |||
| + | # Принудительно пересоздаем контейнеры | ||
| + | docker-compose down | ||
| + | docker-compose up -d --force-recreate | ||
| + | </ | ||
| + | |||
| + | ==== Проверка целостности бекапов ==== | ||
| + | |||
| + | <code bash> | ||
| + | # Тест архива на целостность | ||
| + | tar -tzf / | ||
| + | |||
| + | # Проверка размера бекапа (должен быть больше 1MB) | ||
| + | if [ $(stat -f%z / | ||
| + | echo " | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | ==== Тестирование восстановления ==== | ||
| + | |||
| + | Рекомендуется периодически тестировать процедуру восстановления: | ||
| + | |||
| + | <code bash> | ||
| + | # Создаем тестовую среду | ||
| + | mkdir -p / | ||
| + | cd / | ||
| + | |||
| + | # Распаковываем последний бекап | ||
| + | tar -xzf / | ||
| + | |||
| + | # Проверяем содержимое | ||
| + | ls -la | ||
| + | echo " | ||
| + | </ | ||
| + | |||
| + | ===== Рекомендации по безопасности ===== | ||
| + | |||
| + | * **Шифрование бекапов**: | ||
| + | * **Удаленное хранение**: | ||
| + | * **Мониторинг доступа**: | ||
| + | * **Регулярное тестирование**: | ||
| + | * **Документирование изменений**: | ||
| + | |||
| + | ===== Контакты и поддержка ===== | ||
| + | |||
| + | При возникновении проблем с резервным копированием: | ||
| + | |||
| + | - Проверьте логи: `/ | ||
| + | - Проверьте системные ресурсы: | ||
| + | - Обратитесь к системному администратору | ||
| + | - Создайте issue в системе отслеживания задач | ||
| + | |||
| + | --- | ||
| + | // | ||