← Projects

SaaS multi-tenant de sites

Plataforma em FastAPI onde cada cliente tem site, catálogo e painel isolados — com testes de regressão garantindo que um tenant nunca enxergue o outro.

PythonFastAPIJinja2SQLiteDockerJWT
Status
In progress
Year
2026
Context
Produto próprio
SSR
HTML pronto, sem JS obrigatório
Isolamento
Coberto por teste de regressão
SaaS multi-tenant de sites

Project write-up available in Portuguese only for now.

O que é

Uma plataforma onde negócios locais têm site próprio com o que o ramo precisa — catálogo, página de detalhe, contato — e o dono edita sozinho, sem depender de programador para cada troca de texto.

Arquitetura

  • Multi-tenant com isolamento por cliente, banco por tenant e autenticação em JWT.
  • Renderização no servidor com Jinja2, empacotado em Docker.
  • Temas por ramo de atividade, com features ligáveis individualmente por cliente e paleta configurável via CSS custom properties, para que o tema não precise ser duplicado por cor.

Decisões técnicas

SSR em vez de aplicação client-side, de propósito. O cliente desses sites é um negócio local, e o que ele quer é aparecer na busca. Servidor devolvendo HTML completo significa que o buscador não depende de executar JavaScript para ler a página. É uma decisão de produto disfarçada de decisão técnica — e vale mais que qualquer sofisticação de front-end nesse caso.

Isolamento entre tenants é teste, não intenção. Multi-tenant falha silenciosamente: o vazamento de dado entre clientes não quebra nada, só mostra a coisa errada para a pessoa errada. Por isso o isolamento tem teste de regressão próprio, que tenta acessar dado de um tenant autenticado como outro e exige que a resposta seja negada. É o teste que eu rodo primeiro depois de qualquer mudança em consulta.

Tema por CSS custom properties. A alternativa era um tema por cliente, que multiplicaria a manutenção por N. Com variáveis, a paleta é dado, não código.

Estado

Página de detalhe do item concluída — galeria com lightbox em JavaScript puro, navegação por teclado e toque, dados estruturados e chamada de contato. Em desenvolvimento ativo.