Docs

05 — Deploy e Infraestrutura

Ambientes

AmbientePropósitoBranchURLs
LocalDev—localhost (app :3001, service :3002, website :3000, backoffice :3003, hasura :8080)
ProduçãoClientesmain*.framework.forestbit.io

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 framework-service

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

Containers principais

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

Fonte: cloud/dokploy/apps.json — 8 Applications (postgres, redis, pgbouncer, hasura, service, app, backoffice, website). Sem Compose em produção.

Deploy: merge em main → Dokploy rebuild das Applications afetadas.

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

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.framework.forestbit.io
  • Build: pnpm run build
  • Start: node server.js
  • Health: http://localhost:3001/

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.framework.forestbit.io
  • Build: pnpm run build
  • Start: node server.js
  • Health: http://localhost:3003/

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 framework-app:latest .
docker build -f apps/backoffice/Dockerfile -t framework-backoffice:latest .
docker build -f apps/service/Dockerfile -t framework-service:latest .
docker build -f apps/website/Dockerfile -t framework-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. Merge em main
  2. Dokploy build + deploy por app
  3. Health checks:
    • app: /
    • backoffice: /
    • service: /health
    • website: /healthz
    • hasura: /healthz
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

<!-- Frequência, restore -->

Incidente service down

  1. docker logs framework-service --tail 100
  2. Verificar postgres/redis
  3. Escalar para founder se dados em risco

Links relacionados