Миграция состоит из двух частей: базы данных и статических файлов.
Самая важная часть — это база данных. Вам понадобится резервная копия базы данных (иначе sqldump
) рабочей базы данных, и вам нужно будет импортировать его в локальную базу данных.Есть несколько способов сделать это, в зависимости от хостинга вашего сайта и от того, можете ли вы использовать толкотня
.
Локальный сайт должен быть несколько функциональным после импорта базы данных, но может выглядеть странно, если на нем отсутствуют статические ресурсы, такие как файлы изображений. В зависимости от того, как настроен рабочий сайт, вы, вероятно, сможете найти большинство из них в каталоге общедоступных файлов. Чаще всего эти файлы размещаются ./веб/сайты/по умолчанию/файлы
но путь может быть другим. Вам нужно будет скопировать эти файлы с производственного веб-хостинга в локальную среду с помощью такого инструмента, как rsync
, SCP
, или же фтп
.
Если вы установили Drush (через композитор требует драш/драш
), то вы можете использовать драш sql: синхронизация
для синхронизации баз данных.
Прежде чем вы это сделаете, вы можете настроить Друш псевдонимы для локальных и удаленных сред.
Имейте в виду также, что бросовая миграция
используется для другой цели — перенос содержимого сайта с другой платформы, отличной от Drupal, на ваш сайт Drupal.
В качестве мысленного эксперимента предположим, что у вас есть три копии вашего сайта Drupal — Dev, Stage и Prod — на одном сервере (с использованием трех разных Apache2). Виртуальные хосты
с DocumentRoot
установлен в /var/www/dev
, /var/www/stg
, и /var/www/prd
).
В этом случае вы можете использовать локальная_синхронизация
функция, определенная ниже, для синхронизации базы данных и файлов из среды более высокого уровня в среду более низкого уровня:
#!/бин/баш
★
функция local_drush () {
если [[ $# -eq 0 ]]; тогда
echo "local_drush (установить среду и выполнить локальный drush проекта)"
echo "Использование: local_drush [dev stg prd] [drush-args]"
echo "Задает для среды значение dev stg или prod, затем передает argv локальному drush."
фи
если [[ $1 == 'dev' ]] || [[ $1 == 'stg' ]] || [[ $1 == 'prd' ]]; тогда
RETURN_DIR=${PWD}
компакт-диск /var/www/$1
./vendor/bin/drush ${@:2}
компакт-диск ${RETURN_DIR}
еще
echo "Неверное использование: первый аргумент должен быть dev, stg или prd."
фи
}
★
функция local_sync () {
если [[ $# -lt 1 ]] || [[ $# -gt 2 ]]; тогда
echo "local_sync (перенести базу данных и файлы в более низкую среду)"
echo "Использование: local_sync <ИСТОЧНИК> <ЦЕЛЬ>"
echo "Установите исходную и целевую среды, затем синхронизируйте БД и файлы."
фи
если [[ $1 == 'prd' ]] || [[ $1 == 'stg' ]]; тогда
ИСТОЧНИК=$1
если [[ $2 == 'stg' ]] || [[ $2 == 'разработчик' ]]; тогда
ЦЕЛЬ=$2
если [[ ( $1 = 'prd' && $2 == 'stg' ) || ( $1 = 'prd' && $2 == 'dev' ) || ($1 = 'stg' && $2 == 'dev') ]]; тогда
RETURN_DIR=${PWD}
BACKUP_DIR=$HOME/sqldumps/${ИСТОЧНИК}
BACKUP_FILE=${BACKUP_DIR}/${ИСТОЧНИК}_$(дата -I).sql
mkdir -p ${BACKUP_DIR}
SOURCE_FILES=/var/www/${SOURCE}/web/sites/default/files/
TARGET_FILES=/var/www/${TARGET}/web/sites/default/files/
EXCLUDE_CSS=${SOURCE_FILES}CSS/
EXCLUDE_JS=${SOURCE_FILES}js/
EXCLUDE_PHP=${SOURCE_FILES}php/
★
echo "Создание временной резервной копии базы данных среды ${SOURCE}..."
local_drush ${ИСТОЧНИК} sql:dump > ${BACKUP_FILE}
★
если [[ -s "${BACKUP_FILE}" ]]; тогда
echo "Импорт резервной копии базы данных в среду ${TARGET}..."
local_drush ${TARGET} sqlc < ${BACKUP_FILE}
echo "Развертывание поэтапной конфигурации для среды ${TARGET}..."
local_drush ${TARGET} развернуть
echo "Копирование общедоступных файлов из ${SOURCE} в ${TARGET}..."
rsync --exclude ${EXCLUDE_CSS} \
--exclude ${EXCLUDE_JS} \
--exclude ${EXCLUDE_PHP} \
--delete --progress -av ${SOURCE_FILES} ${TARGET_FILES}
echo "Пересоздание кэшей Drupal для среды ${TARGET}..."
local_drush Кэш ${TARGET}: перестроить
echo "Импорт из ${SOURCE} в ${TARGET} успешно завершен."
echo "Удаление резервной копии базы данных среды ${SOURCE}..."
rm ${BACKUP_FILE}
компакт-диск ${RETURN_DIR}
еще
echo "Ошибка: ${BACKUP_FILE} не найден, продолжить нельзя."
фи
еще
echo "Недопустимое использование: невозможно скопировать из ${SOURCE} в ${TARGET}."
фи
еще
echo "Неверное использование: второй аргумент должен быть stg или dev."
фи
еще
если [[ $1 == 'dev' ]]; тогда
echo "Недопустимое использование: невозможно перейти из среды разработки в среду более высокого уровня."
еще
echo "Неверное использование: первый аргумент должен быть prd или stg."
фи
фи
}
Обратите внимание, что локальная_синхронизация
команда зависит от local_drush
команда, которая, в свою очередь, зависит от локальных и удаленных проектов, содержащих локальный Drush в ./поставщик/бен/драш
, который рекомендуемый метод установки Друша. Сценарий оболочки нестандартен, но его преимущество заключается в том, что он работает независимо от того, правильно ли вы настроили псевдонимы Drush.
Я оставлю это вам в качестве упражнения, чтобы выяснить, как получить файлы с вашего удаленного сервера в вашу локальную среду. Нет ничего плохого в том, чтобы выполнить все эти шаги вручную или использовать Filezilla для передачи файлов через SFTP через SSH, но учтите, что rsync
команду (в строках 49-52) можно использовать с другим ${ИСТОЧНИК}
который может быть на удаленном сервере. Единственное другое изменение, которое вам нужно будет сделать, это также rsync
в ${BACKUP_FILE}
до вашего местного (около линии 42).
Ха! Я вижу, что вы отредактировали свой вопрос, пока я писал свой ответ.
Ваш новый вопрос является дубликатом, ответил здесь к Клайв.
Из комментариев к этому ответу:
Официальный способ заключается в том, чтобы модули, полагающиеся на старый способ, явно писали код, чтобы обновления происходили в hook_update_N
. Все мельчайшие детали здесь: https://drupal.org/node/3034742
Обходной путь заключается в установке Обновления сущности разработки модуль, который делает старый драш энтуп
доступна команда.
Вы не должны использовать это в производственной среде, но это нормально для использования в вашей локальной среде разработки, если вы не продвигаете свою локальную БД в производственной среде.
Похоже, эта проблема возникает только у вас локально, а не в рабочей среде, поэтому этот вариант может вам подойти.
Удачи!