# ============================================================================= # P5.5 — a entrada do tenant, com certificado automatico. # # ── O MOLDE NAO TINHA INGRESS NENHUM ──────────────────────────────────────── # # Achado em 2026-09-19, ao comecar o card 165: os cinco arquivos do molde # consolidado criavam namespace, tres runtimes e a SPA — e nenhuma entrada. Um # tenant provisionado a partir dele subiria inteiro e **nao seria alcancavel de # fora**, com todos os pods saudaveis. # # ── UMA REGRA SO, E ISSO E O PONTO DE P4.6 ────────────────────────────────── # # O Ingress do `plataforma` tem SETE caminhos: um por contexto, mais o BFF, mais a # SPA. Aqui ha um. O nginx da imagem do frontend roteia `/bff` e `/api` por conta # propria (P4.6), entao a topologia interna deixou de ser problema do Ingress — e # mudar de cinco pods para tres runtimes nao obriga mais a editar o Ingress de # todos os tenants. # # ── SEM HOST DE AUTENTICACAO ──────────────────────────────────────────────── # # O `plataforma` tem um segundo host, `auth-plataforma...`, porque tinha Keycloak # proprio. Com o Keycloak compartilhado (P4.8) o tenant nao tem: a autenticacao # acontece no host da plataforma, e o realm e que separa um cliente do outro. # # ── O CERTIFICADO, E POR QUE HTTP-01 ──────────────────────────────────────── # # `cert-manager.io/cluster-issuer: letsencrypt-prod` — o mesmo que o `plataforma` # ja usa, com desafio HTTP-01. # # A alternativa seria um certificado CURINGA, e ele exigiria desafio DNS-01, e # DNS-01 exige um solver do provedor de DNS. **O provedor e a Hostinger, e o # cert-manager nao tem solver nativo para ela** — seria preciso escrever um # webhook. Conferido em 2026-09-19. # # Com HTTP-01 cada tenant tem o proprio certificado e nao ha solver nenhum a # escrever. O que se precisa do provedor e UMA entrada de DNS curinga # (`*.athleticmap.com` apontando para o cluster), feita uma vez a mao. # # **A ORDEM E OBRIGATORIA:** o host precisa resolver para o cluster ANTES de o # cert-manager pedir o certificado, porque o desafio HTTP-01 e uma requisicao que # a Let's Encrypt faz ao proprio host. Sem o curinga no ar, o certificado fica em # `False` para sempre e o tenant responde so em HTTP. # ============================================================================= apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: redirect-https namespace: teste5-prod spec: redirectScheme: scheme: https permanent: true --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: teste5 namespace: teste5-prod annotations: cert-manager.io/cluster-issuer: letsencrypt-prod # O middleware e por namespace: `-@kubernetescrd`. traefik.ingress.kubernetes.io/router.middlewares: teste5-prod-redirect-https@kubernetescrd spec: ingressClassName: traefik tls: - hosts: - teste5.athleticmap.com secretName: teste5-tls rules: - host: teste5.athleticmap.com http: paths: # UMA rota. O nginx da SPA resolve /bff e /api internamente (P4.6). - { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }