# 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 `` | **Alto** | Previne travamentos de tela branca causados por extensões do navegador ou tradução automática do Google Chrome. |