From 3a2824bfa86557600c288b407a23926ca84e3b71 Mon Sep 17 00:00:00 2001 From: deploy Date: Sat, 26 Sep 2026 17:06:27 +0000 Subject: [PATCH] chore(plataforma): quatro manifestos ainda em CRLF passam para LF (YAML conferido identico antes/depois) --- tenants/plataforma/07-sealed-asaas.yaml | 86 ++++---- .../plataforma/70-servico-configuracao.yaml | 136 ++++++------- tenants/plataforma/79-servico-financeiro.yaml | 186 +++++++++--------- tenants/plataforma/80-servico-cadastro.yaml | 136 ++++++------- 4 files changed, 272 insertions(+), 272 deletions(-) diff --git a/tenants/plataforma/07-sealed-asaas.yaml b/tenants/plataforma/07-sealed-asaas.yaml index a15462d..b92d61f 100644 --- a/tenants/plataforma/07-sealed-asaas.yaml +++ b/tenants/plataforma/07-sealed-asaas.yaml @@ -1,43 +1,43 @@ -# ============================================================================ -# Credenciais do Asaas do tenant `plataforma`. Geradas em 2026-09-17 (P3.3); token do webhook rotacionado -# em 2026-09-23. -# -# PODE SER COMMITADO: cifrado para ESTE cluster e preso ao nome -# `asaas-credentials` no namespace `plataforma-prod`. -# -# Sao DOIS segredos por desenho: `api-key` autoriza COBRAR e MOVIMENTAR -# DINHEIRO; `webhook-token` so autoriza alguem a nos AVISAR que algo aconteceu. -# `AsaasConfig` recusa subir o pod se forem iguais. -# -# O `webhook-token` tem de estar cadastrado no painel do Asaas, no campo "Token -# de autenticacao" do webhook. Se ele for regerado aqui sem ser atualizado la, os -# avisos passam a ser recusados — e 15 recusas seguidas param a fila da conta. -# -# PARA REGERAR: `scripts/gerar_credenciais_plataforma.sh asaas` (pede a chave de -# producao do painel). Passo a passo da ligacao em -# `docs/p33-ligar-o-asaas-de-producao.md`. -# -# 2026-09-23: o token do webhook NAO precisa mais ser digitado no painel. O -# `gerar_credenciais_plataforma.sh asaas` grava o valor no webhook de cobranca -# pela API (`PUT /v3/webhooks/{id}`, alvo escolhido pela URL terminando em -# `/webhooks/asaas`), entao os dois lados viram juntos e ninguem ve o valor. -# -# Este cabecalho ja se perdeu uma vez, porque o `kubeseal` devolve YAML limpo. -# O `gravar()` do script passou a preserva-lo. -# ============================================================================ ---- -apiVersion: bitnami.com/v1alpha1 -kind: SealedSecret -metadata: - creationTimestamp: null - name: asaas-credentials - namespace: plataforma-prod -spec: - encryptedData: - api-key: AgBiaakijMDkM2tResLKR+TMTbvrHiTQgRMQkItjJbfqjDad1eHJ7Ot6PzOR+aApC7zGRP/PonFZQ6i7Yyj+arSTT4F6Wl16cIjGS+QNorKnHu3kbEuytgi9zb/6fYbw3DW9K2AQ5SXCU65ptpMY4FXhjzec+c7dBKxAM2l1nEq/Xysa6EUOtVdlvEYisfMEpRQj3MgyOjiVupEvasCDVVDOXreuQuKcPw6Gee6c7gxPpSpnTQ2Osb9Ssol35aXoXAuTCiiInZQk2TOdJ6MbqF/BnBp21SGgl9zYkS0y/V9InbbcsHjNKsq+d9pu8GDkm4i9+y952293ozgey6C3N2RxETtCrREwK9eXbXtvXoatgC/MQ1G41PWjBKRWUwJO1MLf1hsGiP3QDzxOjPgEAYm8B65yVm23JhvWkxnV85EiZSSbqv1OU2+k4vREGavpqqwm5JSvwW34aFGBsiuaCrp5JQ/R1BxpGGfCMTwkCIVPL3CgKTRB4mBB2yjKOG0sT159BMr1xJGNisPXLmHp1jufuldAXnqMF6fkJZgPjrNg0XuZEPbYDN9reNmB2m/ECr/qJYAvJVD5hq4eaNDTJru2rf0Dg6bNuUb5vbXNuJvR9OIMy3lL5hXhpZFI/Upd/a1PGRsgYkGwvEUTf1KMHnWD2uIGsFLYqUjAP5Ge2Xz5IUlMfOfYUUO9FF04Wz9Z2npPF561vyNM8RZbSnwHBelErtky1z9P7FRopTBTwiyVdS7GAhnWAy0T3XbJHCqtgepcVvuHBBmxKznHIHm0zCTJ8JmyTDzAcG9Zeu0F9G9kQxeCkH9IRMf+JmYVXgqRBVXwXxjKtym4ru1Hvjg9lr2XaoVv8le9qQc+rO+uQ8uFoJXliEe0To/OqImPDcFIGeNrwOi0+GyRlMDdyinzmF/fhYQibSP7 - webhook-token: AgAJ+5MCIt6JxBA2exMY4ZmXy//HOsDA8ZyUR1eZSkm0vN9KJ/nDZwEsiyyTK4+ZbFNOqyS3Cki6LiRhlPRuKQCeF8BiQBNkeWkrrXMq+wBhfzQivwGLfFuQj2whYw+lcxlcReEiwKNiVDGvqQu+weQB8MLg+huEV3InZ+0AAgSRXyTD2qDgIEt61kg87Fd+kRzieq+icrpUjfSmm8l0d3Sre5sYxSJ4jrVvCBWqiG4456+JglVbht62Tfjj0uFs3jQanhVK8N6h4ZkLyow7ke5QcrNjnacK5VB+TeH3TTbtPj3KcumXvqpxd2sPxRPq42P9QBnMz9yi9EBp1vY9NgwKZkgrhXP7mStp2EkYBTX4N2vOWXmHTMR6iW5kh67VcM2nl6ME1z9unT+iWsw7MclcUocjfZhsTUT18m6PUHqxzdRoPvYxag6KwDoNweQ3K1ut4xI/anzocBJFJG76Q3w+lk5vK2QypzlXS3rj0ArCyex+ZxNtXZgDhXDW1OvJXaLZ0jJQ6+dhNYGKx3Kdr5WBJ+Cxxxe8RCkC9excb38tR6NDQyFnYL1Rd0syE8JWayYeYAqCPoaiAxDcHj7P76BTs2BUsRGMSC6P+V1paYXkYcUvaKrmqndtFSA81M0XSOtTXKPE+mFeNpc+dr693/hYvLwUuk5vZsAy8Ftv3hHaGNa0/cAeGNQwyT8jwjp8AIsk2pHwEnWK8PKYYzdTPZ+tN90eZm/r2LxCjCmHHxvbvg== - template: - metadata: - creationTimestamp: null - name: asaas-credentials - namespace: plataforma-prod +# ============================================================================ +# Credenciais do Asaas do tenant `plataforma`. Geradas em 2026-09-17 (P3.3); token do webhook rotacionado +# em 2026-09-23. +# +# PODE SER COMMITADO: cifrado para ESTE cluster e preso ao nome +# `asaas-credentials` no namespace `plataforma-prod`. +# +# Sao DOIS segredos por desenho: `api-key` autoriza COBRAR e MOVIMENTAR +# DINHEIRO; `webhook-token` so autoriza alguem a nos AVISAR que algo aconteceu. +# `AsaasConfig` recusa subir o pod se forem iguais. +# +# O `webhook-token` tem de estar cadastrado no painel do Asaas, no campo "Token +# de autenticacao" do webhook. Se ele for regerado aqui sem ser atualizado la, os +# avisos passam a ser recusados — e 15 recusas seguidas param a fila da conta. +# +# PARA REGERAR: `scripts/gerar_credenciais_plataforma.sh asaas` (pede a chave de +# producao do painel). Passo a passo da ligacao em +# `docs/p33-ligar-o-asaas-de-producao.md`. +# +# 2026-09-23: o token do webhook NAO precisa mais ser digitado no painel. O +# `gerar_credenciais_plataforma.sh asaas` grava o valor no webhook de cobranca +# pela API (`PUT /v3/webhooks/{id}`, alvo escolhido pela URL terminando em +# `/webhooks/asaas`), entao os dois lados viram juntos e ninguem ve o valor. +# +# Este cabecalho ja se perdeu uma vez, porque o `kubeseal` devolve YAML limpo. +# O `gravar()` do script passou a preserva-lo. +# ============================================================================ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: asaas-credentials + namespace: plataforma-prod +spec: + encryptedData: + api-key: AgBiaakijMDkM2tResLKR+TMTbvrHiTQgRMQkItjJbfqjDad1eHJ7Ot6PzOR+aApC7zGRP/PonFZQ6i7Yyj+arSTT4F6Wl16cIjGS+QNorKnHu3kbEuytgi9zb/6fYbw3DW9K2AQ5SXCU65ptpMY4FXhjzec+c7dBKxAM2l1nEq/Xysa6EUOtVdlvEYisfMEpRQj3MgyOjiVupEvasCDVVDOXreuQuKcPw6Gee6c7gxPpSpnTQ2Osb9Ssol35aXoXAuTCiiInZQk2TOdJ6MbqF/BnBp21SGgl9zYkS0y/V9InbbcsHjNKsq+d9pu8GDkm4i9+y952293ozgey6C3N2RxETtCrREwK9eXbXtvXoatgC/MQ1G41PWjBKRWUwJO1MLf1hsGiP3QDzxOjPgEAYm8B65yVm23JhvWkxnV85EiZSSbqv1OU2+k4vREGavpqqwm5JSvwW34aFGBsiuaCrp5JQ/R1BxpGGfCMTwkCIVPL3CgKTRB4mBB2yjKOG0sT159BMr1xJGNisPXLmHp1jufuldAXnqMF6fkJZgPjrNg0XuZEPbYDN9reNmB2m/ECr/qJYAvJVD5hq4eaNDTJru2rf0Dg6bNuUb5vbXNuJvR9OIMy3lL5hXhpZFI/Upd/a1PGRsgYkGwvEUTf1KMHnWD2uIGsFLYqUjAP5Ge2Xz5IUlMfOfYUUO9FF04Wz9Z2npPF561vyNM8RZbSnwHBelErtky1z9P7FRopTBTwiyVdS7GAhnWAy0T3XbJHCqtgepcVvuHBBmxKznHIHm0zCTJ8JmyTDzAcG9Zeu0F9G9kQxeCkH9IRMf+JmYVXgqRBVXwXxjKtym4ru1Hvjg9lr2XaoVv8le9qQc+rO+uQ8uFoJXliEe0To/OqImPDcFIGeNrwOi0+GyRlMDdyinzmF/fhYQibSP7 + webhook-token: AgAJ+5MCIt6JxBA2exMY4ZmXy//HOsDA8ZyUR1eZSkm0vN9KJ/nDZwEsiyyTK4+ZbFNOqyS3Cki6LiRhlPRuKQCeF8BiQBNkeWkrrXMq+wBhfzQivwGLfFuQj2whYw+lcxlcReEiwKNiVDGvqQu+weQB8MLg+huEV3InZ+0AAgSRXyTD2qDgIEt61kg87Fd+kRzieq+icrpUjfSmm8l0d3Sre5sYxSJ4jrVvCBWqiG4456+JglVbht62Tfjj0uFs3jQanhVK8N6h4ZkLyow7ke5QcrNjnacK5VB+TeH3TTbtPj3KcumXvqpxd2sPxRPq42P9QBnMz9yi9EBp1vY9NgwKZkgrhXP7mStp2EkYBTX4N2vOWXmHTMR6iW5kh67VcM2nl6ME1z9unT+iWsw7MclcUocjfZhsTUT18m6PUHqxzdRoPvYxag6KwDoNweQ3K1ut4xI/anzocBJFJG76Q3w+lk5vK2QypzlXS3rj0ArCyex+ZxNtXZgDhXDW1OvJXaLZ0jJQ6+dhNYGKx3Kdr5WBJ+Cxxxe8RCkC9excb38tR6NDQyFnYL1Rd0syE8JWayYeYAqCPoaiAxDcHj7P76BTs2BUsRGMSC6P+V1paYXkYcUvaKrmqndtFSA81M0XSOtTXKPE+mFeNpc+dr693/hYvLwUuk5vZsAy8Ftv3hHaGNa0/cAeGNQwyT8jwjp8AIsk2pHwEnWK8PKYYzdTPZ+tN90eZm/r2LxCjCmHHxvbvg== + template: + metadata: + creationTimestamp: null + name: asaas-credentials + namespace: plataforma-prod diff --git a/tenants/plataforma/70-servico-configuracao.yaml b/tenants/plataforma/70-servico-configuracao.yaml index a34e774..90f9862 100644 --- a/tenants/plataforma/70-servico-configuracao.yaml +++ b/tenants/plataforma/70-servico-configuracao.yaml @@ -1,68 +1,68 @@ -# Bounded context "configuracao" como app proprio (ADR-0002): Deployment/pod -# medivel = centro de custo. Schema proprio "configuracao" no Postgres do silo -# (criado pelo Flyway). Roteado em /api/configuracao no ingress do tenant. ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: servico-configuracao - namespace: plataforma-prod - labels: - app: servico-configuracao - athleticmap.io/contexto: configuracao -spec: - replicas: 1 - selector: { matchLabels: { app: servico-configuracao } } - template: - metadata: - labels: - app: servico-configuracao - athleticmap.io/contexto: configuracao - spec: - containers: - - name: servico-configuracao - # Tag alinhada com o tenant `escolinha`, que e o mais atual do - # cluster. A que estava aqui vinha do molde defasado deste - # repositorio, e nenhum tenant real a usava mais. - # - # O preco disso apareceu no primeiro deploy: com - # `servico-financeiro:1.0`, o Flyway aplicou UMA migracao (V001) e - # parou — a imagem foi construida antes de V002..V007 existirem, e a - # tabela `plano_financeiro` nem chegou a ser criada. "Imagem - # presente no no" nao e o mesmo que "imagem atual". - image: docker.io/library/servico-configuracao:1.10-categoria-modalidade - imagePullPolicy: Never - ports: [{ containerPort: 8083 }] - env: - - { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" } - - { name: SPRING_DATASOURCE_USERNAME, value: "atm" } - - name: SPRING_DATASOURCE_PASSWORD - valueFrom: - secretKeyRef: { name: db-credentials, key: password } - - { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" } - - { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" } - - { name: ATM_TENANT, value: "plataforma" } - resources: - requests: { cpu: 150m, memory: 320Mi } - limits: { cpu: "1", memory: 768Mi } - readinessProbe: - httpGet: { path: /api/configuracao/health, port: 8083 } - initialDelaySeconds: 25 - periodSeconds: 10 - failureThreshold: 30 - livenessProbe: - httpGet: { path: /actuator/health/liveness, port: 8083 } - initialDelaySeconds: 60 - periodSeconds: 20 - failureThreshold: 6 ---- -apiVersion: v1 -kind: Service -metadata: - name: servico-configuracao - namespace: plataforma-prod - labels: - app: servico-configuracao -spec: - selector: { app: servico-configuracao } - ports: [{ name: http, port: 80, targetPort: 8083 }] +# Bounded context "configuracao" como app proprio (ADR-0002): Deployment/pod +# medivel = centro de custo. Schema proprio "configuracao" no Postgres do silo +# (criado pelo Flyway). Roteado em /api/configuracao no ingress do tenant. +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: servico-configuracao + namespace: plataforma-prod + labels: + app: servico-configuracao + athleticmap.io/contexto: configuracao +spec: + replicas: 1 + selector: { matchLabels: { app: servico-configuracao } } + template: + metadata: + labels: + app: servico-configuracao + athleticmap.io/contexto: configuracao + spec: + containers: + - name: servico-configuracao + # Tag alinhada com o tenant `escolinha`, que e o mais atual do + # cluster. A que estava aqui vinha do molde defasado deste + # repositorio, e nenhum tenant real a usava mais. + # + # O preco disso apareceu no primeiro deploy: com + # `servico-financeiro:1.0`, o Flyway aplicou UMA migracao (V001) e + # parou — a imagem foi construida antes de V002..V007 existirem, e a + # tabela `plano_financeiro` nem chegou a ser criada. "Imagem + # presente no no" nao e o mesmo que "imagem atual". + image: docker.io/library/servico-configuracao:1.10-categoria-modalidade + imagePullPolicy: Never + ports: [{ containerPort: 8083 }] + env: + - { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" } + - { name: SPRING_DATASOURCE_USERNAME, value: "atm" } + - name: SPRING_DATASOURCE_PASSWORD + valueFrom: + secretKeyRef: { name: db-credentials, key: password } + - { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" } + - { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" } + - { name: ATM_TENANT, value: "plataforma" } + resources: + requests: { cpu: 150m, memory: 320Mi } + limits: { cpu: "1", memory: 768Mi } + readinessProbe: + httpGet: { path: /api/configuracao/health, port: 8083 } + initialDelaySeconds: 25 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: { path: /actuator/health/liveness, port: 8083 } + initialDelaySeconds: 60 + periodSeconds: 20 + failureThreshold: 6 +--- +apiVersion: v1 +kind: Service +metadata: + name: servico-configuracao + namespace: plataforma-prod + labels: + app: servico-configuracao +spec: + selector: { app: servico-configuracao } + ports: [{ name: http, port: 80, targetPort: 8083 }] diff --git a/tenants/plataforma/79-servico-financeiro.yaml b/tenants/plataforma/79-servico-financeiro.yaml index 5f34d3e..d75040f 100644 --- a/tenants/plataforma/79-servico-financeiro.yaml +++ b/tenants/plataforma/79-servico-financeiro.yaml @@ -1,93 +1,93 @@ -# Bounded context "financeiro" (2a onda): Cobranca + ApuracaoRateio (centros de custo). -# Schema proprio "financeiro" (Flyway). Roteado em /api/financeiro no ingress. ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: servico-financeiro - namespace: plataforma-prod - labels: - app: servico-financeiro - athleticmap.io/contexto: financeiro -spec: - replicas: 1 - selector: { matchLabels: { app: servico-financeiro } } - template: - metadata: - labels: - app: servico-financeiro - athleticmap.io/contexto: financeiro - spec: - containers: - - name: servico-financeiro - # Tag alinhada com o tenant `escolinha`, que e o mais atual do - # cluster. A que estava aqui vinha do molde defasado deste - # repositorio, e nenhum tenant real a usava mais. - # - # O preco disso apareceu no primeiro deploy: com - # `servico-financeiro:1.0`, o Flyway aplicou UMA migracao (V001) e - # parou — a imagem foi construida antes de V002..V007 existirem, e a - # tabela `plano_financeiro` nem chegou a ser criada. "Imagem - # presente no no" nao e o mesmo que "imagem atual". - image: docker.io/library/servico-financeiro:1.6-assinatura - imagePullPolicy: Never - ports: [{ containerPort: 8083 }] - env: - - { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" } - - { name: SPRING_DATASOURCE_USERNAME, value: "atm" } - - name: SPRING_DATASOURCE_PASSWORD - valueFrom: - secretKeyRef: { name: db-credentials, key: password } - - { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" } - - { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" } - - { name: ATM_TENANT, value: "plataforma" } - # Plano do tenant, lido pela BarreiraDePlano (P3.7). Sem esta - # variavel o servico nasce Bronze e responde 403 no que e pago. - - { name: ATM_PLANO, value: "institucional" } - - # ── Asaas de PRODUCAO (P3.3) ────────────────────────────────── - # Aqui e o tenant da plataforma: a conta Asaas e a da propria - # Athletic Map, e nao a de um cliente. - # - # O rotulo `ASAAS_AMBIENTE` e a URL tem de concordar. Se nao - # concordarem, `AsaasClient` RECUSA a emissao — de proposito: - # producao apontando para sandbox faria a cobranca "funcionar" sem - # ninguem pagar de verdade, que e o erro caro e silencioso. - - { name: ASAAS_BASE_URL, value: "https://api.asaas.com/v3" } - - { name: ASAAS_AMBIENTE, value: "producao" } - - { name: ASAAS_USER_AGENT, value: "AthleticMap/plataforma" } - - # Os DOIS segredos sao separados, e nao por preciosismo: a API Key - # autoriza movimentar dinheiro; o token do webhook so autoriza - # alguem a nos avisar que algo aconteceu. Se forem iguais, - # `AsaasConfig` RECUSA subir o pod. - - name: ASAAS_API_KEY - valueFrom: - secretKeyRef: { name: asaas-credentials, key: api-key } - - name: ASAAS_WEBHOOK_TOKEN - valueFrom: - secretKeyRef: { name: asaas-credentials, key: webhook-token } - resources: - requests: { cpu: 150m, memory: 320Mi } - limits: { cpu: "1", memory: 768Mi } - readinessProbe: - httpGet: { path: /api/financeiro/health, port: 8083 } - initialDelaySeconds: 25 - periodSeconds: 10 - failureThreshold: 30 - livenessProbe: - httpGet: { path: /actuator/health/liveness, port: 8083 } - initialDelaySeconds: 60 - periodSeconds: 20 - failureThreshold: 6 ---- -apiVersion: v1 -kind: Service -metadata: - name: servico-financeiro - namespace: plataforma-prod - labels: - app: servico-financeiro -spec: - selector: { app: servico-financeiro } - ports: [{ name: http, port: 80, targetPort: 8083 }] +# Bounded context "financeiro" (2a onda): Cobranca + ApuracaoRateio (centros de custo). +# Schema proprio "financeiro" (Flyway). Roteado em /api/financeiro no ingress. +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: servico-financeiro + namespace: plataforma-prod + labels: + app: servico-financeiro + athleticmap.io/contexto: financeiro +spec: + replicas: 1 + selector: { matchLabels: { app: servico-financeiro } } + template: + metadata: + labels: + app: servico-financeiro + athleticmap.io/contexto: financeiro + spec: + containers: + - name: servico-financeiro + # Tag alinhada com o tenant `escolinha`, que e o mais atual do + # cluster. A que estava aqui vinha do molde defasado deste + # repositorio, e nenhum tenant real a usava mais. + # + # O preco disso apareceu no primeiro deploy: com + # `servico-financeiro:1.0`, o Flyway aplicou UMA migracao (V001) e + # parou — a imagem foi construida antes de V002..V007 existirem, e a + # tabela `plano_financeiro` nem chegou a ser criada. "Imagem + # presente no no" nao e o mesmo que "imagem atual". + image: docker.io/library/servico-financeiro:1.6-assinatura + imagePullPolicy: Never + ports: [{ containerPort: 8083 }] + env: + - { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" } + - { name: SPRING_DATASOURCE_USERNAME, value: "atm" } + - name: SPRING_DATASOURCE_PASSWORD + valueFrom: + secretKeyRef: { name: db-credentials, key: password } + - { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" } + - { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" } + - { name: ATM_TENANT, value: "plataforma" } + # Plano do tenant, lido pela BarreiraDePlano (P3.7). Sem esta + # variavel o servico nasce Bronze e responde 403 no que e pago. + - { name: ATM_PLANO, value: "institucional" } + + # ── Asaas de PRODUCAO (P3.3) ────────────────────────────────── + # Aqui e o tenant da plataforma: a conta Asaas e a da propria + # Athletic Map, e nao a de um cliente. + # + # O rotulo `ASAAS_AMBIENTE` e a URL tem de concordar. Se nao + # concordarem, `AsaasClient` RECUSA a emissao — de proposito: + # producao apontando para sandbox faria a cobranca "funcionar" sem + # ninguem pagar de verdade, que e o erro caro e silencioso. + - { name: ASAAS_BASE_URL, value: "https://api.asaas.com/v3" } + - { name: ASAAS_AMBIENTE, value: "producao" } + - { name: ASAAS_USER_AGENT, value: "AthleticMap/plataforma" } + + # Os DOIS segredos sao separados, e nao por preciosismo: a API Key + # autoriza movimentar dinheiro; o token do webhook so autoriza + # alguem a nos avisar que algo aconteceu. Se forem iguais, + # `AsaasConfig` RECUSA subir o pod. + - name: ASAAS_API_KEY + valueFrom: + secretKeyRef: { name: asaas-credentials, key: api-key } + - name: ASAAS_WEBHOOK_TOKEN + valueFrom: + secretKeyRef: { name: asaas-credentials, key: webhook-token } + resources: + requests: { cpu: 150m, memory: 320Mi } + limits: { cpu: "1", memory: 768Mi } + readinessProbe: + httpGet: { path: /api/financeiro/health, port: 8083 } + initialDelaySeconds: 25 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: { path: /actuator/health/liveness, port: 8083 } + initialDelaySeconds: 60 + periodSeconds: 20 + failureThreshold: 6 +--- +apiVersion: v1 +kind: Service +metadata: + name: servico-financeiro + namespace: plataforma-prod + labels: + app: servico-financeiro +spec: + selector: { app: servico-financeiro } + ports: [{ name: http, port: 80, targetPort: 8083 }] diff --git a/tenants/plataforma/80-servico-cadastro.yaml b/tenants/plataforma/80-servico-cadastro.yaml index 4d536b6..be84a32 100644 --- a/tenants/plataforma/80-servico-cadastro.yaml +++ b/tenants/plataforma/80-servico-cadastro.yaml @@ -1,68 +1,68 @@ -# Bounded context "cadastro" como app proprio (ADR-0002/0003): Deployment/pod -# medivel = centro de custo. Schema proprio "cadastro" no Postgres do silo -# (criado pelo Flyway). Roteado em /api/cadastro no ingress do tenant. ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: servico-cadastro - namespace: plataforma-prod - labels: - app: servico-cadastro - athleticmap.io/contexto: cadastro -spec: - replicas: 1 - selector: { matchLabels: { app: servico-cadastro } } - template: - metadata: - labels: - app: servico-cadastro - athleticmap.io/contexto: cadastro - spec: - containers: - - name: servico-cadastro - # Tag alinhada com o tenant `escolinha`, que e o mais atual do - # cluster. A que estava aqui vinha do molde defasado deste - # repositorio, e nenhum tenant real a usava mais. - # - # O preco disso apareceu no primeiro deploy: com - # `servico-financeiro:1.0`, o Flyway aplicou UMA migracao (V001) e - # parou — a imagem foi construida antes de V002..V007 existirem, e a - # tabela `plano_financeiro` nem chegou a ser criada. "Imagem - # presente no no" nao e o mesmo que "imagem atual". - image: docker.io/library/servico-cadastro:1.20-posicao-e-listas - imagePullPolicy: Never - ports: [{ containerPort: 8083 }] - env: - - { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" } - - { name: SPRING_DATASOURCE_USERNAME, value: "atm" } - - name: SPRING_DATASOURCE_PASSWORD - valueFrom: - secretKeyRef: { name: db-credentials, key: password } - - { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" } - - { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" } - - { name: ATM_TENANT, value: "plataforma" } - resources: - requests: { cpu: 150m, memory: 320Mi } - limits: { cpu: "1", memory: 768Mi } - readinessProbe: - httpGet: { path: /api/cadastro/health, port: 8083 } - initialDelaySeconds: 25 - periodSeconds: 10 - failureThreshold: 30 - livenessProbe: - httpGet: { path: /actuator/health/liveness, port: 8083 } - initialDelaySeconds: 60 - periodSeconds: 20 - failureThreshold: 6 ---- -apiVersion: v1 -kind: Service -metadata: - name: servico-cadastro - namespace: plataforma-prod - labels: - app: servico-cadastro -spec: - selector: { app: servico-cadastro } - ports: [{ name: http, port: 80, targetPort: 8083 }] +# Bounded context "cadastro" como app proprio (ADR-0002/0003): Deployment/pod +# medivel = centro de custo. Schema proprio "cadastro" no Postgres do silo +# (criado pelo Flyway). Roteado em /api/cadastro no ingress do tenant. +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: servico-cadastro + namespace: plataforma-prod + labels: + app: servico-cadastro + athleticmap.io/contexto: cadastro +spec: + replicas: 1 + selector: { matchLabels: { app: servico-cadastro } } + template: + metadata: + labels: + app: servico-cadastro + athleticmap.io/contexto: cadastro + spec: + containers: + - name: servico-cadastro + # Tag alinhada com o tenant `escolinha`, que e o mais atual do + # cluster. A que estava aqui vinha do molde defasado deste + # repositorio, e nenhum tenant real a usava mais. + # + # O preco disso apareceu no primeiro deploy: com + # `servico-financeiro:1.0`, o Flyway aplicou UMA migracao (V001) e + # parou — a imagem foi construida antes de V002..V007 existirem, e a + # tabela `plano_financeiro` nem chegou a ser criada. "Imagem + # presente no no" nao e o mesmo que "imagem atual". + image: docker.io/library/servico-cadastro:1.20-posicao-e-listas + imagePullPolicy: Never + ports: [{ containerPort: 8083 }] + env: + - { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" } + - { name: SPRING_DATASOURCE_USERNAME, value: "atm" } + - name: SPRING_DATASOURCE_PASSWORD + valueFrom: + secretKeyRef: { name: db-credentials, key: password } + - { name: ATM_JWK_SET_URI, value: "http://keycloak:8080/realms/athleticmap/protocol/openid-connect/certs" } + - { name: ATM_ISSUER, value: "https://auth-plataforma.athleticmap.com/realms/athleticmap" } + - { name: ATM_TENANT, value: "plataforma" } + resources: + requests: { cpu: 150m, memory: 320Mi } + limits: { cpu: "1", memory: 768Mi } + readinessProbe: + httpGet: { path: /api/cadastro/health, port: 8083 } + initialDelaySeconds: 25 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: { path: /actuator/health/liveness, port: 8083 } + initialDelaySeconds: 60 + periodSeconds: 20 + failureThreshold: 6 +--- +apiVersion: v1 +kind: Service +metadata: + name: servico-cadastro + namespace: plataforma-prod + labels: + app: servico-cadastro +spec: + selector: { app: servico-cadastro } + ports: [{ name: http, port: 80, targetPort: 8083 }]