ryg

Миграция и архивирование сайтов на Drupal

Если вы интенсивно работаете на своих сайтах, то часто возникает необходимость переноса сайтов в архивировании и переносе сайтов с хостинга на локальный компьютер и обратно (или на другой хостинг). 

Для переноса и архивирования сайтов на Drupal можно использовать модули Backup and Migrate и Backup and Migrate files и до недавнего времени я ими пользовался. Но не так давно сайт переехал на хостинг с доступом по SSH и необходимость в данных модулях отпала, потому-что гораздо удобнее это сделать средствами Bash.

Итак, если вы имеете доступ к вашему сайту по ssh, алгоритм архивирования сайта выглядит следующим:

1. Сделать бэкап базы данных средствами MySQL

mysqldump -uUSER -pPASSSWORD --default-character-set=UTF8 mysqlBase > sitedb_backup.sql 

где :

  • USER -имя пользователя имеющего доступ к Базе данных
  • PASSWORD - пароль к базе данных 
  • mysqlBase - имя базы данных
  • sitedb_backup.sql -имя файла дампа БД

Пароль и имя пользователя всегда можно посмотреть в файле sites/default/settings.php, в принципе скрипт мог бы их оттуда парсить, но было лениво это писать.

Потом необходимо заархивировать все файлы из рабочей папки сайта, включая .htaccess

Нижеприведенный скрипт это и делает:

	
#!/bin/bash

# Call parameters
# sh backup.sh login_sql password_sql SiteFolder siteName MySQL_base_name

echo;echo;echo;echo;echo;
# проверяем количество переданных параметров и печатаем их на всякий случай
if [ "$#" != 5 ]
then
echo 'Quantity parameters='$#
echo 'Error! Must have five parameters'
exit
else
echo 'login ='$1
echo 'password='$2
echo 'Site Folder='$3
echo 'Site Name='$4
echo 'Database Name='$5
fi

# запоминаем текущую папку

sr=$(pwd)

# Выгружаем базу данных сайта
echo mysqldump -u$1 -p$2 --default-character-set=UTF8 $5 '>' $4_backup.sql
if mysqldump -u$1 -p$2 --default-character-set=UTF8 $5 > $4_backup.sql
then
echo 'Error! Database dump Created'
else
# Если дамп сделать не удалось, то вываливаемся
echo 'Database dump NOT Created'
exit
fi

# Создаем в текущей папке скрипта подпапку с именем сайта 
# В нее потом занесем архив сайта
mkdir $4

# Архивируем дамп базы данных сайта
zip backup_bd_$4 $4_backup.sql
echo 'Database dump archived '
# Удаляем ненужный дамп
rm $4_backup.sql
echo 'Database dump deleted '

echo  'cd to SiteFolder'
# переходим в папку сайта
cd ~/$3
echo 'Create archive all files of site'
# архивируем все файлы сайта
zip -r backup_$4 *
# удаляем из архива файл /sites/default/settings.php 
# можно было бы сделать исключение в предыдущей команде, но мне так захотелось
echo 'Remove from archive file setting  /sites/default/settings.php'
zip -v backup_$4.zip -d /sites/default/settings.php 

# Архивируем отдельно файл /sites/default/settings.php 
zip default_$4 sites/default/settings.php 

# архивируем отдельно файлы начинающиеся на .
echo 'Create archive files without filename, have extension only. Example .htaccess'
zip dot_files_$4 .* 

# возвращаемся в папку скрипта
echo 'Return to backup folder'
cd $sr

# переносим архивные файлы в подпапку с именем файла
echo 'Move files to  ' $sr/$4/' folder'  

mv -v -i  ~/$3/backup_$4.zip $sr/$4/backup_$4.zip
mv -v -i  ~/$3/dot_files_$4.zip $sr/$4/dot_files_$4.zip
mv -v -i  ~/$3/default_$4.zip $sr/$4/default_$4.zip
mv -v -i  backup_bd_$4.zip $sr/$4/backup_bd_$4.zip

echo 'The end'

