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

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

1 hora atrás

Módulos PHP 8.3 faltando na Saúde do site do WordPress: como instalar

A tela Saúde do site avisa que faltam extensões como intl, imagick ou zip: instale no PHP 8.3, reinicie o…

4 horas atrás

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

Chegou um chamado sem passo a passo e sem exemplo. Veja como virar esse relato em um caso de teste…

1 dia atrás

Bloquear .env e .git no nginx: as regras que ainda deixam o arquivo vazar

Negar /.env no nginx parece resolvido até alguém pedir /wp-content/uploads/.env ou backup.sql. As regras que testei e os furos que…

3 dias atrás

Canonical errado no Yoast: corrigindo pelo filtro wpseo_canonical

O Search Console marca suas páginas 2, 3 e 4 como alternativas da página 1? Ajuste a tag canônica do…

3 dias atrás

Layout XML do Magento 2: remover bloco de módulo de terceiro

Um módulo de terceiro plantou um banner no topo da loja e você não quer desinstalar nada: tire o bloco…

3 dias atrás