vm:chatwoot:03-backup

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
vm:chatwoot:03-backup [2025/08/30 17:51] adminvm:chatwoot:03-backup [2025/08/30 23:56] (текущий) admin
Строка 1: Строка 1:
-====== Резервное копирование Chatwoot ======+====== Автоматическое резервное копирование Chatwoot ======
  
 ===== Описание ===== ===== Описание =====
  
-Автоматизированный скрипт для создания резервных копий **Chatwoot** с поддержкой: +Система автоматического резервного копирования для Chatwoot, которая создает полные бекапы всех данныхвключая базу данных PostgreSQL, Redis, файлы медиа и конфигурации.
-  * Дампов базы данных PostgreSQL +
-  * Дампов Redis +
-  * Архивирования файлов storage, данных БД и Redis +
-  * Автоматической очистки старых бекапов +
-  * Мониторинга дискового пространства +
-  * Уведомлений в Telegram+
  
-===== Требования =====+**ВАЖНО**: Скрипт автоматически включает ВСЁ содержимое папки `/opt/chatwoot/chatwoot_data/` - любые новые файлы и папки попадут в бекап автоматически.
  
-  * Docker и Docker Compose +===== Что включается в бекап =====
-  * Bash 4.0+ +
-  * Утилиты: ''tar'', ''gzip'', ''find'', ''curl'' +
-  * Права root или sudo+
  
-===== Установка =====+^ Компонент ^ Описание ^ Расположение ^ 
 +| База данных PostgreSQL | Полный дамп схемы и данных | `/opt/chatwoot/chatwoot_data/postgres_data/` | 
 +| Redis данные | Дамп всех ключей и значений | `/opt/chatwoot/chatwoot_data/redis_data/` | 
 +| Медиа файлы | Загруженные файлы пользователей | `/opt/chatwoot/chatwoot_data/storage/` | 
 +| Конфигурация времени | Настройки часового пояса | `/opt/chatwoot/chatwoot_data/config/` | 
 +| Docker конфигурация | docker-compose.yml и .env | `/opt/chatwoot/chatwoot_dock/` | 
 +| **Все новые папки** | Автоматически | `/opt/chatwoot/chatwoot_data/*` |
  
-==== 1. Создание директорий ====+**Преимущество**: При добавлении новых папок в `/opt/chatwoot/chatwoot_data/` они автоматически попадут в следующий бекап без изменения скрипта. 
 + 
 +===== Структура проекта ===== 
 + 
 +<code> 
 +/opt/ 
 +├── chatwoot/ 
 +│   ├── chatwoot_dock/           # Docker Compose проект 
 +│   │   ├── docker-compose.yml   # Конфигурация контейнеров 
 +│   │   └── .env                 # Переменные окружения 
 +│   └── chatwoot_data/           # Все данные приложения 
 +│       ├── postgres_data/       # База данных 
 +│       ├── redis_data/          # Кэш 
 +│       ├── storage/             # Медиа файлы 
 +│       └── config/              # Пользовательские конфигурации 
 +├── backups/ 
 +│   └── chatwoot/                # Папка для бекапов 
 +└── scripts/ 
 +    └── chatwoot-backup.sh       # Скрипт резервного копирования 
 +</code> 
 + 
 +===== Установка и настройка ===== 
 + 
 +==== Шаг 1: Создание структуры папок ====
  
 <code bash> <code bash>
-# Создаем необходимые директории+# Создание необходимых папок
 sudo mkdir -p /opt/scripts sudo mkdir -p /opt/scripts
 sudo mkdir -p /opt/backups/chatwoot sudo mkdir -p /opt/backups/chatwoot
- +sudo chown -R $USER:$USER /opt/backups 
-# Устанавливаем права доступа +sudo chown -R $USER:$USER /opt/scripts
-sudo chmod 755 /opt/scripts +
-sudo chmod 755 /opt/backups+
 </code> </code>
  
-==== 2Создание скрипта ====+==== Шаг 2Создание скрипта ==== 
 + 
 +Создайте файл `/opt/scripts/chatwoot-backup.sh`:
  
 <code bash> <code bash>
Строка 38: Строка 58:
 </code> </code>
  
-Скопируйте в файл следующий скрипт:+Вставьте следующий код, заменив пароли на свои:
  
 <code bash> <code bash>
