Files
YandexMusicDiscordBot/backup_db.md
2025-03-21 09:12:21 +03:00

5.2 KiB
Raw Permalink Blame History

Ниже приведён пример скрипта на sh, который можно добавить в cron. Он выполняет следующие шаги:

  1. Создаёт резервную копию базы MongoDB внутри контейнера (через docker exec).
  2. Копирует созданный архив с контейнера на хост.
  3. Шифрует архив с помощью GPG (симметричное шифрование с алгоритмом AES256).
  4. Отправляет зашифрованный файл в облако с помощью rclone.
  5. Очищает временные файлы.

Важно:

  • Задайте переменные, такие как путь для бэкапов (BACKUP_DIR), имя удалённого хранилища для rclone (RCLONE_DEST), а также установите переменную окружения ENCRYPTION_PASSPHRASE с вашим паролем для шифрования.
  • Убедитесь, что на хосте установлены docker, gpg и rclone, а также что контейнер MongoDB называется так же, как указано в скрипте (в примере ymdb-mongodb).

Скрипт (например, сохраните его как /usr/local/bin/backup.sh и сделайте исполняемым):

#!/bin/sh
# backup.sh - резервное копирование базы MongoDB с шифрованием и отправкой в облако

# Настройки (отредактируйте под себя)
BACKUP_DIR="/path/to/backup"         # Локальная папка для хранения бэкапов
RCLONE_DEST="remote:backup"           # Название удалённого хранилища rclone (напр., remote:backup)
MONGO_CONTAINER="ymdb-mongodb"        # Имя контейнера MongoDB

# Получаем дату для имени файла
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="mongodb_backup_${DATE}.archive"
ENCRYPTED_FILE="${BACKUP_FILE}.gpg"

# Проверяем, задан ли пароль для шифрования
if [ -z "$ENCRYPTION_PASSPHRASE" ]; then
  echo "Переменная ENCRYPTION_PASSPHRASE не установлена. Выход."
  exit 1
fi

# Создаём папку для бэкапов, если её нет
mkdir -p "$BACKUP_DIR"

# Создание резервной копии базы данных через mongodump внутри контейнера
echo "Создаём резервную копию MongoDB..."
docker exec "$MONGO_CONTAINER" mongodump --archive="/tmp/${BACKUP_FILE}" --gzip
if [ $? -ne 0 ]; then
  echo "Ошибка при выполнении mongodump."
  exit 1
fi

# Копируем файл резервной копии с контейнера на хост
echo "Копируем резервную копию с контейнера..."
docker cp "$MONGO_CONTAINER":/tmp/"${BACKUP_FILE}" "$BACKUP_DIR"/
if [ $? -ne 0 ]; then
  echo "Ошибка при копировании файла резервной копии."
  exit 1
fi

# Очищаем временный файл резервной копии внутри контейнера
docker exec "$MONGO_CONTAINER" rm -f "/tmp/${BACKUP_FILE}"

# Шифруем резервную копию с помощью GPG
echo "Шифруем резервную копию..."
gpg --batch --yes --passphrase "$ENCRYPTION_PASSPHRASE" --symmetric --cipher-algo AES256 -o "$BACKUP_DIR"/"$ENCRYPTED_FILE" "$BACKUP_DIR"/"$BACKUP_FILE"
if [ $? -ne 0 ]; then
  echo "Ошибка при шифровании резервной копии."
  exit 1
fi

# Удаляем незашифрованный архив
rm -f "$BACKUP_DIR"/"$BACKUP_FILE"

# Отправляем зашифрованную резервную копию в облако с помощью rclone
echo "Отправляем зашифрованную резервную копию в облако..."
rclone copy "$BACKUP_DIR"/"$ENCRYPTED_FILE" "$RCLONE_DEST"
if [ $? -ne 0 ]; then
  echo "Ошибка при отправке резервной копии в облако."
  exit 1
fi

# Опционально удаляем локальный зашифрованный файл после успешной отправки
rm -f "$BACKUP_DIR"/"$ENCRYPTED_FILE"

echo "Резервное копирование и отправка в облако завершены успешно."

Как использовать скрипт в cron

  1. Сделайте скрипт исполняемым:

    chmod +x /usr/local/bin/backup.sh
    
  2. Добавьте задание в crontab (например, ежедневное резервное копирование в 03:00):

    0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
    

В итоге этот скрипт автоматизирует процесс резервного копирования базы, шифрования и отправки в облако. Не забудьте проверить и настроить пути, переменные и параметры согласно вашим требованиям.