В работе программиста много времени отнимают процессы, к программированию относящиеся лишь косвенно. Лично у меня каждый новый, либо надолго забытый проект начинается с продолжительного разворачивания локального окружения, которое состоит не только в клонировании гит-репозитория на локальный компьютер, но также копировании не содержащихся в гите статичных файлов и базы данных. Со временем актуальность локального окружения падает, и часть процесса приходится повторять заново. Еще несколько лет назад я неизменно заходил на сервер, делал дамп БД и архив файлов, которые выкачивал и разворачивал локально. Сейчас появились некоторые инструменты, которые хоть и требуют определенной начальной настройки, но в дальнейшем сильно упрощают жизнь.

1. Подключение к удаленному серверу.

Итак, вы получили доступы к серверу, на котором работает сайт. Первым делом надо озаботиться тем, чтобы раз и навсегда забыть пароль к нему и осуществлять доступ исключительно с помощью SSH-ключа. Поэтому заходим к себе в каталог ~/.ssh и смотрим ранее сгенерированные ключи. Там их, как водится, одна или более пар - закрытый и открытый ключ в каждой. Всего скорее вы найдете что-то вроде id_rsa и id_rsa.pub. Если вы ничего не увидели, то ключ можно сгенерировать командой ssh-keygen. Вам надо будет выбрать название для файла ключа и, если вы поборник безопасности, придумать для него пароль (что я бы не рекомендовал делать в целях упрощения пользования им).

Итак, теперь у нас есть ключ, и нам надо закинуть его публичную часть на сервер, а точнее - дописать содержимое ключа в файл ~/.ssh/authorized_keys. Публичную - это ту, что имеет расширение .pub, всё, что без него, - это ваша личная собственность, и за пределы вашего компьютера уходить не должно. Раньше я делал это через файл-менеджер, однако иногда права доступа настроены таким образом, что сделать это проблематично. Безотказный вариант - использовать специальную команду в консоли. Пусть наш логин на сервере будет username, а домен - servername.ru, тогда команда будет выглядеть следующим образом:

ssh-copy-id -i ~/.ssh/id_rsa.pub username@servername.ru

Если вы подключаетесь по нестандартному порту, добавьте в конце --p[номер порта] (например, -p22222).

Меняете имя файла ключа на свой, а логин и url сервера на нужные, отправляете и, если все верно, единожды вводите пароль. Все - ключ скопирован, и вы можете проверить, как всё работает, попытавшись подключиться: ssh username@servername.ru.

Про пароль теперь можно забыть, что уже хорошо, но запоминать имя пользователя и домен (а то и ip-адрес) тоже не очень бы хотелось, к тому же через пару лет работы таких записей соберется не один десяток и хранить это в голове или где бы то ни было станет невыносимо.

Значительно проще было бы запоминать короткий алиас подключения, а про остальное забыть, как про страшный сон. Например, username@servername.ru обозвать srv. И это возможно - заходим в файл ~/.ssh/config (если нет, то создаем его) и добавляем в него следующие строчки:

host srv
hostname servername.ru  
user username
port 22222 # это только если порт нестандартный

Сохраняем, выполняем в консоли ssh srv и - профит! Есть и иные параметры подключения, но они далеко за пределами обычной работы и всего скорее после краткого гугления вы найдете свой особенный вариант настройки, если стандартный не подойдет.

Главное здесь - называть подключения так, чтобы они были максимально коротки, но при этом чётко ассоциировались с проектом. Наверняка у вас будут подключения к рабочему сайту и его варианту для разработки. Какой бы домен/поддомен не имел последний, наиболее логичным будет назвать его, добавив к алиасу основного подключения суффикс _dev. Так, если у нас srv - это алиас для прода, то к деву будет логично подключаться через srv_dev. Адреса девов меняются, а краткое слово "дев" всегда будет однозначно характеризовать нам то, что... что оно должно характеризовать).

2. Настройка удаленных алиасов для консольной утилиты drush

Drupal поддерживает мультисайтинг. То есть на одной кодовой базе может работать более одного сайта. Для обеспечения возможности работы с несколькими сайтами на уровне утилиты drush были внедрены алиасы сайтов. В режиме мультисайтинга они позволяют из одного рабочего каталога выполнять команды для разных сайтов, в этом каталоге работающих. Но помимо этого, мы можем также указывать среди алиасов удаленные сайты, что открывает нам дополнительные возможности.

В версиях Drupal 7 и Drupal 8/9 настройка осуществляется немного по-разному, что приводит в особенностям при разворачивании локального окружения.

Настройка алиасов drush Для Drupal 7

Алиасы сайтов для Drupal 7 настраиваются глобально для текущего пользователя ОС и по сути не имеют отношения к конкретному проекту, так как описываются за его пределами.

В папке пользователя создаем папку .drush, и в нем - файл aliases.drushrc.php примерно со следующим содержимым:

<?php
 
$aliases['prod'] = array(
  'remote-host' => 'servername.ru', // адрес для подключения
  'remote-user' => 'username', // имя пользователя
  'root' => '/home/username/web/servername.ru/html', // каталог установки сайта
  'uri' => 'https://servername.ru', // URL сайта
  'ssh-options' => '-p 22222' // дополнительные опции для подключения, например, порт
);

