Как стать автором
Обновить

Простой скрипт для инкрементального бекапа директорий

Время на прочтение3 мин
Количество просмотров13K

С чего все начиналось


«Есть 2 типа админов — те, кто ещё не делают бекапы, и те, кто уже делают.»
Будучи первым типом админа, после случайного rm -rf * в директории с проектом, очень печально осознавать, что последняя резервная копия была сделана около полугода назад. Попав в такую ситуацию, я начал поиск простого и не ресурсоемкого средства для резервного копирования информации.
Критерии:
1) Возможность делать бекапы на лету в условиях ограниченных системных ресурсов (например VPS)
2) Возможность нативно удалять устаревшие бекапы
3) Возможность работать с примонтированной файловой системой

Процесс


После некоторого гугления/яндексения выбор пал на утилиту rdiff-backup (офф. сайт).
Все возможности данной утилиты вместе с примерами и документацией есть на сайте, скажу вкратце, что всем трем пунктам она соответствует.
В качестве хранилища для файлов я использую домашний роутер с внешним хардом (монтирую к серверу посредством sshfs), поэтому в скрипте использую именно ее. Кроме того, хотелось получать уведомления о результатах бекапа на почту — это также предусмотрено.

Результат


#!/bin/sh
 
REMOTE_ADDR='user@storage:/remote_path' # Путь до удаленного хранилища
MOUNTPOINT='/backup_remote' # Точка монтирования бекапного раздела
BACKUP_DIR='/somedir' # Директория которую хотим бекапить
MAILFROM='root@server' # Адрес, с которого посылать отчеты
MAILTO='mail@example.com' # Адрес, на который будут приходить отчеты
EXPIRE="1W" # Время, которое хранить инкрементальные файлы
 
TMP='/tmp/backup_tmp.tmp'
 
sshfs $REMOTE_ADDR $MOUNTPOINT > /dev/null 2>&1
 
if [ `mount | grep $MOUNTPOINT | grep -vc grep` = "0" ]then
    echo "Error mounting $MOUNTPOINT at `date +'%d/%m/%Y %H:%M'`" | mail -a "From: $MAILFROM" -s "Backup ERROR" $MAILTO
    exit 1
fi
 
if [ ! -d $MOUNTPOINT/$BACKUP_DIR ]then
    mkdir -p $MOUNTPOINT/$BACKUP_DIR > /dev/null 2>&1
fi
 
printf "Processing $BACKUP_DIR... \n\n" >> $TMP
rdiff-backup --force --exclude-symbolic-links --exclude-sockets --exclude-special-files --exclude-fifos --exclude-device-files --no-hard-links --print-statistics $BACKUP_DIR $MOUNTPOINT/$BACKUP_DIR >> $TMP 2>&1
rdiff-backup --force --no-hard-links --remove-older-than $EXPIRE $MOUNTPOINT/$BACKUP_DIR >> $TMP 2>&1
printf "\n-----------------------\n\n" >> $TMP 
 
ERRORS="no errors"
 
if [ `cat $TMP | grep 'Error' | grep -v 'Errors 0' | grep -cv grep` !"0" ]then
    ERRORS="errors detected"
fi
 
cat $TMP | mail -a "From: $MAILFROM" -s "Backup report (${ERRORS})" $MAILTO
rm -f $TMP
umount $MOUNTPOINT
 
exit 0
 

Скрипт одним файлом можно взять здесь.

Итог


Поместив скрипт в крон получаем инкрементальные бекапы заданной директории с настраиваемым сроком хранения и отчетами о выполнении.
Восстановление файлов из последней версии можно производить простым копированием, для восстановления до определенной версии пользуемся утилитой rdiff-backup.

Приятного пользования!
Теги:
Хабы:
Всего голосов 28: ↑19 и ↓9+10
Комментарии34

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань