Este documento descreve como fazer deploy do StructLive em produção.
- Pré-requisitos
- Configuração de Ambiente
- Deploy na Vercel
- Deploy em Outros Provedores
- Configurações de Produção
- Checklist Pré-Deploy
- Monitoramento
- Troubleshooting
Antes de fazer deploy, certifique-se de ter:
- ✅ Conta no provedor de hosting (Vercel recomendado)
- ✅ Projeto Supabase configurado
- ✅ Credenciais OAuth do Google
- ✅ API Key do Google Gemini
- ✅ Instância RabbitMQ (CloudAMQP recomendado para produção)
- ✅ Código testado e funcionando localmente
Crie as seguintes variáveis de ambiente no seu provedor de hosting:
# Autenticação Google OAuth
GOOGLE_CLIENT_ID=seu-google-client-id
GOOGLE_CLIENT_SECRET=seu-google-client-secret
# NextAuth
NEXTAUTH_SECRET=sua-chave-secreta-nextauth-segura
NEXTAUTH_URL=https://seu-dominio.com
# Supabase
SUPABASE_URL=sua-url-supabase
SUPABASE_SERVICE_ROLE_KEY=sua-chave-service-role
# Google Gemini AI
GEMINI_API_KEY=sua-chave-gemini-ai
GEMINI_API_KEY2=sua-chave-gemini-ai-2
# RabbitMQ (CloudAMQP para produção)
RABBITMQ_URL=amqps://usuario:senha@servidor.cloudamqp.com/vhostPara gerar o NEXTAUTH_SECRET:
openssl rand -base64 32A Vercel é o método recomendado para deploy de aplicações Next.js.
-
Conecte seu repositório:
- Acesse vercel.com
- Clique em "New Project"
- Importe seu repositório do GitHub
-
Configure as variáveis de ambiente:
- Na aba "Environment Variables"
- Adicione todas as variáveis listadas acima
- Mantenha separado: Production, Preview, Development
-
Deploy:
- Clique em "Deploy"
- Vercel fará build e deploy automaticamente
# Instalar Vercel CLI
npm i -g vercel
# Login
vercel login
# Deploy para preview
vercel
# Deploy para produção
vercel --prodO worker RabbitMQ (responderWorker.ts) precisa rodar separadamente. Opções:
-
Heroku:
# Criar Procfile echo "worker: npm run start:worker" > Procfile # Deploy git push heroku main
-
Railway:
- Conecte o repositório
- Configure as variáveis de ambiente
- Adicione comando:
npm run start:worker
-
VPS próprio:
# PM2 para gerenciar processos pm2 start npm --name "structlive-worker" -- run start:worker pm2 save pm2 startup
# Instalar CLI
npm install -g netlify-cli
# Deploy
netlify deploy --prodnetlify.toml:
[build]
command = "npm run build"
publish = ".next"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200- Conecte seu repositório GitHub
- Configure variáveis de ambiente
- Railway detecta Next.js automaticamente
- Deploy é feito automaticamente
Dockerfile:
FROM node:20-alpine AS base
# Dependências
FROM base AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
# Build
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Produção
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT=3000
CMD ["node", "server.js"]docker-compose.yml para produção:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
env_file:
- .env.production
restart: unless-stoppedimport type { NextConfig } from "next";
const nextConfig: NextConfig = {
// Imagens otimizadas
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'lh3.googleusercontent.com',
},
],
formats: ['image/avif', 'image/webp'],
},
// Compressão
compress: true,
// ESLint
eslint: {
ignoreDuringBuilds: false, // Em prod, não ignore
},
// TypeScript
typescript: {
ignoreBuildErrors: false, // Em prod, não ignore
},
// Headers de segurança
async headers() {
return [
{
source: '/:path*',
headers: [
{
key: 'X-DNS-Prefetch-Control',
value: 'on'
},
{
key: 'X-Frame-Options',
value: 'SAMEORIGIN'
},
{
key: 'X-Content-Type-Options',
value: 'nosniff'
},
],
},
];
},
};
export default nextConfig;-
Row Level Security (RLS):
- Ative RLS em todas as tabelas
- Configure políticas apropriadas
-
Connection Pooler:
- Use connection pooling em produção
- Configure timeout adequado
- Testes passando:
npm test - Build local funcionando:
npm run build - Sem erros de lint:
npm run lint - Sem erros de TypeScript:
npm run type-check - Variáveis de ambiente configuradas
- Secrets seguros gerados
- URLs de callback OAuth atualizadas
- Database migrations aplicadas
- RabbitMQ configurado e testado
- Domínio customizado configurado (se aplicável)
- SSL/HTTPS configurado
- Monitoramento configurado
Vercel:
- Acesse Deployment → Logs
- Configure integração com Logtail ou similar
Custom VPS:
# PM2
pm2 logs structlive
# Docker
docker logs -f container-nameFerramentas recomendadas:
- Vercel Analytics - Métricas de performance
- Sentry - Error tracking
- Google Analytics - Analytics de usuário
- Uptime Robot - Monitoramento de uptime
npm install @sentry/nextjs
npx @sentry/wizard -i nextjsSolução:
# Limpar cache
rm -rf .next node_modules
npm install
npm run buildCausa: Domínio não está em remotePatterns
Solução: Adicionar domínio em next.config.ts:
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'seu-dominio.com',
},
],
}Solução: Configure a variável com a URL completa:
NEXTAUTH_URL=https://seu-dominio.comVerificações:
- URL do RabbitMQ correta
- Credenciais válidas
- Firewall não bloqueando porta 5672
Debug:
- Verifique logs do servidor
- Verifique variáveis de ambiente
- Teste endpoints API individualmente
- Verifique conexão com Supabase
Na dashboard:
- Acesse "Deployments"
- Encontre deploy anterior estável
- Clique em "..." → "Promote to Production"
Similar: histórico de deploys disponível na dashboard
# Reverter para imagem anterior
docker-compose down
docker-compose up -d --build <commit-hash>- Setup - Configuração local
- Tech Stack - Tecnologias utilizadas
- Architecture - Arquitetura do sistema
Importante: Sempre teste em ambiente de staging antes de deploy em produção! 🛡️