Files
k8s-manifests/backup-system/cronjob-backup.yaml
T
chemavxandClaude Fable 5 ed3d886090 feat(backup-system): cobertura completa del homelab + sync diario a Mega
- backup.sh: fix openclaw (tar-eaba un hostPath stub vacio, 104 bytes/dia
  desde hace meses); ahora resuelve el PVC real via local-path.
- Nuevos servicios: ghost-en/zona-exclusion (VACUUM INTO consistente via
  node del pod + tar del content), gitea (sqlite .backup + repos + conf,
  sin packages 6.4G reconstruibles), researchowl (sqlite backup API via
  python3), roswell-pg, umami-pg, infisical-pg, trilium, vaultwarden,
  uptime-kuma (sqlite3 .backup), filebrowser-db, home-master (sin ~/.ssh
  ni caches), k3s token + /etc/rancher/k3s (cadena de restauracion).
- Validacion por artefacto: gzip -t + tamano minimo; el job sale 1 si
  falta algo -> alerta Grafana->Telegram existente.
- rclone-mega: de semanal a diario (03:30); --exclude reddit-intel/.
- Nuevo CronJob reddit-intel-backup en n97 (unico dato del worker fuera
  de k3s; su cron local escribia en el mismo disco).
- verify.sh: lista completa (20 servicios + reddit-intel), diario,
  ventana de frescura 3 dias (BusyBox-safe).
- backoffLimit 1 (retry recrearia artefactos y romperia la retencion).
- RESTORE.md: runbook con la cadena token->state.db->infisical-secrets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 16:12:27 +00:00

107 lines
3.4 KiB
YAML

apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
namespace: backup-system
spec:
schedule: "0 2 * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
# Sin reintentos automáticos: un reintento re-crea TODOS los artefactos con
# otro timestamp y la retención por número podría expulsar copias buenas.
backoffLimit: 1
activeDeadlineSeconds: 3600
template:
spec:
restartPolicy: Never
serviceAccountName: backup-sa
securityContext:
runAsUser: 0
nodeSelector:
kubernetes.io/hostname: chemavx-k8
containers:
- name: backup
# bitnami/kubectl v1.36.2 — pinneado por digest: los tags de bitnami
# en Docker Hub ya no son fiables (migración Broadcom/bitnamilegacy)
image: docker.io/bitnami/kubectl@sha256:558420daf32bbc382e3e9af4537f4073085b336ddd47399a3b70e70087115978
command: ["/bin/bash", "/scripts/backup.sh"]
env:
- name: KUBECONFIG
value: /kubeconfig/k3s.yaml
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: "1"
memory: 1Gi
volumeMounts:
- name: backup-dir
mountPath: /data/backups/backups
- name: n8n-data
mountPath: /data/n8n
- name: openclaw-data
mountPath: /data/openclaw
- name: scripts
mountPath: /scripts
- name: k3s-storage
mountPath: /var/lib/rancher/k3s/storage
- name: kubeconfig
mountPath: /kubeconfig/k3s.yaml
- name: k3s-db
mountPath: /data/k3s-db
readOnly: true
- name: k3s-token
mountPath: /host/k3s-token
readOnly: true
- name: etc-rancher-k3s
mountPath: /host/etc-rancher-k3s
readOnly: true
- name: home-chemavx
mountPath: /host/home-chemavx
readOnly: true
volumes:
- name: backup-dir
hostPath:
path: /data/backups/backups
type: DirectoryOrCreate
- name: n8n-data
hostPath:
path: /data/n8n
type: DirectoryOrCreate
- name: openclaw-data
hostPath:
path: /data/openclaw
type: DirectoryOrCreate
- name: scripts
configMap:
name: backup-scripts
defaultMode: 0755
- name: k3s-storage
hostPath:
path: /var/lib/rancher/k3s/storage
type: Directory
- name: kubeconfig
hostPath:
path: /etc/rancher/k3s/k3s.yaml
type: File
- name: k3s-db
hostPath:
path: /var/lib/rancher/k3s/server/db
type: Directory
- name: k3s-token
hostPath:
path: /var/lib/rancher/k3s/server/token
type: File
- name: etc-rancher-k3s
hostPath:
path: /etc/rancher/k3s
type: Directory
- name: home-chemavx
hostPath:
path: /home/chemavx
type: Directory