Миграция и синхронизация сайтов Drupal при помощи Drush

Программа Drush позволяет не только устанавливать и обновлять модули Drupal – она также полезна при необходимости мигрировать сайт или синхронизировать работу нескольких сайтов.

Примечание: Более подробную информацию о Drush можно найти во вступительном руководстве; о базовых командах Drush можно прочесть здесь.

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

Примечание: Подразумевается, что Drush и сайт Drupal уже установлены на виртуальный выделенный сервер.

Алиасы Drush

Как правило, при работе с Drush нужно вводить команды, находясь в папке Drupal. Это не проблема, если на сервере есть только одна установка Drupal. Но бывают случаи, когда нужно управлять сразу несколькими сайтами (как в этом руководстве). К счастью, Drush обладает очень удобными функциями – так называемыми алиасами (англ. alias).

Алиасы Drush – это простые наборы настроек, позволяющие ссылаться на сайты Drupal из любого каталога файловой системы сервера при помощи сокращений в формате @site. Однако, чтобы получить доступ к такому сокращению, необходимо настроить соответствующий алиас. Для этого создайте файл aliases.drushrc.php в папке .drush, которая находится в папке root:

nano /root/.drush/aliases.drushrc.php

Создайте открывающий тег php (<?php) и скопируйте следующий код:

$aliases['site1'] = array(
'root' => '/var/www/drupal_folder',
'uri' => '88.88.88.88/drupal_folder',
);

Данный код выполняет следующие действия:

  • site1 – сокращение, по которому можно ссылаться на сайт при помощи команд Drush (укажите любое удобное сокращение);
  • root в массиве $aliases должен указывать на каталог сайта Drupal;
  • строка uri должна содержать URI сайта.

В приведённом выше блоке кода используется фиктивный IP-адрес сервера. Замените его IP-адресом своего сервера (текущего, а не удалённого).

Сохраните файл и закройте его. Алиас готов к использованию. Чтобы протестировать его, откройте любой каталог и запустите:

drush @site1 status

На экране должна появиться информация о состоянии сайта, на который вы только что сослались. Конечно, это сокращение можно использовать и с другими командами.

Миграция сайта

Ознакомившись с алиасами Drush, приступайте к миграции (т.е., копированию) сайта. предположим, нужно переместить сайт @site1 из каталога /var/www/drupal_folder в каталог /var/www/drupal_folder2.

Сначала создайте новый алиас для миграции. Для этого отредактируйте файл aliases.drushrc.php:

nano /root/.drush/aliases.drushrc.php

В нём нужно создать два алиаса; для этого можно использовать следующий код:

$aliases['site2'] = array(
'root' => '/var/www/drupal_folder2',
'uri' => '88.88.88.88/drupal_folder2',
);

Сохраните и закройте файл. Если теперь запустить команду drush @site2 status, она не сработает, поскольку такой папки попросту не существует. Создайте эту папку:

mkdir /var/www/drupal_folder2

Чтобы подготовить систему к новой установке Drupal, нужно создать новую базу данных. Откройте MySQL и создайте БД (запомните имя пользователя и пароль).

Примечание: За справкой можно обратиться к этой статье.

Подготовив БД, можно приступать к миграции сайта. Чтобы скопировать кодовую базу, запустите:

drush core-rsync @site1 @site2 --include-conf

Эта команда копирует все файлы из drupal_folder в каталог drupal_folder2, включая все файлы settings.php (благодаря опции –include-conf). Если запустить команду без последней опции, то будут скопированы все файлы, кроме settings.php; эта функция отлично продумана, так как для синхронизации файлов не нужно копировать settings.php.

Отредактируйте только что скопированный сайт drupal_folder2, заменив данные БД информацией о только что созданной БД.

nano /var/www/drupal_folder2/sites/default/settings.php

В этом файле нужно изменить следующий блок кода, внеся свои данные о БД:

$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'your_db',
'username' => 'your_username',
'password' => 'your_password',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);

Сохраните и закройте файл. Теперь можно мигрировать вторую БД при помощи Drush, так как Drush знает, что сайт в каталоге drupal_folder2 использует её (даже если она пока что пуста).

