Este projeto demonstra como implementar um sistema white label controlado via OpenResty, onde o fluxo de requisições é gerenciado de forma inteligente para servir diferentes identidades visuais baseadas no domínio.
sequenceDiagram
participant User as Usuário
participant OR as OpenResty
participant BE as Backend
participant DB as SQLite
participant FE as Frontend
User->>OR: Acessa domínio (ex: meudominio.com)
OR->>BE: GET /resolve?domain=meudominio.com
BE->>DB: SELECT id FROM domains WHERE name = ?
alt Domínio Encontrado
DB-->>BE: Retorna ID do domínio
BE-->>OR: Status 200 + ID
OR->>OR: Adiciona header X-Domain-ID
OR->>FE: Proxy pass com X-Domain-ID
FE->>FE: Renderiza componente específico
FE-->>User: Página do domínio
else Domínio Não Encontrado
DB-->>BE: Nenhum resultado
BE-->>OR: Status 404
OR->>FE: Redireciona para /not-found
FE-->>User: Página 404
end
O sistema utiliza uma arquitetura em camadas:
meudominio.com
)X-Domain-ID
X-Domain-ID
, renderiza o conteúdo específico daquele domínioEste é um projeto demonstrativo que visa mostrar uma implementação simples e direta de um sistema white label. A arquitetura atual é intencionalmente básica para facilitar o entendimento do conceito, mas existem várias oportunidades de refinamento:
Sistemas white label são comumente utilizados em:
SaaS (Software as a Service)
Marketplaces
Serviços Financeiros
Educação
Serviços de Marketing
.
├── frontend/ # Aplicação SvelteKit
├── backend/ # API Node.js
└── openresty/ # Configurações do OpenResty
/etc/hosts
Configurar Domínios Locais
Adicione os seguintes domínios ao seu arquivo /etc/hosts
:
127.0.0.1 meudominio.com
127.0.0.1 whitelabel.com
127.0.0.1 tiopatinhas.com
127.0.0.1 naoexiste.com
Iniciar os Serviços
docker-compose up
Isso iniciará:
Nota sobre as Portas: Embora o SvelteKit rode na porta 5173, todo o tráfego é gerenciado pelo OpenResty na porta 8080. O OpenResty atua como um proxy reverso, recebendo todas as requisições e encaminhando-as internamente para o serviço apropriado. Isso é necessário porque o OpenResty precisa interceptar todas as requisições para verificar o domínio antes de decidir para onde encaminhar o tráfego.
Domínios Válidos Acesse no navegador:
http://meudominio.com:8080
http://whitelabel.com:8080
http://tiopatinhas.com:8080
Cada um deve mostrar seu conteúdo específico.
Domínio Não Registrado Acesse:
http://naoexiste.com:8080
Você será redirecionado para a página not-found.
O sistema usa SQLite com a seguinte estrutura:
CREATE TABLE domains (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
created_at TEXT NOT NULL
);
Dados de exemplo:
INSERT INTO domains(id, name, created_at) VALUES(1, 'meudominio.com', '2021-01-01');
INSERT INTO domains(id, name, created_at) VALUES(2, 'whitelabel.com', '2021-01-01');
INSERT INTO domains(id, name, created_at) VALUES(3, 'tiopatinhas.com', '2021-01-01');
Se os domínios não estiverem funcionando:
/etc/hosts
foi atualizado corretamentedocker-compose logs openresty
Se o banco de dados não estiver populado:
domains.db
foi criadoSe o frontend não estiver respondendo:
docker-compose ps
docker-compose logs frontend