С чего все начиналось
«Есть 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.
Приятного пользования!