Для этого нужно просто запустить следующую команду:

drush sql-sync @site1 @site2 --create-db

Эта команда сбросит таблицы, относящиеся к @site2 (эта таблица на данный момент пуста), при помощи опции –create-db и внесёт таблицы, относящиеся к @site1 – исходной инсталляции Drupal. Итак, теперь у вас есть две абсолютно идентичные копии сайта.

Может появиться следующее сообщение об ошибке:

ERROR 1044 (42000) at line 1: Access denied for user 'your_username'@'localhost' to database 'your_db'

Это происходит из-за неправильно установленных привилегий. Чтобы исправить ошибку, откройте MySQL:

mysql -u root -p

И установите следующие права:

grant all privileges on your_db.* to your_username@localhost with grant option;
grant reload  on *.* to druser2@localhost;
flush privileges;

Синхронизация сайтов Drupal

Копию исходного сайта (@site2) можно использовать для разработки. Внеся изменения в кодовую базу, можно просто использовать следующую команду, чтобы синхронизировать кодовые базы сайтов:

drush core-rsync @site2 @site1

Конечно, сейчас копировать файл settings.php не нужно.

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

drush sql-sync @site2 @site1 --create-db

Примечание: В большинстве случаев рекомендуется чистить БД сайта @site1 перед синхронизацией, чтобы избежать конфликтов настроек.

Управление удалёнными сайтами

Как видите, управлять сайтами, размещёнными на одном сервере, довольно просто. Но что делать, если несколько сайтов расположено на разных серверах?  Тут снова понадобятся алиасы Drush.

Однако для работы с удалёнными хостами необходимо установить Drush на все эти хосты и настроить SSH-ключи. За справкой можно обратиться к следующим статьям:

Выполнив эти требования, создайте алиасы для удалённого подключения. Для этого откройте файл aliases.drushrc.php (на предыдущем сервере):

nano /root/.drush/aliases.drushrc.php

Затем создайте новый алиас для сайта на удалённом сервере. Скопируйте следующий код, указав свои данные:

$aliases['site3'] = array(
'root' => '/var/www/drupal_folder3',
'uri' => '99.99.99.99/drupal_folder3',
'remote-host' => '99.99.99.99'
);

Этот код работает следующим образом:

Алиас @site3 находится в каталоге drupal_folder3 на удалённом сервере, и его URI указывает на удалённый сервер. Кроме того, нужно указать IP-адрес удалённого хоста. После настройки SSH-ключей не нужно вводить пароль (конечно, если сами ключи не защищены паролем).

Примечание: В случае с удалёнными хостами рекомендуется защитить SSH-ключи при помощи пароля.

Теперь можно использовать перечисленные ранее команды  при помощи алиаса (т.е., мигрировать и синхронизировать сайты) на удалённом сервере.

Примечание: Чтобы убедиться, что всё работает как положено, запустите:

drush @site3 status

Tags: ,

1 комментарий

  • Andres says:

    Привет! Спасибо за статьи про Ubuntu и Drupal! Очень помогли разобраться.

    Пытался настроить алиас для удалённой машины по этой статье и не получилось. Что то взял из этой что то из этой https://drupal.ru/node/71139.

    И получилось!

    Кажется в этом коде:
    $aliases[‘site3’] = array(
    ‘root’ => ‘/var/www/drupal_folder3’,
    ‘uri’ => ‘99.99.99.99/drupal_folder3’,
    ‘remote-host’ => ‘99.99.99.99’
    );

    Не хватает строки которая бы указывала имя пользователя на удалённой машине:

    ‘remote-user’ => ‘user’

    Итого, в исправленном варианте код алиаса должен выглядеть так:

    $aliases[‘site3’] = array(
    ‘root’ => ‘/var/www/drupal_folder3’,
    ‘uri’ => ‘99.99.99.99/drupal_folder3’,
    ‘remote-host’ => ‘99.99.99.99’
    ‘remote-user’ => ‘user’
    );

Добавить комментарий