Строка 54: Строка 74:
 RETENTION_DAYS=10  # Храним бекапы 10 дней RETENTION_DAYS=10  # Храним бекапы 10 дней
    
-# Настройки базы данных+# Настройки базы данных - ИЗМЕНИТЕ НА СВОИ
 DB_CONTAINER="chatwoot_postgres" DB_CONTAINER="chatwoot_postgres"
 DB_USER="postgres" DB_USER="postgres"
-DB_PASSWORD="ваш_пароль_postgresql" +DB_PASSWORD="YOUR_POSTGRES_PASSWORD"  # Замените на ваш пароль 
-DB_NAME="chatwoot"+DB_NAME="chatwoot_production"
  
-# Настройки Redis+# Настройки Redis - ИЗМЕНИТЕ НА СВОИ
 REDIS_CONTAINER="chatwoot_redis" REDIS_CONTAINER="chatwoot_redis"
-REDIS_PASSWORD="ваш_пароль_redis"+REDIS_PASSWORD="YOUR_REDIS_PASSWORD"  # Замените на ваш пароль
    
 # Логирование # Логирование
Строка 88: Строка 108:
     exit 1     exit 1
 } }
 +
 # Проверяем что контейнеры запущены # Проверяем что контейнеры запущены
 log "Проверяем статус контейнеров..." log "Проверяем статус контейнеров..."
Строка 94: Строка 115:
     exit 1     exit 1
 fi fi
 +
 +# Показываем что будет включено в бекап
 +log "Анализируем содержимое /opt/chatwoot/chatwoot_data/..."
 +CHATWOOT_DATA_CONTENTS=$(ls -la /opt/chatwoot/chatwoot_data/ 2>/dev/null | grep -v "^total" | grep -v "^\." | awk '{print $9}' | grep -v "^$" | tr '\n' ' ')
 +log "Будет включено в бекап: $CHATWOOT_DATA_CONTENTS"
 +
 # Создаем дамп базы данных (пока контейнеры работают) # Создаем дамп базы данных (пока контейнеры работают)
 log "Создаем дамп базы данных..." log "Создаем дамп базы данных..."
Строка 115: Строка 142:
 log "Создаем дамп Redis..." log "Создаем дамп Redis..."
 REDIS_DUMP_PATH="${BACKUP_DIR}/${BACKUP_NAME}_redis.rdb" REDIS_DUMP_PATH="${BACKUP_DIR}/${BACKUP_NAME}_redis.rdb"
-docker exec "$REDIS_CONTAINER" redis-cli -a "$REDIS_PASSWORD" --rdb "$REDIS_DUMP_PATH" 2>> "$LOG_FILE"+# Создаем дамп внутри контейнера во временный файл 
 +REDIS_TEMP_PATH="/tmp/redis_dump.rdb" 
 +docker exec "$REDIS_CONTAINER" redis-cli -a "$REDIS_PASSWORD" --rdb "$REDIS_TEMP_PATH" 2>> "$LOG_FILE"
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     # Копируем дамп из контейнера     # Копируем дамп из контейнера
-    docker cp "$REDIS_CONTAINER:$REDIS_DUMP_PATH" "$REDIS_DUMP_PATH" 2>> "$LOG_FILE"+    docker cp "$REDIS_CONTAINER:$REDIS_TEMP_PATH" "$REDIS_DUMP_PATH" 2>> "$LOG_FILE"
     if [ -f "$REDIS_DUMP_PATH" ]; then     if [ -f "$REDIS_DUMP_PATH" ]; then
         log "Дамп Redis создан: $REDIS_DUMP_PATH"         log "Дамп Redis создан: $REDIS_DUMP_PATH"
         REDIS_DUMP_SIZE=$(du -h "$REDIS_DUMP_PATH" | cut -f1)         REDIS_DUMP_SIZE=$(du -h "$REDIS_DUMP_PATH" | cut -f1)
         log "Размер дампа Redis: $REDIS_DUMP_SIZE"         log "Размер дампа Redis: $REDIS_DUMP_SIZE"
 +        # Удаляем временный файл из контейнера
 +        docker exec "$REDIS_CONTAINER" rm -f "$REDIS_TEMP_PATH" 2>/dev/null
     else     else
         log "ПРЕДУПРЕЖДЕНИЕ: Файл дампа Redis не найден"         log "ПРЕДУПРЕЖДЕНИЕ: Файл дампа Redis не найден"
