Christophe Casalegno

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)