Резервное копирование
Для работы скриптов установите многопоточный архиватор pbzip2
apt install pbzip2
Пример 1. Скрипт backup
В данном примере бэкап осуществляется на соседний диск в каталог из переменной BACKUP_PATH. При запуске скрипта каталог удаляется и создается новый. Если нужен другой сценарий, можно, например, убрать удаление и добавить дату к названию директории…
#!/bin/bash
# Если надо шифрование, если пароль не указан шифрования не будет.
ARCHIVE_PASS=pass
# Каталог удаляется! Будь внимательнее!
BACKUP_PATH=/srv/backup/server/
rm -rf $BACKUP_PATH
mkdir -p $BACKUP_PATH
function do_backup {
local backup_name=${2}-`/bin/date +%Y-%m-%d`.tar.bz2
local backup_cmd="tar -cpf - -C "$(dirname "$1")" "$(basename "$1")" | pbzip2 -c"
if [ -n "${ARCHIVE_PASS}" ]; then
backup_cmd="$backup_cmd | openssl enc -e -aes-256-cbc -pbkdf2 -k '${ARCHIVE_PASS}'"
backup_name="${backup_name}.enc"
fi
echo "Делаю бэкап каталога $1 > $BACKUP_PATH/$backup_name"
bash -c "$backup_cmd" > "$BACKUP_PATH/$backup_name"
}
# Тут просто ручками пишем, что куда бэкапить...
# Первый параметр откуда и второй имя будущего архива в каталоге BACKUP_PATH. К имени добавиться текущая дата.
do_backup /srv/www/site1 site1
do_backup /srv/www/site2 site2
do_backup /srv/data/letsencrypt letsencrypt
do_backup /srv/docker docker
do_backup /var/spool/cron/crontabs cron
# Если надо отправить отчет о проденной работе
du -sh ${BACKUP_PATH}/* | sed 's#\(.*\)\t.*/#\1\t#' | /srv/scripts/send_notify.sh "Hosting backups"
df -h |grep /dev/sd | /srv/scripts/send_notify.sh "Hosting disk space"
Пример 2. Скрипт backup
Более сложный вариант скрипта, с возможностью конфигурации через переменные. Функцию отправки можно сделать любую, хоть на диск сохранить. В примере отправка идет на другой сервер через curl.
#!/bin/bash
declare -A BACKUP
declare -A BACKUP_EXCLUDE
# Список каталогов для резервирования через пробел
BACKUP[base]="/etc /srv"
# Если нужно исключить какие то каталоги заносим их в этот массив
BACKUP_EXCLUDE[base]="/etc/shadow etc/shadow-"
# URL на котором висит сервис
BACKUP_SERVER_URL=host:port/upload
# Пароль
BACKUP_SERVER_PASS=pass
# Пароль на архив
ARCHIVE_PASS=archive-pass
# Название файла
BACKUP_NAME=`hostname`-
# Указываем путь к скрипту отправки уведомлений, если не указан результаты будут выведены на экран.
NTFY_PATH=/srv/scripts/send_notify.sh
cd /var/backups/
send_message () {
if [ -z "${NTFY_PATH}" ]; then
echo $1
else
`echo $1 | ${NTFY_PATH}`
fi
}
function get_excludes () {
RES=""
if [[ -v "BACKUP_EXCLUDE[$1]" ]] ; then
for i in ${BACKUP_EXCLUDE[$1]}; do
RES="${RES} --exclude $(remove_slash $i)"
done
fi
echo ${RES}
}
function remove_slashes_from_str () {
RES=""
for i in $1; do
RES="${RES} $(remove_slash $i)"
done
echo ${RES}
}
function remove_slash () {
echo $(echo "$1" | sed 's:^/::g' | sed 's:/$::g')
}
for key in ${!BACKUP[@]}
do
NAME=${BACKUP_NAME}${key}-`/bin/date +%Y-%m-%d`.tbz2.enc
FILE=/var/backups/$NAME
tar -C / $(get_excludes $key) -c $(remove_slashes_from_str "${BACKUP[$key]}") | pbzip2 -c | openssl enc -e -aes-256-cbc -pbkdf2 -k ${ARCHIVE_PASS} -out ${FILE}
exit_status=`curl -o /dev/null -s -w "%{http_code}\n" --write-out "%{http_code}\n" -i -XPUT ${BACKUP_SERVER_URL} -H "X-Filename: ${NAME}" -H "X-Auth-Token: ${BACKUP_SERVER_PASS}" -T $FILE`
if [ $exit_status -ne 200 ]; then
send_message "Error backup on ${key}"
else
send_message "Good backup on ${key} `du -sh $FILE| awk '{ print $1 }'`"
fi
rm -f $FILE
done
curl умеет грузить файлы не более 5 гигабайт!
Запуск
Хороший вариант положить скрипт в каталог крона и дать ему нужные права.
mv backup /etc/cron.weekly/backup
chmod 700 /etc/cron.weekly/backup
Для распаковки используем команду
openssl enc -d -aes-256-cbc -pbkdf2 -in archive.tgz.enc | pbzip2 -d -c |tar -x
