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 à tmssauf 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)
stocker les creds HMAC GCS à kvv2/<backup.vaultS3Path> (défaut erp/backup) ;
autoriser le rôle Vault auth d'erp à lire ce path (changement tools) ;
backup.enabled: true.
En attendant, l'orchestrateur ops/backup/dolibarr-backup.sh tourne à la demande (prod déjà sauvegardé).
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)
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) <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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) <[email protected]>