Сценарий: два сайта с одинаковым содержимым работают на разных доменах. На одном из них работает полноценный бекап, в котором сохраняются как базы данных, так и все сопутствующие файлы. На втором хостинг дешевый, и бекапа фактически нет, либо его надо делать вручную в личном кабинете пользователя, что конечно неудобно.
Поэтому возникла идея написать скрипт для синхронизации содержимого двух сайтов. Задание crontab будет запускать этот скрипт, и он будет производить следующие действия. Для упрощения сайт, на котором есть бекап, назовем Сайт A, а второй сайт, который должен синхронизироваться, назовем Сайт B.
1. Хост Сайта A с помощью sshfs [1] выполняет монтирование папки пользователя хоста Сайта B.
2. Создается дамп базы данных Сайта A в папку пользователя хоста B.
3. Происходит подключение ssh [2] к командной строке Сайта B [2], и созданный дамп базы данных заливается на Сайт B.
4. Дамп базы данных удаляется, происходит размонтирование папки пользователя Сайта B.
5. С помощью rsync [5] синхронизируются файлы сайтов.
[Скрипт bash]
Текст скрипта bash, который запускается на Сайте A:
#!/bin/bash
# Монтирование удаленной папки домашней директории пользователя Сайта B:
echo Mount remote folder...
sshfs -o password_stdin,default_permissions userSiteB@AddrSiteB.ru:/home/userSiteB \
/mnt <<< 'password_userSiteB'
# Дамп базы данных MySQL сервера сразу на папку удаленного сервера:
echo Dump database...
mysqldump --defaults-extra-file=~/mysqldump.config база_данных_Сайта_A > \
/mnt/dump.sql
# Заливка из дампа на Сервер B:
echo Restore database...
sshpass -p 'password_userSiteB' ssh -o StrictHostKeyChecking=no userSiteB@AddrSiteB.ru \
mysql --password=пароль_MySQL_B -u пользователь_MySQL_B база_данных_Сайта_B < /mnt/dump.sql
# Удаление дампа базы данных:echo Remove dump
rm -f /mnt/dump.sql
# Размонтирование папки на удаленном сервере:
echo Unmount
umount /mnt
# Синхронизация файлов:
sshpass -p 'password_userSiteB' rsync -t -r --exclude=configuration.php -e ssh \
/var/www/userSiteB/AddrSiteA.ru/* userSiteB@AddrSiteB.ru:/home/userSiteB/www/AddrSiteB.ru
echo Done!
В этом скрипте используются следующие параметры:
userSiteB логин пользователя Сайта B.
AddrSiteA.ru адрес Сайта A (доменное имя или IP).
AddrSiteB.ru адрес Сайта B (доменное имя или IP).
/mnt системная папка Сайта A, применяемая для точек монтирования.
password_userSiteB пароль пользователя Сайта B.
mysqldump.config конфигурационный файл для утилиты mysqldump, где указаны логин и пароль пользователя базы данных Сайта B (см. [3]).
база_данных_Сайта_A имя базы данных на Сайте A.
/mnt/dump.sql файл дампа базы данных Сайта A.
пароль_MySQL_B пароль пользователя MySQL на Сайте B.
пользователь_MySQL_B имя пользователя MySQL на Сайте B.
Замечание: файловые пути должны быть абсолютными (относительно корневого каталога /), чтобы демон cron мог нормально выполнить скрипт. Обратите внимание, что на последнем шаге в командную строку rsync добавлена опция --exclude=configuration.php, чтобы исключить конфигурационный файл Joomla. Этот файл должен отличаться для сайтов A и B.
[Создание задания crontab]
Запустите команду для настройки задания crontab от имени пользователя root:
Откроется окно текстового редактора по умолчанию, где нужно в конец файла добавить строку задания:
0 1 * * * bash /root/cloneA2B.sh
Задание в строке указывается в формате "минута час день_месяца месяц день_недели команда". В данном примере указаны следующие параметры задания:
0 задание запускается на нулевой минуте часа.
1 задание запускается в 1 часу ночи.
* задание запустится на любом дне месяца.
* задание запустится на любом месяце.
* задание запустится в любой день недели.
bash /root/cloneA2B.sh запускаемая команда задания. Здесь указано имя скрипта, пример которого был показан выше.
Сохраните и закройте файл. Созданное задание можно посмотреть командой crontab -l (предполагается, что она выполняется от имени пользователя root):
# crontab -l
# Edit this file to introduce tasks to be run by cron.
...
# m h dom mon dow command
0 1 * * * bash /root/cloneA2B.sh
[Ссылки]
1. sshfs: монтирование файловой системы удаленного сервера. 2. ssh: как выполнять команды на удаленном сервере. 3. MySQL - как делать backup. 4. CRONTAB - ФОРМАТ ЗАПИСИ СОБЫТИЙ site:pai-bx.com. 5. rsync: синтаксис, примеры использования. 6. How to pass password automatically for rsync SSH command? site:stackoverflow.com. |