Автоматизация резервного копирования сайта на удаленный сервер

В этом посте хотелось бы рассказать о достаточно простом и надежном способе организации резервного копирования сайта на удаленный сервер. Рассмотрим на примере шаред хостинга, в целом точно таким же образом это делается и для сайта на выделенном сервере.

Постановка задачи:

  1. У нас есть аккаунт на шаред хостинге с доступом по ssh (IP: x.x.x.x, Username: mysiteuser, Операционная система: Linux Debian):
    • База данных MySQL.
    • Сайт на drupal в папке /home/user/public_html/
  2. Сервер архивирования - обычный выделенный сервер, на котором будем хранить архивы (IP: y.y.y.y, Операционная система: Linux Debian).
  3. Нам необходимо автоматизировать резервное копирование папки public_html, так чтобы резервное копирования должно происходило ежедневно ночью в 03:00 по Московскому времени, копии должны храниться не более 7 дней.

В нашем варианте автоматизации мы предлагаем организовать резервное копирование следующим образом:
  1. Сервер архивирования согласно расписанию создает копию файлов сайта и базы данных на локальный жесткий диск.
  2. После копирования происходит архивация копии сайта.
  3. Сжатые копии хранятся 7 дней, после чего удаляются.
Автоматизацию резервного копирования будем проводить на сервере архивирования (y.y.y.y) следующим образом:
  1. Настроим возможность подключения к шаред хостингу по ssh без пароля.
  2. Напишем скрипт синхронизации папки public_html шаред хостинга с выделенным сервером.
  3. Напишем скрипт архивации копии папки public_html и удаление старых архивов.
  4. Добавим задания в /etc/crontab для регулярного автоматического запуска.

Настройка возможности подключения по ssh без ввода пароля

Для этого необходимо:
  1. На выделенном сервере сгенерировать открытый и закрытый ключ. Это очень просто сделать такой командой:
  2. ssh-keygen -t rsa -b 2048 -f mysite-key
    
    где mysite-key - имя Вашего ключа. При выполнении команды будет запрошен пароль, его вводить не требуется. После выполнения этой команды в текущем каталоге появится 2 файла (закрытый и открытый ключи соответственно): "mysite-key" и "mysite-key.pub"
  3. Открытый ключ размещаем на сервере к которому мы планируем подключаться. В нашем случае на шаред хостинге.
  4. Скопировать можно, например, через ssh используя команду scp:
    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
После этих действий ваш сайт будет архивироваться ежедневно на удаленный сервер, и даже если с основным хостингом произойдут какие то проблемы всегда можно будет достаточно быстро восстановиться.

Таким образом мы настраиваем резервное копирование сайтов на всех серверах, которые мы поддерживаем.