diff --git a/tenants/escolinha/50-backup.yaml b/tenants/escolinha/50-backup.yaml index 7f05cec..08c4b39 100644 --- a/tenants/escolinha/50-backup.yaml +++ b/tenants/escolinha/50-backup.yaml @@ -1,4 +1,8 @@ -# Backup diario do Postgres do tenant demo (pg_dump -> PVC, retencao 7 dias) +# Backup diario do Postgres do tenant escolinha. +# +# Cifrado com `age` desde 2026-09-21: ate aqui ele saia em texto comprimido, +# e o escolinha e o UNICO tenant com dado de cliente real — quem pegasse o +# arquivo lia tudo. Os outros tres ja cifravam; este era o que faltava. apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -11,6 +15,17 @@ spec: requests: storage: 5Gi --- +apiVersion: v1 +kind: ConfigMap +metadata: + name: pg-backup-chave + namespace: escolinha-prod +data: + # A MESMA publica do `plataforma` (2026-09-21): uma chave privada + # restaura tudo, e ela vive fora do servidor. Chave por tenant seria + # decisao do dono, e multiplicaria o que ele precisa guardar. + destinatario: "age1g37gc3gvq0zn7802pqh5dd0m3pkvc4z3g2hqk5w3dgvnaz3hwsrq7ps04y" +--- apiVersion: batch/v1 kind: CronJob metadata: @@ -27,27 +42,33 @@ spec: spec: restartPolicy: OnFailure containers: + # Imagem propria: postgres:16 + age + rclone. O dump e cifrado ANTES + # de sair do processo, entao as ferramentas tem de estar no mesmo + # container. Construida de scripts/backup/Containerfile. + # + # Substituiu um shell embutido que fazia `pg_dump | gzip` e mais nada. - name: pg-backup - image: postgres:16 + image: docker.io/library/atm-pg-backup:1.2 env: - name: PGPASSWORD valueFrom: - secretKeyRef: - name: db-credentials - key: password - command: ["/bin/sh", "-c"] - args: - - | - set -eo pipefail - echo "aguardando postgres ficar acessivel..." - for i in $(seq 1 30); do pg_isready -h postgres -U atm -t 3 >/dev/null 2>&1 && break; sleep 2; done - TS=$(date +%Y%m%d-%H%M%S) - for DB in athleticmap keycloak; do - echo "dump $DB ..." - pg_dump -h postgres -U atm -d "$DB" | gzip > "/backups/${DB}-${TS}.sql.gz" - done - find /backups -name '*.sql.gz' -mtime +7 -delete - echo "backups atuais:"; ls -lh /backups | tail -20 + secretKeyRef: { name: db-credentials, key: password } + - name: CHAVE_PUBLICA + valueFrom: + configMapKeyRef: { name: pg-backup-chave, key: destinatario } + - { name: PGHOST, value: "postgres" } + - { name: PGUSER, value: "atm" } + # Os MESMOS dois bancos que o shell antigo copiava. + - { name: DATABASES, value: "athleticmap keycloak" } + - { name: DESTINO, value: "/backups" } + - { name: RETENCAO_DIAS, value: "7" } + # O envio para fora se cala sem o Secret, e falha alto quando ele + # existe e nao funciona — sao coisas diferentes. + - { name: COMANDO_ENVIO, value: "enviar_offsite.sh {}" } + # `optional: true`: sem o Secret o CronJob roda igual e guarda local. + envFrom: + - secretRef: { name: backup-offsite, optional: true } + command: ["backup_tenant.sh"] volumeMounts: - name: backups mountPath: /backups