diff --git a/tenants/acme/30-apps-stubs.yaml b/tenants/acme/30-apps-stubs.yaml index 31a75b1..303f6a9 100644 --- a/tenants/acme/30-apps-stubs.yaml +++ b/tenants/acme/30-apps-stubs.yaml @@ -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/ 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 } } } } diff --git a/tenants/acme/96-ingress-garmin-public.yaml b/tenants/acme/96-ingress-garmin-public.yaml index 0a71fc2..8f7d68e 100644 --- a/tenants/acme/96-ingress-garmin-public.yaml +++ b/tenants/acme/96-ingress-garmin-public.yaml @@ -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 diff --git a/tenants/demo/30-apps-stubs.yaml b/tenants/demo/30-apps-stubs.yaml index 48ec042..f73e700 100644 --- a/tenants/demo/30-apps-stubs.yaml +++ b/tenants/demo/30-apps-stubs.yaml @@ -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/ 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 } } } } diff --git a/tenants/demo/96-ingress-garmin-public.yaml b/tenants/demo/96-ingress-garmin-public.yaml index efe7fa6..0429f8f 100644 --- a/tenants/demo/96-ingress-garmin-public.yaml +++ b/tenants/demo/96-ingress-garmin-public.yaml @@ -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 diff --git a/tenants/escolinha/30-apps-stubs.yaml b/tenants/escolinha/30-apps-stubs.yaml index 1a0788d..96e6bc6 100644 --- a/tenants/escolinha/30-apps-stubs.yaml +++ b/tenants/escolinha/30-apps-stubs.yaml @@ -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/ 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 } } } } diff --git a/tenants/escolinha/96-ingress-garmin-public.yaml b/tenants/escolinha/96-ingress-garmin-public.yaml index 3479650..1ae7664 100644 --- a/tenants/escolinha/96-ingress-garmin-public.yaml +++ b/tenants/escolinha/96-ingress-garmin-public.yaml @@ -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 diff --git a/tenants/piloto/30-apps-stubs.yaml b/tenants/piloto/30-apps-stubs.yaml index 49f9251..2724996 100644 --- a/tenants/piloto/30-apps-stubs.yaml +++ b/tenants/piloto/30-apps-stubs.yaml @@ -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/ 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 } } } } diff --git a/tenants/piloto/96-ingress-garmin-public.yaml b/tenants/piloto/96-ingress-garmin-public.yaml index 96678c1..b4ee680 100644 --- a/tenants/piloto/96-ingress-garmin-public.yaml +++ b/tenants/piloto/96-ingress-garmin-public.yaml @@ -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 diff --git a/tenants/plataforma/30-ingress.yaml b/tenants/plataforma/30-ingress.yaml index a508ee1..7f47312 100644 --- a/tenants/plataforma/30-ingress.yaml +++ b/tenants/plataforma/30-ingress.yaml @@ -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 } } } }