Данный скрипт я назвал backup.sh и разместил его в отдельно папке с таким же названием, но это не принципиально, но удобнее будет его и следующий скрипт хранить в отдельной папке недоступной для посетителей сайта.

Запускается он командой 

sh backup.sh ИмяПользователя Пароль АдресПапкиСайта ИмяАрхивов ИмяБазыДанных

Все данные параметры перечислены ваше в описании команды mysqldump, за исключением АдресПапкиСайта. Данный параметр это имя папки где расположен сайт относительно папки пользователя, например если папка сайта у вас находится в корне (если смотреть файловым менеджером) и называется public_html, то он будет иметь значение public_html. Если вы сделали папку sites и в ней папку osxh.ru, то параметр будет sites/osxh.ru.

В итоге работы скрипта будет создана подпапка в папке где находится скрипт с именем ИмяАрхивов и там будет находиться четыре архива:

  • backup_ИмяАрхива.zip - в нем находятся все файлы из папки сайта
  • backup_bd_ИмяАрхива.zip -Дамп базы данных
  • default_ИмяАрхива.zip -файл setting.php
  • dot_files_ИмяАрхива.zip -все файлы имя которых начинаются с точки, например .htaccess

Всю эту папку с помощью ftp переносим на другой компьютер в такую же подпапку и аналогично запускаем находящийся в папке уровнем выше (где лежит backup.php) другой скрипт restore.php. Все параметры его запуска аналогичны, но необходимо помнить, что имя пользователя, пароль и имя БД могут быть другими.

	
#!/bin/bash
# Call parameters
# sh backup.sh login_sql password_sql SiteFolder MySQL_base_name
echo;echo;echo;echo;echo;

# проверяем количество переданных параметров и печатаем их на всякий случай
if [ "$#" != 5 ]
then
echo 'Quantity parameters='$#
echo 'Error! Must have five parameters'
exit
else
echo 'login ='$1
echo 'password='$2
echo 'Site Folder='$3
echo 'Site Name='$4
echo 'Database Name='$5
fi

# запоминаем текущую папку

sr=$(pwd)

# 
# распаковываем архив с дампом БД
# И восстанавливаем его в mysql
cd $4
unzip -u backup_bd_$4 ;
echo mysql -u$1 -p$2 --default-character-set=UTF8 $5' < '$4_backup.sql 
if mysql -u$1 -p$2 --default-character-set=UTF8 $5 < $4_backup.sql 
then
echo ' Database dump restore';
else
# Если дамп восстановить не удалось, то вываливаемся
echo 'Error! Database dump NOT RESTORE'
rm $4_backup.sql
exit
fi
#
# Удаляем дамп бд
#
rm $4_backup.sql

# копируем файловые архивы в папку сайта
echo 'copy archives to working folder'
echo
cp -f backup_$4.zip ~/$3/backup_$4.zip
cp -f dot_files_$4.zip ~/$3/dot_files_$4.zip
cp -f default_$4.zip ~/$3/default_$4.zip

#
# переходим в папку сайта
#
cd ~/$3
# делаем копии файлов robots.txt, settings.php, .htaccess
echo 'Copy old files robots.txt, settings.php, .htaccess'
if [ -f robots.txt ]; then
     echo cp -f robots.txt robots.txt.old
     cp -f robots.txt robots.txt.old
else
      echo 'Warning! File robots.txt no found'
fi

if [ -f .htaccess ]; then
     echo cp -f .htaccess old.htaccess
     cp -f .htaccess old.htaccess
else
      echo 'Warning! File .htaccess no found'
fi

if [ -f sites/default/settings.php ]; then
      echo cp -f sites/default/settings.php sites/default/settings.php.old
      cp -f sites/default/settings.php sites/default/settings.php.old
else
      echo 'Warning! File setting.php no found'
fi

# распаковываем архивы
echo 
echo 
echo 'Unpacking files from archive'

unzip -u  backup_$4.zip
unzip -u  dot_files_$4.zip
unzip -u  default_$4.zip

# переименовываем новые robots.txt, settings.php, .htaccess

echo
echo
echo 
echo 'Copy new files robots.txt, settings.php, .htaccess'

