feat(backup): skip-if-unchanged + scheduled CronJob in the chart #32

Merged
arcodange merged 1 commits from claude/dolibarr-backup-cronjob into main 2026-06-30 15:53:58 +02:00
Owner

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 :

  • DB = count + max(tms) sur toutes les tables à tms sauf le churn volatil (llx_const, llx_user, session/cron) ;
  • docs = exclut */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 était documents/users/temp/*.cache + llx_const/llx_user sub-minute.)

CronJob (automatisation)

La logique conteneur passe dans chart/files/backup-job.sh (source unique, lue par l'orchestrateur et le chart). Nouveau chart/templates/backup-cronjob.yaml = CronJob quotidien + ConfigMap + VaultStaticSecret, gated par backup.enabled (false par défaut).

Vérifié Helm : off par défaut (0 CronJob), on → rend correctement, env-aware (PREFIX=erp/prod vs erp/sandbox), script embarqué.

Activation (documentée, gate creds)

  1. stocker les creds HMAC GCS à kvv2/<backup.vaultS3Path> (défaut erp/backup) ;
  2. autoriser le rôle Vault auth d'erp à lire ce path (changement tools) ;
  3. backup.enabled: true.

En attendant, l'orchestrateur ops/backup/dolibarr-backup.sh tourne à la demande (prod déjà sauvegardé).

🤖 Generated with Claude Code

Suite du backup dédié ([#31](https://gitea.arcodange.lab/arcodange-org/erp/pulls/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 : - **DB** = `count + max(tms)` sur toutes les tables à `tms` **sauf** le churn volatil (`llx_const`, `llx_user`, session/cron) ; - **docs** = exclut `*/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 était `documents/users/temp/*.cache` + `llx_const`/`llx_user` sub-minute.) ## CronJob (automatisation) La logique conteneur passe dans `chart/files/backup-job.sh` (source unique, lue par l'orchestrateur **et** le chart). Nouveau `chart/templates/backup-cronjob.yaml` = CronJob quotidien + ConfigMap + VaultStaticSecret, **gated par `backup.enabled` (false par défaut)**. Vérifié Helm : off par défaut (0 CronJob), on → rend correctement, env-aware (`PREFIX=erp/prod` vs `erp/sandbox`), script embarqué. ## Activation (documentée, gate creds) 1. stocker les creds HMAC GCS à `kvv2/<backup.vaultS3Path>` (défaut `erp/backup`) ; 2. autoriser le rôle Vault `auth` d'erp à lire ce path (changement `tools`) ; 3. `backup.enabled: true`. En attendant, l'orchestrateur `ops/backup/dolibarr-backup.sh` tourne à la demande (prod déjà sauvegardé). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
arcodange added 1 commit 2026-06-30 15:53:48 +02:00
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>
arcodange merged commit 223dae227e into main 2026-06-30 15:53:58 +02:00
arcodange deleted branch claude/dolibarr-backup-cronjob 2026-06-30 15:53:59 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: arcodange-org/erp#32