From a61eae1430218cd3f5516413e0b228b6ee0fc215 Mon Sep 17 00:00:00 2001 From: deadcxap Date: Fri, 21 Mar 2025 09:12:21 +0300 Subject: [PATCH] backup shell script --- backup_db.md | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 backup_db.md diff --git a/backup_db.md b/backup_db.md new file mode 100644 index 0000000..3ca59df --- /dev/null +++ b/backup_db.md @@ -0,0 +1,96 @@ +Ниже приведён пример скрипта на 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` и сделайте исполняемым): + +```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. Сделайте скрипт исполняемым: + + ```bash + chmod +x /usr/local/bin/backup.sh + ``` + +2. Добавьте задание в crontab (например, ежедневное резервное копирование в 03:00): + + ```cron + 0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 + ``` + +В итоге этот скрипт автоматизирует процесс резервного копирования базы, шифрования и отправки в облако. Не забудьте проверить и настроить пути, переменные и параметры согласно вашим требованиям. \ No newline at end of file