Docs

05 — Deploy e Infraestrutura

Ambientes

AmbientePropósitoBranchURLs
LocalDev—localhost (app :3001, service :3002, website :3000, backoffice :3003, hasura :8080)
ProduçãoClientesmaster*.vectorgen.ai

Backend único: apps/service (NestJS, :3002 / service.vectorgen.ai) atende app e backoffice. Não há um segundo API só para admin — o SPA apps/backoffice chama o mesmo service com client=backoffice e rotas /admin/* (gate por BACKOFFICE_ADMIN_EMAILS). Hasura GraphQL também é compartilhado; permissões diferem por JWT/role.

UIPorta localDomínio prodAPI
apps/app:3001app.vectorgen.aiservice + Hasura
apps/backoffice:3003backoffice.vectorgen.aimesmo service + Hasura
apps/website:3000vectorgen.aiservice (planos/health) quando necessário
apps/service:3002service.vectorgen.ai— (API REST)
Hasura:8080api.vectorgen.ai— (GraphQL)

Fonte canônica de domínios: packages/brand/src/config.ts → domains. Uso obrigatório e integração por app: 10-brand-kit.

Produção

./scripts/prod/server-ssh.sh 'docker ps'
pnpm server:docker -- logs --tail 100 vectorgen-service

Setup one-time: adicionar chave SSH default ao droplet na criação; definir SERVER_IP no .env.

Containers principais

ContainerFunção
vectorgen-postgresPostgreSQL
vectorgen-pgbouncerConnection pooler (porta 6432)
vectorgen-redisRedis
vectorgen-hasuraGraphQL
vectorgen-serviceAPI
vectorgen-appDashboard
vectorgen-backofficeAdmin interno
vectorgen-websiteMarketing

Fonte: cloud/dokploy/apps.json — 8 Applications (postgres, redis, pgbouncer, hasura, service, app, backoffice, website). Sem Compose em produção. Aplicar no painel: pnpm dokploy:validate → pnpm dokploy:sync (ver cloud/dokploy/README.md).

Deploy: push em master → Dokploy rebuild das Applications afetadas (GitHub App webhook).

Ordem completa: postgres → redis → pgbouncer → hasura → service → app → backoffice → website

pnpm dokploy:validate
pnpm dokploy:deploy   # requer DOKPLOY_* no .env
pnpm dokploy:health
./cloud/dokploy/deploy-hooks.sh env-templates production

Apps — portas e health checks

Frontend App (apps/app)

  • Porta: 3001
  • Domínio prod: app.vectorgen.ai
  • Build: pnpm run build
  • Start: node server.js
  • Health: http://localhost:3001/healthz

Variáveis: VITE_API_URL, VITE_HASURA_GRAPHQL_URL, VITE_LOGO_URL, VITE_APP_NAME, VITE_GOOGLE_CLIENT_ID

Backoffice (apps/backoffice)

  • Porta: 3003
  • Domínio prod: backoffice.vectorgen.ai
  • Build: pnpm run build
  • Start: node server.js
  • Health: http://localhost:3003/healthz

Variáveis: VITE_API_URL, VITE_HASURA_GRAPHQL_URL, VITE_LOGO_URL, VITE_APP_NAME, VITE_GOOGLE_CLIENT_ID

Backend Service (apps/service)

  • Porta: 3002
  • Build: pnpm run build
  • Start: pnpm start
  • Health: http://localhost:3002/health

Variáveis: NODE_ENV, PORT, DATABASE_URL, HASURA_GRAPHQL_ENDPOINT, HASURA_ADMIN_SECRET, JWT_SECRET

Website (apps/website)

  • Porta: 3000
  • Build: pnpm run build
  • Start: node server.js
  • Health: http://localhost:3000/healthz

Variáveis: NODE_ENV, PORT, NEXT_PUBLIC_API_URL

Deploy com Docker (local / manual)

docker build -f apps/app/Dockerfile -t vectorgen-app:latest .
docker build -f apps/backoffice/Dockerfile -t vectorgen-backoffice:latest .
docker build -f apps/service/Dockerfile -t vectorgen-service:latest .
docker build -f apps/website/Dockerfile -t vectorgen-website:latest .

Ordem recomendada: service → app → backoffice → website

Deploy produção (Dokploy)

Primeira vez (greenfield): cloud/BOOTSTRAP.md — DO, Dokploy install, GitHub, prompts IA.

Deploy contínuo (infra já no ar):

  1. Push / merge em master
  2. Dokploy build + deploy por app (webhook GitHub App; ou pnpm dokploy:deploy)
  3. Health checks (matriz completa em 07-security-observability):
    • hasura: /healthz
    • service: /health
    • app: /healthz
    • backoffice: /healthz
    • website: /healthz
pnpm dokploy:health
DOKPLOY_HEALTH_JSON=1 pnpm dokploy:health
./scripts/prod/server-ssh.sh 'docker ps'

Guia completo: cloud/BOOTSTRAP.md (greenfield) · cloud/README.md · Por serviço: cloud/apps/ · Dokploy: cloud/dokploy/README.md

Variáveis de ambiente

  • Nunca commitar .env
  • .env.example por app
  • Secrets via Dokploy / painel

Verificação pós-deploy

  • Health checks respondendo
  • Logs sem erros
  • URLs acessíveis
  • Variáveis configuradas

Troubleshooting

ProblemaAções
Build falhaDependências, path do Dockerfile, logs do build
App não iniciaEnv vars, logs, porta
Health check falhaEndpoint existe, timeout, processo rodando

Runbooks

Rollback

<!-- Documentar passos -->

Postgres backup

<!-- Frequency, restore -->

Incidente service down

  1. docker logs vectorgen-service --tail 100 (ou pnpm server:docker -- logs --tail 100 vectorgen-service)
  2. Verificar postgres/redis
  3. Se P0/P1: o alerta WhatsWave "VG · Critical alert" já deve ter notificado o founder — seguir playbook em 07-security-observability § Incident response

Links relacionados