- 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>
107 lines
3.4 KiB
YAML
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
|