feat(P0.9): fase HOSTS — os cinco tenants passam a atender os DOIS dominios

Aditiva de proposito: nenhum endereco antigo sai. Quem esta usando
<tenant>.athleticmap.influxdigital.com.br continua entrando, e o cert-manager
passa a emitir tambem o certificado de <tenant>.athleticmap.com.

Foi possivel porque o dono criou o curinga hoje: *.athleticmap.com resolve para
187.77.37.184, conferido com um nome ALEATORIO — demo. ou www. responderiam
mesmo sem curinga, e a conferencia passaria por engano.

9 arquivos, 28 trocas, 317 insercoes e 4 remocoes. As 4 sao as linhas de TLS em
fluxo, reescritas com os dois dominios na mesma lista.

Cada regra de Ingress foi DUPLICADA com os mesmos paths, e nao trocada: uma
regra com host: X so atende X.

`platform/` (ArgoCD e Grafana) fica FORA: mexer no Ingress do ArgoCD no meio de
uma migracao de dominio e perder o instrumento de rollback.

Conferido antes de aplicar: YAML valido em todos os Ingress, e ZERO host sem
entrada de TLS.

O que NAO muda aqui: ATM_ISSUER, ATM_KC_URL e as URLs do Garmin. Ninguem e
deslogado nesta fase.
This commit is contained in:
deploy
2026-09-23 11:35:48 +00:00
parent 80489672b0
commit 440ade90f5
9 changed files with 317 additions and 4 deletions
+28
View File
@@ -47,7 +47,9 @@ spec:
tls:
- hosts:
- acme.athleticmap.influxdigital.com.br
- acme.athleticmap.com
- auth-acme.athleticmap.influxdigital.com.br
- auth-acme.athleticmap.com
secretName: acme-tls
rules:
- host: acme.athleticmap.influxdigital.com.br
@@ -71,7 +73,33 @@ spec:
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: acme.athleticmap.com
http:
paths:
# P4.6: o nginx da SPA resolve /bff e /api/<contexto> por dentro.
#
# Ate 2026-09-22 havia UMA linha por contexto aqui, mais o /bff — catorze
# ao todo. Cada mudanca de topologia obrigava a editar o Ingress de todos
# os tenants; agora quem conhece a topologia interna e o
# `frontend/nginx.conf.template`, que viaja junto com a imagem.
#
# O destino deste /api mudou de `backend` (o legado) para `frontend-spa`.
# **O que o visitante ve NAO muda:** um caminho nao mapeado continua
# recebendo 401 — antes do backend legado, agora do BFF, para onde o
# nginx manda o /api que sobra. A decisao "401 ou 404" segue aberta e
# intacta; isto so tira o legado do caminho do trafego.
#
# ORDEM: `/api/public` e `/api/public/webhooks/asaas` vivem no
# `96-ingress-garmin-public.yaml` e tem prefixo MAIS LONGO, entao vencem
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: auth-acme.athleticmap.influxdigital.com.br
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
- host: auth-acme.athleticmap.com
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
+36 -1
View File
@@ -9,7 +9,7 @@ metadata:
spec:
ingressClassName: traefik
tls:
- hosts: [acme.athleticmap.influxdigital.com.br]
- hosts: [acme.athleticmap.influxdigital.com.br, acme.athleticmap.com]
secretName: acme-tls
rules:
- host: acme.athleticmap.influxdigital.com.br
@@ -46,3 +46,38 @@ spec:
name: servico-bff
port:
number: 80
- host: acme.athleticmap.com
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
service:
name: servico-bff
port:
number: 80
+28
View File
@@ -47,7 +47,9 @@ spec:
tls:
- hosts:
- demo.athleticmap.influxdigital.com.br
- demo.athleticmap.com
- auth-demo.athleticmap.influxdigital.com.br
- auth-demo.athleticmap.com
secretName: demo-tls
rules:
- host: demo.athleticmap.influxdigital.com.br
@@ -71,7 +73,33 @@ spec:
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: demo.athleticmap.com
http:
paths:
# P4.6: o nginx da SPA resolve /bff e /api/<contexto> por dentro.
#
# Ate 2026-09-22 havia UMA linha por contexto aqui, mais o /bff — catorze
# ao todo. Cada mudanca de topologia obrigava a editar o Ingress de todos
# os tenants; agora quem conhece a topologia interna e o
# `frontend/nginx.conf.template`, que viaja junto com a imagem.
#
# O destino deste /api mudou de `backend` (o legado) para `frontend-spa`.
# **O que o visitante ve NAO muda:** um caminho nao mapeado continua
# recebendo 401 — antes do backend legado, agora do BFF, para onde o
# nginx manda o /api que sobra. A decisao "401 ou 404" segue aberta e
# intacta; isto so tira o legado do caminho do trafego.
#
# ORDEM: `/api/public` e `/api/public/webhooks/asaas` vivem no
# `96-ingress-garmin-public.yaml` e tem prefixo MAIS LONGO, entao vencem
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: auth-demo.athleticmap.influxdigital.com.br
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
- host: auth-demo.athleticmap.com
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
+36 -1
View File
@@ -9,7 +9,7 @@ metadata:
spec:
ingressClassName: traefik
tls:
- hosts: [demo.athleticmap.influxdigital.com.br]
- hosts: [demo.athleticmap.influxdigital.com.br, demo.athleticmap.com]
secretName: demo-tls
rules:
- host: demo.athleticmap.influxdigital.com.br
@@ -46,3 +46,38 @@ spec:
name: servico-bff
port:
number: 80
- host: demo.athleticmap.com
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
service:
name: servico-bff
port:
number: 80
+28
View File
@@ -47,7 +47,9 @@ spec:
tls:
- hosts:
- escolinha.athleticmap.influxdigital.com.br
- escolinha.athleticmap.com
- auth-escolinha.athleticmap.influxdigital.com.br
- auth-escolinha.athleticmap.com
secretName: escolinha-tls
rules:
- host: escolinha.athleticmap.influxdigital.com.br
@@ -71,7 +73,33 @@ spec:
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: escolinha.athleticmap.com
http:
paths:
# P4.6: o nginx da SPA resolve /bff e /api/<contexto> por dentro.
#
# Ate 2026-09-22 havia UMA linha por contexto aqui, mais o /bff — catorze
# ao todo. Cada mudanca de topologia obrigava a editar o Ingress de todos
# os tenants; agora quem conhece a topologia interna e o
# `frontend/nginx.conf.template`, que viaja junto com a imagem.
#
# O destino deste /api mudou de `backend` (o legado) para `frontend-spa`.
# **O que o visitante ve NAO muda:** um caminho nao mapeado continua
# recebendo 401 — antes do backend legado, agora do BFF, para onde o
# nginx manda o /api que sobra. A decisao "401 ou 404" segue aberta e
# intacta; isto so tira o legado do caminho do trafego.
#
# ORDEM: `/api/public` e `/api/public/webhooks/asaas` vivem no
# `96-ingress-garmin-public.yaml` e tem prefixo MAIS LONGO, entao vencem
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: auth-escolinha.athleticmap.influxdigital.com.br
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
- host: auth-escolinha.athleticmap.com
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
@@ -9,7 +9,7 @@ metadata:
spec:
ingressClassName: traefik
tls:
- hosts: [escolinha.athleticmap.influxdigital.com.br]
- hosts: [escolinha.athleticmap.influxdigital.com.br, escolinha.athleticmap.com]
secretName: escolinha-tls
rules:
- host: escolinha.athleticmap.influxdigital.com.br
@@ -46,3 +46,38 @@ spec:
name: servico-bff
port:
number: 80
- host: escolinha.athleticmap.com
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
service:
name: servico-bff
port:
number: 80
+28
View File
@@ -47,7 +47,9 @@ spec:
tls:
- hosts:
- piloto.athleticmap.influxdigital.com.br
- piloto.athleticmap.com
- auth-piloto.athleticmap.influxdigital.com.br
- auth-piloto.athleticmap.com
secretName: piloto-tls
rules:
- host: piloto.athleticmap.influxdigital.com.br
@@ -71,7 +73,33 @@ spec:
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: piloto.athleticmap.com
http:
paths:
# P4.6: o nginx da SPA resolve /bff e /api/<contexto> por dentro.
#
# Ate 2026-09-22 havia UMA linha por contexto aqui, mais o /bff — catorze
# ao todo. Cada mudanca de topologia obrigava a editar o Ingress de todos
# os tenants; agora quem conhece a topologia interna e o
# `frontend/nginx.conf.template`, que viaja junto com a imagem.
#
# O destino deste /api mudou de `backend` (o legado) para `frontend-spa`.
# **O que o visitante ve NAO muda:** um caminho nao mapeado continua
# recebendo 401 — antes do backend legado, agora do BFF, para onde o
# nginx manda o /api que sobra. A decisao "401 ou 404" segue aberta e
# intacta; isto so tira o legado do caminho do trafego.
#
# ORDEM: `/api/public` e `/api/public/webhooks/asaas` vivem no
# `96-ingress-garmin-public.yaml` e tem prefixo MAIS LONGO, entao vencem
# este — o Traefik ordena por tamanho. Conferido.
- { path: /api, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: auth-piloto.athleticmap.influxdigital.com.br
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
- host: auth-piloto.athleticmap.com
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }
+36 -1
View File
@@ -9,7 +9,7 @@ metadata:
spec:
ingressClassName: traefik
tls:
- hosts: [piloto.athleticmap.influxdigital.com.br]
- hosts: [piloto.athleticmap.influxdigital.com.br, piloto.athleticmap.com]
secretName: piloto-tls
rules:
- host: piloto.athleticmap.influxdigital.com.br
@@ -46,3 +46,38 @@ spec:
name: servico-bff
port:
number: 80
- host: piloto.athleticmap.com
http:
paths:
# O webhook de PAGAMENTO do Asaas, ANTES do /api/public generico.
#
# Aquele manda tudo de /api/public para o `servico-bff`, e o BFF NAO tem
# controlador para esta rota — so o financeiro tem
# (`WebhookAsaasController`). O BFF relaya o Garmin de proposito; o Asaas,
# nao. Sem esta linha o aviso de pagamento morre no BFF, e o sintoma e o
# pior possivel: **a cobranca e paga e nunca baixada**, sem erro do nosso
# lado — o provedor so registra uma entrega recusada.
#
# O Traefik ordena por TAMANHO do prefixo, entao esta (26 caracteres) vence
# `/api/public` (11) sozinha. Fica escrita primeiro mesmo assim, para
# ninguem reordenar sem perceber.
#
# `servico-financeiro` e o Service; num tenant consolidado ele aponta para
# o `runtime-operacao`, que e onde o financeiro roda de verdade.
#
# Quem autentica e o cabecalho `asaas-access-token`, no controlador.
- path: /api/public/webhooks/asaas
pathType: Prefix
backend:
service:
name: servico-financeiro
port:
number: 80
- path: /api/public
pathType: Prefix
backend:
service:
name: servico-bff
port:
number: 80
+61
View File
@@ -61,7 +61,9 @@ spec:
tls:
- hosts:
- plataforma.athleticmap.influxdigital.com.br
- plataforma.athleticmap.com
- auth-plataforma.athleticmap.influxdigital.com.br
- auth-plataforma.athleticmap.com
secretName: plataforma-tls
rules:
- host: plataforma.athleticmap.influxdigital.com.br
@@ -118,7 +120,66 @@ spec:
- { path: /bff, pathType: Prefix, backend: { service: { name: servico-bff, port: { number: 80 } } } }
- { path: /, pathType: Prefix, backend: { service: { name: frontend-spa, port: { number: 80 } } } }
- host: plataforma.athleticmap.com
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 — a tela de espera depois do pagamento (P5.8). Quem acabou de
# pagar AINDA NAO TEM CONTA, logo nao tem token: se esta rota exigisse
# um, a tela que existe para tranquilizar quem pagou seria a primeira a
# recusa-lo.
#
# O que ela entrega e deliberadamente pouco: se a conta ficou pronta e
# o endereco do tenant. Nem nome, nem e-mail, nem plano, nem realm — o
# id da assinatura na URL e a unica "credencial" da tela, e ha teste
# guardando esse limite. Acrescentar um campo aqui e acrescentar o que
# um link vazado entrega.
#
# Estava PREPARADA e nao publicada desde 2026-09-19: o controlador
# existe (`EstadoDaContaController`) e a cadeia ja a liberava
# (`SecurityConfig`, permitAll), mas sem esta linha o Ingress devolvia
# 404 — nao ha catch-all aqui, por desenho.
- { path: /api/public/conta, pathType: Prefix, backend: { service: { name: servico-captacao, port: { number: 80 } } } }
# PUBLICA — o aviso de ASSINATURA do Asaas (P5.1), que e outra coisa do
# `/api/public/webhooks/asaas` logo abaixo: aquele avisa que uma COBRANCA
# de cliente foi paga e vai para o financeiro do tenant; este avisa que
# alguem assinou a Athletic Map, e e o que dispara o provisionamento de
# um tenant NOVO. Contas diferentes no Asaas, servicos diferentes aqui.
#
# Chega da internet sem token nosso; quem autentica e o
# `PLATAFORMA_WEBHOOK_TOKEN`, conferido no `WebhookDeAssinatura`. Sem o
# segredo selado, o endpoint RECUSA tudo de proposito, e o log diz isso.
#
# Sem esta linha o Ingress devolvia 404: alguem assinaria, pagaria, e
# nenhum tenant seria criado — sem erro em lugar nenhum do nosso lado.
- { path: /api/public/webhooks/assinatura, 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 } } } }
- host: auth-plataforma.athleticmap.com
http:
paths:
- { path: /, pathType: Prefix, backend: { service: { name: keycloak, port: { number: 8080 } } } }