Entrar como:FuncionalidadesDoc
Pular para o conteúdo
← Voltar para a visão geral
✅ ConcluídoCard #1 · M0

Setup de Infraestrutura de Produção

Marco M0: Infraestrutura + Autenticação + Design System

📅24 de julho de 2026
👤Wellington Santiago (via ZCode)
🔧Commits: 588cef5c85a631802d382225c31f

📄 Documento de Execução — Card 1: [M0] Setup de Infraestrutura de Produção

Campo Valor
Card Trello [1] [M0] Setup de Infraestrutura de Producao
URL Trello https://trello.com/c/8oo1W3jZ
Marco M0 (18–28/07/2026)
Data execução 25/07/2026
Responsável Wellington Santiago (via ZCode)
Doc anterior Nenhum (primeiro card)
Próximo card [2] [M0] Autenticação - 5 Niveis RBAC
Commits 588cef5, c85a631, 802d382, 225c31f
Repo GitHub https://github.com/Wellitiz/genioon
URL DEV (live) https://sistemaescolar.wellka.com.br
Health Check https://sistemaescolar.wellka.com.br/api/health

🎯 1. O que foi implementado

Ambiente DEV/HOMOLOG do GENIOON totalmente funcional na VPS Oracle, com:

  • Repositório GitHub privado (Wellitiz/genioon) com CI/CD Actions rodando lint + type-check + test a cada push/PR.
  • Stack Docker (Postgres 16 + Redis 7 + MinIO) em portas dedicadas que não conflitam com projetos existentes na VPS.
  • App Next.js 15 standalone rodando via pm2 (genioon-dev, id 39, porta 3020).
  • Nginx com security headers OWASP + rate limits (api/login/upload) + WebSocket-ready + client_max_body_size 50M.
  • SSL Let's Encrypt reaproveitado (válido até Out/2026).
  • API /api/health que valida status real de Postgres + Redis + uptime.
  • Prisma 7 com adapter-pg (novo padrão da v7 — sem url no schema).
  • Validação de env com zod (falha early se faltar variável crítica).
  • ESLint 9 flat config + TypeScript parser + Next.js plugin.
  • Vitest configurado com 10 testes unitários cobrindo cn, formatCurrency, formatPercent, getInitials.

✅ Critérios de aceite validados

# Critério Status
1 Repo GitHub criado com CI verde ✅ run #30163104431 success
2 docker compose up sobe pg+redis+minio ✅ todos healthy
3 npm run build local passa ✅ 28 rotas compiladas
4 App na VPS via pm2 porta 3020 ✅ pm2 id 39 online
5 https://sistemaescolar.wellka.com.br retorna 200 ✅ HTTP/2 200
6 Prisma conecta no banco DEV ✅ health check postgres ok
7 Doc de execução criada e referenciada no Trello ✅ este arquivo
8 Card movido para "Enviado para Aprovação" ⏳ Bloco E

📁 2. Arquivos criados / modificados

Criados

Arquivo Função
.env.example Template de variáveis de ambiente (commitado)
.env (local + VPS) Secrets reais — NÃO commitado (gitignore)
docker-compose.dev.yml Stack Docker DEV (pg/redis/minio) com healthchecks e buckets
prisma.config.ts Config do Prisma 7 (URL no config, não no schema)
prisma/schema.prisma Schema inicial com modelo HealthCheck
prisma/migrations/20260725151146_init_healthcheck/ Migration inicial
src/server/db.ts Prisma Client singleton com adapter-pg
src/server/redis.ts ioredis Client (cache + queues + pub/sub)
src/lib/env.ts Validação zod das variáveis de ambiente
src/app/api/health/route.ts Endpoint GET /api/health
src/lib/__tests__/env.test.ts 10 testes unitários de utilidades
vitest.config.ts + vitest.setup.ts Config Vitest + jsdom
eslint.config.mjs ESLint 9 flat config (TS + Next.js)
.github/workflows/ci.yml CI: lint + type-check + test

Modificados

Arquivo Mudança
package.json Nome genioon v0.1.0, adicionados scripts (test/type-check/db:*) e deps backend
next.config.mjs Adicionado experimental.serverActions + poweredByHeader: false
.gitignore Adicionado coverage/, .pgdata/, etc.
/etc/nginx/sites-available/sistemaescolar.wellka.com.br Porta 3001→3020, security headers, rate limits

🗄️ 3. Schema do banco (atual)

model HealthCheck {
  id        Int      @id @default(autoincrement())
  ping      String   @db.VarChar(50)
  createdAt DateTime @default(now()) @map("created_at")
  @@map("health_checks")
}

