Пример настройки резервного копирования по расписанию
Цель настройки
Создать скрипт, который будет регулярно запускать консольный клиент, архивировать и переносить важные данные в S3.
Что нужно для настройки
- консольный клиент (в примере S3cmd с инструментом для автоматизации crontab);
- облачный или выделенный сервер с установленной Ubuntu версии не ниже 18.04;
- пользователь с доступом в S3.
Результат настройки
Скрипт создаст резервную копию файла или каталога с помощью tar и загрузит резервную копию в S3 с помощью s3cmd.
Шаги настройки
- Создайте скрипт.
- Перенесите файлы в S3.
- Настроить управление потоком.
- Проверьте скрипт.
- Опционально: автоматизируйте резервное копирование через crontab или Cyberduck.
1. Создать скрипт
-
Откройте на своем сервере домашнюю директорию:
cd ~ -
С помощью редактора nano создайте пустой файл (например, с именем
bkupscript):nano bkupscript.sh -
Начните писать скрипт резервного копирования в текстовом редакторе с шебанга:
#!/bin/bashШебанг — это директива интерпретатора, которая позволяет запускать скрипты или файлы данных как команды и выглядит как последовательность из двух символов:
#и!. Благодаря шебангу в начале скрипта оболочка запускает команды файла в bash. -
Под шебангом в верхней части текстового файла добавьте в скрипт переменные:
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3Здесь:
DATETIME— метка времени, которую нужно прикрепить к имени полученного файла. Каждый файл, резервная копия которого хранится в пространстве, будет иметь уникальное имя. Эта временная метка создается путем вызова командыdateи форматирования вывода для отображения двух последних цифр года (% y), двух цифр месяца (% m), двух цифр дня (% d), час (% H), минуты (% M) и секунды (% S);SRC— исходный путь для файла или папки, в которую делается резервная копия.$1указывает, что значение берется из перво го параметра, переданного скрипту;DST— место назначения файла. В примере это имя пространства, в которое загружается резервная копия. Это имя будет получено из второго параметра, переданного в скрипт, как указано в$2;GIVENNAME— выбранное пользователем имя для файла назначения. Результирующее имя файла будет начинаться сGIVENNAME, и к нему будет добавленоDATETIME. Это имя происходит от третьего параметра, переданного скрипту$3.
-
Добавьте функцию
showhelpв скрипт резервного копирования для вывода сообщений в случае сбоя работы скрипта:#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(
echo "\n This script will backup files/folders into a single compressed file and will store it in the current folder."
} -
Соберите нужные файлы и объедините их в единый пакет, который можно будет загрузить:
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(
echo "\n This script will backup files/folders into a single compressed file and will store it in the current folder."
){
}
tarandzip(){
echo "\n##### Gathering files #####\n"
tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC
}Когда вызывается инструкция
if, скрипт выполняет командуtarи ожидает результата. Если команда выполнена успешно, будут выполнены строки после оператораthen:- вывод сообщения о том, что процесс
tarуспешно завершился; - возвращение кода ошибки
0, чтобы часть кода, вызывающая эту функцию, знала, что все работает нормально.
Часть
elseскрипта будет выполняться только в том случае, если командаtarобнаружит ошибку при выполнении:- вывод сообщения о том, что команда
tarне выполнена; - возвращение кода ошибки 1, что указывает на то, что что-то пошло не так.
- вывод сообщения о том, что процесс
-
Закончите скрипт
if/then/elseфразойfi. Вид завершенной функцииtarandzip:tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
2. Перенести файлы в S3
-
Добавьте в скрипт резервного копирования функцию передачи файла
movetoSpaceв выбранное пространство. Для создания команды, которая будет помещать файлы резервных копий в выбранное пространство, используются объявленные ранее переменные:movetoSpace(){
/bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}Здесь:
/bin/s3cmd— вызывает s3cmd — инструмент командной строки, используемый для управления сегментами хранилища объектов;put— используется s3cmd для загрузки данных в бакет;$GIVENNAME-$DATETIME.tar.gz— имя резервной копии, которая будет загружена в пространство. Он состоит из четвертой и первой объявленных переменных, за которыми следует.tar.gz, и создается функциейtarandzip;s3://$DST;— место, куда будет загружен файл;s3://— схема типа URI, используемая для описания мест хранения объектов в сети, а$DST;— это третья переменная, которую объявили ранее.
-
Добавьте уведомление о том, что процесс переноса файлов начался:
movetoSpace(){
echo “\n##### MOVING TO SPACE #####\n”
/bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
} -
Настройте вывод сообщения о результате выполнении команды:
if /bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
3. Настроить управление потоком
Если скрипт настроен правильно, при запуске он должен прочитать команду ввода, присвоить значения из нее каждой переменной, выполнить функцию tarandzip, а затем выполнить movetoSpace.
Если сценарий завершится неудачно на любом шаге, он должен напечатать вывод функции showhelp, чтобы помочь в устранении неполадок.
В конец файла добавьте условную инструкцию if / then / else:
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
4. Проверить скрипт
-
Проверьте скрипт:
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(){
echo "\n This script will backup files/folders into a single compressed file and will store it in the current folder."
}
tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if /bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Spac #####\n"
return 1
fi
}
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi -
Перед выходом из nano закройте файл (Ctrl+Х) и сохраните внесенные изменения (Y+Enter).
5. Опционально: автоматизировать резервное копирование
Crontab
Cyberduck
-
Настройте задание cron, которое будет использовать скрипт для регулярного резервного копирования в выбранное пространство. В рамках этого примера резервное копирование будет выполняться каждую минуту.
-
Сделайте скрипт исполняемым:
chmod +x bkupscript.sh -
Отредактируйте файл crontab, чтобы скрипт запускался каждую минуту:
crontab -e -
При первом запуске команды
crontab -eбудет предложено выбрать редактор из списка:no crontab for root - using an empty one
Select an editor. To change later, run "select-editor".
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]: -
Выберите nano по умолчанию или другой текстовый редактор.
-
В crontab добавьте строку в конце скрипта:
* * * * * ~/bkupscript.sh ~/backupthis nameofyourspace cronupload -
Закройте файл (Ctrl+Х) и сохраните внесенные изменения (Y+Enter).
-
Если оставить задание cron запущенным без изменений, новый файл будет копироваться в выбранное пространство каждую минуту. Если cron работает успешно, перенастройте crontab для резервного копирования файлов с нужным интервалом.
На локальной машине есть директория, содержимое которой нужно периодически копировать в S3. Это можно делать с помощью скрипта и задания Cron, которое отправляет резервную копию в хранилище каждый день в указанное время.
Пример задания (дополнительно можно использовать другие опции Cyberduck):
#!/bin/bash
SELECTEL_ID=<selectel_account>
USERNAME=<username>
PASSWORD=<password>
BACKUP_PATH=<bucket_name>/<prefix>
LOCAL_PATH=<path>
duck --upload selectel:/<bucket_name>/<prefix> <path> --existing rename --username <selectel_account>:<username> --password <password> -q -y
Укажите:
<selectel_account>— номер учетной записи панели управления Selectel;<username>— имя сервисного пользователя;<password>— пароль сервисного пользователя. Если вы забыли пароль, измените его;<bucket_name>— имя бакета;<prefix>— префик объектов;<path>— путь к локальной директории.
Здесь:
- ключ
--existingкомандыduckуказывает, что делать с уже имеющимися в хранилище файлами; - опция
renameпереименовывает уже имеющуюся резервную копию, добавляя к имени время и дату.
Опции Cyberduck
При автоматизации резервного копирования через Cyberduck вы можете использовать дополнительные опции:
-
compare— осуществлять дифференциальное резервное копирование:duck --upload selectel:/<bucket_name>/<prefix> <path> --existing compare --username <selectel_account>:<username> --password <password>Загруженная резервная копия будет сравниваться с имеющейся по размеру, дате изменения и контрольной сумме. Если параметры отличаются, старая версия будет удалена, а новая — загружена в хранилище;
-
skip— в хранилище будут загружены только новые файлы (те, которые появились в папке на локальной машине после предыдущей загрузки). Уже имеющиеся файлы не будут загружены, даже если на локальной машине они были изменены; -
overwrite— удаляет из хранилища имеющуюся резервную копию и загружает новую.