Você estava com pressa, o comando deu erro de permissão, você repetiu com sudo e funcionou. Meia hora depois a loja está em 500 e ninguém entende por quê.
O que aconteceu: cada arquivo que aquele comando criou saiu com dono root. Cache, log, classes geradas, arquivo estático. O usuário do PHP-FPM chega ali, tenta escrever e apanha. E o log de erro não ajuda porque ele também virou do root.
Confirme que foi isso
Da raiz do Magento, uma linha responde:
find var generated pub/static pub/media app/etc -user root | head -20Se voltar vazio, o problema é outro. Se voltar lista, você achou. Agora descubra quem deveria ser o dono, olhando com que usuário o PHP roda:
ps -o user= -C php-fpm | sort -u
stat -c '%U %G' pub/index.phpNa maioria dos servidores você vai ver dois nomes diferentes e é assim mesmo: um usuário dono dos arquivos, que é quem faz deploy e roda a CLI, e o usuário do servidor web, que precisa apenas escrever nas pastas de trabalho. A Adobe chama esse arranjo de configuração de dois usuários, e é o recomendado em produção.
Vale olhar também o que o Magento estava tentando dizer antes de ficar mudo:
tail -50 var/log/exception.log
ls -la var/report/ | tail -5 O bloco que conserta
Primeiro devolva o dono. Troque deploy pelo usuário dono dos arquivos e www-data pelo grupo do servidor web:
cd /var/www/html/magento2
chown -R deploy:www-data .Depois rode o bloco oficial da Adobe, que ajusta a permissão de grupo nas pastas que o PHP precisa escrever:
find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +
find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
chmod u+x bin/magentoA parte que costuma passar batido é o s do segundo comando. O g+s em diretório é o setgid: todo arquivo novo criado ali herda o grupo do diretório em vez do grupo primário de quem criou. É isso que faz o arranjo continuar funcionando amanhã, quando o deploy criar arquivo novo.
Por fim, limpe o que ficou com dono errado e recomece do zero:
rm -rf var/cache/* var/page_cache/* var/view_preprocessed/*
sudo systemctl reload php8.4-fpmO reload é pra derrubar o OPcache, que pode estar segurando uma versão antiga do que você acabou de mexer.
Pra não acontecer de novo
A regra da Adobe é curta: todo comando de CLI do Magento roda com o usuário dono dos arquivos. Nem root, nem o usuário do servidor web.
Na prática:
- Entre no servidor como o usuário de deploy, ou use
sudo -u deploy php bin/magento .... Nuncasudo php bin/magentoseco. - O cron do Magento também. Se o crontab estiver no root e o deploy for outro usuário, o cron recria a bagunça toda madrugada. O
php bin/magento cron:installinstala as linhas no crontab de quem está rodando o comando — rode como o dono dos arquivos. - Confira a umask. O
app/bootstrap.phpaplica002por padrão, o que já dá escrita ao grupo. Se você precisar de outro valor, coloque um arquivo chamadomagento_umaskna raiz com o valor em octal. Umask022tira a escrita do grupo e você cai no mesmo problema por outro caminho.
Se o servidor tem vários devs e ninguém lembra dessas regras, ACL resolve melhor que combinado verbal. Mas comece pelo básico: usuário certo, grupo certo e setgid nas pastas de trabalho.
Perguntas rápidas
Posso simplesmente dar 777 e seguir a vida?
Funciona e é uma péssima ideia. Com 777 qualquer processo do servidor escreve em qualquer arquivo da loja, o que transforma uma falha pequena em execução remota de código. Se for pra escolher um atalho, prefira 775 nos diretórios e 664 nos arquivos das pastas de trabalho, com o grupo certo.
Depois do chown a loja continua em 500. O que ainda falta?
Olhe var/log/exception.log e var/report agora que eles voltaram a ser legíveis. Também vale limpar var/cache e var/page_cache e recarregar o PHP-FPM, porque o OPcache pode estar servindo classe gerada de antes. Se o erro persistir, ele provavelmente não era de permissão.
O vendor precisa mesmo estar na lista do chmod?
Está no bloco oficial da Adobe porque o composer escreve ali durante instalação e atualização de módulos. Em produção, com deploy por artefato, você pode deixar o vendor só de leitura. Se o seu fluxo roda composer no servidor, mantenha como está na documentação.
Pra conferir na fonte
- File system ownership and permissions — Adobe Experience League
- Configure and run cron — Adobe Experience League
- app/bootstrap.php (magento_umask) — GitHub