Files
athletic-map-deploy/tenants/plataforma/30-ingress.yaml
T
Athletic Map Deploy ea7da4364a feat(plataforma): tenant proprio da Athletic Map
Namespace, banco, Keycloak e realm proprios, separados dos clientes e do tenant
de demonstracao. Leva 4 contextos (configuracao, cadastro, financeiro, captacao)
mais bff e SPA, e nao os 13 de um cliente: a Athletic Map nao e escolinha.

Ingress escrito do zero, sem o stub backend legado e sem catch-all /api. Duas
rotas publicas, ambas por desenho: /api/public/leads (o formulario da landing
page) e /api/public/webhooks/asaas (o aviso de pagamento, que chega da internet
sem token nosso).

Dominio em *.athleticmap.influxdigital.com.br, e nao no canonico athleticmap.com
do P0.9: aquele ainda nao tem registro A, e com desafio HTTP-01 nascer nele
daria certificado nao emitido e login quebrado.

Tres SealedSecret gerados para ESTE namespace, e a chave publica do backup no
lugar do placeholder. As 7 imagens locais exigidas estao no no, incluindo
servico-captacao:1.0 e atm-pg-backup:1.0, construidas hoje.

Preparado em P3.1 a P3.4. Validado com kubectl --dry-run: 32 documentos.
2026-09-17 17:58:21 +00:00

94 lines
5.1 KiB
YAML

# Ingress do tenant `plataforma`.
#
# ── Por que este arquivo foi escrito, e nao copiado ───────────────────────────
#
# O piloto guarda o Ingress dentro de `30-apps-stubs.yaml`, junto com o stub
# `backend`. Copiar aquele arquivo traria duas coisas que este tenant nao deve
# herdar:
#
# 1. O proprio stub `backend`, que P0.5 mediu nao atender trafego nenhum (11
# requisicoes externas em 50 dias, todas 401) e que esta em fila para ser
# aposentado. Tenant novo nao nasce com divida.
# 2. A rota catch-all `/api` -> `backend`. Aqui nao ha catch-all: o que nao
# casa com um prefixo conhecido devolve 404, que e a resposta honesta.
#
# Os nomes de Service tambem divergem de proposito: o piloto publica `frontend`,
# e aqui o Service se chama `frontend-spa` (veja `95-frontend-spa.yaml`). Copiar
# o do piloto daria um Ingress apontando para um Service inexistente.
#
# ── Por que o dominio e `.influxdigital.com.br`, e nao `.athleticmap.com` ─────
#
# O canonico decidido com o usuario em 2026-09-16 (P0.9) e
# `<tenant>.athleticmap.com`. Ele ainda NAO vale, e nascer nele hoje quebraria
# justamente o criterio deste card ("login funciona"):
#
# - `plataforma.athleticmap.com` e `auth-plataforma.athleticmap.com` nao tem
# registro A nenhum (conferido em 2026-09-17 por nslookup);
# - o apex `athleticmap.com` resolve para 72.61.42.87, que NAO e o cluster —
# o cluster e 187.77.37.184;
# - cert-manager usa desafio HTTP-01, entao sem o host resolvindo para o
# cluster o certificado nao e emitido, e sem certificado nao ha login.
#
# Ja `*.athleticmap.influxdigital.com.br` e wildcard para o cluster (conferido:
# ate um subdominio inventado resolve para 187.77.37.184). Entao este tenant
# sobe hoje e atravessa o corte de dominio junto com os demais, no passo 5 do
# `docs/p09-plano-de-corte-dominio.md` — e nao numa migracao propria.
#
# ── As rotas publicas ────────────────────────────────────────────────────────
#
# Duas, e ambas por desenho:
#
# `/api/public/leads` quem preenche o formulario da landing page
# ainda nao e cliente, e portanto nao tem token.
# `/api/public/webhooks/asaas` o aviso de pagamento chega dos servidores do
# provedor, que tambem nao tem token nosso; quem
# autentica e o cabecalho `asaas-access-token`.
#
# Nenhuma outra rota esta aberta, e nao ha catch-all — o que significa que uma
# rota publica NOVA em qualquer servico precisa ser acrescentada aqui a mao, ou
# devolve 404. O `scripts/conferir_rotas_publicas.py` existe para isso nao
# depender de alguem lembrar.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: plataforma
namespace: plataforma-prod
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
traefik.ingress.kubernetes.io/router.middlewares: plataforma-prod-redirect-https@kubernetescrd
spec:
ingressClassName: traefik
tls:
- hosts:
- plataforma.athleticmap.influxdigital.com.br
- auth-plataforma.athleticmap.influxdigital.com.br
secretName: plataforma-tls
rules:
- host: plataforma.athleticmap.influxdigital.com.br
http:
paths:
# PUBLICA — sem token, por desenho. Vem primeiro porque o Traefik
# ordena por tamanho do prefixo, mas deixar explicito evita que alguem
# reordene sem perceber.
- { path: /api/public/leads, pathType: Prefix, backend: { service: { name: servico-captacao, port: { number: 80 } } } }
# PUBLICA — o aviso de pagamento do Asaas, que chega da internet sem
# token nenhum (P3.3). NAO casa com /api/financeiro: o controlador
# atende em /api/public/webhooks/asaas, e como aqui nao ha catch-all,
# a ausencia desta linha daria 404 em todo aviso — a cobranca seria
# paga e nunca baixada. Quem autentica e o cabecalho
# `asaas-access-token`, conferido no WebhookAsaasController.
- { path: /api/public/webhooks/asaas, pathType: Prefix, backend: { service: { name: servico-financeiro, port: { number: 80 } } } }
# O resto exige token, como em qualquer tenant.
- { path: /api/configuracao, pathType: Prefix, backend: { service: { name: servico-configuracao, port: { number: 80 } } } }
- { path: /api/cadastro, pathType: Prefix, backend: { service: { name: servico-cadastro, port: { number: 80 } } } }
- { path: /api/financeiro, pathType: Prefix, backend: { service: { name: servico-financeiro, port: { number: 80 } } } }
- { path: /bff, pathType: Prefix, backend: { service: { name: servico-bff, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: auth-plataforma.athleticmap.influxdigital.com.br
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }