Voltar para posts
Info

Do localhost para produção: o que ninguém te conta.

25 de maio de 20264 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.