Pular para conteúdo

Visão Geral da Arquitetura

Diagrama

graph TB
    subgraph "Frontend"
        LP[Landing Page]
        AD[Admin Dashboard]
        SD[Student Dashboard]
        CH[Chat Interface]
        CK[Stripe Checkout]
    end

    subgraph "Django 6.0 Backend"
        URLS[URL Router]
        VIEWS[Class Based Views]
        MODELS[Models / ORM]
        MW[Middleware]
        AUTH[Email Auth Backend]
        WH[Webhook Handler]
    end

    subgraph "AI Engine"
        RAG[RAG Pipeline]
        VS[FAISS Vector Store]
        EMB[OpenAI Embeddings]
        LG[LangGraph StateGraph]
    end

    subgraph "External Services"
        OAI[OpenAI API]
        STRIPE[Stripe API]
        STRIPE_WH[Stripe Webhooks]
        STRIPE_CP[Stripe Customer Portal]
    end

    subgraph "Data Layer"
        DB[(SQLite / PostgreSQL)]
        FS[File System - PDFs/MD]
        RD[(Redis Cache/Sessions)]
    end

    subgraph "Infraestrutura Docker"
        NGX[Nginx Reverse Proxy]
        APP[App Réplicas]
        DOCS[MkDocs :8001]
        SENTRY[Sentry Monitoramento]
    end

    LP & AD & SD & CH --> NGX --> APP
    APP --> URLS --> VIEWS --> MODELS --> DB
    VIEWS --> RAG --> VS --> EMB
    VIEWS --> STRIPE
    VIEWS --> RD
    MW --> VIEWS
    APP --> SENTRY
    CK --> STRIPE
    STRIPE_WH --> WH --> MODELS
    AD --> STRIPE_CP

Fluxos Stripe

sequenceDiagram
    participant Admin as Admin/Aluno
    participant App as Django App
    participant Stripe as Stripe API
    participant WH as Webhook Handler

    Note over Admin,WH: Fluxo de Assinatura (Escola)
    Admin->>App: POST /escola/plano/checkout/
    App->>Stripe: create_subscription_checkout()
    Stripe-->>Admin: Redirect → Stripe Checkout
    Admin->>Stripe: Paga via cartão
    Stripe->>WH: checkout.session.completed
    WH->>App: Atualiza Subscription (plan, status=active)

    Note over Admin,WH: Fluxo de Compra de Créditos (Aluno)
    Admin->>App: POST /conta/creditos/
    App->>Stripe: create_credit_checkout()
    Stripe-->>Admin: Redirect → Stripe Checkout
    Admin->>Stripe: Paga via cartão/PIX/boleto
    Stripe->>WH: checkout.session.completed
    Stripe->>WH: checkout.session.completed
    WH->>App: Cria MessagePurchase + libera créditos

Controle de Acesso aos Arquivos de Mídia (Segurança)

Os arquivos (attachments do chat e RAG documents) são estritamente privados: - O Nginx NÃO serve diretamente os arquivos .pdf, .txt, .csv, .png que estão dentro de uploads da plataforma. - A rota media/<path> é roteada para a view protected_media no Django (core.urls). - Apenas usuários autenticados (@login_required) e donos do recurso podem abrir ou baixar o arquivo: - agents/*: Apenas o owner que fez upload do documento. - chats/*: Apenas o student (aluno) dono da sessão de chat. - reports/*: Apenas o autor do report. - Qualquer usuário sem acesso receberá um HTTP 404, ocultando até mesmo a real existência do arquivo no disco.

Tecnologias

Componente Tecnologia
Framework Django 6.0 + Python 3.14
IA/RAG LangChain 1.2, LangGraph 1.1, OpenAI
Vector Store FAISS (local em disco por agente)
Banco (dev) SQLite
Banco (prod) PostgreSQL 16
Cache/Sessões Redis 7
Proxy/LB Nginx
WSGI Gunicorn
Static files WhiteNoise
Pagamentos Stripe (Checkout, Webhooks, Customer Portal)
Monitoramento Sentry
Documentação MkDocs Material