Все админы знают, что своевременный бэкап сервера Linux может предотвратить катастрофу. Я бы хотел поделиться с вами своим вариантом резервного копирования сервера, который сам использую на своём VDS.

И так. Я написал небольшой sh скрипт, который содержит в себе команды архивирования и копирования на удаленный сервер.

#!/bin/sh

# задаем переменную DATE. Она будет содержать текущую дату.

DATE=`date +%Y-%m-%d_%H-%M-%S`

# задаем переменную содержащую путь к каталогу с бэкапами.

DIR=/home/backups/

# переходим в каталог, где должны храниться бэкапы.

cd $DIR 

# создаем дамп всей базы данных MySQL под пользователем root и сжимаем дамп.

mysqldump -uroot -hlocalhost -p'Пароль рута к БД' -A | gzip -c > mysql_all_db_$DATE.gz

# создаем tar сжатый контейнер. Т.е. архивируем каталог www. В каталоге www хранятся все мои сайты.

tar -czf home_$DATE.tar.gz -P /home/www

# дополнительный параметр -P заперщает архиватору отбрасывать корневой '/'.

# Аналогичным образом архивируем конфигурационные файлы системы, необходимые для быстрого развертывания
# сервера из бэкапа. 
# каталог httpd, nginx и т.д. Все файлы будут добавлены в архив с сохранением путей.

tar -czf configs_$DATE.tar.gz -P /etc/openvpn /etc/httpd /etc/nginx /etc/my.cnf /etc/php.ini /etc/logrotate.conf /etc/sysconfig/iptables /etc/sysconfig/clock  /var/spool/cron

# Копируем наши файлы архивов на удаленный сервер с применением
# **авторизации по ключу**.
# Ключ -i говорит программе scp о том, что для идентификации используется файл "for_scp",
# который я генерировал в статье http://blog.anart.ru/users/2012/11/09/generacziya-klyuchej-dlya-besparolnogo-vxoda.html.

scp -B -i /root/.ssh/for_scp /home/backups/mysql_all_db_$DATE.gz user@server.ru:~/backups_anart.ru
scp -B -i /root/.ssh/for_scp /home/backups/configs_$DATE.tar.gz user@server.ru:~/backups_anart.ru
scp -B -i /root/.ssh/for_scp /home/backups/home_$DATE.tar.gz user@server.ru:~/backups_anart.ru

# удаляем 2 дневные копии архивов

find /home/backups/ -name "*.gz" -mtime 2 -exec rm -f {} \;

# инициализируем переменную freemaemory, задав ей значение процентного использования жесткого диска

freemaemory="$(df -h | grep "5.7" | awk '{ print $4 }')";

# grep "5.7" - фильтрую вывод по размеру своего жесткого диска.
# У Вас будет другое значение. Узнать размер жесткого диска можно командой df -h

# Ну и для информирования я отправляю сообщение себе на почту письмо с сообщением, о том, что натворил.
# Ключ -e позволяет echo использовать спец теги, такие как \n (перенос строки) в данном примере.

echo -e "Создание резервной копии сервера anart.ru успешно завершено "`date`"\n\nСозданы следующие архивы:\nmysql_all_db_"$DATE".gz - Дамп базы данных\nhome_"$DATE".tar.gz - Архив web директории\nconfigs_"$DATE".tar.gz - Архив основных конфигурационных файлов системы.\n\nАрхивы отправлены на удаленный сервер.\n\n2-дневные архивы удалены.\n\nЗанято "$freemaemory" дискового пространства" | mail -s "Backup on anart.ru complate" mail@domain.com

Теперь остается добавить задание в cron:

crontab -e

Далее жмем insert и вводим текст

sh10 3 */3 * * sh /home/make-full-backup.sh

что означает, что sh скрипт make-full-backup.sh из каталога /home будет выполняться каждые 3 дня в 3 часа 10 минут.

Далее жмем Esc, затем вводим команду без кавычек :wq и жмем Enter. Всё. Задание добавлено. Проверить запись в cron можно командой

crontab -l