Представьте: вы переносите интернет-магазин с 80 000 товаров, историей заказов и пользовательскими профилями из старого Drupal 7 на Drupal 10. Категории перестроены, изображения хранятся по нестандартным путям, а в comments — 300 000 записей с вложенными ответами глубиной до 10 уровней. Вручную такой объём займёт месяцы, а ошибки неизбежны. Мы используем встроенный ETL-фреймворк Drupal — модуль Migrate, который извлекает, трансформирует и загружает данные. За пять лет мы провели 50+ миграций, гарантируя целостность данных и полное соответствие новой структуре. При грамотной настройке Migrate обрабатывает 10 000 записей за 15–20 минут. Свяжитесь с нами — проведём аудит вашего проекта и предложим оптимальный план миграции.
Архитектура Migrate
Модуль состоит из трёх логических компонентов, которые настраиваются через YAML-конфиги:
- Source — источник данных: CSV, SQL, JSON, старый Drupal 7, WordPress, любые API.
- Process — трансформация: маппинг полей, конвертация форматов, обогащение через плагины.
- Destination — куда записываем: Node, Term, User, File, Config.
Каждая миграция описывается в файле config/install/migrate_plus.migration.*.yml. Мы используем Migrate Plus, Migrate Tools и дополнительные source-плагины. Все миграции наследуют базовый класс Migration.
| Критерий | Migrate | Ручной перенос |
|---|---|---|
| Скорость | Часы для 10 000 записей | Дни или недели |
| Трансформации | Встроенные плагины | Вручную скрипты |
| Ошибки | Логирование, continue-on-failure | Нет контроля |
| Повторное использование | YAML конфиги | Каждый раз заново |
Migrate обычно в 10 раз быстрее ручного переноса при сравнении времени разработки и выполнения.
Как настроить миграцию в Drupal?
Процесс включает шесть шагов:
- Анализ исходных данных: структура, типы, связи, объём. Например, определяем, что категории хранятся в отдельной таблице, а изображения — по внешним URL.
- Проектирование миграций: маппинг полей, выбор source-плагинов, определение зависимостей (например, сначала миграция категорий, потом статей).
- Реализация: написание YAML, кастомных плагинов, тестирование на выборке из 10–20 записей.
- Тестирование: проверка целостности, регрессия, исправление ошибок — запускаем на полной копии.
- Запуск: поэтапный импорт с мониторингом, откат при необходимости.
- Поддержка: доработка под новые источники, обновление после релизов Drupal.
Какие источники данных поддерживаются?
Модуль Migrate из коробки поддерживает CSV, JSON, XML, SQL-базы через PDO, а также старые версии Drupal (6, 7). Для WordPress есть готовый source-плагин, для произвольных API — кастомные плагины. Таблица ниже показывает популярные варианты:
| Источник | Плагин | Пример использования |
|---|---|---|
| CSV | csv |
Импорт из экспорта Excel |
| JSON | json |
REST API стороннего сервиса |
| WordPress | wordpress |
Перенос блога из WP |
| Drupal 7 | d7_node |
Обновление до Drupal 10 |
| Произвольный API | кастомный source |
Интеграция с CRM |
Пример: миграция из CSV
Конфигурация миграции статей из CSV-файла:
id: articles_from_csv label: 'Статьи из CSV' migration_group: content_import source: plugin: csv path: 'public://import/articles.csv' ids: - external_id header_row_count: 1 column_names: - external_id - title - body - category - publish_date - image_url process: title: title 'body/value': body 'body/format': plugin: default_value default_value: full_html created: plugin: format_date source: publish_date from_format: 'd.m.Y' to_format: 'U' status: plugin: default_value default_value: 1 field_category: plugin: migration_lookup migration: categories_from_csv source: category field_image: plugin: download source: - image_url - '@filename' destination: plugin: 'public://images' rename: true destination: plugin: 'entity:node' default_bundle: article migration_dependencies: required: - categories_from_csv Пример кастомного source-плагина для API:
<?php // src/Plugin/migrate/source/ExternalApiSource.php namespace Drupal\mymodule\Plugin\migrate\source; use Drupal\migrate\Plugin\migrate\source\SourcePluginBase; /** * @MigrateSource( * id = "external_api", * source_module = "mymodule" * ) */ class ExternalApiSource extends SourcePluginBase { public function getIds(): array { return ['id' => ['type' => 'integer']]; } public function fields(): array { return [ 'id' => 'ID записи', 'title' => 'Заголовок', 'content' => 'Содержимое', 'tags' => 'Теги (через запятую)', ]; } protected function initializeIterator(): \Iterator { $page = 0; do { $response = \Drupal::httpClient()->get( 'https://api.external.com/posts?page=' . $page, ['headers' => ['Authorization' => 'Bearer ' . $this->configuration['api_key']]] ); $data = json_decode($response->getBody(), true); $items = $data['items']; foreach ($items as $item) { yield $item; } $page++; } while (!empty($items) && $page < $data['total_pages']); } } Как избежать дубликатов при повторной миграции?
Используйте highwater mark или track_changes: true в конфигурации источника. Тогда мигрируются только новые или изменённые записи. Это особенно полезно при инкрементальном обновлении после первичного импорта. Пример настройки:
highwaterProperty: name: updated_at alias: u Миграция медиафайлов и инкрементальный импорт
Изображения и файлы мигрируются отдельным YAML-конфигом, затем привязываются к сущностям через migration_lookup. Пример миграции файлов:
id: files_migration source: plugin: csv path: 'public://import/files.csv' process: filename: plugin: callback callable: basename source: file_url uri: plugin: download source: - file_url - '@filename' destination: plugin: 'public://migrated' destination: plugin: 'entity:file' В миграции нод поле field_image использует migration_lookup для ссылки на загруженный файл.
Что входит в наши услуги по миграции контента?
В рамках работы под ключ мы предоставляем:
- Документацию по структуре миграций
- Доступы к репозиторию с конфигурацией
- Оптимизацию производительности: настройка batch size, highwater mark, parallel processing
- Обучение ваших разработчиков работе с Migrate
- Поддержку в течение месяца после запуска
- Гарантию безостановочной работы сайта во время миграции
Сроки
Простая миграция из CSV (500–5000 записей) — 2–3 дня. Сложная миграция из нескольких источников с кастомными плагинами и трансформациями — 1–2 недели. Точные сроки определяем на бесплатном аудите.
Почему миграция на Migrate выгоднее ручного переноса?
Миграция через Migrate — это не только скорость, но и гарантия целостности. Мы используем best practices: highwater mark, track_changes, continue-on-failure. Наши инженеры имеют сертификаты Drupal и опыт работы с проектами, где объём контента превышает 500 000 записей. Свяжитесь с нами, чтобы обсудить вашу задачу. Получите консультацию по миграции бесплатно.







