SxFilesBkp (ScalarX File Backup) : script de backup de fichiers basé sur rdiff-backup
SxFilesBkp (ScalarX File Backup)
SxFilesBkp est un script Bash sous licence GPL conçu pour réaliser des sauvegardes fichiers incrémentales et versionnées via rdiff-backup, vers une destination distante en SSH. Il est pensé pour un usage production sur des serveurs Linux (notamment la flotte StackX), avec une approche pragmatique : robuste, traçable, et opérable.
C’est l’évolution « naturelle » de sxbackup et de brainbackup que j’avais écrite lors d’une série de livecoding il y a quelques années sur ma chaîne YouTube. J’ai sorti le backup de DB pour le séparer dans un module à part que je vais également publier.
Le script pilote rdiff-backup comme un « moteur » fiable : il sauvegarde une liste de répertoires, maintient un historique incrémental, puis applique une politique de rétention (30D par défaut). Il ajoute les fondamentaux attendus en production : verrouillage anti-concurrence, logs horodatés, validation des entrées et options de limitation de charge (nice/ionice).
Objectif et philosophie
SxFilesBkp vise un compromis simple et efficace :
Source locale : liste explicite de répertoires à sauvegarder (fichier .dirs).
Destination distante : un serveur de backup accessible en SSH.
Historique : incréments conservés, navigables, purgés selon rétention.
Opérationnel : logs systématiques, lock strict, erreurs explicites.
Le format cible est volontairement stable et structuré :
${REMOTE_USER}@${REMOTE_HOST}::${REMOTE_ROOT}/${REMOTE_TAG}/${REL_PATH}
Ce qui permet de segmenter proprement les backups par serveur (REMOTE_TAG) et par répertoire (REL_PATH).
Fonctionnalités principales
Exécution safe en production :
Exécution root obligatoire.
Verrouillage anti-concurrence renforcé via lockfile + flock (contrôle symlink, type, owner root, umask 077).
Logs systématiques dans /var/log/sxfilesbkp/ avec mirroring stdout/stderr (tee) + timestamps.
Backup incrémental distant via rdiff-backup :
– Support automatique des syntaxes rdiff-backup « modernes » (détection des actions via « rdiff-backup backup –help »).
– Fallback compatible avec l’ancienne CLI (mode « sxbackup-like ») si nécessaire.
– Support optionnel de –remote-schema pour forcer la manière dont rdiff invoque le serveur distant.
Exemple : « ssh -C {h} rdiff-backup –new server »
Rétention et purge :
– Politique de rétention configurable : RETENTION_REMOTE (ex: 30D, 12W, 6M, 1Y).
– Purge automatique des incréments après backup (désactivable).
– Mode purge-only.
– Gestion pragmatique de certains retours non fatals (ex: rc=2 traité comme warning sur remove increments dans certains cas).
Exclusions et hygiène :
– Exclusion des autres filesystems (–exclude-other-filesystems) activable.
– Exclusion des fichiers spéciaux (–exclude-special-files) activable.
– Exclusion des symlinks optionnelle.
– Exclusion globbing via fichier (rdiff-backup patterns) optionnelle.
– Exclusion automatique des répertoires contenant un marqueur .nosxbackup (configurable).
Contrôle de charge :
– Enrobage optionnel via nice (niveau configurable).
– Enrobage optionnel via ionice (classe/niveau configurables).
Architecture technique
1) Configuration déclarative
– Un fichier sxfilesbkp.cfg au format « KEY:VALUE » (avec trimming et suppression des commentaires).
– Un fichier sxfilesbkp.dirs listant les répertoires sources (1 par ligne).
– Optionnel : un fichier d’exclusions globbing (rdiff-backup).
2) Normalisation des chemins
Chaque répertoire source est converti en un chemin relatif stable (REL_PATH).
« / » est protégé par défaut (ALLOW_SOURCE_ROOT:no) pour éviter une erreur opérationnelle coûteuse.
3) Destination distante stable
Construction de la destination sous forme :
user@host::root/tag/rel
Ce découpage (ROOT/TAG/REL) permet de :
– mutualiser un datastore sur le serveur de backup,
– segmenter par machine,
– éviter les collisions.
4) Exécution
– Pour chaque répertoire : backup incrémental.
– Ensuite (si activé) : purge des incréments plus vieux que RETENTION_REMOTE.
Utilisation
Arborescence typique :
/etc/sx/sxfilesbkp/
sxfilesbkp.cfg
sxfilesbkp.dirs
sxfilesbkp.excludes (optionnel)
Initialisation (backup + purge selon rétention) :
sxfilesbkp
Mode dry-run :
sxfilesbkp --dry-run
Désactiver la purge :
sxfilesbkp --no-purge
Purge uniquement (sans backup) :
sxfilesbkp --purge-only
Tester la compatibilité distante (avant backup) :
sxfilesbkp --test
Changer les chemins de config :
sxfilesbkp -c /etc/sx/sxfilesbkp/sxfilesbkp.cfg -l /etc/sx/sxfilesbkp/sxfilesbkp.dirs
Logs :
ls -latr /var/log/sxfilesbkp/
tail -f /var/log/sxfilesbkp/sxfilesbkp-YYYYMMDD-HHMMSS.log
Note : le script doit être lancé avec les droits root, parce que le root c’est la vie.
Configuration (exemple)
sxfilesbkp.cfg (format KEY:VALUE) :
REMOTE_HOST:backup_server
REMOTE_USER:server_username
REMOTE_ROOT:/datastore/servers
REMOTE_TAG:server_dirname
RETENTION_REMOTE:30D
VERBOSITY:3
PRINT_STATS:yes
CREATE_FULL_PATH:yes
EXCLUDE_OTHER_FILESYSTEMS:yes
EXCLUDE_SPECIAL_FILES:yes
EXCLUDE_SYMLINKS:no
#EXCLUDE_GLOBS_FILE:/etc/sx/sxfilesbkp/sxfilesbkp.excludes
EXCLUDE_IF_PRESENT:.nosxbackup
USE_NICE:yes
NICE_LEVEL:10
USE_IONICE:yes
IONICE_CLASS:2
IONICE_LEVEL:7
ALLOW_SOURCE_ROOT:no
sxfilesbkp.dirs :
/boot
/etc
/home
/opt
/root
/run
/srv
/usr
/var
sxfilesbkp.excludes (optionnel, globbing rdiff-backup) :
/cache/
/.cache/
/node_modules/
/.npm/
/.composer/cache/
/tmp/
Notes de conception
SxFilesBkp est volontairement « boring » : peu de magie et beaucoup de garde-fous.
– Le parsing de config évite eval et rejette les clés non conformes.
– Le lock est traité comme une surface d’attaque (symlink, owner, type, perms).
– La stratégie par liste de répertoires évite les surprises et facilite l’audit.
– L’option REMOTE_SCHEMA adresse les environnements hétérogènes (rdiff-backup old/new, serveur distant encapsulé, etc.).
Todo list
– Vérification stricte et explicite de la configuration remote (sanity check : user/host/root/tag).
– Mode « single dir » optionnel (override ponctuel de la liste sans éditer le fichier .dirs).
– Rapports de stats plus lisibles en fin d’exécution (résumé par répertoire).
– Option de chiffrement au repos côté datastore (si backend le supporte) + documentation opératoire associée.
Ressources
Le script + fichiers de configuration d’exemple : sxfilesbkp.tar.gz
—
Christophe Casalegno (retrouvez tous mes réseaux sur : all.bo)