Строка 134: Строка 165:
 # Очищаем переменную окружения # Очищаем переменную окружения
 unset PGPASSWORD unset PGPASSWORD
 +
 # Останавливаем контейнеры # Останавливаем контейнеры
 log "Останавливаем контейнеры Chatwoot..." log "Останавливаем контейнеры Chatwoot..."
Строка 148: Строка 180:
 sleep 5 sleep 5
    
-# Создаем архив с данными (включая дампы БД и Redis) +# Создаем архив с данными - АВТОМАТИЧЕСКИ ВКЛЮЧАЕТ ВСЁ СОДЕРЖИМОЕ chatwoot_data 
-log "Создаем архив данных..."+log "Создаем архив данных (включает ВСЁ содержимое chatwoot_data)..."
 BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
- + 
 +# Создаем архив с автоматическим включением ВСЕГО содержимого /opt/chatwoot/chatwoot_data/
 tar -czf "$BACKUP_PATH" \ tar -czf "$BACKUP_PATH" \
     --exclude='*.log' \     --exclude='*.log' \
     --exclude='**/lost+found' \     --exclude='**/lost+found' \
 +    --exclude='**/.tmp' \
 +    --exclude='**/tmp/*' \
 +    --exclude='**/.cache' \
     -C "$BACKUP_DIR" "${BACKUP_NAME}_database.sql" \     -C "$BACKUP_DIR" "${BACKUP_NAME}_database.sql" \
     $([ -f "$REDIS_DUMP_PATH" ] && echo "-C $BACKUP_DIR ${BACKUP_NAME}_redis.rdb") \     $([ -f "$REDIS_DUMP_PATH" ] && echo "-C $BACKUP_DIR ${BACKUP_NAME}_redis.rdb") \
-    -C "/opt/chatwoot/chatwoot_data" \ +    -C "/opt/chatwoot"
-    postgres_data/+    chatwoot_data/ \
-    redis_data/ \ +
-    storage/ \+
     -C "$CHATWOOT_DIR" \     -C "$CHATWOOT_DIR" \
     docker-compose.yml \     docker-compose.yml \
     .env     .env
- +
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     log "Архив создан: $BACKUP_PATH"     log "Архив создан: $BACKUP_PATH"
Строка 176: Строка 210:
     [ -f "$REDIS_DUMP_PATH" ] && rm -f "$REDIS_DUMP_PATH"     [ -f "$REDIS_DUMP_PATH" ] && rm -f "$REDIS_DUMP_PATH"
     log "Отдельные файлы дампов удалены (включены в архив)"     log "Отдельные файлы дампов удалены (включены в архив)"
 +    
 +    # Показываем что попало в архив
 +    log "Содержимое архива (основные папки и файлы):"
 +    tar -tzf "$BACKUP_PATH" | head -20 | while read file; do
 +        log "  $file"
 +    done
 +    TOTAL_FILES=$(tar -tzf "$BACKUP_PATH" | wc -l)
 +    log "Общее количество файлов в архиве: $TOTAL_FILES"
 +    
 else else
     log "ОШИБКА: Не удалось создать архив"     log "ОШИБКА: Не удалось создать архив"
Строка 208: Строка 251:
     log "ПРЕДУПРЕЖДЕНИЕ: Работают только $RUNNING_CONTAINERS из $TOTAL_CONTAINERS контейнеров"     log "ПРЕДУПРЕЖДЕНИЕ: Работают только $RUNNING_CONTAINERS из $TOTAL_CONTAINERS контейнеров"
 fi fi
 +
 # Проверяем доступность базы данных # Проверяем доступность базы данных
 log "Проверяем подключение к базе данных..." log "Проверяем подключение к базе данных..."
Строка 253: Строка 297:
 log "Общее количество бекапов: $BACKUP_COUNT" log "Общее количество бекапов: $BACKUP_COUNT"
 log "Общий размер папки бекапов: $TOTAL_SIZE" log "Общий размер папки бекапов: $TOTAL_SIZE"
 +
 # Получаем информацию о свободном месте на диске # Получаем информацию о свободном месте на диске
 BACKUP_DISK_USAGE=$(df -h "$BACKUP_DIR" | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)"}') BACKUP_DISK_USAGE=$(df -h "$BACKUP_DIR" | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)"}')
