Данное руководство поможет быстро создать резервные копии наиболее общих компонентов виртуального выделенного сервера, а именно файлов сайта и БД. В руководстве показано, как настроить ежедневное резервное копирование off-site (то есть, на другой удалённый сервер), а также как использовать rsync для инкрементного копирования. Для выполнения описанных здесь действий понадобится rsync, cron и несколько простых команд bash. В качестве примера для бэкапа будет использоваться WordPress (инструкции по установке можно найти здесь); предполагается, что WordPress находится в каталоге /var/www/wordpress, а БД MySQL называется wordpress.
Примечание: Замените эти условные данные своими значениями.
Резервное копирование бывает полным (копирует все данные) и инкрементным (копирует только изменения с момента последнего обновления бэкапа).
Полный бэкап
Создание архива
Итак, необходимые данные хранятся в каталоге /var/www/wordpress. Создайте каталог для резервного копирования:
mkdir -p /backup/wordpress
Чтобы создать полную резервную копию данных, используйте инструмент tar.
tar -czf /backup/wordpress/initial_backup.tar.gz
/var/www/wordpress
Этот инструмент создаст gzip-архив в файле initial_backup.tar.gz; флаг -czf значит create, gzip и file. Можно также добавить флаг v (-czvf), чтобы получить расширенный вывод.
Из названии файла для бэкапа следует, что эта начальная копия (initial backup) была заархивирована при помощи tar в формате gzip.
Инструмент tar может копировать несколько точек системы:
tar -czf /backup/cms_systems_backup.tar.gz /var/www/wordpress
/var/www/drupal /var/www/joomla
Эта команда создаст бэкап всех установленных CMS.
Для удобства управления резервными копиями в название файла можно добавить дату создания копии:
tar -czf /backup/wordpress/wordpress-`date '+%m%d%y'`.tar.gz
/var/www/wordpress
Результат:
[root@Backup ~]# ls -l /backup/wordpress/
total 9760
-rw-r--r-- 1 root root 4995743 Apr 17 12:16 initial_backup.tar.gz
-rw-r--r-- 1 root root 4995743 Apr 17 12:25 wordpress-041713.tar.gz
[root@Backup ~]#
Теперь на сервере есть два файла: initial_backup.tar.gz и wordpress-041715.tar.gz (где 041715 – дата создания копии).
Теперь можно настроить ежедневное резервное копирование при помощи crontab (это планировщик задач Linux). Откройте crontab:
EDITOR=nano crontab -e
Для примера настройте автоматическое резервное копирование в 3.30 утра (поскольку в это время трафик, как правило, небольшой). Кроме того, cron может сообщить результаты по электронной почте. Добавьте в crontab:
MAILTO=email@example.com
30 3 * * * /bin/tar -czf /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz /var/www/wordpress
Сохраните и закройте файл.
Итак, теперь каждый день в 3.30 утра система будет выполнять бэкап данных, а затем отправлять результаты по электронной почте. В случае ошибки в сообщение будет содержать инструкции по её устранению.
Копирование бэкапа на удаленный сервер
Чтобы скопировать резервные копии данных на другой удалённый сервер, используйте scp. Сначала создайте SSH-ключ:
ssh-keygen
Можно не создавать пароль для ключа и использовать файл ключей /root/.ssh/id_rsa_backup (или /home/username/.ssh/id_rsa_backup, если текущий пользователь не root). Проверьте открытый ключ:
cat .ssh/id_rsa_backup.pub
Скопируйте открытый SSH-ключ на удалённый сервер в файл authorized_keys. Предполагается, что у вас уже есть заранее подготовленный виртуальный выделенный сервер по имени backup.example.com и пользователь backup.
scp .ssh/id_rsa_backup.pub
backup@backup.example.com:/home/backup/backup_key.pub
Будет запрошен пароль пользователя backup. Теперь ключ скопирован и его нужно переместить в authorized_keys. Чтобы создать такой файл, введите:
ssh backup@backup.example.com "mkdir -p /home/backup/.ssh"
ssh backup@backup.example.com "chmod 700 /home/backup/.ssh"
ssh backup@backup.example.com "touch /home/backup/.ssh/authorized_keys"
ssh backup@backup.example.com "chmod 600 /home/backup/.ssh/authorized_keys"
ssh backup@backup.example.com "mkdir -p /home/backup/backups"
Эти команды создадут каталог и файл authorized_keys (если таковых ещё не существует), необходимый для перемещения резервных копий. Файлы можно хранить в каталоге backups. Нужно скопировать открытый ключ в этот каталог:
ssh backup@backup.example.com "cat /home/backup/backup_key.pub >>
/home/backup/.ssh/authorized_keys"
В дальнейшем этот ключ можно использовать для обмена данными.
Скопируйте файл бэкапа на удалённый сервер:
scp -i .ssh/id_rsa_backup
/backup/wordpress/wordpress-041713.tar.gz
backup@backup.example.com:/home/backup/backups
Если ключ был установлен правильно, то файл будет скопирован без запроса пароля. Убедитесь, что файл перемещен:
ssh backup@backup.example.com "ls -l /home/backup/backups"
Теперь можно автоматизировать перемещение резервных копий на удалённый сервер при помощи crontab.
EDITOR=nano crontab -e
Добавьте в настройки бэкапа команды, которые скопируют созданный архив.
30 3 * * * /bin/tar -czf /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz /var/www/wordpress;/usr/bin/scp -i
/root/.ssh/id_rsa_backup /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz
backup@backup.example.com:/home/backup/backups
Примечание: Это не самый надёжный способ автоматизировать эту задачу. Для автоматизации копирования бэкапа рекомендуется создать скрипт, а затем запланировать его запуск. Данный метод используется в руководстве для краткости и простоты.
Инкрементное резервное копирование
Что если на удалённом сервере тоже есть программное обеспечение для резервного копирования? В таком случае можно просто синхронизировать данные двух серверов и настроить один из них для выполнения резервного копирования. Кроме того, можно сохранить файлы с отметками. Для этого используется rsync.
Данный раздел покажет, как при помощи rsync создать инкрементную резервную копию каталога var/www/wordpress и поместить её в каталог /home/backup/snapshots/wordpress на удаленном сервере.
Для этого запустите:
ssh backup@backup.example.com "mkdir -p /home/backup/sync"
rsync -avz --delete -e "ssh -i /root/.ssh/id_rsa_backup"
/var/www/wordpress backup@backup.example.com:/home/backup/sync
Первая команда создаёт каталог для хранения копии, а вторая копирует в него изменённые файлы (отредактированные, созданные, удалённые). Чтобы запланировать этот бэкап, откройте cron:
EDITOR=nano crontab -e
Добавьте в файл следующие настройки:
30 3 * * * /usr/bin/rsync -avz --delete -e "ssh -i
/root/.ssh/id_rsa_backup" /var/www/wordpress
backup@backup.example.com:/home/backup/sync
Резервное копирование БД
Примечание: Согласно предложенному ранее руководству по установке WordPress, БД называется wordpress, пользователь – wordpressuser, пароль – password. Замените эти условные данные своими данными.
Создайте дамп данных.
mkdir /backup/mysql
mysqldump < wordpress -u wordpressuser -ppassword | gzip >
/backup/mysql/initial.sql.gz
Эта команда создаёт SQL-файл initial.sql.gz. Чтобы запланировать бэкап БД, откройте cron и добавьте такие настройки:
0 4 * * * /usr/bin/mysqldump < wordpress -u wordpressuser
-ppassword | /bin/gzip > /backup/mysql/mysql--`date +\%m\%d\%y`.sql.gz
Чтобы переместить дамп на удалённый сервер, добавьте в cron scp или rsync:
0 4 * * * /usr/bin/mysqldump < wordpress -u wordpressuser
-ppassword | /bin/gzip > /backup/mysql/mysql-`date +\%m\%d\%y`.sql.gz;
/usr/bin/scp -i /root/.ssh/id_rsa_backup /backup/mysql/mysql-`date
+\%m\%d\%y`.sql.gz backup@backup.example.com:/home/backup/