Миграция сайта с Drupal 7 на Drupal 10/11
Drupal 7 достиг EOL в январе 2025. Прямого upgrade пути нет — это полноценная миграция. Drupal 7 и Drupal 10 — архитектурно разные системы: D7 не использует Composer, OOP, Symfony компоненты. Контент мигрируется через Migrate API, код переписывается.
Стратегии миграции
Migrate API (рекомендуется) — контент мигрируется программно из D7 БД в D10. Настроенные миграции можно запускать повторно до дня переключения, минимизируя downtime.
Manual content migration — для небольших сайтов (< 100 нод) экспорт через Views + импорт через Migrate или ручное копирование. Быстрее настройки, дольше выполнение.
Big bang — полная остановка D7, настройка D10, миграция. Downtime от нескольких часов до дней.
Анализ D7 сайта
# Список активных модулей D7
drush pm-list --status=enabled --type=module
# Типы нод и количество
drush sql-query "SELECT type, COUNT(*) FROM node GROUP BY type"
# Размер БД
drush sql-query "SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'MB' FROM information_schema.TABLES WHERE table_schema = DATABASE() ORDER BY (data_length + index_length) DESC"
# Кастомные модули
ls sites/all/modules/custom/
Настройка D10 сайта с Migrate API
На новом D10-сервере:
composer create-project drupal/recommended-project drupal10-site
cd drupal10-site
composer require drupal/migrate_plus drupal/migrate_tools \
drupal/migrate_upgrade drupal/migrate_source_csv
drush en migrate migrate_plus migrate_tools migrate_upgrade -y
Подключить D7 как дополнительную БД в settings.php:
$databases['migrate']['default'] = [
'driver' => 'mysql',
'database' => 'drupal7_db',
'username' => 'db_user',
'password' => 'db_pass',
'host' => '127.0.0.1',
'port' => '3306',
'prefix' => '',
];
Генерация миграций
# Автоматически сгенерировать конфигурации миграций из D7
drush migrate:upgrade --legacy-db-key=migrate --legacy-root=/path/to/d7/files
# Посмотреть что сгенерировалось
drush migrate:status
Migrate Upgrade создаёт YAML-конфигурации для: пользователей, ролей, словарей таксономии, терминов, типов контента, полей, нод, медиафайлов, блоков, меню.
Порядок запуска миграций
Зависимости важны — нельзя мигрировать ноды раньше, чем словари таксономии и файлы:
# 1. Конфигурация (роли, типы контента, поля)
drush migrate:import upgrade_d7_user_role
drush migrate:import upgrade_d7_node_type
drush migrate:import upgrade_d7_field
drush migrate:import upgrade_d7_field_instance
# 2. Словари таксономии
drush migrate:import upgrade_d7_taxonomy_vocabulary
drush migrate:import upgrade_d7_taxonomy_term
# 3. Пользователи
drush migrate:import upgrade_d7_user
# 4. Файлы
drush migrate:import upgrade_d7_file
# 5. Контент (ноды)
drush migrate:import upgrade_d7_node_complete
# 6. Меню и блоки
drush migrate:import upgrade_d7_menu
drush migrate:import upgrade_d7_block
Проблемные зоны
CCK/Field API — поля в D7 CCK мигрируют хорошо. Field Collection (аналог Paragraphs в D7) — нет прямой поддержки, нужен кастомный migrate.
composer require drupal/migrate_field_collection
Вьюхи — Views 3 (D7) мигрируют частично. Сложные вьюхи с relationships придётся пересоздать.
Кастомные модули D7 — нужна полная переработка: D7 использует процедурный код, hook_schema, hook_menu. D10 — классы, аннотации, маршруты через YAML.
Медиафайлы — миграция файлов с D7 файловой системы:
# Конфигурация для копирования файлов
source:
plugin: d7_file
source_base_path: 'https://old-d7-site.com' # или локальный путь
process:
uri:
plugin: file_copy
source:
- '@source_path'
- 'public://'
Переписка кастомных модулей
// D7 (процедурный)
function mymodule_menu() {
return [
'admin/config/mymodule' => [
'title' => 'My Module Settings',
'page callback' => 'drupal_get_form',
'page arguments' => ['mymodule_settings_form'],
],
];
}
// D10 (OOP + YAML маршруты)
// mymodule.routing.yml:
// mymodule.settings:
// path: '/admin/config/mymodule'
// defaults:
// _form: '\Drupal\mymodule\Form\SettingsForm'
Delta-миграция: минимизация downtime
# Первичная миграция (несколько часов/дней до переключения)
drush migrate:import --all
# В день переключения:
# 1. Включить режим обслуживания на D7
# 2. Обновить изменённый контент
drush migrate:import --all --update
# 3. Переключить DNS на D10
# 4. Отключить режим обслуживания на D10
Сроки
| Тип сайта | Срок |
|---|---|
| Простой сайт (< 100 нод, стандартные типы) | 2–3 недели |
| Средний (500–5000 нод, кастомные модули) | 4–8 недель |
| Крупный (50k+ нод, сложные зависимости) | 3–6 месяцев |







