Записи
Ничего не найдено

Резервное копирование

Для работы скриптов установите многопоточный архиватор 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