Создание резервных копий сайтов на локальном и удаленном сервере

Признаюсь, я ленив местами. То что можно сделать автоматизированно — я делаю (если смогу побороть лень :-D) И тут представилась такая возможность. Я решил обойтись без панели управления VESTACP и руками настроить сервер для своего сайта.

Сделал по быстрому, и тут встал вопрос о резервном копировании. В панели управления для этого была специальная настройка и всё было замечательно (если не считать того, что периодически панель забывала чистить за собой временные файлы резервных копий и забивала свободное место на диске) однако на сервере настроенном руками, резервное копирование тоже надо делать ручками. Итак, задача:

  1. Делать копии всех сайтов пользователя что есть на сервере.
  2. Делать копии всех баз данных пользователя mysql что есть на сервере.
  3. Хранить копии определенное время.
  4. Хранить копии бекапов на удаленном сервере.
  5. Копии делать 1 раз в день в автоматическом режиме.

Будем исходить из ТЗ.  Имеем:

  • Удаленный сервер remote.site.ru с работающим по стандартному 22 порту сервером ssh на котором есть директория /home/user/backup
  • Сервер с сайтами site.ru расположенными в директории /home/serv/sites
  • MySQL сервер на site.ru к которой мы имеем доступ от имени пользователя serv

Наши действия:

Создаем директорию под локальные бэкапы:

mkdir -p /home/serv/backup

Создаем ключ ssh с помощью которого будем заходить на домашний сервер и копировать туда файлы:

ssh-keygen -f ~/.ssh/id_rsa -q -P ""
cat ~/.ssh/id_rsa.pub

В выхлопе получим что-то вроде:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLVDBIpdpfePg/a6h8au1HTKPPrg8wuTrjdh0QFVPpTI4KHctf6/FGg1NOgM++hrDlbrDVStKn/b3Mu65//tuvY5SG9sR4vrINCSQF++a+YRTGU6Sn4ltKpyj3usHERvBndtFXoDxsYKRCtPfgm1BGTBpoSl2A7lrwnmVSg+u11FOa1xSZ393aaBFDS555GlJf1SojWYIAbE25Xe3z5L232vZ5acC2PJkvKctzvUttJCP91gbNe5FSwDolE44diYbNYqEtvq2Jt8x45YzgFSVKf6ffnPwnUDwhtvc2f317TKx9l2Eq4aWqXTOMiPFA5ZRM/CF0IJCqeXG6s+qVfRjB

Идем на remote.site.ru сервер и добавляем туда наш ключ в файл ~/.ssh/authorized_keys Если этого файла нет, то его надо создать и выставить на него права:

mkdir ~/.ssh
chmod 0700 ~/.ssh
touch ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLVDBIpdpfePg/a6h8au1HTKPPrg8wuTrjdh0QFVPpTI4KHctf6/FGg1NOgM++hrDlbrDVStKn/b3Mu65//tuvY5SG9sR4vrINCSQF++a+YRTGU6Sn4ltKpyj3usHERvBndtFXoDxsYKRCtPfgm1BGTBpoSl2A7lrwnmVSg+u11FOa1xSZ393aaBFDS555GlJf1SojWYIAbE25Xe3z5L232vZ5acC2PJkvKctzvUttJCP91gbNe5FSwDolE44diYbNYqEtvq2Jt8x45YzgFSVKf6ffnPwnUDwhtvc2f317TKx9l2Eq4aWqXTOMiPFA5ZRM/CF0IJCqeXG6s+qVfRjB" >> ~/.ssh/authorized_keys 
chmod 0644 ~/.ssh/authorized_keys

Теперь наш сервер с сайтами будет подключаться к удаленному серверу без пароля.

Следующий шаг — добавляем скрипт и настраиваем его:

nano ./backup.sh

Каждый шаг скрипта я снабдил комментарием:

#!/bin/bash
###########################################
# Предварительные настройки и переменные  #
###########################################
#Директория с сайтами
SITE_DIR='/home/serv/sites'
#Директория для резервных копий
BACKUP_DIR='/home/serv/backup'
#Имя резервной копии в зависимости от даты
BACKUP_NAME=$(date "+%Y%m%d")
#Сервер куда будут складываться копии резервных копий
REMOTE_HOST='remote.site.ru'
#Директория на удаленном сервере куда будут складываться копии резервных копий
REMOTE_DIR='/home/user'
#Пользователь под которым мы заходим на удаленный сервере
REMOTE_USER='user'
#Настройки базы данных
#Пользователь БД
DB_USER='serv'
#Пароль пользователя БД
DB_PASS='serv_password333'
#Сервер базы данных
DB_HOST='localhost'

###########################################
#          Рабочая часть скрипта          #
###########################################      

#Создаем архив с файлами сайтов
tar -zcf "$BACKUP_DIR/sites_$BACKUP_NAME.tar.gz" $SITE_DIR

#Создаем архив баз данных доступных пользователю
mysqldump -u $DB_USER -h $DB_HOST -p$DB_PASS -A | gzip -c > "$BACKUP_DIR/mysql-db-$BACKUP_NAME.dump.gz"

#Смотрим файлы старше 5 дней и если есть - то удаляем.
find $BACKUP_DIR -type f -mtime +5 -exec rm {} \;

#Синхронизируем нашу директорию с резервными копиями с директорией на удаленном сервере через ssh
rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" $BACKUP_DIR $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR

Теперь дадим права на запуск нашему скрипту:

chmod +x ./backup.sh

Ну и напоследок- добавим выполнение скрипта на полтретьего ночи каждый день:

crontab -e

30 2 * * * /home/serv/backup.sh

Вот, в принципе и всё.

Оцените статью
( Пока оценок нет )
Блог админа