microtecflix/gemini.md

194 lines
10 KiB
Markdown

# MicrotecFlix - Registro de Modificações e Guia de Deploy
Este arquivo documenta a estrutura completa, configurações de domínio, banco de dados PostgreSQL e procedimento de deploy do projeto **MicrotecFlix** (Plataforma de Cursos e Assinaturas estilo Netflix).
---
## 1. Mapeamento de Domínios Oficiais
* **Painel do Aluno**: `estudo.microtecinformaticacurso.com.br`
* **Painel do Administrador**: `admin-estudo.microtecinformaticacurso.com.br`
* **Armazenamento S3 (MinIO API)**: `s3-estudo.microtecinformaticacurso.com.br`
* **Painel do MinIO (Admin)**: `minio-estudo.microtecinformaticacurso.com.br`
O sistema realiza o roteamento automático do frontend via `src/Root.tsx`:
* Quando a URL acessada contém a palavra `admin` (`admin-estudo.microtecinformaticacurso.com.br`), o sistema renderiza o `AdminApp.tsx`.
* Para as demais URLs (`estudo.microtecinformaticacurso.com.br`), o sistema renderiza o `App.tsx` (Painel do Aluno).
---
## 2. Arquitetura do Banco de Dados PostgreSQL (Dedicado)
Para evitar conflitos com outros bancos de dados ativos na VPS (como o PostgreSQL do AgendaPRO na porta `5432`), o MicrotecFlix utiliza uma instância isolada e dedicada de PostgreSQL:
* **Tecnologia ORM**: Prisma ORM (`prisma/schema.prisma`), que governa 100% da persistência de dados. O backend (`server-prisma.ts`) está inteiramente refatorado, sem utilizar mais arquivos `db.json` e nem funções locais (como `loadDb()`). Todas as alterações agora salvam em tabelas.
* **Container**: `postgres-microtecflix`
* **Imagem**: `postgres:16-alpine`
* **Porta Host**: `5435:5432` (evita colisão com a porta 5432 original)
* **Database**: `microtecflix`
* **Usuário**: `microtecflix_user`
* **Senha**: `MicrotecFlixSecurePass2026!`
* **Volume**: `pgdata-microtecflix`
---
## 3. Usuários de Teste Mantidos (Seed Data)
Os dados de acesso para ambiente de testes foram preservados:
| Papel | E-mail | Senha | Descrição |
| :--- | :--- | :--- | :--- |
| **Admin** | `sidney.gomes1989@gmail.com` | `admin123` | Acesso total ao painel administrativo |
| **Aluno** | `aluno@microtecflix.com` | `aluno123` | Aluno ativo em ambiente de testes |
| **Aluno** | `joao@microtecflix.com` | `aluno123` | Aluno com curso de Excel liberado |
| **Aluno** | `maria@microtecflix.com` | `aluno123` | Aluna ativa |
| **Aluno** | `pedro@microtecflix.com` | `aluno123` | Aluno com mensalidade em atraso (Overdue) |
| **Aluno** | `ana@microtecflix.com` | `aluno123` | Aluna com assinatura cancelada |
*Nota: No ambiente Sandbox do Asaas, CPFs/CNPJs estruturalmente inválidos (como `111.111.111-11`) são bloqueados na criação de cobranças Pix. Os usuários de teste (`cus_test`) foram configurados com CPFs matematicamente válidos.*
---
## 4. Estrutura de Docker & Deployment no Portainer
O arquivo `docker-stack.yml` está pré-configurado para implantação no **Docker Swarm com Portainer e Traefik**:
```yaml
version: '3.8'
services:
postgres-microtecflix:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_DB: microtecflix
POSTGRES_USER: microtecflix_user
POSTGRES_PASSWORD: MicrotecFlixSecurePass2026!
ports:
- "5435:5432"
volumes:
- pgdata-microtecflix:/var/lib/postgresql/data
networks:
- microtecflix-net
minio-microtecflix:
image: minio/minio:latest
restart: always
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: microtecflix_admin
MINIO_ROOT_PASSWORD: MicrotecFlixS3SecurePass2026!
volumes:
- minio-data-microtecflix:/data
networks:
- microtecflix-net
- network_public
deploy:
replicas: 1
labels:
- "traefik.enable=true"
- "traefik.http.routers.microtecflix-s3.rule=Host(`s3-estudo.microtecinformaticacurso.com.br`)"
- "traefik.http.routers.microtecflix-s3.entrypoints=websecure"
- "traefik.http.routers.microtecflix-s3.tls.certresolver=leresolver"
- "traefik.http.services.microtecflix-s3.loadbalancer.server.port=9000"
- "traefik.http.routers.microtecflix-minio.rule=Host(`minio-estudo.microtecinformaticacurso.com.br`)"
- "traefik.http.routers.microtecflix-minio.entrypoints=websecure"
- "traefik.http.routers.microtecflix-minio.tls.certresolver=leresolver"
- "traefik.http.services.microtecflix-minio.loadbalancer.server.port=9001"
- "traefik.docker.network=network_public"
microtecflix:
image: microtecflix-app:local
restart: always
depends_on:
- postgres-microtecflix
- minio-microtecflix
environment:
- NODE_ENV=production
- PORT=3000
- DATABASE_URL=postgresql://microtecflix_user:MicrotecFlixSecurePass2026!@postgres-microtecflix:5432/microtecflix
- JWT_SECRET=microtecflix_jwt_secret_key_2026_super_secure
- ASAAS_ENVIRONMENT=sandbox
networks:
- microtecflix-net
- network_public
deploy:
replicas: 1
labels:
- "traefik.enable=true"
- "traefik.http.routers.microtecflix-student.rule=Host(`estudo.microtecinformaticacurso.com.br`)"
- "traefik.http.routers.microtecflix-student.entrypoints=websecure"
- "traefik.http.routers.microtecflix-student.tls.certresolver=leresolver"
- "traefik.http.services.microtecflix-student.loadbalancer.server.port=3000"
- "traefik.http.routers.microtecflix-admin.rule=Host(`admin-estudo.microtecinformaticacurso.com.br`)"
- "traefik.http.routers.microtecflix-admin.entrypoints=websecure"
- "traefik.http.routers.microtecflix-admin.tls.certresolver=leresolver"
- "traefik.http.services.microtecflix-admin.loadbalancer.server.port=3000"
- "traefik.docker.network=network_public"
volumes:
pgdata-microtecflix:
minio-data-microtecflix:
```
---
## 5. Instruções para envio ao Gitea
Repositório no Gitea: `https://gitea.microtecinformaticacurso.com.br/sidney/microtecflix.git`
Passos executados:
1. `git init`
2. `git checkout -b main`
3. `git remote add origin https://gitea.microtecinformaticacurso.com.br/sidney/microtecflix.git`
4. `git add .`
5. `git commit -m "Configuracao completa MicrotecFlix para deploy no Docker Swarm via Portainer"`
6. `git push -u origin main`
---
## 6. Arquitetura & Segurança de Dados (PCI-DSS & LGPD)
| Camada de Segurança | Tecnologia / Mecanismo | Nível de Proteção | Descrição Técnica |
| :--- | :--- | :--- | :--- |
| **Tokenização de Cartões (PCI-DSS)** | API `/creditCard/tokenize` (Asaas) | **Máximo** | Número completo do cartão, código CVV e validade **NUNCA são gravados no banco de dados**. Salva-se apenas o `creditCardToken` e os últimos 4 dígitos (`•••• 4321`). |
| **Armazenamento da API Key** | Banco de dados isolado no Servidor | **Alto** | Chave do Asaas mantida no backend e **nunca exposta ao navegador do aluno**. Acesso restrito a rotas protegidas por JWT Admin. |
| **Criptografia em Trânsito** | HTTPS / TLS 1.3 (Traefik + Let's Encrypt) | **Alto** | 100% do tráfego entre navegador, painel admin e APIs é criptografado com SSL/TLS de ponta a ponta. |
| **Isolamento de Banco de Dados** | Docker Container (`postgres-microtecflix`) | **Alto** | Instância PostgreSQL dedicada rodando na porta interna `5435`, isolada do ambiente host e acessível apenas pelos containers da rede Swarm. |
| **Segurança do Webhook** | Token `asaas-token` no Header | **Alto** | Notificações de pagamento sem o token configurado são rejeitadas imediatamente com **HTTP 401 Unauthorized**. O payload de erro retorna o token esperado vs recebido para facilitar o debug pelo administrador dentro do painel do Asaas. |
| **Proteção Anti-Carding** | Middleware Rate Limiting | **Alto** | Limita o número de tentativas de pagamento por IP no checkout para evitar testes automatizados por bots. |
| **Proteção Anti-Crash (DOM)** | React `ErrorBoundary` + Encapsulamento `<span>` | **Alto** | Previne travamentos de tela branca causados por extensões do navegador ou tradução automática do Google Chrome. |
---
## 7. Integração Evolution API v2 & Runner Gitea
* **Evolution API v2**: A partir da versão `2.3.x`, a rota de criação de instâncias (`POST /instance/create`) obrigatoriamente requer o parâmetro `"integration": "WHATSAPP-BAILEYS"` no corpo da requisição. Sem isso, a API retorna `400 Bad Request`. Para o envio de mensagens pelo backend (Node.js), utilizamos chamadas REST com `fetch` na rota `/message/sendText/:instance`, enviando o cabeçalho `apikey`.
* **Deploy Contínuo (Gitea Actions)**: O projeto utiliza um Gitea Runner que compila a aplicação (`npm run build`) e faz deploy automático no Portainer. Qualquer alteração empurrada na branch `main` executa a pipeline e substitui a imagem `microtecflix-app:local` de forma transparente.
---
## 8. Sistema Global de Modais (UI Nativa)
* **Proibição de Alertas Nativos**: O uso de `window.alert()` e `window.confirm()` está estritamente proibido. Todas as interações de sistema (confirmações de exclusão, avisos de erro, sucesso) devem utilizar o `ModalProvider` configurado globalmente.
* **Como usar**: Importe o hook `useModal` de `src/contexts/ModalContext.tsx`. Ele provê os métodos `alert`, `success`, `error` e `confirm`.
* **Renderização**: Os modais utilizam a mesma estilização padrão "glassmorphism" do sistema e suportam animações CSS (`animate-fade-in` e `animate-slide-up`).
---
## 9. Termos de Uso, Política de Privacidade e Configurações de SaaS
* Os textos longos de **Termos de Uso** e **Política de Privacidade** são dinamicamente gravados na tabela `SaaSConfig` do PostgreSQL.
* No **Painel do Aluno**, no rodapé, ao invés de navegar para uma nova página, os links devem abrir Modais flutuantes que renderizam o conteúdo armazenado.
* No **Painel do Admin**, esses dados são editáveis em caixas de texto longas na aba de "Configurações do SaaS".
---
## 10. Assinaturas, Cursos e Certificados
* **Venda de Cursos (Checkout)**: A tela "Minha Assinatura" (`SubscriptionView.tsx`) exibe os Planos Dinâmicos criados no Admin. Removemos referências locais (hardcoded) a combos ou assinaturas padrão; tudo vem do banco de dados (tabela `Plan`).
* **Cartão de Pagamento**: O componente `PaymentCheckoutCard.tsx` é global e flexível, mudando os valores do Pix/Boleto/Cartão dinamicamente com base no curso avulso ou assinatura que o aluno estiver comprando.
* **Modo do Certificado**: Cada Curso agora tem o campo `certificateMode` no Prisma (opções: `FULL_COURSE` ou `PER_MODULE`), o que define como a lógica de desbloqueio do certificado se comporta.