feat(backup): envio para fora do servidor (atm-pg-backup:1.2 com rclone)

This commit is contained in:
deploy
2026-09-22 01:57:55 +00:00
parent 76fd9fd270
commit 22412c40aa
+39 -18
View File
@@ -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