feat(backup): skip-if-unchanged + scheduled CronJob in the chart #32
Reference in New Issue
Block a user
Delete Branch "claude/dolibarr-backup-cronjob"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Suite du backup dédié (#31) — automatisation + l'optimisation demandée « ne rien réuploader quand rien n'a bougé ».
Skip-if-unchanged ✅
Chaque moitié (DB / documents) porte une empreinte de contenu (
erp/<env>/.fp-{db,docs}) et n'est dumpée+uploadée que si elle diffère du dernier run — un jour calme ne réuploade rien.L'empreinte porte sur le contenu métier durable, pas le bruit :
count + max(tms)sur toutes les tables àtmssauf le churn volatil (llx_const,llx_user, session/cron) ;*/temp/*(cache de stats Dolibarr régénéré en continu) — des deux côtés (empreinte et tar).Prouvé en live : RUN 1 sauvegarde les deux ; RUN 2 immédiat →
db: unchanged — skipped,docs: unchanged — skipped,uploaded=0. (Diagnostic à l'appui : le bruit étaitdocuments/users/temp/*.cache+llx_const/llx_usersub-minute.)CronJob (automatisation)
La logique conteneur passe dans
chart/files/backup-job.sh(source unique, lue par l'orchestrateur et le chart). Nouveauchart/templates/backup-cronjob.yaml= CronJob quotidien + ConfigMap + VaultStaticSecret, gated parbackup.enabled(false par défaut).Vérifié Helm : off par défaut (0 CronJob), on → rend correctement, env-aware (
PREFIX=erp/prodvserp/sandbox), script embarqué.Activation (documentée, gate creds)
kvv2/<backup.vaultS3Path>(défauterp/backup) ;authd'erp à lire ce path (changementtools) ;backup.enabled: true.En attendant, l'orchestrateur
ops/backup/dolibarr-backup.shtourne à la demande (prod déjà sauvegardé).🤖 Generated with Claude Code
Builds on the dedicated backup (erp#31). Skip-if-unchanged: each half (DB / documents) carries a content fingerprint at erp/<env>/.fp-{db,docs} and is dumped+uploaded only if it differs from the last run — a quiet ERP day re-uploads nothing. Fingerprint = durable BUSINESS content only: DB = count+max(tms) over tms tables EXCEPT volatile churn (llx_const, llx_user, session/cron); docs EXCLUDE */temp/* (Dolibarr stats cache) — from both the fingerprint and the tar. Proven live: 1st run uploads both, immediate 2nd run skips both (uploaded=0). Automation: the in-container logic moves to chart/files/backup-job.sh (single source of truth, read by the orchestrator AND the chart). New chart/templates/backup-cronjob.yaml renders a daily CronJob + ConfigMap + VaultStaticSecret, gated by backup.enabled (default false). Helm-verified: off by default (0 CronJobs), on renders correctly, env-aware (PREFIX erp/prod vs erp/sandbox), script embedded. Activation (documented): store GCS HMAC creds at kvv2/<backup.vaultS3Path> (default erp/backup), grant the erp `auth` Vault role read on it (tools change), set backup.enabled=true. Until then the orchestrator runs on demand. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>