🌐 Gerenciador de Subdomínios e DNS (Hostinger)
O Subdominio.Manager é a solução de gerenciamento multitenancy de rede e identidade visual da plataforma Clube67. Ele centraliza o apontamento automático de DNS e a personalização visual dos tenants em um console web de alta performance.
🎨 1. Identidade & Subdomínios (SaaS Multitenancy)
Este módulo controla a marca visual de cada cliente (tenant) da rede Clube67 e automatiza o apontamento do seu subdomínio correspondente.
⚙️ Fluxo de Funcionamento e Persistência
Quando um novo subdomínio é registrado através do painel:
- Validação de Nível Único: O sistema valida o nome do host via RegExp (
/^[a-zA-Z0-9][-a-zA-Z0-9]*$/) para evitar subdomínios aninhados (ex:cliente.dev.scoreodonto.com), garantindo compatibilidade estrita com certificados SSL. - Criação de Zona DNS (Hostinger): O backend realiza uma requisição
PUTpara a API de Desenvolvedores da Hostinger (https://developers.hostinger.com/api/dns/v1/zones/{domain}), injetando o novo registro (padrão tipoAapontando para o IP da VPS 1). - Persistência de Branding (PostgreSQL): Caso a Hostinger retorne sucesso, o sistema salva os metadados de identidade visual na tabela
brandingdo banco de dadossubdominiono PostgreSQL local:- Logo URL: URL da imagem do logotipo do cliente.
- Cores Primária & Secundária: Paleta de cores em formato hexadecimal para estilização em tempo de execução.
- Título & Descrição: Utilizados dinamicamente para injeção de SEO e Meta Tags.
- Favicon URL: Ícone personalizado da aba do navegador.
🗑️ Exclusão Sincronizada (Cleanup Automático)
Para evitar registros de DNS órfãos e desperdício de recursos, a exclusão de um subdomínio é sincronizada:
- O backend lê as informações de apontamento do banco de dados.
- Dispara uma requisição
DELETEpara a API da Hostinger, removendo o registro DNS correspondente. - Remove os registros correspondentes da tabela
subdomainsebrandingno banco de dados local.
☁️ 2. DNS Real-Time (Hostinger)
Uma aba administrativa com conexão direta à zona de DNS dos domínios da Hostinger, funcionando como um console de controle em tempo real.
🌟 Funcionalidades Principais
- Query em Tempo Real: Listagem instantânea de toda a tabela de DNS do domínio direto dos servidores da Hostinger (sem cache local).
- Filtros Dinâmicos: Filtro reativo por tipos de registros (A, CNAME, TXT, MX, NS) e busca em tempo real por host ou conteúdo.
- Console de Inserção: Permite adicionar qualquer registro DNS customizado (como chaves de verificação TXT do Google Search Console ou servidores de e-mail MX).
- Remoção Instantânea: Um clique no ícone de lixeira dispara a remoção imediata do registro na API da Hostinger.
🏗️ 3. Arquitetura Técnica e Deploy GitOps
O painel foi estruturado para suportar atualizações em milissegundos e estabilidade máxima.
📦 Estrutura de Docker Compose
Ambos os microsserviços utilizam montagem direta de volumes (Host ➜ Container) em vez de compilação de código dentro de imagens estáticas:
- Frontend: Executa sobre
nginx:alpineoficial, montando a pasta./frontend/diste o arquivonginx.confcomo volumes de leitura. - Backend: Roda diretamente no
node:20-alpine, montando a pasta./backendinteira e iniciando comnode server.js.
🚚 Fluxo de Promoção (GitOps)
Quando o script de deploy mestre deploy-prod-builder.sh é acionado na VPS 4 (Laboratório):
- Compila o frontend React/TS localmente gerando a pasta
/dist. - Sincroniza arquivos de infraestrutura (
docker-compose.yml,nginx.confe scripts) viarsyncpara a VPS 1. - Despacha o backend atualizado e a pasta
/distcompilada. - O container do Docker Nginx e Node.js refletem as alterações instantaneamente na hora, com tempo de inatividade zero.
🔐 4. Segurança de Credenciais
Todas as comunicações com a Hostinger exigem uma HOSTINGER_API_KEY válida. O sistema protege essa chave de duas formas:
- Configuração via Env: A chave é carregada do arquivo
.envdo backend em produção. - Configuração Dinâmica: O administrador pode fornecer a chave em tempo de execução através da interface de fallback. A chave fica salva em memória no backend protegida por CORS, sem nunca ser exposta ao cliente frontend ou ao código do navegador.