Перейти к содержимому

Клонирование сайтов в RISH

Этот материал объясняет, как пользоваться новым клонированием сайтов в RISH: что подготовить, какой сценарий выбрать и что происходит во время переноса.

Главное правило

Клонирование всегда запускается на сервере-приемнике. То есть вы заходите в RISH на тот сервер, куда нужно перенести сайт, а RISH уже подключается к серверу-источнику по SSH.

Клонирование в RISH предназначено для переноса сайтов между серверами с RISH-структурой. Оно умеет создать или использовать целевой сайт, перенести файлы, перенести базу данных, поправить конфигурацию Joomla и подготовить сайт к работе в новом окружении.

Как запустить клонирование

Запустить клонирование можно из основного меню MC, которое вызывается по F2.

После запуска RISH покажет меню сценариев клонирования:

  • Клонирование сайта — перенос файлов и базы данных;
  • Клонирование сайта с исключением выбранных папок — перенос сайта без содержимого выбранных вами папок (кэша, временных папок или бэкапов);
  • Клонирование только базы данных сайта — перенос только базы данных без создания и копирования файлов сайта.

Что делает клонирование

Новый механизм клонирования переносит сайт с одного RISH-сервера на другой через SSH. RISH получает список сайтов на сервере-источнике, проверяет параметры выбранного сайта, предлагает выбрать пользователя и имя сайта на сервере-приемнике, а затем выполняет перенос.

  • перенос файлов сайта из /var/www/<user>/www/<site>;
  • перенос базы данных, если она есть и называется как сайт;
  • создание целевого vhost и PHP-FPM pool при необходимости;
  • сохранение относительного DocumentRoot, если он находится внутри site_root;
  • настройка Joomla после переноса;
  • проверка опасных ситуаций перед копированием.

Два основных сценария

Перед началом важно понять, какой именно перенос вы делаете. В RISH есть два типичных сценария: перенос с рабочего сервера на локальный сервер для разработки и перенос с одного рабочего сервера на другой.

Рабочий сервер -> локальный RISH-сервер

Этот сценарий нужен для разработки, тестирования обновлений Joomla и расширений, проверки новой версии PHP или экспериментов с шаблоном. Обычно сайт получает локальное имя вроде example.test, а RISH может предложить создать self-signed SSL.

  • запускайте клонирование на локальном RISH-сервере;
  • после переноса отключите или проверьте отправку реальных писем;
  • проверьте cron-задачи и внешние API;
  • убедитесь, что локальный сайт не индексируется поисковиками;
  • помните, что SSL с рабочего сервера не переносится.

Рабочий сервер -> новый рабочий сервер

Этот сценарий нужен для переноса сайта на новый сервер. Клонирование запускается на новом сервере-приемнике. DNS обычно переключается только после проверки сайта на новом сервере.

  • проверьте сайт до переключения DNS: через временный домен, hosts-файл или другой безопасный способ;
  • сертификат Let’s Encrypt обычно выпускается уже после переключения DNS;
  • после переключения DNS проверьте логи Apache и PHP-FPM;
  • проверьте почту, cron, внешние интеграции и права файлов.

Что подготовить перед клонированием

  • доступ root по SSH с сервера-приемника на сервер-источник;
  • открытый SSH/TCP порт 22 на сервере-источнике;
  • достаточно места на сервере-приемнике для файлов сайта и временного дампа базы;
  • локальный пользователь RISH на сервере-приемнике, в чей каталог будет перенесен сайт;
  • установленную нужную версию PHP или готовность выбрать другую версию;
  • понимание, нужно ли переносить все файлы или исключить кэш, временные файлы и бэкапы.

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

Добавление сервера-источника

Если сервер-источник уже описан в ~/.ssh/config на сервере-приемнике, RISH покажет его в списке. Если его нет, выберите пункт Добавить сервер.

  • введите IP-адрес или hostname сервера-источника;
  • RISH проверит доступность SSH/TCP порта 22 без использования ping;
  • задайте локальное имя SSH host;
  • RISH создаст ключ ed25519 и добавит host в ~/.ssh/config;
  • скопируйте предложенную команду на сервер-источник, чтобы добавить публичный ключ в ~/.ssh/authorized_keys.

После добавления ключа вернитесь к клонированию и выберите сервер-источник из списка. RISH проверит SSH-доступ в batch-режиме, то есть без интерактивного ввода пароля.

Выбор сайта-источника

