Создание бэкапов на Linux-сервере
В работе любого системного администратора возникает пора, когда он задумывается над системой бэкапирования. Как в том старом анекдоте:
Есть системные администраторы, которые делают бэкапы и те, которые еще не делают.
Проблема достаточно важная и особенно актуальна, особенно при атаке вирусом-шифровальщиком. Я покажу один из примеров организации бэкапирования данных. Для организации автоматического бэкапирования я использую скрипт.
1. Определяем директорию, куда будем складывать бэкапы на сервере (либо той же машины, на которой делаем бэкап): допустим это /root/backup
2. Так как бэкап создается раз в сутки, имеет смысл создать директорию формата: [год]-[месяц]-[день]. Для этого воспользуемся командой:
3. Теперь можем смело складывать наш бэкап в созданную директорию. Но прежде чем создавать бэкап, имеет смысл вести лог бэкапирования. Например так:
4. Если на сервере есть база данных, то бэкапим ее:
5. Далее бэкапим сами файлы, у меня они находятся в /var/www/:
echo ‘Приступаю к архивации :’ >> /root/backup/`date +%Y-%m-%d`/backup.log
tar -czvf /root/backup/`date +%Y-%m-%d`/[название архива].tar.gz [название директории, которая архивируется] >> /root/backup/`date +%Y-%m-%d`/backup.log
echo ‘Архив готов’ >> /root/backup/`date +%Y-%m-%d`/backup.log echo ‘Проверка backup:’ >> /root/backup/`date +%Y-%m-%d`/backup.log
ls /root/backup/`date +%Y-%m-%d` >> /root/backup/`date +%Y-%m-%d`/backup.log
Мы создали бэкап и он лежит у нас на нашем сервере в директории /root/backup/`date +%Y-%m-%d`. Попутно мы все действия записали в лог файл. Можно на этом успокоиться, но… хранить бэкапы в том же самом месте, что и сами файлы не совсем разумно. Имеет смысл скопировать их на специально подготовленный сервер (я его называю сервер бэкапов).
6. Для копирования я использую протокол ssh. Первым делом обеспечим без парольное подключение к серверу бэкапов:
- Генерируем ключ на клиенте: ssh-keygen
- Записываем наш ключ в файл authorized_keys на сервере: cat .ssh/id_rsa.pub | ssh [логин]@[ip сервера бэкапов] «cat — >> .ssh/authorized_keys»
- Добавляем запись в лог файл: echo «Копирую архив на Backup сервер:» >> /root/backup/`date +%Y-%m-%d`/backup.log
- Копируем файлы на сервер бэкапов: scp -r /root/backup/`date +%Y-%m-%d` [логин]@[ip сервера бэкапов]:[путь к директории для хранения бэкапов на сервере бэкапов] >> /root/backup/`date +%Y-%m-%d`/backup.log
7. После того как мы скопировали файлы в безапасное место, не имеет смысла хранить все бэкапы на локальной машине. В случае аварии, нам понадобятся самые свежие — это 1-2 день. Поэтому произведем чистку директории /root/backup/:
i=0
find /root/backup -mtime +$i -print -delete
8. На этом процедура бэкапирования закончена. Осталось проверить свободное дисковое пространство. Это имеет смысл сделать для того, чтобы внезапно не оказалось, что бэкапы забили все дисковое пространство на нашей машине:
df -h >> /root/backup/`date +%Y-%m-%d`/backup.log
9. Так как я люблю спать спокойно, то неплохо бы было получать уведомления о благополучном завершении процедуры бэкапирования. Для этого организуем отправку лога /root/backup/`date +%Y-%m-%d`/backup.log на почту:
- Устанавливаем пакет ssmtp:
- Редактируем файл /etc/ssmtp/ssmtp.conf:
hostname=smtp.mail.ru:25
UseTLS=YES
UseSTARTTLS=YES
hostname=localhost
authuser=[наш e-mail] authpass=[пароль от ящика] FromLineOverride=NO
Debug=YES
- Редактируем файл /etc/ssmtp/revaliases:
- Отправляем лог на почту:
Все эти команды можно записать в скрипт и запускать автоматически в назначенное время:
mkdir /root/backup/`date +%Y-%m-%d`
echo ‘Произвожу выгрузку баз данных’ >> /root/backup/`date +%Y-%m-%d`/backup.log
mysqldump —user=[пользователь базы данных] —password=[пароль пользователя] —host=[имя хоста, в моем случае это localhost] [имя бэкапируемой базы данных] > /root/backup/`date +%Y-%m-%d`/[имя файла, куда записваем содержимое базы даных].sql
cd «/var/www/»
echo ‘Приступаю к архивации :’ >> /root/backup/`date +%Y-%m-%d`/backup.log
tar -czvf /root/backup/`date +%Y-%m-%d`/[название архива].tar.gz [название директории, которая архивируется] >> /root/backup/`date +%Y-%m-%d`/backup.log
echo ‘Архив готов’ >> /root/backup/`date +%Y-%m-%d`/backup.log
echo ‘Проверка backup:’ >> /root/backup/`date +%Y-%m-%d`/backup.log
ls /root/backup/`date +%Y-%m-%d` >> /root/backup/`date +%Y-%m-%d`/backup.log
echo «Копирую архив на Backup сервер:» >> /root/backup/`date +%Y-%m-%d`/backup.log
scp -r /root/backup/`date +%Y-%m-%d` [логин]@[ip сервера бэкапов]:[путь к директории для хранения бэкапов на сервере бэкапов] >> /root/backup/`date +%Y-%m-%d`/backup.log
echo «Удаляю резервные копии старше двух дней:»
i=0
find /root/backup -mtime +$i -print -delete
echo «Процедура создания бэкапа закончена )» >> /root/backup/`date +%Y-%m-%d`/backup.log
echo «Дисковое пространство:» >> /root/backup/`date +%Y-%m-%d`/backup.log
df -h >> /root/backup/`date +%Y-%m-%d`/backup.log
echo «[сообщение]» | mail -v -s «[тема письма]» [e-mail, кому отправляем] < /root/backup/`date +%Y-%m-%d`/backup.log
Если будет полезно, примите как пример..
http://vixdevelop.blogspot.ru/2017/02/backup.html