В этом посте хотелось бы рассказать о достаточно простом и надежном способе организации резервного копирования сайта на удаленный сервер. Рассмотрим на примере шаред хостинга, в целом точно таким же образом это делается и для сайта на выделенном сервере.
Постановка задачи:
- У нас есть аккаунт на шаред хостинге с доступом по ssh (IP: x.x.x.x, Username: mysiteuser, Операционная система: Linux Debian):
- База данных MySQL.
- Сайт на drupal в папке /home/user/public_html/
- Сервер архивирования - обычный выделенный сервер, на котором будем хранить архивы (IP: y.y.y.y, Операционная система: Linux Debian).
- Нам необходимо автоматизировать резервное копирование папки public_html, так чтобы резервное копирования должно происходило ежедневно ночью в 03:00 по Московскому времени, копии должны храниться не более 7 дней.
- Сервер архивирования согласно расписанию создает копию файлов сайта и базы данных на локальный жесткий диск.
- После копирования происходит архивация копии сайта.
- Сжатые копии хранятся 7 дней, после чего удаляются.
- Настроим возможность подключения к шаред хостингу по ssh без пароля.
- Напишем скрипт синхронизации папки public_html шаред хостинга с выделенным сервером.
- Напишем скрипт архивации копии папки public_html и удаление старых архивов.
- Добавим задания в /etc/crontab для регулярного автоматического запуска.
Настройка возможности подключения по ssh без ввода пароля
Для этого необходимо:- На выделенном сервере сгенерировать открытый и закрытый ключ. Это очень просто сделать такой командой:
- Открытый ключ размещаем на сервере к которому мы планируем подключаться. В нашем случае на шаред хостинге. Скопировать можно, например, через ssh используя команду scp:
ssh-keygen -t rsa -b 2048 -f mysite-keyгде mysite-key - имя Вашего ключа. При выполнении команды будет запрошен пароль, его вводить не требуется. После выполнения этой команды в текущем каталоге появится 2 файла (закрытый и открытый ключи соответственно): "mysite-key" и "mysite-key.pub"
scp mysite-key.pub mysiteuser@x.x.x.x:/home/mysiteuser/.ssh/После этого необходимо добавить этот ключ в список авторизованных ключей. это можно сделать либо через панель управления хостингом (cpanel позволяет), либо через ssh используя команду cat:
cd .ssh cat mysite-key.pub >> authorized_keys2
ssh -i mysite-key mysiteuser@x.x.x.xПосле выполнения этой команды мы попадем в сеанс ssh без ввода пароля.
Написание скрипта синхронизации папки с выделенным сервером
Для синхронизации папки сайта с папкой на выделенном сервере архивирования можно использовать скрипт:#!/bin/bash #Путь к закрытому ключу ssh. Например: /home/user/.ssh/privatekey SSH_PRIVATEKEY="/home/openadmins/.ssh/ssh-cron-key" #Имя пользователя для доступа к удаленному серверу по ssh SSH_REMOTEUSER="mysiteuser" #ip адрес удаленного сервера SSH_REMOTEHOST="x.x.x.x" #скрипт, который должен отработать на сервере, где находится сайт, перед синхронизацией.Скрипт должен лежать на удаленном сервере #Если задать пустую строку, то ничего не происходит. SSH_REMOTEPRECOMMAND="./backupdb.sh" #скрипт, который должен отработать на сервере, где находится сайт, после синхронизации.Скрипт должен лежать на удаленном сервере #Если задать пустую строку, то ничего не происходит. SSH_REMOTEPOSTCOMMAND="./removebackupdb.sh" #Папка на удаленному сервере, которую будем синхронизировать REMOTEDIR=/home/mysiteuser/public_html #Путь куда будет скопирована папки с удаленного сервера BACKUPDIR=/home/openadmins/backup/ituslugi #Запуск команды на удаленном сервере перед синхронизацией if [ -n $SSH_REMOTEPRECOMMAND ]; then ssh -i $SSH_PRIVATEKEY $SSH_REMOTEUSER@$SSH_REMOTEHOST $SSH_REMOTEPRECOMMAND fi #Запуск синхронизации rsync -avz -e "ssh -i "$SSH_PRIVATEKEY $SSH_REMOTEUSER@$SSH_REMOTEHOST:$REMOTEDIR $BACKUPDIR/ #Запуск команды на удаленном сервере после синхронизации if [ -n $SSH_REMOTEPOSTCOMMAND ]; then ssh -i $SSH_PRIVATEKEY $SSH_REMOTEUSER@$SSH_REMOTEHOST $SSH_REMOTEPOSTCOMMAND fi #Вызываем скрипт архивации папки public_html /bin/sh /home/initlab/scripts/backup_mysite.shКомментарии приведены по тексту, поэтому должно быть все понятно. Сохраним этот скрипт в /home/openadmins/scripts/sync-mysite.sh. Переходим к написанию скрипта архивации папки и удаления старых архивов.
Написание скрипта архивации папки и удаление старых архивов
Для архивации папки с файлами сайта используем следующий скрипт:#!/bin/bash #Скрипт циклической архивации каталога. Позволяет хранить архивы только за последние N дней. Количество дней можно задать. #Путь к каталогу, где будут храниться архивы. например: /home/user/backupsites/mysite BACKUP_FOLDERNAME="/home/openadmins/backup/mysiteuser" #Название файлов архивов. Например,если указа backup-my-site. #тогда имя файла архива после архивации в 25 апреля 2011 года в 00:00 будет таким: backup-my-site-2011-04-25--00-00.tar.gz BACKUP_FILENAME="backup-mysiteuser" #Путь к архивируемому каталогу. Например: /home/user/backupsites/mysite/public_html FOLDERNAME="/home/openadmins/backup/mysiteuser/public_html" #Количество дней хранения архивов. Все архивы, которые хранятся большее количество дней будут удалены. DAYCOUNT=7 #Создание архива tar czf $BACKUP_FOLDERNAME/$BACKUP_FILENAME-`date +%F--%H-%M`.tar.gz $FOLDERNAME #Удаление архивов, которые лежат дольше чем количество дней хранения архивов. find $BACKUP_FOLDERNAME/ -name '*gz' -type f -mtime +$DAYCOUNT -execdir rm {} +Сохраним этот скрипт в /home/openadmins/scripts/backup-mysite.sh
Настройка автоматического запуска по cron
Настройку автоматического запуска осуществляем в файле /etc/crontab, Для осуществления ежедневного запуска вписываем следующие строку01 03 * * * initlab /bin/sh /home/openadmins/scripts/sync-sites.shПосле этих действий ваш сайт будет архивироваться ежедневно на удаленный сервер, и даже если с основным хостингом произойдут какие то проблемы всегда можно будет достаточно быстро восстановиться.
Таким образом мы настраиваем резервное копирование сайтов на всех серверах, которые мы поддерживаем.