📄 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/healthque valida status real de Postgres + Redis + uptime. - Prisma 7 com adapter-pg (novo padrão da v7 — sem
urlno 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 conformedocs/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-pgjá instalados e funcionandosrc/server/db.ts(Prisma Client singleton) — pronto para importarsrc/server/redis.ts(ioredis + clientes para queues/pubsub) — pronto para importarsrc/lib/env.ts(validação zod das env vars) — pronto para importarnext-auth@beta(v5) +@auth/prisma-adapterjá instalados — pronto para configurar rotas[...nextauth]bcryptjs,otplib,qrcodejá instalados — prontos para 2FA e hash de senhanext-intljá 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)
- Limpeza:
pm2 delete 22(sistema-escolar velho), backup tar.gz,rm -rf /home/ubuntu/projetos/sistema-escolar/ - Repo GitHub:
gh auth login(browser) →gh repo create genioon --private --source=. --push - Deploy key VPS:
ssh-keygen ed25519→gh repo deploy-key add --allow-write→git clone git@github.com-genioon:Wellitiz/genioon.git . - Containers:
docker compose -f docker-compose.dev.yml up -d(pg:5434, redis:6380, minio:9100/9101) - App:
npm install→npx prisma generate→npx prisma migrate dev --name init_healthcheck→npm run build→PORT=3020 pm2 start npm --name genioon-dev -- start -- -p 3020 - Nginx: backup do config antigo → novo config com porta 3020 + security headers + rate limits →
nginx -t && sudo systemctl reload nginx - 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
docs/ARQUITETURA.md§1 (visão geral) + §3 (banco) + §7 (RBAC)docs/SEGURANCA_LGPD.md§2 (autenticação) + §3 (criptografia) + §4 (2FA)docs/BANCO_DE_DADOS.md(modelos User, Account, Session, VerificationToken, Branch)decisoes.md(respostas do cliente sobre acesso: login por email OU matrícula, recuperação via WhatsApp, 2FA para MASTER/LOCAL/SUPERVISOR)- 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
Usercompleto (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)
bcryptsalt 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.