После подключения к серверу-источнику RISH получает список сайтов из структуры /var/www/*/www/*. Служебный сайт 000-default пропускается.

В списке отображается имя сайта и пользователь, которому он принадлежит. После выбора сайта RISH проверяет vhost, DocumentRoot, версию PHP, наличие базы данных и SSL-директивы.

  • если vhost не найден, DocumentRoot считается папкой сайта;
  • если DocumentRoot найден, он должен быть внутри site_root;
  • если DocumentRoot указывает наружу, перенос будет остановлен;
  • если база данных с именем сайта найдена, RISH предложит перенести ее в рамках выбранного сценария.

Выбор сайта-приемника

На сервере-приемнике RISH предлагает выбрать локального пользователя из /var/www, а затем показывает имя сайта для клонирования. Можно оставить предложенный вариант, исправить его или ввести свое имя.

Если клонирование выполняется на локальный RISH-сервер, имя по умолчанию может быть преобразовано в локальный домен вида example.test. Если вы вводите домен кириллицей, RISH попробует перевести его в punycode.

Если целевой vhost уже существует, RISH проверит, совпадает ли его DocumentRoot с ожидаемым. Если совпадает, существующий сайт может быть использован. Если папка сайта не пустая, RISH предложит очистить ее, продолжить с перезаписью содержимого или выйти.

  • если сайт создается заново, RISH предложит версию PHP;
  • если PHP на источнике установлен и на приемнике, RISH использует такую же версию;
  • если нужной версии PHP нет, придется выбрать одну из установленных;
  • если PHP-FPM pool пользователя еще не существует, можно выбрать режим ondemand или dynamic.

Копирование файлов без промежуточного архива

Файлы сайта передаются без создания промежуточного архива на диске. На сервере-источнике RISH запускает tar, который собирает содержимое сайта в поток. Этот поток передается через ssh -C и сразу распаковывается через tar на сервере-приемнике.

tar на источнике -> ssh -C -> tar на цели

Параметр -C включает сжатие на уровне SSH. Данные сжимаются прямо во время передачи, без создания отдельного .tar.gz с файлами сайта. Это особенно полезно для PHP, CSS, JavaScript, HTML и других хорошо сжимаемых файлов.

Если установлен pv и RISH смог определить размер исходного сайта через du -sb, будет показан прогресс передачи.

tar на источнике -> ssh -C -> pv -> tar на цели

Ошибки передачи отслеживаются через pipeline с set -o pipefail. Если оборвется SSH-соединение или произойдет ошибка упаковки/распаковки, операция не должна считаться успешной.

Права файлов после переноса

После распаковки файлов RISH назначает владельцем всех файлов и папок локального пользователя сайта:

<user>:<user>

При этом права доступа самих файлов в основном приходят с сервера-источника вместе с tar-потоком. RISH не выполняет автоматическое приведение всех перенесенных папок к 755, а файлов к 644 сразу после клонирования.

Поэтому после переноса, особенно с незнакомого или старого сервера, рекомендуется открыть сайт в Midnight Commander и выполнить штатную настройку прав RISH. Этот пункт приведет папки к 755, файлы к 644, назначит владельца <user>:<user> и снимет special bits.

Перенос базы данных

База данных переносится отдельно от файлов. RISH ожидает, что база данных на источнике называется так же, как сайт. Для переноса используется mariadb-dump, затем дамп сжимается через gzip и сохраняется во временную папку на сервере-приемнике.

mariadb-dump на источнике -> gzip -> временный .sql.gz на приемнике -> gzip -t -> import в MariaDB

Перед импортом RISH проверяет gzip-файл командой gzip -t. Затем создает базу данных на сервере-приемнике, выдает права локальному пользователю и импортирует дамп в MariaDB.

Временная папка имеет вид /tmp/rish-clone.XXXXXX и удаляется после завершения клонирования.

Клонирование с исключением папок

Для больших сайтов часто нет смысла переносить кэш, временные файлы, старые архивы и резервные копии. Для этого есть сценарий Клонирование сайта с исключением выбранных папок.

Исключаются не сами папки, а их содержимое. Это важно: структура каталогов сохраняется, но тяжелые или временные данные не переносятся.

  • для Joomla: administrator/cache,administrator/logs,cache,tmp;
  • для Joomla + YOOtheme: administrator/cache,administrator/logs,cache,tmp,templates/yootheme/cache;
  • для Joomla + Akeeba Backup: administrator/cache,administrator/logs,cache,tmp,administrator/components/com_akeeba/backup.

Список исключений вводится через запятую. RISH проверяет, что пути относительные, не выходят наружу через .. и содержат только допустимые символы. Последний список сохраняется в настройке ARCHIVE_EXCLUDE.

Joomla после клонирования

Если RISH находит в перенесенном сайте файл configuration.php, сайт считается Joomla-сайтом и запускается автоматическая настройка конфигурации.

  • обновляется пароль базы данных;
  • обновляется пользователь базы данных;
  • обновляется имя базы данных;
  • исправляются log_path и tmp_path;
  • $host устанавливается в localhost;
  • $live_site очищается, если он был заполнен.

Это помогает избежать типичной ситуации, когда перенесенная Joomla продолжает ссылаться на старые пути или старый домен.

SSL после клонирования

SSL-сертификаты с сервера-источника автоматически не переносятся. Это безопаснее: сертификат привязан к домену, серверу, путям и способу выпуска.

Если клонирование выполняется на локальный RISH-сервер, RISH предложит создать self-signed SSL для локального сайта.

Для переноса на новый рабочий сервер сначала проверьте сайт до переключения DNS: через временный адрес, hosts-файл или другой доступный способ. После переключения DNS выпустите Let’s Encrypt на новом сервере и проверьте работу сайта по HTTPS.

Проверка после клонирования

  • откройте сайт и административную панель;
  • проверьте, что сайт работает на нужной версии PHP;
  • если это Joomla, проверьте пути tmp и logs в настройках сайта;
  • если вашему сайту нужен live_site, настройте его заново для нового адреса, потому что он сбрасывается во время клонирования;
  • проверьте права файлов и владельца; при необходимости запустите настройку прав RISH;
  • проверьте cron-задачи, если сайт их использует;
  • проверьте отправку почты и внешние интеграции, если они важны для сайта;
  • после переноса на новый рабочий сервер сначала проверьте сайт до переключения DNS через временный адрес, hosts-файл или другой доступный способ;
  • после переключения DNS выпустите Let’s Encrypt на новом сервере и проверьте работу сайта по HTTPS;

Для обычного выпуска Let’s Encrypt домен должен указывать на новый сервер. Поэтому при переносе на новый рабочий сервер сначала проверьте сайт до переключения DNS любым доступным способом, затем переключите DNS и уже после этого выпускайте сертификат на новом сервере.

Частые вопросы

Где запускать клонирование?

Клонирование запускается на сервере-приемнике: там, куда нужно перенести сайт. RISH подключается с этого сервера к серверу-источнику по SSH.

Почему сервер не появляется в списке?

RISH берет список серверов из ~/.ssh/config. Если нужного сервера там нет, выберите пункт Добавить сервер в меню клонирования.

Почему SSH-доступ не проходит?

RISH проверяет прямое SSH/TCP-подключение к порту 22 и затем пробует подключиться в batch-режиме по ключу. Проверьте доступность порта, имя host в ~/.ssh/config и наличие публичного ключа в ~/.ssh/authorized_keys на сервере-источнике.

Почему сайт-источник не найден?

В текущей версии RISH ищет сайты на источнике в структуре /var/www/<user>/www/<site>. Служебный сайт 000-default пропускается.

Что делать, если DocumentRoot вне site_root?

Первый этап клонирования поддерживает DocumentRoot внутри site_root. Если vhost указывает наружу, RISH остановит перенос. Такой сайт лучше сначала привести к стандартной структуре или переносить вручную.

Нужно ли свободное место под архив?

Для файлов сайта промежуточный архив не создается: они идут потоком tar -> ssh -C -> tar. Но если переносится база данных, на сервере-приемнике временно создается сжатый SQL-дамп в /tmp/rish-clone.XXXXXX.

Проверяет ли RISH контрольные суммы файлов?

Нет, строгой сверки файлов по checksum в этом релизе пока нет. RISH отслеживает ошибки SSH, упаковки и распаковки через pipeline с pipefail. Расширенная верификация хорошо подходит для будущих миграторов серверов.

Почему база данных не перенеслась?

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

Что происходит с SSL?

Сертификаты с рабочего сервера автоматически не переносятся. Для локального RISH-сервера может быть предложен self-signed SSL. Для нового рабочего сервера сертификат обычно выпускается заново после переключения DNS, потому что Let’s Encrypt должен увидеть домен на новом сервере. До переключения DNS сайт лучше проверить через временный адрес или hosts-файл.