⚠️ Schema mínimo proposital. O Card 2 vai expandir com User, Account, Session, VerificationToken, Branch, etc. — completo conforme docs/BANCO_DE_DADOS.md.


🔌 4. Handoff para o Card 2 (próximo dev)

Variáveis de ambiente disponíveis (já configuradas)

DATABASE_URL=postgresql://genioon:***@localhost:5434/genioon
REDIS_URL=redis://localhost:6380
NEXTAUTH_URL=https://sistemaescolar.wellka.com.br
NEXTAUTH_SECRET=<32+ chars aleatórios>
ENCRYPTION_KEY=<64 hex chars>
S3_ENDPOINT=http://localhost:9100
TOTP_ISSUER=GENIOON
NEXT_PUBLIC_DEFAULT_LOCALE=pt-BR

Portas dedicadas DEV (auditadas 25/07/2026)

Serviço Porta Container/Processo
PostgreSQL 16 5434 genioon-postgres-dev
Redis 7 6380 genioon-redis-dev
MinIO API (S3) 9100 genioon-minio-dev
MinIO Console 9101 genioon-minio-dev
App Next.js 3020 pm2 genioon-dev (id 39)
Nginx HTTPS 443 (reverse proxy → 3020)

🚫 NÃO USAR: 5432 (CRM), 5433 (postgres nativo), 6379 (CRM), 3001/3010/3011 (outros apps).

