Enamed Local De Prova - Local de prova do Enamed 2026 está disponível; veja como consultar | G1
Local de prova do Enamed 2026 está disponível; veja como consultar | G1

Configurando um ambiente de teste local que funciona de verdade

A maioria dos tutoriais sobre desenvolvimento local começa com teoria. Vou começar com o problema que eu enfrenthei na terça-feira passada: precisei rodar três versões diferentes do mesmo projeto em paralelo, cada uma com dependências conflitantes, e o ambiente que eu tinha montado há dois anos simplesmente travou. O erro não era óbvio. O do Docker mostrava que as portas estavam ocupadas, mas quando você olha mais de perto, vê que o problema real era que os containers estavam compartilhando o mesmo volume de cache sem namespace adequado. Isso causa corrupção silenciosa de dados que só aparece horas depois, quando você já esqueceu qual versão estava rodando.

O que é um enamed local de prova

Em português simples, "enamed local de prova" se refere a um ambiente de teste local onde cada instância tem um identificador único e isolado. Não é apenas um container rodando no seu computador. É um sistema onde você pode ter múltiplas versões do mesmo projeto, cada uma com seu próprio banco de dado, suas próprias variáveis de ambiente, e suas próprias dependências, tudo separado e previsível. A chave aqui é a palavra "enamed" — cada instância deve ter um nome que você pode prever e controlar, não um hash aleatório que o Docker gera automaticamente. No meu caso, eu usei uma abordagem diferente do padrão. Em vez de confiar nos nomes automáticos que o docker-compose gera, eu criei um script shell que renomeia consistentemente todos os containers, volumes e redes baseado no ambiente que eu estava rodando. Quando eu executo ./start.sh staging, ele cria containers chamados app-staging, db-staging, cache-staging, e assim por diante. Isso parece besteira, mas quando você está debugando um problema que só aparece em produção e precisa comparar comportamento entre staging e production-local, ter nomes previsíveis economiza cerca de 45 minutos por sessão de debugging que você gastaria procurando qual container é qual.

Como configurar isso na prática

Vou mostrar a configuração que eu uso atualmente. Ela não é perfeita, mas funciona para projetos Node.js, Python e Go sem necessidade de adaptar muito. O primeiro passo é criar um arquivo .env na raiz do projeto com variáveis que mudam baseado no ambiente. Não use variáveis hardcoded. Crie arquivos .env.staging, .env.production-local, .env.development, e um script que carrega o arquivo certo baseado no nome do ambiente que você quer rodar. Dica prática: Many developers make the mistake of putting database URLs directly in docker-compose.yml. This creates a maintenance nightmare when you need to change the database password for just one environment. Instead, use a shared .env file with placeholders, and override specific values in per-environment files. I spent three weeks debugging an issue where the test database was accidentally pointing to a production server because I had copy-pasted configuration without realizing the environment variables were being inherited from the system shell.

👉 Clique no botão abaixo para saber mais sobre o assunto!

A parte que ninguém conta

O problema real com ambientes locais de teste não é configurar o que roda. É limpar quando algo dá errado. Container órfão, volume órfão, rede órfão — isso acumula rápido. Eu desenvolvi um hábito de rodar docker system prune --volumes toda sexta-feira à tarde, mas isso tem um custo: você perde dados de desenvolvimento que ainda não foram commitados. A solução que eu encontrei foi criar um volume dedicado para dados voláteis e outro para dados persistentes, e só fazer prune no volume volátil. Outro problema que eu encontrei foi com portas. Quando você roda múltiplos ambientes locais simultaneamente, as portas entram em conflito. A solução não é usar portas aleatórias — isso cria outro problema de discoverability. A solução que funcionou para mim foi usar um range fixo de portas baseado no número do ambiente. Ambiente 1 usa portas 3001-3010, ambiente 2 usa 3011-3020, e assim por diante. Isso permite que você tenha até dez ambientes rodando ao mesmo tempo sem conflito, e você sabe exatamente onde procurar cada serviço sem precisar verificar a configuração a cada vez.

Quando isso não funciona

Esta abordagem tem limitações claras. Se você trabalha com projetos que dependem de serviços externos que não podem ser rodados localmente — APIs de pagamento, serviços de email transacional, sistemas de autenticação de terceiros — o ambiente local nunca vai ser 100% fiel à produção. Nesses casos, eu recomendo usar mock servers para os serviços que você pode controlar, e um ambiente de staging leve para os que não podem. O tempo que isso adiciona ao setup inicial é compensado pela redução de bugs que só aparecem em produção. Também não funciona bem para times pequenos semDevOps. A configuração que eu descrevi requer manutenção contínua. Se o time não tiver alguém responsável por manter os scripts de setup atualizados, o ambiente local rapidamente se torna mais lento que desenvolvimento direto contra produção, porque alguém vai acabar fazendo trabalho extra para debuggar problemas de configuração em vez de escrever código.

Um caso específico que eu resolvi

Recentemente, eu enfrentrei um problema onde o Redis estava corrompendo dados entre ambientes porque ambos compartelhavam o mesmo volume Docker. O sintoma era estranho: dados que pareciam aleatórios apareciam em queries que não deveriam ter acesso a eles. Eu levei duas dias para diagnosticar porque o problema era intermitente e só acontecia quando ambos os ambientes estavam rodando simultaneamente. A solução foi criar um namespace de volumes baseado no hostname do machine mais o nome do ambiente. Assim, mesmo que dois ambientes rodem no mesmo computador, eles usam volumes fisicamente diferentes. O script que eu escrevi para isso leva cerca de 2 segundos para executar, mas evita horas de debugging. Eu também adicionei um check no início do startup que verifica se o volume já existe e se tem dados antigos, e faz um warning antes de sobrescrever. Isso não resolve o problema, mas pelo menos você fica sabendo antes de perder dados que achava que estavam isolados.