Magento 2

rsync do pub/media no Magento 2: copiar as imagens sem levar o cache

Migração de servidor, pub/media com 40 GB e a cópia não termina nunca. Antes de culpar a rede, roda isto no servidor antigo: du -sh pub/media/catalog/product/cache. Na maioria das lojas esse diretório sozinho é metade do total, e ele é 100% descartável.

São as miniaturas que o Magento gera sob demanda a partir do original. Copiar isso pro destino é pagar banda para levar arquivo que o próprio Magento refaz em minutos.

O rsync que eu uso

rsync -avz --info=progress2 
  --exclude='catalog/product/cache/' 
  --exclude='.thumbs/' 
  --exclude='tmp/' 
  --exclude='captcha/' 
  --exclude='custom_options/quote/' 
  /var/www/loja/pub/media/ 
  deploy@destino:/var/www/loja/pub/media/

Duas coisas fáceis de errar aí. A barra no fim da origem: com ela, o rsync copia o conteúdo de media para dentro de media; sem ela, você ganha um pub/media/media. E os caminhos do --exclude são relativos à raiz da transferência, não absolutos, então nada de começar com barra. O --info=progress2 pede rsync 3.1 ou mais novo; em servidor velho, troque por --progress.

Reconstruir as miniaturas no destino

cd /var/www/loja
sudo chown -R www-data:www-data pub/media
sudo -u www-data php bin/magento catalog:images:resize
sudo -u www-data php bin/magento cache:flush

O chown não é opcional: o -a do rsync só preserva dono e grupo quando ele roda como root, e copiando com usuário comum tudo chega no dono errado e o PHP-FPM não escreve mais nada ali. Depois disso o catalog:images:resize percorre o catálogo e regrava o cache nos tamanhos que o tema pede. Em loja grande ele demora, então deixe rodando antes de virar o DNS, não em cima da hora.

Última coisa: rode o rsync de novo depois da primeira leva, porque a segunda passada leva só o que mudou e fecha a janela entre a cópia e a virada. Se for acrescentar --delete nela, passe antes com --dry-run e leia a lista, que esse parâmetro apaga no destino tudo que não estiver na origem.

Post Recentes

mu-plugins no WordPress: onde colocar snippets em vez do functions.php

Tire os snippets do functions.php e coloque num must-use plugin: carrega sempre, sobrevive à atualização do tema e ninguém desativa…

8 horas atrás

preg_replace_callback no PHP: substituir cada match com uma função

Quando o valor novo depende do que a regex achou, preg_replace não resolve. Exemplo real aplicando 10% de desconto em…

1 dia atrás

Cron do Magento 2 não roda: status missed e pending no cron_schedule

Pedido que não fatura e e-mail que não sai porque todo job fica missed: como ler a cron_schedule, conferir o…

2 dias atrás

Gerar slug de URL em PHP: acento, espaço e símbolo fora do endereço

Uma função curta em PHP 8.3 que transforma Camiseta Preta Tamanho GG em camiseta-preta-tamanho-gg, sem depender do locale do servidor.

3 dias atrás

Log de consentimento LGPD: a tabela MySQL que guarda a prova do aceite

O banner registra o clique só no navegador e some. Veja a tabela MySQL e o endpoint que gravam a…

3 dias atrás

Comando CLI Magento 2: criar a classe e registrar no di.xml

A classe do comando existe e o bin/magento list ignora ela. Falta o registro no di.xml: aqui vai a classe…

4 dias atrás