6.3.7 Автоматическое резервное копирование

Существует необходимость создавать резервную копию директории согласно графику и хранить ее на внешнем хранилище?
Это можно весьма просто выполнить используя KeepData в качестве удаленного облачного хранилища. Более того, такой процесс можно полностью автоматизировать.
Решение отличается в зависимости от ОС, но общий алгоритм состоит в запуске исполняемого файла по назначенному расписанию. Давайте разберем на примерах.
Создание бэкапов в Windows
В ОС Windows подобное реализуемо с помощью исполняемого файла в формате .bat и планировщика задач Windows.
Рассмотрим пошаговую инструкцию:
1. Для корректного исполнения будущего .bat-файла, нам понадобится скачать и установить программу WinSCP. Сделать это можно на их официальном сайте. Выполнять какие-либо действия в самой программе при этом не понадобится.
2. Создайте новый текстовый файл в любой удобной локации. Это и будет наш новый скрипт для резервного копирования.
3. Самый важный шаг – наполнение скрипта. Ниже представлен пример с пояснениями. Выделенные переменные необходимо заполнить Вашей информацией:
@echo off
"C:\Program Files (x86)\WinSCP\WinSCP.exe" ^
  /ini=nul ^
  /command ^
    "open ftp://login:password@server.keepdata.thehost.ua/" ^
    "lcd C:\Folder\Work" ^
    "cd /backups-work/" ^
    "mkdir %%TIMESTAMP#yyyy-mm-dd%%" ^
    "cd /backups-work/%%TIMESTAMP#yyyy-mm-dd%%" ^
    "put File1" ^
    "lcd C:\" ^
    "put Folder2" ^
    "lcd C:\Users\User" ^
    "put File3" ^
    "exit"
set WINSCP_RESULT=%ERRORLEVEL%
if %WINSCP_RESULT% equ 0 (
  echo Success
) else (
  echo Error
)
exit /b %WINSCP_RESULT%
Теперь, к пояснениям:
"C:\Program Files (x86)\WinSCP\WinSCP.exe" ^– укажите путь к.exeфайлу WinSCP. В примере указан путь при стандартной установке."open ftp://login:password@server.keepdata.thehost.ua/" ^– эта строка выполняет подключения к Вашему Облачному хранилищу. Здесь необходимо указать логин, пароль и сервер подключения. Все эти данные Вы можете узнать в Письме об открытии услуги."lcd C:\Folder\Work" ^– эта команда переходит по выделенному пути на локальном ПК."cd /backups-work/" ^– эта команда переходит по выделенному пути на Вашем Облачном хранилище."mkdir %%TIMESTAMP#yyyy-mm-dd%%" ^– создает директорию в KeepData с названием в форматегод-месяц-день."cd /backups-work/%%TIMESTAMP#yyyy-mm-dd%%" ^– переходит в указанную директорию."put File1" ^– загружает в эту директорию файлFile1с текущего местоположения на локальном ПК (D:\Folder\Workв этом примере)."lcd C:\" ^– переходит по новому пути на локальном ПК."put Folder2" ^– загружает папкуFile2и все ее содержимое из нового пути на Облачное хранилище."lcd C:\Users\User" ^– переходит по новому пути на локальном ПК."put File3" ^– загружает файлFile3из нового пути на Облачное хранилище.
Важно: в Windows для разделения директорий используется символ \, в Linux же – /. Облачное хранилище построено именно на архитектуре Linux. Учтите это при редактировании пользовательского скрипта
Таким образом, мы получили скрипт, который подключается к KeepData, создает в указанной директории новую папку и загружает в нее три файла из разных местоположений на локальном ПК. Созданная папка будет иметь имя аналогичное времении ее создания, что облегчит дальнейшую работу с имеющимися резервными копиями. При необходимости, указанный скрипт можно отредактировать под Ваши нужды.
4. Сохраняем наш текстовый файл в формате .bat. Для этого нужно в файловом редакторе вместо Сохранить нажать Сохранить как. При сохранении выбираем Все файлы и указываем полное имя файла, вместе с форматом .bat в конце:

Теперь у нас есть написанный скрипт, который выполняет резервное копирование. Как этот процесс автоматизировать? В этом нам поможет Планировщик задач Windows.
5. Открываем Планировщик задач с помощью меню Пуск или альтернативным способом – нажав Win + R и выполнив taskschd.msc:

6. Правым кликом мыши по Библиотека планировщика заданий открываем контектное меню и нажимаем Создать задачу:

7. Переходим в подменю Триггеры и нажимаем Создать. В открытой форме указываем по какому расписанию необходимо выполняться задаче. Например, каждый день в 12:00:

