# Apps do tenant acme: # - backend: Spring Boot OAuth2 Resource Server (imagem athletic-map-backend:1.0, importada no k3s) # - frontend: SPA OIDC Authorization Code + PKCE (keycloak-js) chamando /api/me # - bff: stub (whoami) — sera substituido na evolucao --- apiVersion: apps/v1 kind: Deployment metadata: { name: backend, namespace: acme-prod, labels: { app: backend } } spec: replicas: 0 selector: { matchLabels: { app: backend } } template: metadata: { labels: { app: backend } } spec: containers: - name: backend image: docker.io/library/athletic-map-backend:1.3 imagePullPolicy: Never env: - { name: ATM_JWK_SET_URI, value: "http://keycloak.plataforma-prod.svc:8080/realms/athleticmap-3/protocol/openid-connect/certs" } - { name: ATM_ISSUER, value: "https://auth.athleticmap.com/realms/athleticmap-3" } - { name: ATM_TENANT, value: "acme" } ports: [{ containerPort: 8083 }] readinessProbe: httpGet: { path: /api/public/health, port: 8083 } initialDelaySeconds: 20 periodSeconds: 10 failureThreshold: 24 --- apiVersion: v1 kind: Service metadata: { name: backend, namespace: acme-prod, labels: { app: backend } } spec: selector: { app: backend } ports: [{ name: http, port: 80, targetPort: 8083 }] --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: acme namespace: acme-prod annotations: cert-manager.io/cluster-issuer: letsencrypt-prod traefik.ingress.kubernetes.io/router.middlewares: acme-prod-redirect-https@kubernetescrd spec: ingressClassName: traefik tls: - hosts: - acme.athleticmap.com secretName: acme-tls rules: - 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 } } } }