Cena clássica de migração: o migrate:data rodou até o fim, o volume check passou, os 12 mil produtos estão no admin com nome, preço e categoria. E a vitrine inteira está com aquele ícone de imagem quebrada.
Não tem nada errado com a migração. O nome da ferramenta é Data Migration Tool e ela leva isso ao pé da letra: banco de dados, e só.
Por que a foto não vem junto
Não é opinião minha, está no arquivo. O config.xml.dist que a ferramenta distribui termina assim:
<source>
<database host="localhost" name="magento1" user="root" />
</source>
<destination>
<database host="localhost" name="magento2" user="root" />
</destination>Origem é um banco. Destino é um banco. Não existe campo de caminho de arquivo, de FTP, de nada. Os três modos — settings, data e delta, nessa ordem — trabalham tabela por tabela.
Tem uma segunda pista, no settings.xml.dist: as configurações web/unsecure/base_media_url e web/secure/base_media_url estão explicitamente na lista de <ignore>. A ferramenta nem carrega a URL de mídia da loja antiga, porque a estrutura de pastas mudou.
E mudou mesmo. No Magento 1 as imagens vivem em <raiz>/media/. No Magento 2, em <raiz>/pub/media/. O que não mudou é o caminho relativo gravado no banco: a coluna value de catalog_product_entity_media_gallery continua guardando algo como /a/b/abc123.jpg, relativo a catalog/product. É por isso que o copia-e-cola direto funciona.
O rsync que resolve
Com os dois servidores no ar, rodando do servidor do Magento 2:
rsync -avz --progress \
--exclude 'catalog/product/cache/' \
--exclude 'tmp/' \
--exclude 'import/' \
--exclude '.htaccess' \
usuario@servidor-m1:/var/www/magento1/media/ \
/var/www/magento2/pub/media/Três coisas que dão errado nessa linha:
- A barra no fim da origem.
media/copia o conteúdo da pasta.mediasem barra criapub/media/media/e você vai passar meia hora procurando o erro. - O cache do M1. A pasta
catalog/product/cachecostuma ser maior que todo o resto junto, e é lixo: são os redimensionamentos do tema antigo, que o Magento 2 não usa. Fora. - Os
.htaccess. O Magento 2 instala arquivos de proteção dentro depub/media— na raiz e emcustomer,downloadable,custom_options,import,sitemapetheme_customization. É o que bloqueia execução de PHP ali dentro. Sobrescrever isso com os do M1 é abrir a porta que o pessoal de segurança passa a vida tentando fechar.
O que você precisa deixar passar: catalog/product e catalog/category (as fotos), wysiwyg (as imagens de CMS e de banner) e downloadable/files, se a loja vende produto para download. Esse último é o mais esquecido, e o cliente só descobre quando um comprador antigo tenta baixar de novo.
Permissão, cache e a conferência que ninguém faz
Arquivo copiado por rsync chega com o dono e o modo do servidor de origem. Aplique o padrão que a Adobe documenta, restrito à pasta que você acabou de mexer:
find pub/media -type f -exec chmod g+w {} +
find pub/media -type d -exec chmod g+ws {} +
chown -R :www-data pub/media
php bin/magento cache:flushTroque www-data pelo grupo do seu servidor web. O g+ws nas pastas não é capricho: o bit s faz arquivo novo herdar o grupo, e é isso que evita o problema voltar na primeira imagem que o admin subir.
Agora a conferência. Em vez de abrir a loja e olhar, pergunte ao banco qual imagem ele espera e veja se o arquivo está lá:
SELECT value FROM catalog_product_entity_media_gallery LIMIT 5;ls -l pub/media/catalog/product/a/b/abc123.jpgSe o arquivo existe e a vitrine continua quebrada, o problema deixou de ser de migração e passou a ser de permissão, de cache ou de URL base. Se o arquivo não existe, faltou rsync.
Um último detalhe de tamanho: catálogo grande com muita foto pode levar horas nesse rsync. Rode uma primeira passada com a loja antiga ainda no ar, dias antes do corte, e uma segunda passada no dia da virada — o rsync só manda o que mudou, e a segunda vai levar minutos. É o mesmo raciocínio do modo delta do tool, aplicado a arquivo.
Perguntas rápidas
Preciso rodar catalog:images:resize depois de copiar?
Não é obrigatório. O Magento gera o redimensionamento na primeira visita à página. Rodar antes só evita que os primeiros visitantes peguem a página mais lenta, e em catálogo grande esse comando demora bastante.
Posso copiar a pasta media antes de rodar o migrate:data?
Pode, e é o que eu faço. As duas coisas são independentes: uma mexe em banco, a outra em arquivo. Copiar antes só adianta a parte demorada.
E as imagens de banner e de página CMS?
Estão em media/wysiwyg e vão no mesmo rsync. O conteúdo do CMS referencia essas imagens por um marcador de media url, então elas continuam funcionando desde que o arquivo esteja no lugar certo.
Pra conferir na fonte
- Data Migration Tool config.xml.dist — GitHub
- Data Migration Tool settings.xml.dist — GitHub
- How data migration works — Adobe Experience League
- Set ownership and permissions — Adobe Experience League