Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| vm:chatwoot:03-backup [2025/08/28 21:12] – ↷ Имя страницы vm:chatwoot:02-backup изменено на vm:chatwoot:03-backup admin | vm:chatwoot:03-backup [2025/08/30 23:56] (текущий) – admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== | + | ====== |
| ===== Описание ===== | ===== Описание ===== | ||
| - | Автоматическое резервное копирование системы | + | Система автоматического резервного копирования для |
| - | ===== Что включается в резервную копию ===== | + | **ВАЖНО**: |
| - | * **База данных** - SQL дамп базы '' | + | ===== Что включается в бекап ===== |
| - | * **Файлы хранилища** - директория '' | + | |
| - | * **Данные PostgreSQL** - директория '' | + | |
| - | * **Данные Redis** - директория '' | + | |
| - | * **Конфигурация** - файлы '' | + | |
| - | **⚠️ Важно:** Директория '' | + | ^ Компонент ^ Описание ^ Расположение ^ |
| + | | База данных PostgreSQL | Полный дамп схемы и данных | `/ | ||
| + | | Redis данные | ||
| + | | Медиа файлы | Загруженные | ||
| + | | Конфигурация времени | Настройки часового | ||
| + | | Docker | ||
| + | | **Все новые папки** | Автоматически | `/ | ||
| - | ===== Установка скрипта резервного | + | **Преимущество**: При добавлении |
| - | ==== 1. Создание директорий ==== | + | ===== Структура проекта ===== |
| + | |||
| + | < | ||
| + | /opt/ | ||
| + | ├── chatwoot/ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | ├── backups/ | ||
| + | │ | ||
| + | └── scripts/ | ||
| + | └── chatwoot-backup.sh | ||
| + | </ | ||
| + | |||
| + | ===== Установка и настройка ===== | ||
| + | |||
| + | ==== Шаг 1: Создание структуры папок | ||
| <code bash> | <code bash> | ||
| - | mkdir -p / | + | # Создание необходимых папок |
| - | mkdir -p / | + | sudo mkdir -p / |
| + | sudo mkdir -p / | ||
| + | sudo chown -R $USER:$USER / | ||
| + | sudo chown -R $USER:$USER / | ||
| </ | </ | ||
| - | ==== 2. Создание скрипта ==== | + | ==== Шаг |
| - | Создайте файл | + | Создайте файл |
| <code bash> | <code bash> | ||
| - | nano / | + | sudo nano / |
| </ | </ | ||
| - | Вставьте следующий код: | + | Вставьте следующий код, заменив пароли на свои: |
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| + | |||
| # Скрипт резервного копирования Chatwoot | # Скрипт резервного копирования Chatwoot | ||
| # Запуск: | # Запуск: | ||
| + | |||
| # Настройки | # Настройки | ||
| - | COMPOSE_FILE="/ | + | COMPOSE_FILE="/ |
| - | CHATWOOT_DIR="/ | + | CHATWOOT_DIR="/ |
| BACKUP_DIR="/ | BACKUP_DIR="/ | ||
| DATE=$(date +" | DATE=$(date +" | ||
| BACKUP_NAME=" | BACKUP_NAME=" | ||
| - | RETENTION_DAYS=30 # Храним бекапы | + | RETENTION_DAYS=10 # Храним бекапы |
| - | + | ||
| - | # Настройки базы данных | + | # Настройки базы данных |
| - | DB_NAME="chatwoot_production" | + | DB_CONTAINER="chatwoot_postgres" |
| DB_USER=" | DB_USER=" | ||
| - | DB_PASSWORD=" | + | DB_PASSWORD=" |
| - | DB_CONTAINER="chatwoot_postgres_1" | + | DB_NAME="chatwoot_production" |
| + | # Настройки Redis - ИЗМЕНИТЕ НА СВОИ | ||
| + | REDIS_CONTAINER=" | ||
| + | REDIS_PASSWORD=" | ||
| + | |||
| # Логирование | # Логирование | ||
| LOG_FILE=" | LOG_FILE=" | ||
| + | |||
| # Функция логирования | # Функция логирования | ||
| log() { | log() { | ||
| echo " | echo " | ||
| } | } | ||
| + | |||
| # Создаем директорию для бекапов если не существует | # Создаем директорию для бекапов если не существует | ||
| mkdir -p " | mkdir -p " | ||
| + | |||
| log "=== Начало резервного копирования Chatwoot ===" | log "=== Начало резервного копирования Chatwoot ===" | ||
| + | |||
| # Проверяем что compose файл существует | # Проверяем что compose файл существует | ||
| if [ ! -f " | if [ ! -f " | ||
| Строка 72: | Строка 102: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Переходим в директорию с Chatwoot | # Переходим в директорию с Chatwoot | ||
| cd " | cd " | ||
| Строка 80: | Строка 110: | ||
| # Проверяем что контейнеры запущены | # Проверяем что контейнеры запущены | ||
| - | if ! docker-compose ps | grep -q " | + | log " |
| - | log "ПРЕДУПРЕЖДЕНИЕ: Не все контейнеры запущены" | + | if ! docker-compose |
| + | log "ОШИБКА: Контейнеры | ||
| + | exit 1 | ||
| fi | fi | ||
| - | # Создаем | + | # Показываем |
| - | log "Создаем дамп базы данных..." | + | log "Анализируем содержимое / |
| - | DB_DUMP_FILE="${BACKUP_DIR}/${BACKUP_NAME}_database.sql" | + | CHATWOOT_DATA_CONTENTS=$(ls -la /opt/ |
| + | log " | ||
| - | docker exec -t " | + | # Создаем дамп базы данных (пока контейнеры работают) |
| + | 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 | ||
| + | # Создаем дамп Redis | ||
| + | log " | ||
| + | REDIS_DUMP_PATH=" | ||
| + | # Создаем дамп внутри контейнера во временный файл | ||
| + | REDIS_TEMP_PATH="/ | ||
| + | docker exec " | ||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| - | | + | |
| - | | + | docker cp " |
| - | log " | + | if [ -f " |
| + | log " | ||
| + | | ||
| + | log " | ||
| + | # Удаляем временный файл из контейнера | ||
| + | docker exec "$REDIS_CONTAINER" | ||
| + | else | ||
| + | log " | ||
| + | REDIS_DUMP_SIZE=" | ||
| + | fi | ||
| else | else | ||
| - | log "ОШИБКА: Не удалось создать дамп | + | log "ПРЕДУПРЕЖДЕНИЕ: Не удалось создать дамп |
| - | | + | |
| fi | fi | ||
| - | # Останавливаем контейнеры | + | # Очищаем переменную окружения |
| + | unset PGPASSWORD | ||
| + | |||
| + | # Останавливаем контейнеры | ||
| log " | log " | ||
| docker-compose -f " | docker-compose -f " | ||
| + | |||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| log " | log " | ||
| Строка 109: | Строка 176: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Ждем пару секунд для полной остановки | # Ждем пару секунд для полной остановки | ||
| sleep 5 | sleep 5 | ||
| + | |||
| + | # Создаем архив с данными - АВТОМАТИЧЕСКИ ВКЛЮЧАЕТ ВСЁ СОДЕРЖИМОЕ chatwoot_data | ||
| + | log " | ||
| + | BACKUP_PATH=" | ||
| - | # Создаем архив с данными | + | # Создаем архив с автоматическим включением ВСЕГО содержимого / |
| - | log "Создаем архив данных..." | + | tar -czf "$BACKUP_PATH" \ |
| - | BACKUP_ARCHIVE=" | + | |
| - | + | ||
| - | tar -czf "$BACKUP_ARCHIVE" \ | + | |
| --exclude=' | --exclude=' | ||
| --exclude=' | --exclude=' | ||
| - | --exclude=' | + | --exclude=' |
| - | --exclude=' | + | --exclude=' |
| - | | + | |
| - | | + | |
| - | | + | $([ -f " |
| + | -C "/opt/chatwoot" | ||
| + | | ||
| + | -C " | ||
| docker-compose.yml \ | docker-compose.yml \ | ||
| .env | .env | ||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| - | log " | + | log " |
| + | |||
| + | # Получаем размер архива | ||
| + | BACKUP_SIZE=$(du -h " | ||
| + | log " | ||
| + | |||
| + | # Удаляем отдельные файлы дампов, | ||
| + | rm -f " | ||
| + | [ -f " | ||
| + | log " | ||
| + | |||
| + | # Показываем что попало в архив | ||
| + | log " | ||
| + | tar -tzf " | ||
| + | log " | ||
| + | done | ||
| + | TOTAL_FILES=$(tar -tzf " | ||
| + | log " | ||
| | | ||
| - | # Получаем размер архива | ||
| - | ARCHIVE_SIZE=$(du -h " | ||
| - | log " | ||
| else | else | ||
| log " | log " | ||
| - | | + | |
| # Пытаемся запустить контейнеры даже при ошибке | # Пытаемся запустить контейнеры даже при ошибке | ||
| log " | log " | ||
| Строка 142: | Строка 227: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Запускаем контейнеры обратно | # Запускаем контейнеры обратно | ||
| log " | log " | ||
| docker-compose -f " | docker-compose -f " | ||
| + | |||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| log " | log " | ||
| Строка 153: | Строка 238: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Ждем запуска сервисов | # Ждем запуска сервисов | ||
| - | log " | + | sleep 15 |
| - | sleep 30 | + | |
| # Проверяем что все контейнеры работают | # Проверяем что все контейнеры работают | ||
| log " | log " | ||
| - | if docker-compose -f " | + | RUNNING_CONTAINERS=$(docker-compose -f " |
| - | log "Контейнеры работают корректно" | + | TOTAL_CONTAINERS=$(docker-compose -f "$COMPOSE_FILE" |
| + | if [ " | ||
| + | log "Все контейнеры | ||
| else | else | ||
| - | log " | + | log " |
| fi | fi | ||
| - | # Проверяем | + | # Проверяем доступность |
| log " | log " | ||
| - | if docker exec " | + | export PGPASSWORD=" |
| - | log " | + | if docker exec " |
| + | log " | ||
| else | else | ||
| log " | log " | ||
| fi | fi | ||
| - | # Создаем итоговый архив с дампом базы данных | + | # Проверяем что база данных Chatwoot содержит нужные таблицы |
| - | log "Создаем итоговый архив с дампом базы данных..." | + | log " |
| - | FINAL_BACKUP=" | + | if docker exec " |
| + | | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| - | tar -czf "$FINAL_BACKUP" -C "$BACKUP_DIR" "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}_database.sql" | + | # Проверяем Redis контейнер |
| + | log " | ||
| + | if docker exec "$REDIS_CONTAINER" | ||
| + | log "Redis работает корректно" | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| - | if [ $? -eq 0 ]; then | + | # Проверяем Rails контейнер |
| - | log " | + | log "Проверяем |
| - | + | if docker exec chatwoot_rails bundle exec rails runner | |
| - | | + | log "Rails приложение работает корректно" |
| - | | + | |
| - | | + | |
| - | + | ||
| - | # Удаляем промежуточные файлы | + | |
| - | rm -f "$BACKUP_ARCHIVE" "$DB_DUMP_FILE" | + | |
| - | log "Промежуточные файлы удалены" | + | |
| else | else | ||
| - | log "ОШИБКА: Не удалось создать итоговый архив" | + | log "ПРЕДУПРЕЖДЕНИЕ: Rails приложение может работать некорректно" |
| fi | fi | ||
| + | unset PGPASSWORD | ||
| + | |||
| # Удаляем старые бекапы | # Удаляем старые бекапы | ||
| log " | log " | ||
| - | find " | + | DELETED_COUNT=$(find " |
| - | find " | + | log "Удалено старых бекапов: |
| - | find "$BACKUP_DIR" | + | |
| # Показываем статистику бекапов | # Показываем статистику бекапов | ||
| - | BACKUP_COUNT=$(ls -1 " | + | BACKUP_COUNT=$(ls -1 " |
| - | log " | + | TOTAL_SIZE=$(du -sh " |
| + | log " | ||
| + | log " | ||
| - | # Показываем общий размер всех бекапов | + | # Получаем информацию о свободном месте на диске |
| - | TOTAL_SIZE=$(du -sh " | + | BACKUP_DISK_USAGE=$(df -h " |
| - | log "Общий размер | + | ROOT_DISK_USAGE=$(df -h / | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)" |
| + | log " | ||
| + | if [ " | ||
| + | log "Свободное место на корневом диске: $ROOT_DISK_USAGE" | ||
| + | fi | ||
| + | # Получаем процент заполнения диска с бекапами для предупреждений | ||
| + | BACKUP_DISK_PERCENT=$(df " | ||
| + | if [ " | ||
| + | log " | ||
| + | elif [ " | ||
| + | log " | ||
| + | fi | ||
| + | |||
| log "=== Резервное копирование завершено успешно ===" | log "=== Резервное копирование завершено успешно ===" | ||
| - | # Отправляем уведомление (раскомментируйте если нужно) | + | # Формируем сообщение для Telegram |
| - | # curl -s -X POST " | + | TELEGRAM_MESSAGE=" |
| - | # -d chat_id=" | + | 📁 Backup: $BACKUP_NAME ($BACKUP_SIZE) |
| - | # -d text="✅ Chatwoot backup completed: | + | 💾 DB dump: $DB_DUMP_SIZE |
| + | 🗄️ Redis dump: $REDIS_DUMP_SIZE | ||
| + | 📊 Total backups: $BACKUP_COUNT | ||
| + | 📄 Files in archive: $TOTAL_FILES | ||
| + | 💿 Disk space: $BACKUP_DISK_USAGE" | ||
| + | |||
| + | # Добавляем предупреждение о месте, если нужно | ||
| + | if [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ WARNING: Disk >90% full!" | ||
| + | elif [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ ATTENTION: Disk >80% full" | ||
| + | fi | ||
| + | |||
| + | # Отправляем уведомление | ||
| + | # Замените | ||
| + | curl -s -X POST " | ||
| + | -d chat_id=" | ||
| + | -d text=" | ||
| exit 0 | exit 0 | ||
| </ | </ | ||
| - | ==== 3. Настройка прав доступа ==== | + | **Обязательно измените**: |
| + | * `YOUR_POSTGRES_PASSWORD` на ваш пароль PostgreSQL | ||
| + | * `YOUR_REDIS_PASSWORD` на ваш пароль Redis | ||
| + | * `[YOUR_BOT_TOKEN]` на токен вашего Telegram бота (опционально) | ||
| + | * `[YOUR_CHAT_ID]` на ваш Chat ID в Telegram (опционально) | ||
| + | |||
| + | ==== Шаг | ||
| <code bash> | <code bash> | ||
| - | chmod +x / | + | # Делаем скрипт исполняемым |
| + | sudo chmod +x / | ||
| + | |||
| + | # Проверяем права | ||
| + | ls -la / | ||
| </ | </ | ||
| - | ===== Настройка автоматического | + | ==== Шаг 4: Тестовый запуск ==== |
| - | ==== Добавление в crontab | + | <code bash> |
| + | # Запуск тестового бекапа | ||
| + | sudo / | ||
| + | |||
| + | # Проверка результата | ||
| + | ls -la / | ||
| + | cat / | ||
| + | </ | ||
| + | |||
| + | ===== Автоматизация через Cron ===== | ||
| + | |||
| + | ==== Настройка ежедневного бекапа | ||
| <code bash> | <code bash> | ||
| - | crontab -e | + | # Открываем crontab |
| + | sudo crontab -e | ||
| + | |||
| + | # Добавляем задачу (бекап каждый день в 2:00 ночи) | ||
| + | 0 2 * * * / | ||
| + | |||
| + | # Сохраняем и выходим (Ctrl+X, Y, Enter) | ||
| </ | </ | ||
| - | Добавьте | + | ==== Альтернативные расписания ==== |
| < | < | ||
| - | 0 2 * * * / | + | # Каждый день в 3:00 |
| - | </ | + | 0 3 * * * / |
| - | ===== Тестирование скрипта ===== | + | # Каждые 12 часов |
| + | 0 6,18 * * * / | ||
| - | ==== Ручной запуск ==== | + | # Каждый день в 1:30 ночи |
| + | 30 1 * * * / | ||
| - | <code bash> | + | # Только в выходные в 4:00 |
| - | / | + | 0 4 * * 6,0 / |
| </ | </ | ||
| - | ==== Проверка результатов ==== | + | ==== Проверка работы Cron ==== |
| <code bash> | <code bash> | ||
| - | # Проверить созданные файлы | + | # Проверить статус cron |
| - | ls -la / | + | sudo systemctl status cron |
| - | # Посмотреть | + | # Посмотреть |
| - | tail -f / | + | sudo crontab |
| - | # Проверить размер бекапов | + | # Посмотреть |
| - | du -sh /opt/backups/chatwoot/ | + | sudo tail -f /var/log/chatwoot-backup-cron.log |
| </ | </ | ||
| - | ===== Настройка параметров | + | ===== Мониторинг и уведомления |
| - | ==== Изменение времени хранения бекапов ==== | + | ==== Настройка Telegram бота ==== |
| - | В скрипте найдите | + | 1. **Создайте бота**: Отправьте `/start` боту @BotFather в Telegram |
| + | 2. **Получите токен**: Сохраните | ||
| + | 3. **Узнайте Chat ID**: Отправьте сообщение боту, затем откройте: | ||
| + | | ||
| + | |||
| + | ==== Проверка уведомлений ==== | ||
| <code bash> | <code bash> | ||
| - | RETENTION_DAYS=30 | + | # Тест отправки сообщения (замените токен и chat_id) |
| + | curl -s -X POST " | ||
| + | -d chat_id=" | ||
| + | -d text=" | ||
| </ | </ | ||
| - | ==== Настройки базы данных ==== | + | ==== Мониторинг места на диске ==== |
| - | + | ||
| - | При необходимости измените параметры подключения к БД: | + | |
| <code bash> | <code bash> | ||
| - | DB_NAME=" | + | # Проверка места в папке бекапов |
| - | DB_USER=" | + | df -h / |
| - | DB_PASSWORD=" | + | |
| - | DB_CONTAINER=" | + | # Размер всех бекапов |
| + | du -sh / | ||
| + | |||
| + | # Список всех бекапов с размерами | ||
| + | ls -lah / | ||
| </ | </ | ||
| - | ===== Уведомления ===== | + | ===== Восстановление из бекапа |
| - | ==== Настройка Telegram уведомлений ==== | + | ==== Полное восстановление ==== |
| - | Раскомментируйте и настройте в конце скрипта: | + | <code bash> |
| + | # Остановите Chatwoot | ||
| + | cd / | ||
| + | docker-compose down | ||
| + | |||
| + | # Найдите нужный бекап | ||
| + | ls -la / | ||
| + | |||
| + | # Извлеките архив (замените | ||
| + | cd /tmp | ||
| + | tar -xzf / | ||
| + | |||
| + | # Восстановите данные | ||
| + | sudo rm -rf / | ||
| + | sudo cp -r chatwoot_data/ | ||
| + | |||
| + | # Восстановите | ||
| + | cp docker-compose.yml / | ||
| + | cp .env / | ||
| + | |||
| + | # Запустите Chatwoot | ||
| + | cd / | ||
| + | docker-compose up -d | ||
| + | </ | ||
| + | |||
| + | ==== Восстановление только базы данных ==== | ||
| <code bash> | <code bash> | ||
| - | curl -s -X POST " | + | # Найдите дамп базы в архиве |
| - | -d chat_id="YOUR_CHAT_ID" | + | tar -tzf /opt/backups/ |
| - | -d text=" | + | |
| + | # Извлеките дамп | ||
| + | tar -xzf /opt/backups/ | ||
| + | |||
| + | # Восстановите в контейнер (Chatwoot должен быть запущен) | ||
| + | export PGPASSWORD="YOUR_POSTGRES_PASSWORD" | ||
| + | cat chatwoot_backup_YYYYMMDD_HHMMSS_database.sql | docker exec -i chatwoot_postgres psql -U postgres | ||
| + | unset PGPASSWORD | ||
| </ | </ | ||
| - | Замените: | + | ===== Устранение неполадок ===== |
| - | * '' | + | |
| - | * '' | + | |
| - | ===== Восстановление из резервной копии ===== | + | ==== Основные проблемы ==== |
| - | ==== 1. Распаковка архива ==== | + | === Ошибка " |
| + | **Причина**: | ||
| + | |||
| + | **Решение**: | ||
| <code bash> | <code bash> | ||
| - | cd / | + | docker ps |
| - | tar -xzf chatwoot_backup_YYYYMMDD_HHMMSS_complete.tar.gz | + | # Обновите переменные DB_CONTAINER и REDIS_CONTAINER в скрипте |
| </ | </ | ||
| - | ==== 2. Восстановление | + | === Ошибка доступа к базе данных === |
| + | **Причина**: | ||
| + | |||
| + | **Решение**: | ||
| <code bash> | <code bash> | ||
| - | # Остановить Chatwoot | + | cat / |
| - | cd /opt/ | + | # Обновите переменные в скрипте согласно .env |
| - | docker-compose down | + | </code> |
| - | # Очистить существующую базу данных (осторожно!) | + | === Нехватка места |
| - | docker-compose up -d postgres | + | |
| - | docker exec -it chatwoot_postgres_1 dropdb -U postgres chatwoot_production | + | **Причина**: Заполнен диск |
| - | docker exec -it chatwoot_postgres_1 createdb | + | |
| + | **Решение**: | ||
| + | <code bash> | ||
| + | # Удалите старые бекапы вручную | ||
| + | find / | ||
| - | # Восстановить из дампа | + | # Уменьшите RETENTION_DAYS в скрипте |
| - | docker exec -i chatwoot_postgres_1 psql -U postgres -d chatwoot_production < / | + | |
| </ | </ | ||
| - | ==== 3. Восстановление файлов ==== | + | ==== Проверка логов ==== |
| <code bash> | <code bash> | ||
| - | # Распаковать файлы системы | + | # Основной лог скрипта |
| - | cd / | + | tail -f / |
| - | tar -xzf / | + | |
| - | # Запустить систему | + | # Лог cron |
| - | docker-compose up -d | + | tail -f / |
| + | |||
| + | # Логи Docker контейнеров | ||
| + | docker | ||
| + | docker logs chatwoot_redis | ||
| </ | </ | ||
| - | ===== Мониторинг и обслуживание ===== | + | ===== Дополнительные настройки |
| - | ==== Проверка статуса бекапов | + | ==== Изменение |
| + | В скрипте измените: | ||
| <code bash> | <code bash> | ||
| - | # Просмотр | + | RETENTION_DAYS=10 |
| - | tail -n 50 / | + | </code> |
| - | # Статистика бекапов | + | ==== Изменение папки |
| - | ls -lh / | + | |
| - | # Общий | + | В скрипте измените: |
| - | du -sh / | + | <code bash> |
| + | BACKUP_DIR=" | ||
| </ | </ | ||
| - | ==== Очистка старых бекапов | + | **Рекомендация**: Для больших проектов рассмотрите возможность |
| + | |||
| + | ===== Безопасность ===== | ||
| + | |||
| + | ==== Защита скрипта ==== | ||
| <code bash> | <code bash> | ||
| - | # Удалить | + | # Ограничить |
| - | find /opt/backups/chatwoot/ -name " | + | sudo chown root: |
| + | sudo chmod 700 /opt/ | ||
| + | |||
| + | # Проверить права | ||
| + | ls -la / | ||
| </ | </ | ||
| - | ===== Оптимизация размера бекапов | + | ==== Шифрование бекапов ==== |
| - | **💡 Совет | + | Для дополнительной |
| <code bash> | <code bash> | ||
| - | tar -czf " | + | # Добавьте в скрипт после создания архива: |
| - | --exclude=' | + | gpg --symmetric |
| - | | + | rm " |
| - | | + | |
| - | --exclude=' | + | |
| - | storage/ \ | + | |
| - | # postgres_data/ | + | |
| - | redis_data/ \ | + | |
| - | docker-compose.yml \ | + | |
| - | .env | + | |
| </ | </ | ||
| - | SQL дамп базы данных содержит все необходимые данные для восстановления системы. Бинарная копия '' | + | ===== Заключение |
| - | ===== Безопасность ===== | + | Данный скрипт |
| - | | + | - **Полное резервное копирование** всех данных Chatwoot |
| - | * Регулярно проверяйте логи на наличие ошибок | + | - **Автоматическое |
| - | * Периодически тестируйте процедуру | + | - **Безопасное выполнение** с остановкой и запуском контейнеров |
| - | | + | - **Очистку старых бекапов** для экономии места |
| + | - **Детальное | ||
| + | - **Уведомления в Telegram** | ||
| + | - **Мониторинг | ||
| - | ===== Структура файлов ===== | + | **Результат**: Надежная система |
| - | < | + | ---- |
| - | /opt/scripts/ | + | |
| - | / | + | //Инструкция протестирована на Ubuntu Server с Docker Compose. Регулярно проверяйте работоспособность |
| - | ├── backup.log | + | |
| - | ├── cron.log | + | |
| - | └── chatwoot_backup_YYYYMMDD_HHMMSS_complete.tar.gz | + | |
| - | </code> | + | |