Строка 260: Строка 305:
     log "Свободное место на корневом диске: $ROOT_DISK_USAGE"     log "Свободное место на корневом диске: $ROOT_DISK_USAGE"
 fi fi
 +
 # Получаем процент заполнения диска с бекапами для предупреждений # Получаем процент заполнения диска с бекапами для предупреждений
 BACKUP_DISK_PERCENT=$(df "$BACKUP_DIR" | awk 'NR==2 {print $5}' | sed 's/%//') BACKUP_DISK_PERCENT=$(df "$BACKUP_DIR" | awk 'NR==2 {print $5}' | sed 's/%//')
Строка 269: Строка 315:
    
 log "=== Резервное копирование завершено успешно ===" log "=== Резервное копирование завершено успешно ==="
 +
 # Формируем сообщение для Telegram # Формируем сообщение для Telegram
 TELEGRAM_MESSAGE="✅ Chatwoot backup completed TELEGRAM_MESSAGE="✅ Chatwoot backup completed
Строка 275: Строка 322:
 🗄️ Redis dump: $REDIS_DUMP_SIZE 🗄️ Redis dump: $REDIS_DUMP_SIZE
 📊 Total backups: $BACKUP_COUNT 📊 Total backups: $BACKUP_COUNT
 +📄 Files in archive: $TOTAL_FILES
 💿 Disk space: $BACKUP_DISK_USAGE" 💿 Disk space: $BACKUP_DISK_USAGE"
 +
 # Добавляем предупреждение о месте, если нужно # Добавляем предупреждение о месте, если нужно
 if [ "$BACKUP_DISK_PERCENT" -gt 90 ]; then if [ "$BACKUP_DISK_PERCENT" -gt 90 ]; then
Строка 284: Строка 333:
 ⚠️ ATTENTION: Disk >80% full" ⚠️ ATTENTION: Disk >80% full"
 fi fi
 +
 # Отправляем уведомление в Telegram (опционально) # Отправляем уведомление в Telegram (опционально)
-curl -s -X POST "https://api.telegram.org/bot[ВАШ_ТОКЕН]/sendMessage"+# Замените на свой BOT_TOKEN и CHAT_ID 
-     -d chat_id="[ВАШ_CHAT_ID]" \+curl -s -X POST "https://api.telegram.org/bot[YOUR_BOT_TOKEN]/sendMessage"
 +     -d chat_id="[YOUR_CHAT_ID]" \
      -d text="$TELEGRAM_MESSAGE" > /dev/null      -d text="$TELEGRAM_MESSAGE" > /dev/null
 +
 exit 0 exit 0
 </code> </code>
  
-**Обязательно измените следующие параметры:** +**Обязательно измените**: 
-  * ''DB_PASSWORD="ваш_пароль_postgresql"''пароль PostgreSQL +  * `YOUR_POSTGRES_PASSWORD` на ваш пароль PostgreSQL 
-  * ''REDIS_PASSWORD="ваш_пароль_redis"''пароль Redis +  * `YOUR_REDIS_PASSWORD` на ваш пароль Redis   
-  * ''[ВАШ_ТОКЕН]''токен Telegram бота +  * `[YOUR_BOT_TOKEN]` на токен вашего Telegram бота (опционально) 
-  * ''[ВАШ_CHAT_ID]'' - ID чата для уведомлений+  * `[YOUR_CHAT_ID]` на ваш Chat ID в Telegram (опционально)
  
-==== 3. Установка прав выполнения ====+==== Шаг 3: Настройка прав доступа ====
  
 <code bash> <code bash>
 +# Делаем скрипт исполняемым
 sudo chmod +x /opt/scripts/chatwoot-backup.sh sudo chmod +x /opt/scripts/chatwoot-backup.sh
 +
 +# Проверяем права
 +ls -la /opt/scripts/chatwoot-backup.sh
 </code> </code>
  
-===== Настройка Telegram уведомлений =====+==== Шаг 4: Тестовый запуск ====
  
-1. Создайте бота через **@BotFather** +<code bash> 
-2. Получите **токен бота** и **chat_id** +Запуск тестового бекапа 
-3. Замените в скрипте соответствующие плейсхолдеры+sudo /opt/scripts/chatwoot-backup.sh
  
