O que é staging numa loja Magento e o que ele evita
Staging, ou ambiente de homologação, é uma segunda instalação da loja: o mesmo código, uma cópia do banco e das imagens, num endereço que cliente nenhum acessa. É ali que o dev roda a atualização, instala o módulo e mostra o resultado antes de tocar na loja que vende.
No Magento isso pesa mais do que num site comum, porque subir código não é copiar arquivo: o setup:upgrade aplica patches que alteram o banco e o setup:di:compile gera código. Se um desses passos quebra em produção, a loja para. No staging, o mesmo erro custa só o tempo do dev.
No Adobe Commerce na nuvem da Adobe, o ambiente vem pronto: segundo a documentação da arquitetura Pro, o Staging roda em infraestrutura dedicada, com os serviços da produção, como Fastly e New Relic. No Magento Open Source, ou no Adobe Commerce hospedado por conta própria, alguém precisa montar, e com as travas abaixo.
Checklist: os 10 itens que eu confiro num staging de loja Magento
Use a tabela como pedido para o dev ou para a hospedagem. Cada linha tem uma forma de conferir que não exige ler código.
| Item | O que pedir | Como conferir |
|---|---|---|
| 1. Endereço fechado | Subdomínio com senha no nginx ou liberado só para os IPs da equipe | Fora da rede liberada, pede senha |
| 2. Base URL própria | web/secure/base_url e web/unsecure/base_url do staging, gravadas com --lock-env | Nenhum link do staging pode levar para a loja real |
| 3. E-mail desligado | system/smtp/disable igual a 1 (Disable Email Communications) | Fazer um pedido de teste com o seu e-mail: nada pode chegar |
| 4. Pagamento em sandbox | Cada meio de pagamento com a credencial de teste do próprio gateway, nenhuma chave de produção | Pagar com cartão de teste e ver a transação no painel de testes do gateway |
| 5. Google fora | Senha na porta e cabeçalho X-Robots-Tag: noindex | curl -I de fora da rede liberada devolve 401 |
| 6. Cron sob controle | Cron ligado; integrações com ERP, marketplace e feed desligadas ou no ambiente de teste do parceiro | Lista escrita do que foi desligado |
| 7. Índice próprio no OpenSearch | catalog/search/opensearch_index_prefix diferente do da produção, se o servidor de busca for o mesmo | Reindexar o staging e ver que a busca da loja real não mudou |
| 8. Mesmas versões | PHP, MariaDB ou MySQL, OpenSearch, Redis ou Valkey e Varnish iguais aos da produção | Comparar php -v e bin/magento --version nos dois ambientes |
| 9. Sem dado de cliente real | Cópia do banco com nome, e-mail, telefone, CPF e endereço mascarados | Abrir um pedido antigo no admin do staging |
| 10. Rotina de atualização | Quem copia o banco, quando, e o que é reaplicado depois | Documento de uma página com a data da última cópia |
Os itens 3, 4 e 9 protegem o cliente: staging que esquece um deles manda e-mail de pedido para quem comprou na loja real. Se só couber pouca coisa agora, comece por esses três e pela senha.
Trocar a base URL do staging e desligar o e-mail sem perder tudo na próxima cópia
O erro clássico é este: o dev copia o banco da produção, corrige a base URL direto na tabela core_config_data, esquece o e-mail e, um mês depois, copia o banco de novo. Tudo volta a apontar para a loja real, inclusive o envio de e-mail.
O Magento tem um caminho melhor. O bin/magento config:set com a opção --lock-env grava o valor em app/etc/env.php, e a documentação da Adobe diz que valor presente no env.php tem prioridade sobre o que está no banco e fica travado no admin. Como o env.php não vai para o repositório e não vem junto com o banco copiado, a configuração do staging sobrevive a qualquer importação:
bin/magento config:set --lock-env web/unsecure/base_url https://staging.sualoja.com.br/
bin/magento config:set --lock-env web/secure/base_url https://staging.sualoja.com.br/
bin/magento config:set --lock-env system/smtp/disable 1
bin/magento config:set --lock-env catalog/search/opensearch_index_prefix staging_sualoja
bin/magento indexer:reindex catalogsearch_fulltext
bin/magento cache:flushDois cuidados. Se a loja tem base URL própria por website ou por store view, cada uma precisa do mesmo comando com --scope e --scope-code; sem isso, o valor gravado no banco naquele escopo continua valendo. E o campo de e-mail fica em Stores > Configuration > Advanced > System > Mail Sending Settings: depois do comando ele aparece travado no admin, que é justamente o sinal de que funcionou.
Como bloquear o Google no ambiente de teste da loja
Senha na porta é a trava que não depende do banco. A documentação do Google orienta proteger com senha o conteúdo que não deve ser encontrado e avisa que página bloqueada só por robots.txt ainda pode aparecer nos resultados, por exemplo quando outra página aponta para ela.
No nginx, a configuração abaixo pede senha para quem está fora e deixa passar o IP da equipe sem pedir. O par satisfy any com allow e auth_basic é o exemplo da própria documentação do nginx:
satisfy any;
allow 203.0.113.10;
deny all;
auth_basic "Staging";
auth_basic_user_file /etc/nginx/.htpasswd-staging;
add_header X-Robots-Tag "noindex, nofollow" always;Tem uma armadilha no cabeçalho. O nginx.conf.sample do Magento declara add_header próprio dentro das locations de /static/ e /media/, e pela regra do nginx isso anula o add_header herdado do bloco de fora. As páginas recebem o X-Robots-Tag; as imagens e os arquivos estáticos, não. Por isso a senha vem antes.
A liberação por IP ajuda também em teste de integração pela API REST, em que a senha da autenticação básica e o token disputariam o mesmo cabeçalho Authorization.
Staging no mesmo servidor da loja ou separado?
Não coloco preço aqui porque ele depende da sua hospedagem. O que dá para comparar é o critério:
| Critério | Mesmo servidor | Servidor separado | Máquina do dev |
|---|---|---|---|
| Isolamento | Baixo: o staging disputa CPU e memória com a loja | Alto | Total |
| Fidelidade | Alta, com banco, busca e cache separados | Alta, com as mesmas versões | Depende de Docker ou DDEV bem montado |
| Custo | Menor, sem máquina nova | Maior, uma máquina a mais | Nenhum para a loja |
| Quem consegue homologar | Você e o dev | Você e o dev | Só o dev |
| Risco principal | O teste deixar a loja lenta | Ficar desatualizado | Funcionar só na máquina dele |
O que eu recomendo: o ambiente local é ferramenta do dev; o staging é seu, é onde você aprova, com acesso próprio e limitado para o dev. Loja em servidor com folga se vira com staging no mesmo servidor, com banco, prefixo e cache separados e sem reindexar em horário de venda. Loja perto do limite da máquina precisa de staging separado.
Se quiser que eu olhe como está o staging da sua loja antes de contratar alguma mudança, me chama.
Perguntas frequentes
Staging no mesmo servidor da loja dá problema?
Pode dar, se os dois dividirem recursos sem regra: reindexação e compilação no staging consomem CPU e memória da máquina que atende os clientes. Com banco, busca e cache separados, e testes pesados fora do horário de venda, funciona para loja com folga de servidor.
O Google pode indexar o staging da loja Magento?
Pode, se o endereço estiver aberto. Basta um link esquecido para ele ser descoberto. Senha na porta é a proteção mais segura. Bloquear só pelo robots.txt não impede a URL de aparecer nos resultados, segundo a própria documentação do Google.
Preciso de licença extra de extensão para usar no staging?
Depende dos termos de cada fornecedor. Leia a regra de uso em ambiente de teste na licença de cada extensão paga antes de montar o staging. Se alguma extensão confere a licença pelo domínio, ela pode não funcionar no endereço do staging sem liberação do fornecedor.
Com que frequência atualizar o banco do staging?
Antes de cada homologação importante, e não em data fixa, porque banco antigo esconde erro que depende de produto ou pedido recente. A cada cópia, a máscara dos dados pessoais precisa ser aplicada de novo; a configuração gravada no env.php continua valendo.
Fontes oficiais
- Set configuration values (config:set e --lock-env) (Adobe Experience League)
- Configuration management: technical details (Adobe Experience League)
- Pro architecture (ambiente Staging no Adobe Commerce on Cloud) (Adobe Experience League)
- Block Search indexing with noindex (Google Search Central)
- Control what you share with Google (Google Search Central)
- Module ngx_http_headers_module (herança do add_header) (nginx.org)
- Module ngx_http_core_module (diretiva satisfy) (nginx.org)