feat(P6.4): expurgo da trilha nos Postgres proprios — CronJob no escolinha-prod e expurgo-trilha-proprio na plataforma (BANCOS fixo)

This commit is contained in:
deploy
2026-09-30 02:56:10 +00:00
parent b08dc64a05
commit edb1da9684
3 changed files with 145 additions and 5 deletions
@@ -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
@@ -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/<t>/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
@@ -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