Это вариант для идеальных условий, который, тем не менее, срабатывает для большинства случаев. Иногда требуются дополнительные параметры, как, например, пути к каталогу установки drush, к статичным файлам и т.п. Пример файла настроек алиасов со всеми возможными значениями можно посмотреть здесь.

Казалось бы, всё легко, но если локально вы работаете с docker-окружением (а это наверняка так), то вам надо пробросить этот файл в контейнер. Я пользуюсь Lando и для проброса использую следующую инструкцию. Аналогично можно сделать для docksal. Адепты docker4drupal, думаю, разберутся и без дополнительных пояснений - им в конфигах копаться не впервой.

Настройка алиасов drush Для Drupal 8

Здесь всё стало логичнее: конфигурация алиасов - это уже часть проекта. В каталоге проекта создается папка drush/sites, и в ней - файл self.sites.yml с соответствующим содержимым:

prod:
  host: servername.ru
  user: username
  root: /home/username/web/servername.ru/html
  uri: https://servername.ru
Полный пример файла, как всегда - в репозитории проекта.


3. Использование алиасов drush

Итак, мы сконфигурировали алиасы сайтов для drush и теперь можем попробовать их в деле. Сбрасываем кэш drush, выполнив drush cc drush (если вы используете docker, предварительно зайдите в контейнер), и пытаемся получить информацию от удаленного сайта drush @prod st. В ответ мы должны увидеть то, что обычно видим при выполнении привычного drush st, но уже в контексте удаленного сайта. Также пробуем получить ссылку для авторизации (вы ведь уже забыли пароль?) - drush @prod uli. Работает? Переходим к самому интересному.

Пока вы были в отпуске, сайт ушёл далеко вперёд? Пора актуализировать БД. Сделаем это по-модному. Для начала раз и навсегда запоминаем, что в стандартной односайтовой установке текущий сайт обозначается алиасом @self. Теперь выполняем

drush sql-sync @prod @self

Если нам повезёт, то мы увидим процесс авторизации, создания дампа на удаленном сайте, скачивания его и разворачивания на локальной установке. Если этого не произошло - что-то в вашей конфигурации алиаса не так и всего скорее придётся немного погуглить. Часто проблема возникает, если в настройках не указаны пути к папке и к исполняемому файлу drush.

Мы актуализировали БД и обнаружили, что все последние новости с пустыми картинками - нет новых файлов. Не беда, выполняем

drush rsync @prod:%files @self:%files

Как вы поняли, %files - это переменная, в которой хранится путь к каталогу public:// удаленного сайта (который обычно /sites/default/files/). Порой эту переменную надо особо определить, о чём выше, но обычно всё происходит без лишних сложностей. Впрочем, вместо %files может быть любой каталог сайта.

Теперь о страшном. С самого начала я думал, что произойдёт, если случайно перепутать алиасы местами и запустить drush sql-sync @self @prod. И вот как-то я попробовал это сделать. Ничего не вышло, Drush отказал мне. Не знаю, сделано ли это ограничение для алиаса @prod, или вообще нельзя выкатить свой дамп на удаленную БД, но по крайней мере в этой фобии можно себя успокоить.

4. Хитрости при дампе БД

Порой нам встречаются сайты, база данных которых разрослась до многих гигабайт, и скачивание и разворачивание такого гиганта занимает много ценного рабочего (или не очень) времени. Причём значительную часть этого объема занимают таблицы, где хранится кэш.

Решаем вопрос следующим образом (рецепт для Drupal 7). В папке .drush на сайте создаем файл .drushrc.php (если его там еще нет), где прописываем список таблиц, которые надо пропускать при создании дампа. Например:

<?php
 
$options['structure-tables']['common'] = array('cache', 'cache_admin_menu', 'cache_block', 'cache_bootstrap', 'cache_commerce_shipping_rates', 'cache_entity_comment', 'cache_entity_commerce_customer_profile', 'cache_entity_commerce_line_item', 'cache_entity_commerce_order', 'cache_entity_commerce_product', 'cache_entity_field_collection_item', 'cache_entity_file', 'cache_entity_node', 'cache_entity_taxonomy_term', 'cache_entity_taxonomy_vocabulary', 'cache_entity_user', 'cache_features', 'cache_feeds_http', 'cache_field', 'cache_filter', 'cache_form', 'cache_hacked', 'cache_image', 'cache_libraries', 'cache_menu', 'cache_metatag', 'cache_page', 'cache_path', 'cache_rules', 'cache_session_cache', 'cache_token', 'cache_ultimate_cron', 'cache_update', 'cache_variable', 'cache_views', 'cache_views_data');

Впрочем, всего скорее, сейчас уже должна быть доступна запись с wildcard:

$options['structure-tables']['common'] = array('cache', 'cache_*');

Теперь при синхронизации (да и просто при создании дампа) добавляем ссылку на этот список: --structure-tables-key=common, например:


drush sql-sync @prod_ru @ru --structure-tables-key=common

Заключение

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

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