8. Аналогично переходим в подменю Действия и снова нажимаем Создать. В открытой форме выбираем Запуск программы и указываем путь к нашему скрипту, в ручную или с помощью кнопки Обзор:

Совет: в подменю Условия и Параметры можно дополнительно настроить Вашу задачу, например, разрешить ей запускаться только при подключении к определенной сети.
9. Задание создано. Оно будет выполняться согласно указанному расписанию. Крайне желательно сразу же протестировать его выполнение с помощью ручного запуска – кликнув на задание правой кнопкой мыши и нажав Выполнить. В случае, если тестовое выполнение закончилось безуспешно – обратитесь в нашу Службу поддержки предоставив максимум информации, включая текст Вашего скрипта.
Создание бэкапов в Linux
В Linux процесс аналогичен, с поправкой на инструментарий и завимости ОС. Также, скриптов для выполнения бэкапа будет два – для непосредственно файлов и для баз данных.
Зависимостью для работы исполняемого файла создания бэкапа в Linux является консольный FTP-клиент LFTP.
Давайте рассмотрим инструкцию по настройке с помощью пошагового примера:
1. Установите LFTP.
- Установить в Ubuntu/Debian можно так:
 
sudo apt update
sudo apt install lftp
- В CentOS/AlmaLinux/RockyLinux:
 
sudo yum install lftp
2. В Linux нам понадобится два скрипта – для резервирования определенных директорий и для резервирования определенных баз данных. В нашем примере они называются backup-dir.sh и backup-mysql.sh, их создани посвящены шаги 3 и 4 этой инструкции. Если Вам необходим только один – создавайте только один. Создание будущих исполняемых файлов в формате .sh в нужной директории выполняется так:
touch backup-dir.sh
touch backup-mysql.sh
3. Начнем со скрипта который резервирует файлы нужной директории, в этом примере он носит название backup-dir.sh. Откроем его любым текстовым редаткором, к примеру с помощью nano backup-dir.sh. Ниже представлен пример скрипта с пояснениями. Выделенные переменные необходимо заполнить Вашей информацией:
#!/bin/bash
echo "Directory Backuper by TheHost"
#Определение переменных и параметров доступа к FTP-серверу
TMP_PATH="/tmp"
BACKUP_DIRS="/home/user/data /home/user/data2 /home/user/data3"
FTP_HOST="ftp://server.keepdata.thehost.ua"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"
#Создание новой резервной копии локально, во временной директории
DATE=`date +%Y-%m-%d`
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
mkdir -p "$TMP_PATH/DIR_BACKUP-$DATE"
cd $TMP_PATH/DIR_BACKUP-$DATE
GZIPFILE="backup-$DATE_TIME.tgz"
echo -n "Creating archive $GZIPFILE... "
tar -czf $GZIPFILE $BACKUP_DIRS && echo "OK" || echo -e "Failed!\a"
#Загрузка созданного архива на FTP-хранилище
echo -n "Checking $FTP_HOST for today's archive... "
if [[ -z "`lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE && renlist backup-$DATE-*.tgz; bye" $FTP_HOST 2>/dev/null`" ]]; then
  echo "not found"
  echo "Uploading archive to $FTP_HOST"
  lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE || mkdir $DATE; cd /$DATE && put $GZIPFILE; bye" $FTP_HOST >/dev/null 2>&1;
else
  echo "already exist!";
fi
#Удаление временной директории
cd $TMP_PATH
rm -rf $TMP_PATH/DIR_BACKUP-$DATE
echo "Done."
exit 0
Несмотря на громоздкий вид скрипта, модифицировать в нем необходимо совсем немного. А именно:
TMP_PATH="/tmp"– устанавливает временную директорию для хранения созданной резервной копии перед ее загрузкой на удаленный сервер. Можно оставить стандартное значением/tmp.BACKUP_DIRS="/home/user/data /home/user/data2 /home/user/data3"– какие именно директории будут резервироваться в архив. Можно указать одну.FTP_HOST="ftp://server.keepdata.thehost.ua"– адрес Вашего Облачного хранилища.FTP_USER="ftp_user"– FTP-пользователь Вашего Облачного хранилища.FTP_PASS="ftp_password"– пароль FTP-пользователя Вашего Облачного хранилища.
Такой скрипт будет при запуске создавать архив в формате .tgz директорий указанных в BACKUP_DIRS=, сохранять их в TMP_PATH= локально и затем пытаться закгрузить архив на удаленнное FTP-хранилище, в им же созданную директорию с названием в виде текущей даты. В случае успешного выполнения, он удалит локальную копию архива. После редактирования скрипта, сохраните файл, обязательно в формате .sh.
4. Теперь редактируем скрипт для баз данных, у нас в примере это backup-mysql.sh. Откроем его любым текстовым редаткором, к примеру с помощью nano backup-mysql.sh. Ниже представлен пример скрипта с пояснениями. Выделенные переменные необходимо заполнить Вашей информацией:
#!/bin/bash
echo "Database Backuper by TheHost"
#Определение переменных и параметров доступа
DATABASES='database1 database2 database3'
TMP_PATH="/tmp"
BACKUP_USER="mysql_user"
BACKUP_PASS="mysql_password"
FTP_HOST="ftp://server.keepdata.thehost.ua"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"
#Создание нового бэкапа
DATE=`date +%Y-%m-%d`
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
mkdir -p "$TMP_PATH/DB_BACKUP-$DATE"
cd $TMP_PATH/DB_BACKUP-$DATE
for DB in $DATABASES; do
  echo -n "Dumping $DB... "
  mysqldump -E -R -u"$BACKUP_USER" -p"$BACKUP_PASS" $DB > noc-$DATE_TIME.$DB.sql && echo "OK" || echo -e "Failed!\a"
done
GZIPDB="backup-$DATE_TIME.tgz"
echo -n "Creating archive $GZIPDB... "
tar -czf $GZIPDB --remove-files backup-$DATE_TIME.*.sql && echo "OK" || echo -e "Failed!\a"
#Загрузка бэкапа на удаленный сервер
echo -n "Checking $FTP_HOST for today's archive... "
if [[ -z "`lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE && renlist backup-$DATE-*.tgz; bye" $FTP_HOST 2>/dev/null`" ]]; then
  echo "not found"
  echo "Uploading archive to $FTP_HOST"
  lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE || mkdir $DATE; cd /$DATE && put $GZIPDB; bye" $FTP_HOST >/dev/null 2>&1;
