Do localhost para produção: o que ninguém te conta.
25 de maio de 2026 • 4 min de leitura
Tem uma sensação muito específica quando o seu projeto funciona perfeitamente no localhost e você sobe para produção pela primeira vez.
Spoiler: raramente funciona de primeira.
O que aconteceu
Estava desenvolvendo uma aplicação de agendamentos para uma barbearia (teste) — frontend em Next.js na Vercel, backend em NestJS no Render, base de dados no MongoDB Atlas. Parecia simples no papel.
O primeiro deploy falhou com "Command npm run build exited with 1". Sem stack trace claro, sem mensagem de erro útil. Só esse código frio e indiferente.
Variáveis de ambiente
O primeiro culpado foi clássico: a variável NEXT_PUBLIC_API_URL não estava configurada na Vercel. O frontend estava a fazer fetch para http://localhost:3333 em produção. Claro que não funcionava.
A lição aqui é simples mas fácil de esquecer: tudo que é local precisa de ser explicitamente configurado no ambiente de produção. O que funciona na sua máquina não viaja automaticamente para os servidores.
O problema do cache
Depois de resolver as variáveis, surgiu outro problema mais subtil. Os dados dos serviços da barbearia apareciam desatualizados para novos visitantes — como se o site estivesse a mostrar uma fotografia antiga da base de dados.
O problema era que o Services era um Server Component assíncrono no Next.js, e o framework fazia cache agressivo do resultado por padrão. A solução foi adicionar cache: "no-store" nas chamadas à API, forçando sempre dados frescos.
O Render adormece
O plano gratuito do Render hiberna o servidor após 15 minutos sem uso. Quando alguém acessa o site após esse período, a primeira requisição pode demorar 30 a 60 segundos enquanto o servidor "acorda".
Não é um bug — é uma limitação do plano gratuito. Mas parece um bug para quem não sabe. Documentar isso para os utilizadores finais faz parte do trabalho.
O que aprendi
Deployar não é só fazer push. É pensar no ambiente, nas variáveis, no comportamento de cache, nas limitações da infraestrutura. Cada erro é uma camada da realidade que o localhost escondia.