feat(tenants): BFF funde no pod do frontend-spa (P4.6) — Service fica, so o selector muda; Garmin e Prometheus continuam apontando pro mesmo nome

This commit is contained in:
deploy
2026-09-26 16:27:25 +00:00
parent a888c05d3c
commit c7ee642017
6 changed files with 192 additions and 294 deletions
@@ -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 }]
@@ -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:
+10 -80
View File
@@ -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 }]
+54 -18
View File
@@ -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:
+10 -80
View File
@@ -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 }]
+54 -18
View File
@@ -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: