Миграция с Magento 1 на Magento 2
Magento 1 официально не поддерживается с июня 2020 года. Перенос на Magento 2 — не обновление, а полная пересборка: разные архитектуры, разные форматы данных, разная система расширений. Официальный инструмент Data Migration Tool перенесёт данные, но весь код тем и модулей нужно писать заново или искать аналоги.
Что переносится, что нет
| Компонент | Статус |
|---|---|
| Товары, категории, атрибуты | Переносятся через Data Migration Tool |
| Клиенты и пароли | Клиенты переносятся, пароли — нет (алгоритм хэширования изменился) |
| Заказы и история | Переносятся |
| CMS-страницы и блоки | Переносятся |
| Темы (шаблоны) | Не переносятся — Magento 2 использует PHTML + Knockout.js + LESS |
| Расширения | Не переносятся — Magento 2 API несовместим |
| Кастомные таблицы БД | Требуют ручного переноса |
| URL rewrites | Переносятся с оговорками |
Этапы миграции
1. Аудит Magento 1
Инвентаризация расширений — самый важный этап:
# Список установленных расширений
find /var/www/m1 -name "*.xml" -path "*/etc/config.xml" | \
grep -v "Mage\|Phoenix\|Enterprise" | head -50
# Список кастомного кода в app/local и app/community
ls /var/www/m1/app/code/local/
ls /var/www/m1/app/code/community/
Для каждого расширения найти аналог для Magento 2 или оценить стоимость переписывания.
2. Установка Magento 2 и Data Migration Tool
# Установить Magento 2
composer create-project --repository-url=https://repo.magento.com/ \
magento/project-community-edition /var/www/m2
# Установить Data Migration Tool
composer require magento/data-migration-tool
# Конфиг: app/etc/env.php (M2 соединение)
# config.xml мигратора
cp vendor/magento/data-migration-tool/etc/opensource-to-opensource/1.9.4.1/config.xml.dist \
app/etc/migration-config.xml
Редактировать migration-config.xml — указать оба соединения (M1 и M2), версию источника.
3. Настройка маппинга
<!-- app/etc/migration-config.xml -->
<config xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="urn:magento:module:Magento_DataMigrationTool:etc/config.xsd">
<steps mode="data">
<step title="Settings Step">
<integrity>Magento\DataMigration\Step\Settings\Integrity</integrity>
<run>Magento\DataMigration\Step\Settings\Data</run>
</step>
</steps>
<source>
<database host="localhost" name="magento1_db" user="root" password="pass"/>
</source>
<destination>
<database host="localhost" name="magento2_db" user="root" password="pass"/>
</destination>
<options>
<bulk_size>100</bulk_size>
<custom_option_map>false</custom_option_map>
<source_prefix></source_prefix>
<dest_prefix></dest_prefix>
</options>
</config>
4. Запуск миграции настроек
# Проверить настройки (только чтение)
php bin/magento migrate:settings --config=app/etc/migration-config.xml
# Мигрировать конфигурацию магазина
php bin/magento migrate:settings --config=app/etc/migration-config.xml --stage=data
5. Миграция данных
# Проверка целостности (до запуска!)
php bin/magento migrate:check --config=app/etc/migration-config.xml --stage=data
# Если проверка прошла — запуск миграции данных
php bin/magento migrate:data --config=app/etc/migration-config.xml
# Инкрементальная миграция (delta) для синхронизации новых заказов
php bin/magento migrate:delta --config=app/etc/migration-config.xml
Миграция большого каталога (100k+ товаров) занимает часы. Запускать через screen или tmux:
screen -S migration
php bin/magento migrate:data --config=app/etc/migration-config.xml 2>&1 | tee /var/log/migration.log
# Ctrl+A D для detach
6. Маппинг нестандартных атрибутов
Если в M1 были кастомные атрибуты со специфичными кодами или типами:
<!-- vendor/magento/data-migration-tool/etc/opensource-to-opensource/1.9.4.1/map-eav.xml -->
<map>
<source>
<field_rules>
<ignore>
<field>catalog_product/my_custom_attr_old_name</field>
</ignore>
</field_rules>
</source>
<destination>
<field_rules>
<transform>
<field>catalog_product/new_attr_name</field>
<handler class="Magento\DataMigration\Handler\SetValue">
<param name="value" value="default_value"/>
</handler>
</transform>
</field_rules>
</destination>
</map>
Миграция кастомных таблиц
Data Migration Tool не знает о кастомных таблицах расширений. Для них — ручной SQL-скрипт:
<?php
// migrate_custom_data.php
$m1 = new PDO('mysql:host=localhost;dbname=magento1', 'root', 'pass');
$m2 = new PDO('mysql:host=localhost;dbname=magento2', 'root', 'pass');
// Пример: перенести кастомные отзывы
$stmt = $m1->query("SELECT * FROM custom_reviews WHERE status = 1");
$reviews = $stmt->fetchAll(PDO::FETCH_ASSOC);
$insert = $m2->prepare(
"INSERT INTO custom_reviews (product_id, customer_id, text, rating, created_at)
VALUES (:product_id, :customer_id, :text, :rating, :created_at)
ON DUPLICATE KEY UPDATE text = :text"
);
foreach ($reviews as $review) {
$insert->execute($review);
}
Проблема паролей клиентов
M1 использует MD5-хэш паролей, M2 — bcrypt. После миграции клиентам нужно сбросить пароль. Варианты:
- Принудительный сброс — отправить всем email со ссылкой на сброс пароля
- Lazy migration — при первом входе проверять старый MD5, если совпадает — перехэшировать через bcrypt и сохранить
// Plugin для CustomerAuthenticationService
public function aroundAuthenticate($subject, callable $proceed, $username, $password)
{
try {
return $proceed($username, $password); // Попробовать стандартный bcrypt
} catch (AuthenticationException $e) {
// Проверить legacy MD5
$customer = $this->customerRepository->get($username);
$legacyHash = md5($password); // упрощённо, M1 использовал соль
if (hash_equals($customer->getLegacyPasswordHash(), $legacyHash)) {
// Обновить на bcrypt
$this->customerRepository->save(
$customer->setPasswordHash($this->encryptor->getHash($password, true))
);
return $customer;
}
throw $e;
}
}
Переход с OCMOD/Connect на Composer
Все M1-расширения установлены через Magento Connect или файловые патчи. В M2 — только Composer. Для каждого расширения:
- Найти аналог на marketplace.magento.com или Packagist
- Если аналога нет — написать модуль заново под M2 API
# Установка расширения через Composer
composer require vendor/module-name
# Активировать модуль
php bin/magento module:enable Vendor_ModuleName
php bin/magento setup:upgrade
SEO: сохранение URL
M1 и M2 имеют разные форматы URL. Нужно сгенерировать 301-редиректы:
-- Получить старые URL из M1
SELECT request_path, target_path, options
FROM core_url_rewrite
WHERE store_id = 1
AND id_path NOT LIKE 'product/%' -- исключить автогенерированные
ORDER BY request_path;
После генерации URL в M2 — сравнить и создать редиректы в Nginx или через M2 URL Rewrites.
Финальная синхронизация (delta migration)
Пока M1 работает в production, новые заказы продолжают поступать. После переключения DNS:
# Остановить M1, запустить финальную дельта-миграцию
php bin/magento migrate:delta --config=app/etc/migration-config.xml
# Переиндексация
php bin/magento indexer:reindex
# Деплой статики
php bin/magento setup:static-content:deploy ru_RU en_US -f
php bin/magento cache:flush
Сроки
Миграция данных с Magento 1 (до 50k товаров) — 2–3 дня. Весь проект с переработкой темы, портингом расширений и тестированием — 2–4 месяца в зависимости от объёма кастомного кода в M1.







