From c7ee642017305969847049c2f952c6e874d4007f Mon Sep 17 00:00:00 2001 From: deploy Date: Sat, 26 Sep 2026 16:27:25 +0000 Subject: [PATCH] =?UTF-8?q?feat(tenants):=20BFF=20funde=20no=20pod=20do=20?= =?UTF-8?q?frontend-spa=20(P4.6)=20=E2=80=94=20Service=20fica,=20so=20o=20?= =?UTF-8?q?selector=20muda;=20Garmin=20e=20Prometheus=20continuam=20aponta?= =?UTF-8?q?ndo=20pro=20mesmo=20nome?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../escolinha-de-teste-2/90-servico-bff.yaml | 90 +++---------------- .../escolinha-de-teste-2/95-frontend-spa.yaml | 72 +++++++++++---- .../escolinha-de-teste/90-servico-bff.yaml | 90 +++---------------- .../escolinha-de-teste/95-frontend-spa.yaml | 72 +++++++++++---- tenants/zico-0/90-servico-bff.yaml | 90 +++---------------- tenants/zico-0/95-frontend-spa.yaml | 72 +++++++++++---- 6 files changed, 192 insertions(+), 294 deletions(-) diff --git a/tenants/escolinha-de-teste-2/90-servico-bff.yaml b/tenants/escolinha-de-teste-2/90-servico-bff.yaml index 48b9428..5cf2a33 100644 --- a/tenants/escolinha-de-teste-2/90-servico-bff.yaml +++ b/tenants/escolinha-de-teste-2/90-servico-bff.yaml @@ -1,84 +1,14 @@ # ============================================================================= -# O BFF do tenant. -# -# POR QUE ELE EXISTE AQUI, E NAO COMO BIBLIOTECA -# -# A SPA chama o BFF para quase tudo. Sem ele, `/bff` devolve 502 e o sistema -# abre vazio — foi o que aconteceu nos dois primeiros tenants provisionados, em -# 2026-09-24. As tres saidas estavam registradas desde 2026-09-18; o dono -# escolheu o quinto Deployment, que e o unico que entrega sem refatorar um -# componente que ja roda em producao em dois lugares. -# -# O PRECO ESTA NA COTA, e nao aqui: cinco Deployments precisam de mais que oito -# pods durante um rollout. Ver 00-namespace-quota-netpol.yaml. -# -# AS URLS APONTAM PARA OS RUNTIMES, e nao para os treze servicos: e esta a -# diferenca entre este molde e o `escolinha`. O mapa e o mesmo dos poms: -# core configuracao, cadastro, organizacao, documentos, agenda -# operacao planejamento, campeonato, administrativo, financeiro -# saude saude, nutricao, assistencia-social, pedagogico +# So o Service. O Deployment foi FUNDIDO no pod do frontend-spa (P4.6, +# 2026-09-26) — ver 95-frontend-spa.yaml, segundo container. Esta linha +# de servico continua existindo porque: +# 1. tenants/escolinha/96-ingress-garmin-public.yaml aponta DIRETO +# para este Service (o webhook do Garmin nao passa pelo nginx); +# 2. o Prometheus raspa por ele (athleticmap.io/metricas: tenant). +# O `selector` mudou de `app: servico-bff` para o rotulo do pod +# fundido (athleticmap.io/bff-aqui); nome e porta do Service NAO mudaram — o +# Ingress do Garmin nao precisou de nenhuma edicao. # ============================================================================= -apiVersion: apps/v1 -kind: Deployment -metadata: - name: servico-bff - namespace: escolinha-de-teste-2-prod - labels: - app: servico-bff - athleticmap.io/contexto: bff -spec: - replicas: 1 - selector: { matchLabels: { app: servico-bff } } - template: - metadata: - labels: - app: servico-bff - athleticmap.io/contexto: bff - spec: - containers: - - name: servico-bff - image: docker.io/library/servico-bff:2.0-conta-de-recebimento - imagePullPolicy: Never - ports: [{ containerPort: 8083 }] - env: - - { name: ATM_CONFIG_URL, value: "http://runtime-core" } - - { name: ATM_CADASTRO_URL, value: "http://runtime-core" } - - { name: ATM_ORGANIZACAO_URL, value: "http://runtime-core" } - - { name: ATM_DOCUMENTOS_URL, value: "http://runtime-core" } - - { name: ATM_AGENDA_URL, value: "http://runtime-core" } - - { name: ATM_PLANEJAMENTO_URL, value: "http://runtime-operacao" } - - { name: ATM_CAMPEONATO_URL, value: "http://runtime-operacao" } - - { name: ATM_ADMINISTRATIVO_URL, value: "http://runtime-operacao" } - - { name: ATM_FINANCEIRO_URL, value: "http://runtime-operacao" } - - { name: ATM_SAUDE_URL, value: "http://runtime-saude" } - - { name: ATM_NUTRICAO_URL, value: "http://runtime-saude" } - - { name: ATM_ASSISTENCIA_SOCIAL_URL, value: "http://runtime-saude" } - - { name: ATM_PEDAGOGICO_URL, value: "http://runtime-saude" } - - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-7/protocol/openid-connect/certs" } - - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-7" } - - { name: ATM_TENANT, value: "escolinha-de-teste-2" } - - { name: ATM_PLANO, value: "bronze" } - # `optional` porque o molde ainda NAO cria este Secret. Sem ele o - # selo de consentimento simplesmente nao e emitido — o BFF sobe e - # funciona (ver SeloDeConsentimento, que trata segredo vazio). No dia - # em que o Secret existir, isto passa a valer sozinho. - - name: ATM_CONSENTIMENTO_SEGREDO - valueFrom: - secretKeyRef: { name: consentimento-selo, key: segredo, optional: true } - resources: - requests: { cpu: 50m, memory: 256Mi } - limits: { cpu: 500m, memory: 512Mi } - readinessProbe: - httpGet: { path: /bff/health, port: 8083 } - initialDelaySeconds: 20 - periodSeconds: 10 - failureThreshold: 30 - livenessProbe: - httpGet: { path: /actuator/health/liveness, port: 8083 } - initialDelaySeconds: 50 - periodSeconds: 20 - failureThreshold: 6 ---- apiVersion: v1 kind: Service metadata: @@ -88,5 +18,5 @@ metadata: app: servico-bff athleticmap.io/metricas: tenant spec: - selector: { app: servico-bff } + selector: { athleticmap.io/bff-aqui: "true" } ports: [{ name: http, port: 80, targetPort: 8083 }] diff --git a/tenants/escolinha-de-teste-2/95-frontend-spa.yaml b/tenants/escolinha-de-teste-2/95-frontend-spa.yaml index dd3714e..efc9573 100644 --- a/tenants/escolinha-de-teste-2/95-frontend-spa.yaml +++ b/tenants/escolinha-de-teste-2/95-frontend-spa.yaml @@ -30,7 +30,7 @@ spec: matchLabels: { app: frontend-spa } template: metadata: - labels: { app: frontend-spa } + labels: { app: frontend-spa, athleticmap.io/bff-aqui: "true" } spec: containers: - name: frontend-spa @@ -43,23 +43,16 @@ spec: - { name: ATM_CLIENT, value: "spa" } - { name: ATM_TENANT, value: "escolinha-de-teste-2" } - { name: ATM_PLANO, value: "bronze" } - # ATENCAO: nao ha Deployment de `servico-bff` neste molde — sao - # quatro, e nenhum e o BFF. Este endereco NAO RESOLVE, e todo /bff - # devolve 502. Ver a pendencia no diario; o molde ainda nao pode ser - # aplicado a um tenant por causa disto. Deixado apontando para o nome - # antigo de proposito: apagar a linha esconderia o buraco. - # NOME COMPLETO, e nao o curto. A diferenca nao e estetica. - # - # O nginx roteia /bff e /api com proxy_pass de VARIAVEL, e ai ele - # resolve por requisicao usando a diretiva resolver. E o resolver do - # nginx NAO le os dominios de busca do /etc/resolv.conf: ele pergunta - # o nome cru ao CoreDNS, que responde NXDOMAIN para servico-bff. - # - # O sintoma e 502 com could not be resolved (3: Host not found) no log - # do nginx — enquanto getent hosts servico-bff DENTRO do mesmo pod - # resolve, porque o getent usa o search. Medido em 2026-09-24; e por - # isso que o escolinha sempre usou FQDN aqui, e este molde nao usava. - - { name: ATM_BFF_URL, value: "http://servico-bff.escolinha-de-teste-2-prod.svc.cluster.local" } + # P4.6 fechado 2026-09-26: o BFF e o SEGUNDO CONTAINER deste + # mesmo pod (ver abaixo, depois do frontend-spa) — nao tem + # Deployment proprio. `127.0.0.1` porque os dois containers + # de um pod compartilham a rede; nao precisa de Service nem + # de `resolver` (isso so vale para nome de Service, que exige + # DNS). O Service `servico-bff` continua existindo (o webhook + # do Garmin do escolinha aponta direto para ele, e o Prometheus + # tambem) — so o `selector` dele mudou, para o rotulo + # `athleticmap.io/bff-aqui` deste pod. + - { name: ATM_BFF_URL, value: "http://127.0.0.1:8083" } # /api por GRUPO DE CONTEXTO, e nao um destino so. # @@ -89,6 +82,49 @@ spec: httpGet: { path: /, port: 80 } initialDelaySeconds: 5 periodSeconds: 10 + - name: servico-bff + image: docker.io/library/servico-bff:2.0-conta-de-recebimento + imagePullPolicy: Never + ports: [{ containerPort: 8083 }] + env: + - { name: ATM_CONFIG_URL, value: "http://runtime-core" } + - { name: ATM_CADASTRO_URL, value: "http://runtime-core" } + - { name: ATM_ORGANIZACAO_URL, value: "http://runtime-core" } + - { name: ATM_DOCUMENTOS_URL, value: "http://runtime-core" } + - { name: ATM_AGENDA_URL, value: "http://runtime-core" } + - { name: ATM_PLANEJAMENTO_URL, value: "http://runtime-operacao" } + - { name: ATM_CAMPEONATO_URL, value: "http://runtime-operacao" } + - { name: ATM_ADMINISTRATIVO_URL, value: "http://runtime-operacao" } + - { name: ATM_FINANCEIRO_URL, value: "http://runtime-operacao" } + - { name: ATM_SAUDE_URL, value: "http://runtime-saude" } + - { name: ATM_NUTRICAO_URL, value: "http://runtime-saude" } + - { name: ATM_ASSISTENCIA_SOCIAL_URL, value: "http://runtime-saude" } + - { name: ATM_PEDAGOGICO_URL, value: "http://runtime-saude" } + - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-7/protocol/openid-connect/certs" } + - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-7" } + - { name: ATM_TENANT, value: "escolinha-de-teste-2" } + - { name: ATM_PLANO, value: "bronze" } + # `optional` porque o molde ainda NAO cria este Secret. Sem ele o + # selo de consentimento simplesmente nao e emitido — o BFF sobe e + # funciona (ver SeloDeConsentimento, que trata segredo vazio). No dia + # em que o Secret existir, isto passa a valer sozinho. + - name: ATM_CONSENTIMENTO_SEGREDO + valueFrom: + secretKeyRef: { name: consentimento-selo, key: segredo, optional: true } + resources: + requests: { cpu: 50m, memory: 256Mi } + limits: { cpu: 500m, memory: 512Mi } + readinessProbe: + httpGet: { path: /bff/health, port: 8083 } + initialDelaySeconds: 20 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: { path: /actuator/health/liveness, port: 8083 } + initialDelaySeconds: 50 + periodSeconds: 20 + failureThreshold: 6 + volumes: - name: publico projected: diff --git a/tenants/escolinha-de-teste/90-servico-bff.yaml b/tenants/escolinha-de-teste/90-servico-bff.yaml index f3300a9..f2d7af2 100644 --- a/tenants/escolinha-de-teste/90-servico-bff.yaml +++ b/tenants/escolinha-de-teste/90-servico-bff.yaml @@ -1,84 +1,14 @@ # ============================================================================= -# O BFF do tenant. -# -# POR QUE ELE EXISTE AQUI, E NAO COMO BIBLIOTECA -# -# A SPA chama o BFF para quase tudo. Sem ele, `/bff` devolve 502 e o sistema -# abre vazio — foi o que aconteceu nos dois primeiros tenants provisionados, em -# 2026-09-24. As tres saidas estavam registradas desde 2026-09-18; o dono -# escolheu o quinto Deployment, que e o unico que entrega sem refatorar um -# componente que ja roda em producao em dois lugares. -# -# O PRECO ESTA NA COTA, e nao aqui: cinco Deployments precisam de mais que oito -# pods durante um rollout. Ver 00-namespace-quota-netpol.yaml. -# -# AS URLS APONTAM PARA OS RUNTIMES, e nao para os treze servicos: e esta a -# diferenca entre este molde e o `escolinha`. O mapa e o mesmo dos poms: -# core configuracao, cadastro, organizacao, documentos, agenda -# operacao planejamento, campeonato, administrativo, financeiro -# saude saude, nutricao, assistencia-social, pedagogico +# So o Service. O Deployment foi FUNDIDO no pod do frontend-spa (P4.6, +# 2026-09-26) — ver 95-frontend-spa.yaml, segundo container. Esta linha +# de servico continua existindo porque: +# 1. tenants/escolinha/96-ingress-garmin-public.yaml aponta DIRETO +# para este Service (o webhook do Garmin nao passa pelo nginx); +# 2. o Prometheus raspa por ele (athleticmap.io/metricas: tenant). +# O `selector` mudou de `app: servico-bff` para o rotulo do pod +# fundido (athleticmap.io/bff-aqui); nome e porta do Service NAO mudaram — o +# Ingress do Garmin nao precisou de nenhuma edicao. # ============================================================================= -apiVersion: apps/v1 -kind: Deployment -metadata: - name: servico-bff - namespace: escolinha-de-teste-prod - labels: - app: servico-bff - athleticmap.io/contexto: bff -spec: - replicas: 1 - selector: { matchLabels: { app: servico-bff } } - template: - metadata: - labels: - app: servico-bff - athleticmap.io/contexto: bff - spec: - containers: - - name: servico-bff - image: docker.io/library/servico-bff:2.0-conta-de-recebimento - imagePullPolicy: Never - ports: [{ containerPort: 8083 }] - env: - - { name: ATM_CONFIG_URL, value: "http://runtime-core" } - - { name: ATM_CADASTRO_URL, value: "http://runtime-core" } - - { name: ATM_ORGANIZACAO_URL, value: "http://runtime-core" } - - { name: ATM_DOCUMENTOS_URL, value: "http://runtime-core" } - - { name: ATM_AGENDA_URL, value: "http://runtime-core" } - - { name: ATM_PLANEJAMENTO_URL, value: "http://runtime-operacao" } - - { name: ATM_CAMPEONATO_URL, value: "http://runtime-operacao" } - - { name: ATM_ADMINISTRATIVO_URL, value: "http://runtime-operacao" } - - { name: ATM_FINANCEIRO_URL, value: "http://runtime-operacao" } - - { name: ATM_SAUDE_URL, value: "http://runtime-saude" } - - { name: ATM_NUTRICAO_URL, value: "http://runtime-saude" } - - { name: ATM_ASSISTENCIA_SOCIAL_URL, value: "http://runtime-saude" } - - { name: ATM_PEDAGOGICO_URL, value: "http://runtime-saude" } - - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-6/protocol/openid-connect/certs" } - - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-6" } - - { name: ATM_TENANT, value: "escolinha-de-teste" } - - { name: ATM_PLANO, value: "bronze" } - # `optional` porque o molde ainda NAO cria este Secret. Sem ele o - # selo de consentimento simplesmente nao e emitido — o BFF sobe e - # funciona (ver SeloDeConsentimento, que trata segredo vazio). No dia - # em que o Secret existir, isto passa a valer sozinho. - - name: ATM_CONSENTIMENTO_SEGREDO - valueFrom: - secretKeyRef: { name: consentimento-selo, key: segredo, optional: true } - resources: - requests: { cpu: 50m, memory: 256Mi } - limits: { cpu: 500m, memory: 512Mi } - readinessProbe: - httpGet: { path: /bff/health, port: 8083 } - initialDelaySeconds: 20 - periodSeconds: 10 - failureThreshold: 30 - livenessProbe: - httpGet: { path: /actuator/health/liveness, port: 8083 } - initialDelaySeconds: 50 - periodSeconds: 20 - failureThreshold: 6 ---- apiVersion: v1 kind: Service metadata: @@ -88,5 +18,5 @@ metadata: app: servico-bff athleticmap.io/metricas: tenant spec: - selector: { app: servico-bff } + selector: { athleticmap.io/bff-aqui: "true" } ports: [{ name: http, port: 80, targetPort: 8083 }] diff --git a/tenants/escolinha-de-teste/95-frontend-spa.yaml b/tenants/escolinha-de-teste/95-frontend-spa.yaml index 7dd9cae..cc16821 100644 --- a/tenants/escolinha-de-teste/95-frontend-spa.yaml +++ b/tenants/escolinha-de-teste/95-frontend-spa.yaml @@ -30,7 +30,7 @@ spec: matchLabels: { app: frontend-spa } template: metadata: - labels: { app: frontend-spa } + labels: { app: frontend-spa, athleticmap.io/bff-aqui: "true" } spec: containers: - name: frontend-spa @@ -43,23 +43,16 @@ spec: - { name: ATM_CLIENT, value: "spa" } - { name: ATM_TENANT, value: "escolinha-de-teste" } - { name: ATM_PLANO, value: "bronze" } - # ATENCAO: nao ha Deployment de `servico-bff` neste molde — sao - # quatro, e nenhum e o BFF. Este endereco NAO RESOLVE, e todo /bff - # devolve 502. Ver a pendencia no diario; o molde ainda nao pode ser - # aplicado a um tenant por causa disto. Deixado apontando para o nome - # antigo de proposito: apagar a linha esconderia o buraco. - # NOME COMPLETO, e nao o curto. A diferenca nao e estetica. - # - # O nginx roteia /bff e /api com proxy_pass de VARIAVEL, e ai ele - # resolve por requisicao usando a diretiva resolver. E o resolver do - # nginx NAO le os dominios de busca do /etc/resolv.conf: ele pergunta - # o nome cru ao CoreDNS, que responde NXDOMAIN para servico-bff. - # - # O sintoma e 502 com could not be resolved (3: Host not found) no log - # do nginx — enquanto getent hosts servico-bff DENTRO do mesmo pod - # resolve, porque o getent usa o search. Medido em 2026-09-24; e por - # isso que o escolinha sempre usou FQDN aqui, e este molde nao usava. - - { name: ATM_BFF_URL, value: "http://servico-bff.escolinha-de-teste-prod.svc.cluster.local" } + # P4.6 fechado 2026-09-26: o BFF e o SEGUNDO CONTAINER deste + # mesmo pod (ver abaixo, depois do frontend-spa) — nao tem + # Deployment proprio. `127.0.0.1` porque os dois containers + # de um pod compartilham a rede; nao precisa de Service nem + # de `resolver` (isso so vale para nome de Service, que exige + # DNS). O Service `servico-bff` continua existindo (o webhook + # do Garmin do escolinha aponta direto para ele, e o Prometheus + # tambem) — so o `selector` dele mudou, para o rotulo + # `athleticmap.io/bff-aqui` deste pod. + - { name: ATM_BFF_URL, value: "http://127.0.0.1:8083" } # /api por GRUPO DE CONTEXTO, e nao um destino so. # @@ -89,6 +82,49 @@ spec: httpGet: { path: /, port: 80 } initialDelaySeconds: 5 periodSeconds: 10 + - name: servico-bff + image: docker.io/library/servico-bff:2.0-conta-de-recebimento + imagePullPolicy: Never + ports: [{ containerPort: 8083 }] + env: + - { name: ATM_CONFIG_URL, value: "http://runtime-core" } + - { name: ATM_CADASTRO_URL, value: "http://runtime-core" } + - { name: ATM_ORGANIZACAO_URL, value: "http://runtime-core" } + - { name: ATM_DOCUMENTOS_URL, value: "http://runtime-core" } + - { name: ATM_AGENDA_URL, value: "http://runtime-core" } + - { name: ATM_PLANEJAMENTO_URL, value: "http://runtime-operacao" } + - { name: ATM_CAMPEONATO_URL, value: "http://runtime-operacao" } + - { name: ATM_ADMINISTRATIVO_URL, value: "http://runtime-operacao" } + - { name: ATM_FINANCEIRO_URL, value: "http://runtime-operacao" } + - { name: ATM_SAUDE_URL, value: "http://runtime-saude" } + - { name: ATM_NUTRICAO_URL, value: "http://runtime-saude" } + - { name: ATM_ASSISTENCIA_SOCIAL_URL, value: "http://runtime-saude" } + - { name: ATM_PEDAGOGICO_URL, value: "http://runtime-saude" } + - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-6/protocol/openid-connect/certs" } + - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-6" } + - { name: ATM_TENANT, value: "escolinha-de-teste" } + - { name: ATM_PLANO, value: "bronze" } + # `optional` porque o molde ainda NAO cria este Secret. Sem ele o + # selo de consentimento simplesmente nao e emitido — o BFF sobe e + # funciona (ver SeloDeConsentimento, que trata segredo vazio). No dia + # em que o Secret existir, isto passa a valer sozinho. + - name: ATM_CONSENTIMENTO_SEGREDO + valueFrom: + secretKeyRef: { name: consentimento-selo, key: segredo, optional: true } + resources: + requests: { cpu: 50m, memory: 256Mi } + limits: { cpu: 500m, memory: 512Mi } + readinessProbe: + httpGet: { path: /bff/health, port: 8083 } + initialDelaySeconds: 20 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: { path: /actuator/health/liveness, port: 8083 } + initialDelaySeconds: 50 + periodSeconds: 20 + failureThreshold: 6 + volumes: - name: publico projected: diff --git a/tenants/zico-0/90-servico-bff.yaml b/tenants/zico-0/90-servico-bff.yaml index 3da32ab..abd2659 100644 --- a/tenants/zico-0/90-servico-bff.yaml +++ b/tenants/zico-0/90-servico-bff.yaml @@ -1,84 +1,14 @@ # ============================================================================= -# O BFF do tenant. -# -# POR QUE ELE EXISTE AQUI, E NAO COMO BIBLIOTECA -# -# A SPA chama o BFF para quase tudo. Sem ele, `/bff` devolve 502 e o sistema -# abre vazio — foi o que aconteceu nos dois primeiros tenants provisionados, em -# 2026-09-24. As tres saidas estavam registradas desde 2026-09-18; o dono -# escolheu o quinto Deployment, que e o unico que entrega sem refatorar um -# componente que ja roda em producao em dois lugares. -# -# O PRECO ESTA NA COTA, e nao aqui: cinco Deployments precisam de mais que oito -# pods durante um rollout. Ver 00-namespace-quota-netpol.yaml. -# -# AS URLS APONTAM PARA OS RUNTIMES, e nao para os treze servicos: e esta a -# diferenca entre este molde e o `escolinha`. O mapa e o mesmo dos poms: -# core configuracao, cadastro, organizacao, documentos, agenda -# operacao planejamento, campeonato, administrativo, financeiro -# saude saude, nutricao, assistencia-social, pedagogico +# So o Service. O Deployment foi FUNDIDO no pod do frontend-spa (P4.6, +# 2026-09-26) — ver 95-frontend-spa.yaml, segundo container. Esta linha +# de servico continua existindo porque: +# 1. tenants/escolinha/96-ingress-garmin-public.yaml aponta DIRETO +# para este Service (o webhook do Garmin nao passa pelo nginx); +# 2. o Prometheus raspa por ele (athleticmap.io/metricas: tenant). +# O `selector` mudou de `app: servico-bff` para o rotulo do pod +# fundido (athleticmap.io/bff-aqui); nome e porta do Service NAO mudaram — o +# Ingress do Garmin nao precisou de nenhuma edicao. # ============================================================================= -apiVersion: apps/v1 -kind: Deployment -metadata: - name: servico-bff - namespace: zico-0-prod - labels: - app: servico-bff - athleticmap.io/contexto: bff -spec: - replicas: 1 - selector: { matchLabels: { app: servico-bff } } - template: - metadata: - labels: - app: servico-bff - athleticmap.io/contexto: bff - spec: - containers: - - name: servico-bff - image: docker.io/library/servico-bff:2.0-conta-de-recebimento - imagePullPolicy: Never - ports: [{ containerPort: 8083 }] - env: - - { name: ATM_CONFIG_URL, value: "http://runtime-core" } - - { name: ATM_CADASTRO_URL, value: "http://runtime-core" } - - { name: ATM_ORGANIZACAO_URL, value: "http://runtime-core" } - - { name: ATM_DOCUMENTOS_URL, value: "http://runtime-core" } - - { name: ATM_AGENDA_URL, value: "http://runtime-core" } - - { name: ATM_PLANEJAMENTO_URL, value: "http://runtime-operacao" } - - { name: ATM_CAMPEONATO_URL, value: "http://runtime-operacao" } - - { name: ATM_ADMINISTRATIVO_URL, value: "http://runtime-operacao" } - - { name: ATM_FINANCEIRO_URL, value: "http://runtime-operacao" } - - { name: ATM_SAUDE_URL, value: "http://runtime-saude" } - - { name: ATM_NUTRICAO_URL, value: "http://runtime-saude" } - - { name: ATM_ASSISTENCIA_SOCIAL_URL, value: "http://runtime-saude" } - - { name: ATM_PEDAGOGICO_URL, value: "http://runtime-saude" } - - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-8/protocol/openid-connect/certs" } - - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-8" } - - { name: ATM_TENANT, value: "zico-0" } - - { name: ATM_PLANO, value: "bronze" } - # `optional` porque o molde ainda NAO cria este Secret. Sem ele o - # selo de consentimento simplesmente nao e emitido — o BFF sobe e - # funciona (ver SeloDeConsentimento, que trata segredo vazio). No dia - # em que o Secret existir, isto passa a valer sozinho. - - name: ATM_CONSENTIMENTO_SEGREDO - valueFrom: - secretKeyRef: { name: consentimento-selo, key: segredo, optional: true } - resources: - requests: { cpu: 50m, memory: 256Mi } - limits: { cpu: 500m, memory: 512Mi } - readinessProbe: - httpGet: { path: /bff/health, port: 8083 } - initialDelaySeconds: 20 - periodSeconds: 10 - failureThreshold: 30 - livenessProbe: - httpGet: { path: /actuator/health/liveness, port: 8083 } - initialDelaySeconds: 50 - periodSeconds: 20 - failureThreshold: 6 ---- apiVersion: v1 kind: Service metadata: @@ -88,5 +18,5 @@ metadata: app: servico-bff athleticmap.io/metricas: tenant spec: - selector: { app: servico-bff } + selector: { athleticmap.io/bff-aqui: "true" } ports: [{ name: http, port: 80, targetPort: 8083 }] diff --git a/tenants/zico-0/95-frontend-spa.yaml b/tenants/zico-0/95-frontend-spa.yaml index e5074fb..931e975 100644 --- a/tenants/zico-0/95-frontend-spa.yaml +++ b/tenants/zico-0/95-frontend-spa.yaml @@ -30,7 +30,7 @@ spec: matchLabels: { app: frontend-spa } template: metadata: - labels: { app: frontend-spa } + labels: { app: frontend-spa, athleticmap.io/bff-aqui: "true" } spec: containers: - name: frontend-spa @@ -43,23 +43,16 @@ spec: - { name: ATM_CLIENT, value: "spa" } - { name: ATM_TENANT, value: "zico-0" } - { name: ATM_PLANO, value: "bronze" } - # ATENCAO: nao ha Deployment de `servico-bff` neste molde — sao - # quatro, e nenhum e o BFF. Este endereco NAO RESOLVE, e todo /bff - # devolve 502. Ver a pendencia no diario; o molde ainda nao pode ser - # aplicado a um tenant por causa disto. Deixado apontando para o nome - # antigo de proposito: apagar a linha esconderia o buraco. - # NOME COMPLETO, e nao o curto. A diferenca nao e estetica. - # - # O nginx roteia /bff e /api com proxy_pass de VARIAVEL, e ai ele - # resolve por requisicao usando a diretiva resolver. E o resolver do - # nginx NAO le os dominios de busca do /etc/resolv.conf: ele pergunta - # o nome cru ao CoreDNS, que responde NXDOMAIN para servico-bff. - # - # O sintoma e 502 com could not be resolved (3: Host not found) no log - # do nginx — enquanto getent hosts servico-bff DENTRO do mesmo pod - # resolve, porque o getent usa o search. Medido em 2026-09-24; e por - # isso que o escolinha sempre usou FQDN aqui, e este molde nao usava. - - { name: ATM_BFF_URL, value: "http://servico-bff.zico-0-prod.svc.cluster.local" } + # P4.6 fechado 2026-09-26: o BFF e o SEGUNDO CONTAINER deste + # mesmo pod (ver abaixo, depois do frontend-spa) — nao tem + # Deployment proprio. `127.0.0.1` porque os dois containers + # de um pod compartilham a rede; nao precisa de Service nem + # de `resolver` (isso so vale para nome de Service, que exige + # DNS). O Service `servico-bff` continua existindo (o webhook + # do Garmin do escolinha aponta direto para ele, e o Prometheus + # tambem) — so o `selector` dele mudou, para o rotulo + # `athleticmap.io/bff-aqui` deste pod. + - { name: ATM_BFF_URL, value: "http://127.0.0.1:8083" } # /api por GRUPO DE CONTEXTO, e nao um destino so. # @@ -89,6 +82,49 @@ spec: httpGet: { path: /, port: 80 } initialDelaySeconds: 5 periodSeconds: 10 + - name: servico-bff + image: docker.io/library/servico-bff:2.0-conta-de-recebimento + imagePullPolicy: Never + ports: [{ containerPort: 8083 }] + env: + - { name: ATM_CONFIG_URL, value: "http://runtime-core" } + - { name: ATM_CADASTRO_URL, value: "http://runtime-core" } + - { name: ATM_ORGANIZACAO_URL, value: "http://runtime-core" } + - { name: ATM_DOCUMENTOS_URL, value: "http://runtime-core" } + - { name: ATM_AGENDA_URL, value: "http://runtime-core" } + - { name: ATM_PLANEJAMENTO_URL, value: "http://runtime-operacao" } + - { name: ATM_CAMPEONATO_URL, value: "http://runtime-operacao" } + - { name: ATM_ADMINISTRATIVO_URL, value: "http://runtime-operacao" } + - { name: ATM_FINANCEIRO_URL, value: "http://runtime-operacao" } + - { name: ATM_SAUDE_URL, value: "http://runtime-saude" } + - { name: ATM_NUTRICAO_URL, value: "http://runtime-saude" } + - { name: ATM_ASSISTENCIA_SOCIAL_URL, value: "http://runtime-saude" } + - { name: ATM_PEDAGOGICO_URL, value: "http://runtime-saude" } + - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-8/protocol/openid-connect/certs" } + - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-8" } + - { name: ATM_TENANT, value: "zico-0" } + - { name: ATM_PLANO, value: "bronze" } + # `optional` porque o molde ainda NAO cria este Secret. Sem ele o + # selo de consentimento simplesmente nao e emitido — o BFF sobe e + # funciona (ver SeloDeConsentimento, que trata segredo vazio). No dia + # em que o Secret existir, isto passa a valer sozinho. + - name: ATM_CONSENTIMENTO_SEGREDO + valueFrom: + secretKeyRef: { name: consentimento-selo, key: segredo, optional: true } + resources: + requests: { cpu: 50m, memory: 256Mi } + limits: { cpu: 500m, memory: 512Mi } + readinessProbe: + httpGet: { path: /bff/health, port: 8083 } + initialDelaySeconds: 20 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: { path: /actuator/health/liveness, port: 8083 } + initialDelaySeconds: 50 + periodSeconds: 20 + failureThreshold: 6 + volumes: - name: publico projected: