diff --git a/tenants/escolinha/57-cronjob-expurgo-trilha.yaml b/tenants/escolinha/57-cronjob-expurgo-trilha.yaml new file mode 100644 index 0000000..26be6ad --- /dev/null +++ b/tenants/escolinha/57-cronjob-expurgo-trilha.yaml @@ -0,0 +1,85 @@ +# ============================================================================= +# P6.4 no ESCOLINHA — expurgo das trilhas de auditoria com mais de 5 anos no +# Postgres PROPRIO deste namespace (o escolinha nao esta no pg-compartilhado). +# Copia do 57- da plataforma com tres diferencas: PGHOST e o `postgres` daqui, +# BANCOS fixo em `athleticmap`, e o Secret `pg-expurgo-trilha` deste namespace +# (papel criado e selado em 30/09/2026 — scripts/banco/papel_expurgo_trilha.sql). +# Domingo 05:20: depois do backup (02:00), da eliminacao (04:40) e do expurgo +# do compartilhado (05:10). +# ============================================================================= +apiVersion: v1 +kind: ConfigMap +metadata: + name: expurgo-trilha + namespace: escolinha-prod +data: + expurgar.sh: | + #!/bin/sh + set -u + : "${PGPASSWORD:?falta PGPASSWORD (Secret pg-expurgo-trilha)}" + # BANCOS vem fixo (Postgres PROPRIO de um namespace: so `athleticmap`) ou e + # descoberto (compartilhado: todo `athleticmap_%`). + if [ -z "${BANCOS:-}" ]; then + BANCOS="$(psql -d postgres -Atc "select datname from pg_database where datname like 'athleticmap\_%' order by 1")" \ + || { echo "ERRO: nao consegui listar os bancos." >&2; exit 1; } + fi + [ -n "${BANCOS}" ] || { echo "ERRO: nenhum banco athleticmap_* encontrado." >&2; exit 1; } + FALHOU=0 + for DB in ${BANCOS}; do + for SCHEMA in cadastro financeiro; do + TEM="$(psql -d "${DB}" -Atc "select to_regprocedure('${SCHEMA}.expurgar_trilhas_vencidas()') is not null" 2>&1)" + if [ "${TEM}" != "t" ]; then + echo "${DB} ${SCHEMA}: sem a funcao de expurgo (migracao pendente ou sem acesso): ${TEM}" + continue + fi + if SAIDA="$(psql -v ON_ERROR_STOP=1 -d "${DB}" -Atc "select tabela || '=' || apagados from ${SCHEMA}.expurgar_trilhas_vencidas()" 2>&1)"; then + echo "${DB} ${SCHEMA}: $(echo "${SAIDA}" | tr '\n' ' ')" + else + echo "ERRO ${DB} ${SCHEMA}: ${SAIDA}" >&2 + FALHOU=1 + fi + done + done + exit ${FALHOU} +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: expurgo-trilha + namespace: escolinha-prod +spec: + schedule: "20 5 * * 0" + timeZone: America/Sao_Paulo + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + jobTemplate: + spec: + activeDeadlineSeconds: 1800 + backoffLimit: 1 + template: + spec: + restartPolicy: OnFailure + containers: + - name: expurgar + image: postgres:16 + imagePullPolicy: IfNotPresent + command: ["/bin/sh", "/script/expurgar.sh"] + env: + - { name: PGHOST, value: "postgres" } + - { name: BANCOS, value: "athleticmap" } + - { name: PGUSER, value: "expurgo_trilha" } + - name: PGPASSWORD + valueFrom: + secretKeyRef: { name: pg-expurgo-trilha, key: password } + resources: + requests: { cpu: 10m, memory: 32Mi } + limits: { cpu: 200m, memory: 128Mi } + volumeMounts: + - name: script + mountPath: /script + volumes: + - name: script + configMap: + name: expurgo-trilha + defaultMode: 0555 diff --git a/tenants/plataforma/57-cronjob-expurgo-trilha.yaml b/tenants/plataforma/57-cronjob-expurgo-trilha.yaml index e28fa9d..a53049a 100644 --- a/tenants/plataforma/57-cronjob-expurgo-trilha.yaml +++ b/tenants/plataforma/57-cronjob-expurgo-trilha.yaml @@ -21,9 +21,10 @@ # 3. Tenant cujo banco ainda nao tem a V020/V011 aparece como "sem a funcao": # nao e erro (nao ha o que expurgar com o trigger antigo), e a fase `grants` # tem de rodar de novo depois que ele migrar. -# 4. Tenant antigo com Postgres PROPRIO (tenants//10-postgres.yaml), se -# algum ainda existir, NAO e coberto por este job: precisa do papel e de um -# job apontando para ele. +# 4. Postgres PROPRIO (escolinha-prod; e o da propria plataforma, com captacao +# e financeiro) NAO entra neste job: cada um tem o seu — tenants/escolinha/57- +# e tenants/plataforma/59-cronjob-expurgo-trilha-proprio.yaml — com BANCOS +# fixo em `athleticmap`, papel e Secret proprios (decisao do dono, 30/09/2026). # # Semanal: o prazo e de anos, e a primeira linha so vence em 2031. # ============================================================================= @@ -37,8 +38,12 @@ data: #!/bin/sh set -u : "${PGPASSWORD:?falta PGPASSWORD (Secret pg-expurgo-trilha)}" - BANCOS="$(psql -d postgres -Atc "select datname from pg_database where datname like 'athleticmap\_%' order by 1")" \ - || { echo "ERRO: nao consegui listar os bancos." >&2; exit 1; } + # BANCOS vem fixo (Postgres PROPRIO de um namespace: so `athleticmap`) ou e + # descoberto (compartilhado: todo `athleticmap_%`). + if [ -z "${BANCOS:-}" ]; then + BANCOS="$(psql -d postgres -Atc "select datname from pg_database where datname like 'athleticmap\_%' order by 1")" \ + || { echo "ERRO: nao consegui listar os bancos." >&2; exit 1; } + fi [ -n "${BANCOS}" ] || { echo "ERRO: nenhum banco athleticmap_* encontrado." >&2; exit 1; } FALHOU=0 for DB in ${BANCOS}; do diff --git a/tenants/plataforma/59-cronjob-expurgo-trilha-proprio.yaml b/tenants/plataforma/59-cronjob-expurgo-trilha-proprio.yaml new file mode 100644 index 0000000..5b7f063 --- /dev/null +++ b/tenants/plataforma/59-cronjob-expurgo-trilha-proprio.yaml @@ -0,0 +1,50 @@ +# ============================================================================= +# P6.4 no Postgres PROPRIO da plataforma (captacao + servico-financeiro das notas +# da Athletic Map, que tem `financeiro.acesso_auditoria`). O 57- varre so o +# pg-compartilhado; este aponta para o `postgres` deste namespace, com BANCOS +# fixo em `athleticmap` e o Secret `pg-expurgo-trilha-proprio` (papel criado e +# selado em 30/09/2026). Reusa o ConfigMap `expurgo-trilha` do 57-. O banco nao +# tem o schema cadastro: o script avisa "sem a funcao" e segue — esperado. +# Domingo 05:30, depois do expurgo do compartilhado (05:10). +# ============================================================================= +apiVersion: batch/v1 +kind: CronJob +metadata: + name: expurgo-trilha-proprio + namespace: plataforma-prod +spec: + schedule: "30 5 * * 0" + timeZone: America/Sao_Paulo + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + jobTemplate: + spec: + activeDeadlineSeconds: 1800 + backoffLimit: 1 + template: + spec: + restartPolicy: OnFailure + containers: + - name: expurgar + image: postgres:16 + imagePullPolicy: IfNotPresent + command: ["/bin/sh", "/script/expurgar.sh"] + env: + - { name: PGHOST, value: "postgres" } + - { name: BANCOS, value: "athleticmap" } + - { name: PGUSER, value: "expurgo_trilha" } + - name: PGPASSWORD + valueFrom: + secretKeyRef: { name: pg-expurgo-trilha-proprio, key: password } + resources: + requests: { cpu: 10m, memory: 32Mi } + limits: { cpu: 200m, memory: 128Mi } + volumeMounts: + - name: script + mountPath: /script + volumes: + - name: script + configMap: + name: expurgo-trilha + defaultMode: 0555