-===== Автоматизация =====+# Проверка результата 
 +ls -la /opt/backups/chatwoot/ 
 +cat /opt/backups/chatwoot/backup.log 
 +</code>
  
-==== Настройка Cron ====+===== Автоматизация через Cron ===== 
 + 
 +==== Настройка ежедневного бекапа ====
  
 <code bash> <code bash>
-Редактируем crontab+Открываем crontab
 sudo crontab -e sudo crontab -e
  
-# Добавляем задание - ежедневно в 4:00   +# Добавляем задачу (бекап каждый день в 2:00 ночи) 
-* * * /opt/scripts/chatwoot-backup.sh >> /var/log/chatwoot-backup.log 2>&1+* * * /opt/scripts/chatwoot-backup.sh >> /var/log/chatwoot-backup-cron.log 2>&1 
 + 
 +# Сохраняем и выходим (Ctrl+X, Y, Enter)
 </code> </code>
  
-===== Использование =====+==== Альтернативные расписания ====
  
-==== Ручной запуск ====+<code> 
 +# Каждый день в 3:00 
 +0 3 * * * /opt/scripts/chatwoot-backup.sh
  
-<code bash> +# Каждые 12 часов (в 6:00 и 18:00) 
-sudo /opt/scripts/chatwoot-backup.sh+0 6,18 * * * /opt/scripts/chatwoot-backup.sh 
 + 
 +# Каждый день в 1:30 ночи 
 +30 1 * * * /opt/scripts/chatwoot-backup.sh 
 + 
 +# Только в выходные в 4:00 
 +0 4 * * 6,0 /opt/scripts/chatwoot-backup.sh
 </code> </code>
  
-==== Проверка бекапов ====+==== Проверка работы Cron ====
  
 <code bash> <code bash>
-Список бекапов +Проверить статус cron 
-ls -la /opt/backups/chatwoot/+sudo systemctl status cron
  
-# Просмотр лога +# Посмотреть активные задачи 
-tail -f /opt/backups/chatwoot/backup.log+sudo crontab -l 
 + 
 +# Посмотреть логи cron 
 +sudo tail -f /var/log/chatwoot-backup-cron.log
 </code> </code>
  
-===== Структура бекапов =====+===== Мониторинг и уведомления =====
  
-<code> +==== Настройка Telegram бота ==== 
-/opt/backups/chatwoot/ + 
-├── chatwoot_backup_20250830_201456.tar.gz   # Основной архив +1. **Создайте бота**: Отправьте `/start` боту @BotFather в Telegram 
-├── backup.log                               # Лог операций +2**Получите токен**: Сохраните Bot Token  
-└── [старые бекапы...]+3**Узнайте Chat ID**: Отправьте сообщение боту, затем откройте: 
 +   `https://api.telegram.org/bot[YOUR_BOT_TOKEN]/getUpdates` 
 + 
 +==== Проверка уведомлений ==== 
 + 
 +<code bash> 
 +# Тест отправки сообщения (замените токен и chat_id) 
 +curl -s -X POST "https://api.telegram.org/bot[YOUR_BOT_TOKEN]/sendMessage"
 +     -d chat_id="[YOUR_CHAT_ID]"
 +     -d text="Test message from Chatwoot backup script"
 </code> </code>
  
-**Содержимое архива:** +==== Мониторинг места на диске ====
-  * ''chatwoot_backup_YYYYMMDD_HHMMSS_database.sql'' - дамп PostgreSQL +
-  * ''chatwoot_backup_YYYYMMDD_HHMMSS_redis.rdb'' - дамп Redis +
-  * ''postgres_data/'' - данные PostgreSQL +
-  * ''redis_data/'' - данные Redis +
-  * ''storage/'' - файлы storage Chatwoot +
-  * ''docker-compose.yml'' - конфигурация Docker +
-  * ''.env'' - переменные окружения+
  
-===== Восстановление =====+<code bash> 
 +# Проверка места в папке бекапов 
 +df -h /opt/backups/chatwoot/ 
 + 
 +# Размер всех бекапов 
 +du -sh /opt/backups/chatwoot/ 
 + 
 +# Список всех бекапов с размерами 
 +ls -lah /opt/backups/chatwoot/chatwoot_backup_*.tar.gz 
 +</code> 
 + 
 +===== Восстановление из бекапа =====
  
 ==== Полное восстановление ==== ==== Полное восстановление ====
  
 <code bash> <code bash>
