Skip to main content
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ávelDevelopmentPreviewProduction
DATABASE_URLlocalpreview DBprod DB
AUTH_SECRET / NEXTAUTH_SECRETqualquermesmodiferente e seguro
CSRF_SECRETqualquermesmoforte (>= 32 chars)
ENCRYPTION_KEYqualquermesmoforte (64 chars hex)
CRON_SECRETqualquermesmoforte
NEXT_PUBLIC_APP_URLlocalhost:3000URL do previewURL de prod
REDIS_URLopcionalopcionalrecomendado
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.