diff --git a/tenants/acme/50-backup.yaml b/tenants/acme/50-backup.yaml deleted file mode 100644 index 9d7475c..0000000 --- a/tenants/acme/50-backup.yaml +++ /dev/null @@ -1,91 +0,0 @@ -# Backup diario do Postgres do tenant demo (pg_dump -> PVC, retencao 7 dias) -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: pg-backups - namespace: acme-prod -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 5Gi ---- -# ConfigMap com o DESTINATARIO age (chave PUBLICA). -# -# Publica pode ser versionada: ela so cifra. Quem tem a publica NAO abre o -# backup. A privada e gerada por scripts/backup/gerar_chave_backup.sh na maquina -# de quem restaura, e NUNCA chega neste repositorio nem no VPS. -# -# O valor abaixo e um marcador: substitua pelo destinatario real antes de -# aplicar. Com o marcador, o backup_tenant.sh recusa rodar em vez de gravar em -# claro — e o comportamento certo. -apiVersion: v1 -kind: ConfigMap -metadata: - name: pg-backup-chave - namespace: acme-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: - name: pg-backup - namespace: acme-prod -spec: - schedule: "0 2 * * *" # diariamente 02:00 - successfulJobsHistoryLimit: 3 - failedJobsHistoryLimit: 3 - concurrencyPolicy: Forbid - jobTemplate: - spec: - template: - # O label e o que a 19-netpol-backup-offsite seleciona: so o pod do backup - # sai para a internet (443), para mandar o dump cifrado ao bucket. - metadata: - labels: { app: pg-backup } - spec: - restartPolicy: OnFailure - containers: - # Imagem propria: postgres:16 + age. O dump precisa ser cifrado - # ANTES de sair do processo, entao as duas ferramentas tem de estar - # no mesmo container. Construida de scripts/backup/Containerfile. - - name: pg-backup - image: docker.io/library/atm-pg-backup:1.3 - env: - - name: PGPASSWORD - valueFrom: - 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" } - - { name: DATABASES, value: "athleticmap keycloak" } - - { name: DESTINO, value: "/backups" } - - { name: RETENCAO_DIAS, value: "7" } - # O envio para fora. O script se cala quando o Secret nao existe, e - # falha ALTO quando existe e nao funciona — sao coisas diferentes, - # e um CronJob que falha toda madrugada por falta de credencial - # ensina todo mundo a ignorar o unico alerta que nao se pode ignorar. - - { name: COMANDO_ENVIO, value: "enviar_offsite.sh {}" } - # Um prefixo POR ORIGEM no bucket: sem ele todos gravavam em `athleticmap/` com o - # mesmo nome de arquivo — nao se sabia de quem era o dump, e dois no mesmo segundo - # se sobrescreveriam (visto em 01/10/2026). - - { name: OFFSITE_PREFIXO, value: "athleticmap/acme" } - # `optional: true`: enquanto o Secret `backup-offsite` nao existir, o - # CronJob roda igual e guarda local. No dia em que ele existir, o - # envio liga sozinho — sem tocar neste arquivo. - envFrom: - - secretRef: { name: backup-offsite, optional: true } - command: ["backup_tenant.sh"] - volumeMounts: - - { name: backups, mountPath: /backups } - volumes: - - name: backups - persistentVolumeClaim: - claimName: pg-backups diff --git a/tenants/demo/50-backup.yaml b/tenants/demo/50-backup.yaml deleted file mode 100644 index 8220bc0..0000000 --- a/tenants/demo/50-backup.yaml +++ /dev/null @@ -1,87 +0,0 @@ -# Backup diario do Postgres do tenant demo (pg_dump -> PVC, retencao 7 dias) -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: pg-backups - namespace: demo-prod -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 5Gi ---- -# ConfigMap com o DESTINATARIO age (chave PUBLICA). -# -# Publica pode ser versionada: ela so cifra. Quem tem a publica NAO abre o -# backup. A privada e gerada por scripts/backup/gerar_chave_backup.sh na maquina -# de quem restaura, e NUNCA chega neste repositorio nem no VPS. -# -# O valor abaixo e um marcador: substitua pelo destinatario real antes de -# aplicar. Com o marcador, o backup_tenant.sh recusa rodar em vez de gravar em -# claro — e o comportamento certo. -apiVersion: v1 -kind: ConfigMap -metadata: - name: pg-backup-chave - namespace: demo-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: - name: pg-backup - namespace: demo-prod -spec: - schedule: "0 2 * * *" # diariamente 02:00 - successfulJobsHistoryLimit: 3 - failedJobsHistoryLimit: 3 - concurrencyPolicy: Forbid - jobTemplate: - spec: - template: - spec: - restartPolicy: OnFailure - containers: - # Imagem propria: postgres:16 + age. O dump precisa ser cifrado - # ANTES de sair do processo, entao as duas ferramentas tem de estar - # no mesmo container. Construida de scripts/backup/Containerfile. - - name: pg-backup - image: docker.io/library/atm-pg-backup:1.3 - env: - - name: PGPASSWORD - valueFrom: - 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" } - - { name: DATABASES, value: "athleticmap keycloak" } - - { name: DESTINO, value: "/backups" } - - { name: RETENCAO_DIAS, value: "7" } - # O envio para fora. O script se cala quando o Secret nao existe, e - # falha ALTO quando existe e nao funciona — sao coisas diferentes, - # e um CronJob que falha toda madrugada por falta de credencial - # ensina todo mundo a ignorar o unico alerta que nao se pode ignorar. - - { name: COMANDO_ENVIO, value: "enviar_offsite.sh {}" } - # Um prefixo POR ORIGEM no bucket: sem ele todos gravavam em `athleticmap/` com o - # mesmo nome de arquivo — nao se sabia de quem era o dump, e dois no mesmo segundo - # se sobrescreveriam (visto em 01/10/2026). - - { name: OFFSITE_PREFIXO, value: "athleticmap/demo" } - # `optional: true`: enquanto o Secret `backup-offsite` nao existir, o - # CronJob roda igual e guarda local. No dia em que ele existir, o - # envio liga sozinho — sem tocar neste arquivo. - envFrom: - - secretRef: { name: backup-offsite, optional: true } - command: ["backup_tenant.sh"] - volumeMounts: - - { name: backups, mountPath: /backups } - volumes: - - name: backups - persistentVolumeClaim: - claimName: pg-backups diff --git a/tenants/piloto/50-backup.yaml b/tenants/piloto/50-backup.yaml deleted file mode 100644 index 1fdd945..0000000 --- a/tenants/piloto/50-backup.yaml +++ /dev/null @@ -1,91 +0,0 @@ -# Backup diario do Postgres do tenant piloto (pg_dump -> PVC, retencao 7 dias) -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: pg-backups - namespace: piloto-prod -spec: - accessModes: [ReadWriteOnce] - storageClassName: local-path - resources: - requests: - storage: 5Gi ---- -# ConfigMap com o DESTINATARIO age (chave PUBLICA). -# -# Publica pode ser versionada: ela so cifra. Quem tem a publica NAO abre o -# backup. A privada e gerada por scripts/backup/gerar_chave_backup.sh na maquina -# de quem restaura, e NUNCA chega neste repositorio nem no VPS. -# -# O valor abaixo e um marcador: substitua pelo destinatario real antes de -# aplicar. Com o marcador, o backup_tenant.sh recusa rodar em vez de gravar em -# claro — e o comportamento certo. -apiVersion: v1 -kind: ConfigMap -metadata: - name: pg-backup-chave - namespace: piloto-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: - name: pg-backup - namespace: piloto-prod -spec: - schedule: "0 2 * * *" # diariamente 02:00 - successfulJobsHistoryLimit: 3 - failedJobsHistoryLimit: 3 - concurrencyPolicy: Forbid - jobTemplate: - spec: - template: - # O label e o que a 19-netpol-backup-offsite seleciona: so o pod do backup - # sai para a internet (443), para mandar o dump cifrado ao bucket. - metadata: - labels: { app: pg-backup } - spec: - restartPolicy: OnFailure - containers: - # Imagem propria: postgres:16 + age. O dump precisa ser cifrado - # ANTES de sair do processo, entao as duas ferramentas tem de estar - # no mesmo container. Construida de scripts/backup/Containerfile. - - name: pg-backup - image: docker.io/library/atm-pg-backup:1.3 - env: - - name: PGPASSWORD - valueFrom: - 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" } - - { name: DATABASES, value: "athleticmap keycloak" } - - { name: DESTINO, value: "/backups" } - - { name: RETENCAO_DIAS, value: "7" } - # O envio para fora. O script se cala quando o Secret nao existe, e - # falha ALTO quando existe e nao funciona — sao coisas diferentes, - # e um CronJob que falha toda madrugada por falta de credencial - # ensina todo mundo a ignorar o unico alerta que nao se pode ignorar. - - { name: COMANDO_ENVIO, value: "enviar_offsite.sh {}" } - # Um prefixo POR ORIGEM no bucket: sem ele todos gravavam em `athleticmap/` com o - # mesmo nome de arquivo — nao se sabia de quem era o dump, e dois no mesmo segundo - # se sobrescreveriam (visto em 01/10/2026). - - { name: OFFSITE_PREFIXO, value: "athleticmap/piloto" } - # `optional: true`: enquanto o Secret `backup-offsite` nao existir, o - # CronJob roda igual e guarda local. No dia em que ele existir, o - # envio liga sozinho — sem tocar neste arquivo. - envFrom: - - secretRef: { name: backup-offsite, optional: true } - command: ["backup_tenant.sh"] - volumeMounts: - - { name: backups, mountPath: /backups } - volumes: - - name: backups - persistentVolumeClaim: - claimName: pg-backups