else
  echo "already exist!";
fi
#Удаление временной директории
cd $TMP_PATH
rm -rf $TMP_PATH/DB_BACKUP-$DATE
echo "Done."
exit 0
Пояснения:
DATABASES='database1 database2 database3– список баз данных, которые будет затрагивать задание. Указывать через пробел.TMP_PATH="/tmp"– устанавливает временную директорию для хранения созданной резервной копии перед ее загрузкой на удаленный сервер. Можно оставить стандартное значением/tmp.BACKUP_USER="mysql_user"– пользователь для входа в MySQL.BACKUP_PASS="mysql_password"– пароль указанного пользователя.FTP_HOST="ftp://server.keepdata.thehost.ua"– адрес Вашего Облачного хранилища.FTP_USER="ftp_user"– FTP-пользователь Вашего Облачного хранилища.FTP_PASS="ftp_password"– пароль FTP-пользователя Вашего Облачного хранилища.
Такой скрипт будет при запуске создавать дампы баз данных DATABASES= и сжимать их в архив в формате .tgz, сохранять его в TMP_PATH= локально и затем пытаться загрузить его на удаленнное FTP-хранилище, в им же созданную директорию с названием в виде текущей даты. В случае успешного выполнения, он удалит локальную копию архива. После редактирования скрипта, сохраните файл, обязательно в формате .sh.
5. Предоставьте скриптам права на выполнение:
chmod +x /path/to/backup-dir.sh
chmod +x /path/to/backup-mysql.sh
Где /path/to/ замените путями к созданным скриптам.
6. Скрипты созданы, осталось автоматизировать их выполнения. Для этого мы используем CRON-задание.
Откройте файл crontab с помощью команды:
crontab -e
Добавьте новые задания на выполнения Ваших скриптов. К примеру:
30 3 * * * /path/to/backup-dir.sh
30 3 * * * /path/to/backup-mysql.sh
Замените /path/to/ путями к созданным скриптам, после чего сохраните файл. Предоставленные примеры будут выполняться ежедневно, в 3:30 ночи.
Совет: ознакомиться с возможностями CRON для настройки пользовательских заданий можно в соответствующей инструкции.
7. Готово! Скрипты созданы и отредактированы с Вашими данными, CRON-задание на их выполнение уже ожидает необходимой даты. Советуем также выполнить скрипт мануально для тестирования. Это можно сделать следующей командой:
./path/to/backup-dir.sh
Где /path/to/ замените путем к скрипту. Если тест оказался успешен, значит Вами все было настроено верно. Если же желаемый результат не был достигнут – обратитесь в нашу Службу поддержки предоставив максимум информации, включая содержимое Ваших скриптов.