-# Останавливаем сервисы+# Остановите Chatwoot
 cd /opt/chatwoot/chatwoot_dock cd /opt/chatwoot/chatwoot_dock
 docker-compose down docker-compose down
  
-Создаем бекап текущего состояния +Найдите нужный бекап 
-sudo mv /opt/chatwoot/chatwoot_data /opt/chatwoot/chatwoot_data.backup.$(date +%Y%m%d_%H%M%S)+ls -la /opt/backups/chatwoot/
  
-Создаем новую директорию данных +Извлеките архив (замените на ваш файл) 
-sudo mkdir -/opt/chatwoot/chatwoot_data+cd /tmp 
 +tar -xzf /opt/backups/chatwoot/chatwoot_backup_YYYYMMDD_HHMMSS.tar.gz
  
-Извлекаем архив +Восстановите данные 
-sudo tar -xzf /opt/backups/chatwoot/chatwoot_backup_YYYYMMDD_HHMMSS.tar.gz -/+sudo rm -rf /opt/chatwoot/chatwoot_data/
 +sudo cp -r chatwoot_data/* /opt/chatwoot/chatwoot_data/
  
-Запускаем сервисы+Восстановите конфигурацию (если нужно) 
 +cp docker-compose.yml /opt/chatwoot/chatwoot_dock/ 
 +cp .env /opt/chatwoot/chatwoot_dock/ 
 + 
 +# Запустите Chatwoot 
 +cd /opt/chatwoot/chatwoot_dock
 docker-compose up -d docker-compose up -d
 </code> </code>
  
-==== Восстановление только БД ====+==== Восстановление только базы данных ====
  
 <code bash> <code bash>
-Извлекаем SQL дамп +Найдите дамп базы в архиве 
-tar -xzf backup.tar.gz chatwoot_backup_YYYYMMDD_HHMMSS_database.sql+tar -tzf /opt/backups/chatwoot/chatwoot_backup_YYYYMMDD_HHMMSS.tar.gz | grep database.sql
  
-# Восстанавливаем в контейнер +# Извлеките дамп 
-docker exec -i chatwoot_postgres psql -U postgres -d chatwoot < chatwoot_backup_YYYYMMDD_HHMMSS_database.sql+tar -xzf /opt/backups/chatwoot/chatwoot_backup_YYYYMMDD_HHMMSS.tar.gz chatwoot_backup_YYYYMMDD_HHMMSS_database.sql 
 + 
 +# Восстановите в контейнер (Chatwoot должен быть запущен) 
 +export PGPASSWORD="YOUR_POSTGRES_PASSWORD" 
 +cat chatwoot_backup_YYYYMMDD_HHMMSS_database.sql | docker exec -i chatwoot_postgres psql -U postgres -d chatwoot_production 
 +unset PGPASSWORD
 </code> </code>
  
-===== Мониторинг =====+===== Устранение неполадок =====
  
-При успешном бекапе приходит уведомление: +==== Основные проблемы ====
-<code> +
-✅ Chatwoot backup completed +
-📁 Backup: chatwoot_backup_20250830_201456 (125M) +
-💾 DB dump: 45M +
-🗄️ Redis dump: 8M +
-📊 Total backups: 7 +
-💿 Disk space: 2.1G свободно из 10G (79% занято) +
-</code>+
  
-Предупреждения при заполнении диска: +=== Ошибка "Container not found" === 
-<code> + 
-⚠️ ATTENTION: Disk >80% full +**Причина**: Неправильные имена контейнеров 
-⚠️ WARNING: Disk >90% full!+ 
 +**Решение**: Проверьте имена контейнеров
 +<code bash
 +docker ps 
 +# Обновите переменные DB_CONTAINER и REDIS_CONTAINER в скрипте
 </code> </code>
  
-===== Устранение проблем =====+=== Ошибка доступа к базе данных ===
  
-=== Контейнеры не запущены ===+**Причина**: Неправильный пароль или имя базы 
 + 
 +**Решение**: Проверьте настройки в `.env` файле:
 <code bash> <code bash>
-cd /opt/chatwoot/chatwoot_dock +cat /opt/chatwoot/chatwoot_dock/.env | grep -i postgres 
-docker-compose ps +# Обновите переменные в скрипте согласно .env
-docker-compose up -d+
 </code> </code>
  
-=== Ошибка дампа БД ===+=== Нехватка места на диске === 
 + 
 +**Причина**: Заполнен диск 
 + 
 +**Решение**: 
 <code bash> <code bash>
-Проверяем доступность БД +Удалите старые бекапы вручную 
-docker exec chatwoot_postgres pg_isready -U postgres+find /opt/backups/chatwoot/ -name "chatwoot_backup_*.tar.gz" -mtime +7 -delete
  
-Проверяем логи +Уменьшите RETENTION_DAYS в скрипте
-docker logs chatwoot_postgres+
 </code> </code>
  
-=== Ошибка дампа Redis ===+==== Проверка логов ==== 
 <code bash> <code bash>
-Проверяем Redis +Основной лог скрипта 
-docker exec chatwoot_redis redis-cli -a [пароль] ping+tail -f /opt/backups/chatwoot/backup.log
  
-Проверяем логи+Лог cron 
 +tail -f /var/log/chatwoot-backup-cron.log 
 + 
 +# Логи Docker контейнеров 
 +docker logs chatwoot_postgres
 docker logs chatwoot_redis docker logs chatwoot_redis
 </code> </code>
  
-=== Нет места на диске ===+===== Дополнительные настройки ===== 
 + 
 +==== Изменение времени хранения ===
 + 
 +В скрипте измените:
 <code bash> <code bash>
-Проверяем использование +RETENTION_DAYS=10  Храним бекапы 10 дней 
-df -h /opt/backups+</code>
  
-# Удаляем старые бекапы +==== Изменение папки бекапов ==== 
-find /opt/backups -name "*backup*.tar.gz-mtime +5 -delete+ 
 +В скрипте измените: 
 +<code bash> 
 +BACKUP_DIR="/opt/backups/chatwoot"
 </code> </code>
 +
 +**Рекомендация**: Для больших проектов рассмотрите возможность хранения бекапов на отдельном диске или в облачном хранилище.
  
 ===== Безопасность ===== ===== Безопасность =====
 +
 +==== Защита скрипта ====
  
 <code bash> <code bash>
-Устанавливаем правильные права +Ограничить доступ только root
-sudo chmod 700 /opt/scripts/chatwoot-backup.sh+
 sudo chown root:root /opt/scripts/chatwoot-backup.sh sudo chown root:root /opt/scripts/chatwoot-backup.sh
 +sudo chmod 700 /opt/scripts/chatwoot-backup.sh
  
-Защищаем директорию бекапов +Проверить права 
-sudo chmod 755 /opt/backups +ls -la /opt/scripts/chatwoot-backup.sh
-sudo chown root:root /opt/backups+
 </code> </code>
 +
 +==== Шифрование бекапов ====
 +
 +Для дополнительной безопасности можно добавить шифрование:
 +
 +<code bash>
 +# Добавьте в скрипт после создания архива:
 +gpg --symmetric --cipher-algo AES256 "$BACKUP_PATH"
 +rm "$BACKUP_PATH"  # Удаляем незашифрованную версию
 +</code>
 +
 +===== Заключение =====
 +
 +Данный скрипт обеспечивает:
 +
 +- **Полное резервное копирование** всех данных Chatwoot
 +- **Автоматическое включение** новых файлов и папок в `/opt/chatwoot/chatwoot_data/`
 +- **Безопасное выполнение** с остановкой и запуском контейнеров
 +- **Очистку старых бекапов** для экономии места
 +- **Детальное логирование** всех операций
 +- **Уведомления в Telegram** о статусе бекапа
 +- **Мониторинг места на диске** с предупреждениями
 +
 +**Результат**: Надежная система резервного копирования, которая автоматически адаптируется к изменениям в структуре данных Chatwoot.
  
 ---- ----
  
-//Документация обновлена: {{ CURRENTUSER }} {{ date:j.m.Y H:i }}/+//Инструкция протестирована на Ubuntu Server с Docker Compose. Регулярно проверяйте работоспособность бекапов и процедуры восстановления.//
  • vm/chatwoot/03-backup.1756576301.txt.gz
  • Последнее изменение: 2025/08/30 17:51
  • admin