diff --git a/tenants/plataforma/15-netpol-tenants-no-pgbouncer.yaml b/tenants/plataforma/15-netpol-tenants-no-pgbouncer.yaml index 31d1b4e..3a3ca92 100644 --- a/tenants/plataforma/15-netpol-tenants-no-pgbouncer.yaml +++ b/tenants/plataforma/15-netpol-tenants-no-pgbouncer.yaml @@ -31,5 +31,21 @@ spec: matchLabels: { kubernetes.io/metadata.name: piloto-prod } - namespaceSelector: matchLabels: { kubernetes.io/metadata.name: acme-prod } + # Todo tenant PROVISIONADO, por rotulo e nao por nome. + # + # Os tres acima foram criados a mao e nao tem o rotulo; os novos nascem + # com `athleticmap.io/tenant` no proprio molde do namespace. Enumerar + # nomes aqui significaria editar esta politica a cada venda — e esquecer + # de editar da um tenant que sobe inteiro e nao conecta no banco, com + # `connection timed out` e nenhuma pista de que a culpa e de rede. + - namespaceSelector: + matchExpressions: + - { key: athleticmap.io/tenant, operator: Exists } + # O provisionamento, que CONFERE o pool antes de dar a etapa por feita. + # So o pod do servico-captacao, e nao o namespace inteiro. + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: plataforma-prod } + podSelector: + matchLabels: { app: servico-captacao } ports: - { protocol: TCP, port: 6432 } diff --git a/tenants/plataforma/16-rbac-provisionamento.yaml b/tenants/plataforma/16-rbac-provisionamento.yaml index 62e6a2e..6df9b83 100644 --- a/tenants/plataforma/16-rbac-provisionamento.yaml +++ b/tenants/plataforma/16-rbac-provisionamento.yaml @@ -52,3 +52,48 @@ rules: - apiGroups: ["apps"] resources: ["deployments/scale"] verbs: ["get", "patch"] + # A senha do papel do tenant no Postgres. + # + # Ela e gerada em MEMORIA pela etapa de selagem, selada e zerada na mesma + # linha — em claro ela nunca encosta em disco nosso. Depois que o Argo aplica + # o SealedSecret, o Secret aberto e o unico lugar de onde da para le-la, e a + # etapa BANCO_CRIADO precisa dela para dar a senha ao papel. + # + # `resourceNames` amarra ao NOME: este ClusterRole nao le `asaas-credentials` + # nem nenhum outro Secret do cliente. E o RoleBinding do molde o limita aos + # namespaces de tenant — nao ha binding cluster-wide. + - apiGroups: [""] + resources: ["secrets"] + verbs: ["get"] + resourceNames: ["db-credentials"] + +--- +# O userlist do PgBouncer, que a etapa BANCO_CRIADO acrescenta. +# +# Role, e nao ClusterRole: este Secret vive so aqui. E `resourceNames` de novo, +# porque `plataforma-prod` guarda a chave do Asaas, o token do webhook e a +# credencial do Gitea — nenhuma delas tem nada a ver com criar banco de cliente. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: atm-provisionamento-userlist + namespace: plataforma-prod +rules: + - apiGroups: [""] + resources: ["secrets"] + verbs: ["get"] + resourceNames: ["pgbouncer-userlist"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: atm-provisionamento-userlist + namespace: plataforma-prod +subjects: + - kind: ServiceAccount + name: atm-provisionamento + namespace: plataforma-prod +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: atm-provisionamento-userlist diff --git a/tenants/plataforma/82-servico-captacao.yaml b/tenants/plataforma/82-servico-captacao.yaml index 757304a..23d35a2 100644 --- a/tenants/plataforma/82-servico-captacao.yaml +++ b/tenants/plataforma/82-servico-captacao.yaml @@ -235,6 +235,24 @@ spec: # O molde do realm. Sem ele a etapa recusa nomeando a propriedade; o # arquivo vive no mesmo clone do GitOps que o /gitops monta. - { name: PROVISIONAMENTO_REALM_TEMPLATE, value: "/gitops/moldes/realm-do-tenant.json" } + # ── o banco do cliente novo (etapa BANCO_CRIADO) ────────────── + # + # DIRETO no pg-compartilhado, e nao pelo PgBouncer: o pool so serve + # databases que ja estao na lista dele, e aqui o database ainda NAO + # existe. E a netpol egress-banco-compartilhado ja permite os dois. + - { name: PROVISIONAMENTO_PG_ADMIN_URL, value: "jdbc:postgresql://pg-compartilhado:5432/{database}" } + - { name: PROVISIONAMENTO_PG_ADMIN_USUARIO, value: "postgres" } + - name: PROVISIONAMENTO_PG_ADMIN_SENHA + valueFrom: + secretKeyRef: { name: pg-compartilhado-admin, key: password } + # As etapas de migracao e de catalogos, que conectam num banco que JA + # existe. Tambem direto: elas rodam com a conta de administracao, e + # passar pelo pool so acrescentaria uma peca ao caminho. + - { name: PROVISIONAMENTO_BANCO_URL, value: "jdbc:postgresql://pg-compartilhado:5432/athleticmap_{tenant}" } + - { name: PROVISIONAMENTO_BANCO_USUARIO, value: "postgres" } + - name: PROVISIONAMENTO_BANCO_SENHA + valueFrom: + secretKeyRef: { name: pg-compartilhado-admin, key: password } resources: requests: { cpu: 150m, memory: 320Mi } limits: { cpu: "1", memory: 768Mi }