if [ -f robots.txt ]; then
    
     echo cp -f robots.txt robots.txt.new
     cp -f robots.txt robots.txt.new
else
      echo 'Warning! New file robots.txt no found. Not unpacking'
fi
if [ -f .htaccess ]; then
    echo cp -f .htaccess new.htaccess
    cp -f .htaccess new.htaccess
else
      echo 'Warning! New file  .htaccess no found. Not unpacking'
fi

if [ -f sites/default/settings.php ]; then
      echo cp -f sites/default/settings.php sites/default/settings.php.new
      cp -f sites/default/settings.php sites/default/settings.php.new
else
      echo 'Warning! New file setting.php no found. Not unpacking'
fi

# восстанавливаем robots.txt, settings.php, .htaccess
echo
echo 'Restore old files robots.txt, settings.php, .htaccess'

if [ -f robots.txt.old ]; then
     echo cp -f robots.txt.old robots.txt 
     cp -f robots.txt.old robots.txt 
     echo rm robots.txt.old 
     rm robots.txt.old 
 else
      echo 'Warning! Old file robots.txt no found. Save new'
fi  
if [ -f old.htaccess ]; then  
     echo cp -f old.htaccess .htaccess
     cp -f old.htaccess .htaccess
     echo rm old.htaccess 
     rm old.htaccess 
else
      echo 'Warning! Old file  .htaccess no found.  Save new'
fi
if [ -f sites/default/settings.php.old ]; then
     echo  cp -f sites/default/settings.php.old sites/default/settings.php 
     cp -f sites/default/settings.php.old sites/default/settings.php 
     echo rm  sites/default/settings.php.old 
     rm  sites/default/settings.php.old 
 else
      echo 'Warning! Old file setting.php no found. Save new'
fi  
rm  backup_$4.zip
rm  dot_files_$4.zip
rm  default_$4.zip
cd $sr

echo 'The end'

Данный скрипт сначала восстанавливает дамп базы данных, если восстановление неудачно, он прекращает работу. Потом он восстанавливает файлы. Сохраняя старые файлы .htacces, robots.txt и setting.php, если они имелись. Аналогичные файлы перенесенные с хостинга будит иметь имена new.htaccess, robots.txt.new,  setting.php.new их необходимо или удалить если они не нужны или переименовать .htacces, robots.txt и setting.php соответственно.

Ну и скрипты для скачивания архива и его закачки. Для скачивания я назвал ftp_get.sh вызывается он с одним параметром: 

sh ftp_get.sh ИмяАрхивов

#!/bin/sh
mkdir $1
cd $1
HOST="замените этот текст на адрес ftp сервера"
PORT="замените этот текст на порт"
USER="заменить на имя пользователя"
PASSWD="заменить на пароль"

echo ftp  $USER'@'$HOST $PORT 
ftp -inv $HOST $PORT << EOF
user $USER $PASSWD
bin
cd backup
cd $1
get backup_$1.zip
get dot_files_$1.zip
get default_$1.zip
get backup_bd_$1.zip
ls
quit
exit 0

и закачки на хостинг 

sh ftp_put.sh ИмяАрхивов

#!/bin/sh	
cd $1
HOST="замените этот текст на адрес ftp сервера"
PORT="замените этот текст на порт"
USER="заменить на имя пользователя"
PASSWD="заменить на пароль"

echo ftp  $USER'@'$HOST $PORT 
ftp -inv $HOST $PORT << EOF
user $USER $PASSWD
bin
cd backup
mkdir $1
cd $1
put backup_$1.zip
put dot_files_$1.zip
put default_$1.zip
put backup_bd_$1.zip
ls
quit
exit 0

 

Вот в принципе и все, что можно сказать о переносе и архивации сайта на Drupal с помощью SSH.

 

Возможно обойтись только командами mysql и mysqldump, а всю остальную синхронизацию сделать с помощью ftp клиентов Mac OS X.

Ссылки на дополнительные материалы:

Команда оболочки и запуска скриптов  bash
ftp - описание параметров терминальной команды для передачи файлов по ftp протоколу.

Весь список команд terminal Mac OS X