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 |