Crie o arquivo .env.local na raiz do projeto com as seguintes variáveis:
Banco de Dados
# URL de conexão pooled (usada em produção pelo Prisma)
DATABASE_URL="postgresql://user:password@host:5432/dbname?sslmode=require"
# URL direta (sem pool — usada para migrations)
DATABASE_URL_UNPOOLED="postgresql://user:password@host:5432/dbname?sslmode=require"
# Alternativa pooled do Neon (sem channel_binding, compatível com PgBouncer)
POSTGRES_PRISMA_URL="postgresql://user:password@host-pooler:5432/dbname?sslmode=require"
Recomendamos o Neon para banco PostgreSQL gerenciado com suporte a branches (ideal para preview deploys). O plano free suspende após 5 dias sem atividade — configure CRON_SECRET para que o backup diário mantenha o banco ativo.
Autenticação (NextAuth)
# Segredo para assinar tokens de sessão — gere com: openssl rand -base64 32
AUTH_SECRET="seu-segredo-aqui"
NEXTAUTH_SECRET="seu-segredo-aqui" # mesmo valor que AUTH_SECRET
# URL pública da aplicação
NEXTAUTH_URL="http://localhost:3000"
CSRF
# Segredo para assinar tokens CSRF — gere com: openssl rand -hex 32 (mínimo 32 chars)
CSRF_SECRET="d14bc890958d40c6eee672baaab5b1b1caeba33d41ecf3432588289c5ca6943e"
Sem CSRF_SECRET, a proteção CSRF é desabilitada silenciosamente em produção com log de erro crítico. Configure essa variável no Vercel.
Google OAuth (Opcional)
AUTH_GOOGLE_ID="seu-google-client-id"
AUTH_GOOGLE_SECRET="seu-google-client-secret"
Email (Resend)
RESEND_API_KEY="re_xxxxxxxxxxxxxxxxxxxx"
# E-mail remetente configurado no Resend
EMAIL_FROM="noreply@seudominio.com"
Monitoramento (Sentry)
NEXT_PUBLIC_SENTRY_DSN="https://xxxx@sentry.io/yyyy"
SENTRY_AUTH_TOKEN="sntrys_xxxx"
SENTRY_ORG="sua-org"
SENTRY_PROJECT="plataforma-testes"
Rate Limiting (Redis / Upstash)
# URL do Redis Upstash (formato: redis://default:password@host:port)
REDIS_URL="redis://default:password@redis-xxxxx.upstash.io:6379"
Se REDIS_URL não estiver configurada ou o Redis estiver inacessível, o rate limiting falha aberto (fail-open) — requisições são permitidas e o erro é registrado nos logs. A aplicação funciona normalmente sem Redis, mas sem proteção de rate limit.
Criptografia
# Chave de 64 chars hex para criptografia AES-256 — gere com: openssl rand -hex 32
ENCRYPTION_KEY="a1b2c3d4e5f6..."
Cron Jobs
# Segredo para autenticar chamadas do cron na Vercel
CRON_SECRET="seu-cron-secret-aqui"
Storage de Arquivos (Opcional)
# Cloudinary (para upload de imagens/arquivos)
CLOUDINARY_CLOUD_NAME="seu-cloud-name"
CLOUDINARY_API_KEY="sua-api-key"
CLOUDINARY_API_SECRET="seu-api-secret"
Configuração da Aplicação
# URL base da aplicação (usada em links de e-mail, etc.)
NEXT_PUBLIC_APP_URL="http://localhost:3000"
# Ambiente
NODE_ENV="development"
Variáveis de Produção (Vercel)
No painel da Vercel, adicione todas as variáveis acima em Settings → Environment Variables, separando por ambiente:
| Variável | Development | Preview | Production |
|---|
DATABASE_URL | local | preview DB | prod DB |
AUTH_SECRET / NEXTAUTH_SECRET | qualquer | mesmo | diferente e seguro |
CSRF_SECRET | qualquer | mesmo | forte (>= 32 chars) |
ENCRYPTION_KEY | qualquer | mesmo | forte (64 chars hex) |
CRON_SECRET | qualquer | mesmo | forte |
NEXT_PUBLIC_APP_URL | localhost:3000 | URL do preview | URL de prod |
REDIS_URL | opcional | opcional | recomendado |
Nunca commite o arquivo .env.local no Git. Ele já está no .gitignore do projeto. Variáveis do .env.local nunca são enviadas automaticamente ao Vercel — você precisa adicioná-las manualmente no painel.