feat(backup): envio para fora do servidor (atm-pg-backup:1.2 com rclone)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user