A loja inteira devolvendo 503 Service Temporarily Unavailable, incluindo o admin. O servidor sem carga, o banco respondendo, o var/log/exception.log sem nada de novo. Isso é sintoma clássico de modo de manutenção ligado, não de aplicação quebrada.
Acontece quando o script de deploy roda maintenance:enable, o setup:upgrade falha no meio, o script morre — e ninguém chega no maintenance:disable do final.
Confirma em dez segundos
Um comando responde:
php bin/magento maintenance:statusA saída é literalmente esta:
Status: maintenance mode is enabled
List of exempt IP-addresses: noneSe o bin/magento também estiver quebrado (acontece quando o módulo que derrubou o deploy nem carrega), olhe o arquivo direto:
ls -la var/.maintenance.flagÉ um arquivo vazio, criado com touch. Ele não guarda nada; a existência dele já é a informação.
O caminho dentro do Magento é curto: o bootstrap vê a flag, para com o código de erro 901 e inclui o pub/errors/503.php, que responde HTTP 503 e desenha a página 503.phtml. Por isso não aparece exception nenhuma: do ponto de vista do aplicativo, nada deu errado.
Tira do ar do jeito certo
Com a CLI funcionando:
php bin/magento maintenance:disableCom a CLI quebrada, apagar o arquivo resolve na hora e é seguro:
rm var/.maintenance.flagSó que antes de tirar, pense por que ela ficou lá. Se o deploy morreu no setup:upgrade, o banco pode estar num estado meio migrado. Nessa situação eu rodo primeiro:
php bin/magento setup:db:statusSe ele disser que o schema ou os dados estão desatualizados, o certo é terminar o setup:upgrade com a loja ainda fechada, e só então liberar. Abrir a loja com migração pela metade é como colher pedido para um banco que ainda vai mudar.
Depois de liberar, um php bin/magento cache:flush evita que Varnish ou FPC sirvam a página de 503 que ficou guardada.
Da próxima vez, libere só o seu IP
Manutenção sem exceção de IP é manutenção que você não consegue testar. A forma certa de ligar é:
php bin/magento maintenance:enable --ip=203.0.113.10A opção repete: --ip=203.0.113.10 --ip=203.0.113.11. Isso grava var/.maintenance.ip ao lado da flag. Para mexer na lista sem ligar ou desligar nada, existe um comando próprio:
php bin/magento maintenance:allow-ips 203.0.113.10 --add
php bin/magento maintenance:allow-ips --noneO --add soma à lista atual em vez de substituir, e o --none limpa tudo. Detalhe que pouca gente sabe: a comparação aceita faixa, então 203.0.113.0/24 funciona e vale para o escritório inteiro.
Um aviso que já me custou meia hora: o Magento compara com o REMOTE_ADDR, e por padrão ele não olha cabeçalho de proxy. Atrás de Cloudflare ou de um load balancer sem real_ip configurado no nginx, o IP que chega é o do proxy — o seu nunca vai bater, e você continua vendo 503 mesmo estando na lista.
Quando não é a flag
Se o maintenance:status disser disabled e a loja continuar em 503, o erro está antes do Magento. Os dois casos que eu mais vejo:
- php-fpm fora. O nginx devolve 502 ou 503 quando não consegue falar com o pool. Confira com
systemctl status php8.4-fpme olhe o log de erro do nginx, não o do Magento. - Varnish sem backend saudável. Com o backend reprovado no health check, o Varnish serve 503 Backend fetch failed — texto diferente do 503 do Magento, e é assim que dá para distinguir os dois olhando só a página.
Vale ler o corpo da resposta antes de sair mexendo. A página de manutenção do Magento tem o título Error 503: Service Unavailable; a do Varnish e a do nginx são outras. Meio segundo de leitura poupa vinte minutos de caça errada.
Perguntas rápidas
Posso simplesmente apagar o .maintenance.flag em vez de rodar o comando?
Pode. O comando faz exatamente isso, apagar o arquivo. Usar a CLI é melhor só porque ela também valida permissão de escrita na pasta var.
O modo de manutenção prejudica o SEO?
Se durar minutos, não. O 503 é justamente o código que diz ao Google para voltar depois, sem tirar a página do índice. O problema é ficar dias assim, aí o Google começa a remover as URLs.
O cron continua rodando com a manutenção ligada?
Sim. A flag bloqueia a requisição HTTP, não a linha de comando. Por isso é comum ver pedido processando pelo cron enquanto a loja está fechada para visita.
Pra conferir na fonte
- Enable or disable maintenance mode — Adobe Experience League
- MaintenanceAllowIpsCommand.php (opções --add e --none) — GitHub — magento/magento2
- ExceptionHandler.php (o desvio para errors/503.php) — GitHub — magento/magento2
- Manage the cache — Adobe Experience League