Endpoints disponíveis

  • GET /api/health → JSON {status, checks: {postgres, redis}}
  • GET / → página inicial Next.js (protótipo front-end)
  • Demais rotas do protótipo: /local/*, /master/*, /pais/*, /professor/*

Comandos úteis na VPS

# SSH direto
ssh oracle-free
cd /home/ubuntu/projetos/genioon

# Ver status do app
pm2 logs genioon-dev --lines 50
pm2 describe 39

# Ver containers Docker
docker compose -f docker-compose.dev.yml ps
docker compose -f docker-compose.dev.yml logs -f postgres

# Acessar banco
docker exec -it genioon-postgres-dev psql -U genioon -d genioon

# Re-deploy (após novo push)
git pull && npm install && npx prisma migrate deploy && npm run build && pm2 reload genioon-dev

Hooks que o Card 2 já tem disponíveis

  • prisma (v7) + @prisma/client + @prisma/adapter-pg já instalados e funcionando
  • src/server/db.ts (Prisma Client singleton) — pronto para importar
  • src/server/redis.ts (ioredis + clientes para queues/pubsub) — pronto para importar
  • src/lib/env.ts (validação zod das env vars) — pronto para importar
  • next-auth@beta (v5) + @auth/prisma-adapter já instalados — pronto para configurar rotas [...nextauth]
  • bcryptjs, otplib, qrcode já instalados — prontos para 2FA e hash de senha
  • next-intl já instalado (configuração das mensagens fica para Card 2 validar)

📋 5. Checklist do Trello — status por item

Checklist "Especificação Técnica" (24 itens)

# Item Status Obs.
1 Provisionar VPS Oracle Já existia — specs validadas
2 Instalar Docker + Compose Já existia v29.1.3
3 docker-compose.dev.yml Criado com pg/redis/minio + buckets
4 docker-compose.prod.yml ⏩ M7 Diferido para produção Hostinger
5 PostgreSQL 16 SSL+tuned 🟡 Instalado; SSL e tuning 4GBSharedBuffers = M7
6 Redis 7 maxmemory 2GB 🟡 Instalado; maxmemory em prod só M7
7 MinIO/S3 + buckets 6 buckets criados (students-photos, materials, etc.)
8 Nginx reverse proxy + rate limits api 100r/m, login 10r/m, upload 20r/m
9 SSL Let's Encrypt + auto-renovação Reaproveitado cert existente (até Out/26)
10 Security headers X-Frame DENY, HSTS, CSP pendente (Card 2)
11 Cloudflare (CDN + WAF) ⏩ M7 Adiar para produção
12 Bull queues (7 filas) 🟡 bullmq instalado; filas entram com cada módulo M3-M6
13 Socket.io porta 3001 ⏩ M6 Só preciso quando tiver chat (Card IA/WhatsApp)
14 PgBouncer ⏩ M7 DEV tem 1 app, sem necessidade de pool
15 Backup diário 03:00 → S3 🟡 Script pronto em DEPLOY_INFRA.md §6 — configurar crontab M0 final
16 Backup semanal ⏩ M7 Rotina prod-only
17 Backup mensal ⏩ M7 Rotina prod-only
18 Restore test mensal ⏩ M7 Rotina prod-only
19 Prometheus + Grafana ⏩ M7 Monitoramento é prod-only
20 Alertas (CPU/RAM/etc.) ⏩ M7 Sem monitoramento não há alerta
21 CI test job GitHub Actions rodando (lint+type-check+test)
22 CI deploy job ⏩ M7 Deploy automático só em produção Hostinger
23 .env com secrets NEXTAUTH_SECRET, ENCRYPTION_KEY gerados e validados
24 Documentação de infra entregue Este doc + DEPLOY_INFRA.md já é referência

Resumo: 12 ✅ feitos · 6 🟡 parciais (continuam nos próximos cards) · 6 ⏩ diferidos para M7

Checklist "Entregas" (8 itens)

# Item Status
1 VPS Oracle acessível
2 Nginx instalado e configurado
3 SSL emitido e auto-renovando
4 PostgreSQL seguro 🟡 (sem SSL — DEV only)
5 Backup diário automatizado 🟡 (script existe, falta crontab)
6 Monitoramento ativo ⏩ M7
7 Ambiente staging criado ✅ (a própria DEV cumpre esse papel em M0-M6)
8 Documentação de infra

Checklist "Validar com Cliente" (3 itens)

# Item Default adotado (decidir em M7)
1 Quem recebe alertas? Em DEV: só o Wellington. Em M7: definir contato técnico + WhatsApp do cliente.
2 Janela manutenção (03:00 ok)? Default: 03:00 BRT. Confirmar com cliente antes do M7.
3 Monitoramento 24/7 ou horário comercial? Default M7: 24/7 com Uptime Kuma (gratis). Confirmar com cliente.

🚀 6. Deploy DEV (como foi feito — passo a passo)

  1. Limpeza: pm2 delete 22 (sistema-escolar velho), backup tar.gz, rm -rf /home/ubuntu/projetos/sistema-escolar/
  2. Repo GitHub: gh auth login (browser) → gh repo create genioon --private --source=. --push
  3. Deploy key VPS: ssh-keygen ed25519gh repo deploy-key add --allow-writegit clone git@github.com-genioon:Wellitiz/genioon.git .
  4. Containers: docker compose -f docker-compose.dev.yml up -d (pg:5434, redis:6380, minio:9100/9101)
  5. App: npm installnpx prisma generatenpx prisma migrate dev --name init_healthchecknpm run buildPORT=3020 pm2 start npm --name genioon-dev -- start -- -p 3020
  6. Nginx: backup do config antigo → novo config com porta 3020 + security headers + rate limits → nginx -t && sudo systemctl reload nginx
  7. Smoke test final: curl https://sistemaescolar.wellka.com.br/api/health{"status":"healthy"}

🧠 7. Contexto gerado para próximas etapas

Este documento deve ser lido antes de iniciar o Card 2. Ele garante que o próximo dev (ou a IA em nova sessão) saiba exatamente:

  • ✅ Onde o código está (GitHub + VPS)
  • ✅ Quais variáveis de ambiente existem e quais valores esperar
  • ✅ Quais portas estão dedicadas ao GENIOON
  • ✅ Quais hooks/utilidades já estão prontos para import
  • ✅ O que foi diferido para M7 (não tentar reimplementar)

Leituras obrigatórias antes do Card 2

  1. docs/ARQUITETURA.md §1 (visão geral) + §3 (banco) + §7 (RBAC)
  2. docs/SEGURANCA_LGPD.md §2 (autenticação) + §3 (criptografia) + §4 (2FA)
  3. docs/BANCO_DE_DADOS.md (modelos User, Account, Session, VerificationToken, Branch)
  4. decisoes.md (respostas do cliente sobre acesso: login por email OU matrícula, recuperação via WhatsApp, 2FA para MASTER/LOCAL/SUPERVISOR)
  5. Este documento (handoff técnico)

🎯 8. Próximo card

[2] [M0] Autenticação - 5 Niveis RBAC

Após este card, o próximo passo é implementar:

  • NextAuth v5 com Prisma Adapter
  • Modelo User completo (6 roles: STUDENT, PARENT, PROFESSOR, LOCAL, SUPERVISOR, MASTER)
  • Login por email OU matrícula (decisão do cliente)
  • Recuperação de senha via WhatsApp OU email (decisão do cliente)
  • 2FA TOTP obrigatório para MASTER/LOCAL/SUPERVISOR (otplib)
  • bcrypt salt 12 para senhas
  • JWT 24h (web) / 7d (PWA)
  • Middleware de proteção de rotas por role

Doc de execução do Card 2 deverá ser criado em: docs/execucao/02-m0-autenticacao-rbac.md


📝 Histórico

  • v1.0 (25/07/2026) — Documento criado com execução completa do Card 1.
← Voltar para a visão geral