Le principe
Un serveur qui héberge plusieurs instances Dolibarr (ERP) doit être sauvegardé de façon fiable, chiffrée et économe. La méthode présentée ici s'appuie sur restic : chaque nuit, le serveur sauvegarde toutes ses instances (fichiers + bases de données) vers un NAS distant. Les sauvegardes sont chiffrées, dédupliquées et incrémentales.
Pourquoi restic plutôt qu'une archive complète quotidienne ?
La sauvegarde « classique » (un .tar.gz complet par site, chaque jour, telle que produite par certains panneaux d'hébergement) fonctionne mais montre vite ses limites dès que les données grossissent. Comparatif :
| Critère | Archive complète quotidienne | restic |
|---|---|---|
| Espace de stockage | Copie complète chaque jour (ex. 5 Go × 15 jours = 75 Go, et ça se multiplie par instance) | Dédupliqué : les données stockées une seule fois + petits deltas quotidiens |
| Chiffrement | Généralement aucun (archive et transfert en clair) | Dépôt chiffré de bout en bout |
| Lisibilité | 1 fichier par site, extraction directe | Dépôt géré — restauration via la commande restic (ce guide) |
| Restauration fine | Tout ou rien par archive | Un fichier, un dossier, une base, une date précise |
| Rétention | Simple purge par nombre de jours | Politiques quotidien / hebdo / mensuel automatiques |
L'architecture
La chaîne de sauvegarde :
Serveur Dolibarr → dump des bases + fichiers
↓
restic (chiffre & déduplique) → rclone (transport)
↓
NAS distant (dépôt chiffré)
Éléments typiques d'une telle installation (chemins d'exemple, à adapter) :
| Élément | Emplacement d'exemple |
|---|---|
| Script de sauvegarde | /usr/local/sbin/backup-dolibarr.sh |
| Planification (cron) | /etc/cron.d/backup-dolibarr — chaque nuit en heure creuse |
| Journal | /var/log/backup-dolibarr.log |
| Dépôt restic | rclone:nas:<dossier-du-serveur>/restic |
| Mot de passe du dépôt | /root/.restic-pass (+ une copie hors serveur, cf. encadré) |
| Config rclone (remote FTP) | /root/.config/rclone/rclone.conf |
| Ce qui est sauvegardé | Fichiers : /var/www/clients (webroots + documents) • Bases : dumps SQL dans /var/backups/db |
Le script de sauvegarde (schéma)
Le principe du script exécuté chaque nuit :
#!/bin/bash
set -uo pipefail
export RESTIC_REPOSITORY="rclone:nas:<dossier-du-serveur>/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
DUMPDIR=/var/backups/db
# 1) Dump de toutes les bases (hors bases systeme)
mkdir -p "$DUMPDIR"; rm -f "$DUMPDIR"/*.sql
for db in $(mysql -N -e "SHOW DATABASES" \
| grep -vE '^(information_schema|performance_schema|mysql|sys)$'); do
mysqldump --single-transaction --routines --triggers "$db" > "$DUMPDIR/$db.sql"
done
# 2) Sauvegarde chiffree : fichiers + dumps
restic backup /var/www/clients "$DUMPDIR" --tag dolibarr --exclude-caches
# 3) Retention (purge automatique des anciennes)
restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 6 --prune
/var/www/clients et sa base est découverte par le SHOW DATABASES.Superviser (est-ce que ça tourne ?)
En SSH sur le serveur, en root. Charger une fois les variables du dépôt :
export RESTIC_REPOSITORY="rclone:nas:<dossier-du-serveur>/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic snapshots # liste les sauvegardes datées (la plus récente en bas)
tail -20 /var/log/backup-dolibarr.log # journal de la derniere nuit
restic stats # taille reelle occupee
restic check # verifie l'integrite du depot (periodiquement)
restic snapshots et une fin de journal sans erreur.Restaurer
Les commandes supposent les deux export ci-dessus déjà faits. On restaure toujours vers un dossier neuf (ex. /restore) pour ne rien écraser, puis on recopie ce qu'il faut.
1. Voir ce qu'on peut restaurer
restic snapshots # choisir une date (noter son ID court)
restic ls latest # lister les fichiers du dernier snapshot
restic ls latest /var/backups/db # voir les bases disponibles
2. Restaurer une instance complète (fichiers + base)
Exemple pour une instance dont les fichiers sont dans clientX/webY et la base s'appelle masite_db :
# a) Fichiers de l'instance
restic restore latest --target /restore \
--include /var/www/clients/clientX/webY
# b) Dump de sa base
restic restore latest --target /restore \
--include /var/backups/db/masite_db.sql
# c) Reimporter la base
mysql masite_db < /restore/var/backups/db/masite_db.sql
# d) Remettre les fichiers en place (ajuster proprietaire/chemin)
rsync -a /restore/var/www/clients/clientX/webY/ /var/www/clients/clientX/webY/
3. Restaurer un seul fichier (ex. un document perdu)
restic restore latest --target /restore \
--include "/var/www/clients/clientX/webY/private/documents/xxx/fichier.pdf"
4. Restaurer une version d'il y a quelques jours
restic snapshots # reperer l'ID de la date voulue (ex. a1b2c3d4)
restic restore a1b2c3d4 --target /restore --include /var/backups/db/masite_db.sql
5. Réimporter une base directement
restic dump latest /var/backups/db/masite_db.sql | mysql masite_db
6. Parcourir la sauvegarde comme un disque
mkdir -p /mnt/restic
restic mount /mnt/restic # laisser tourner ; naviguer dans un 2e terminal
# ls /mnt/restic/snapshots/latest/var/www/clients/...
# (Ctrl+C pour demonter)
Reprise totale (le serveur est détruit)
Scénario catastrophe : le serveur n'existe plus. On restaure depuis le NAS sur un serveur neuf.
- Provisionner un serveur neuf et réinstaller la même pile applicative.
- Installer les outils :
apt install restic rclone. - Récupérer sur le NAS le mot de passe du dépôt (copie déposée dans le dossier du dépôt).
- Recréer le remote rclone vers le NAS (mêmes paramètres de transport).
- Pointer restic sur le dépôt et le mot de passe récupéré, puis
restic restore latest --target /restore. - Réimporter chaque base (
/restore/var/backups/db/*.sql) et remettre les fichiers (/restore/var/www/clients/…). - Vérifier le fichier de configuration de chaque instance Dolibarr (
conf.php: chemins, base). La clé de chiffrement interne de Dolibarr y est stockée, elle est donc préservée avec les fichiers.
LISEZMOI-restore.txt à côté du dépôt sur le NAS, avec les commandes essentielles — la restauration reste possible même sans ce guide sous la main.Dépannage
Pas de nouvelle sauvegarde depuis plusieurs jours
Consulter le journal, puis lancer une sauvegarde manuelle (le script). Vérifier l'accès au NAS avec rclone lsd nas:.
Erreur d'accès au NAS
Vérifier que le NAS est joignable (port de transport ouvert, NAS allumé) et que les identifiants du remote rclone sont valides.
« repository is already locked »
Verrou résiduel après une interruption : restic unlock puis relancer.
Vérifier que tout est réellement récupérable
restic check pour l'intégrité, et périodiquement un vrai test : restaurer vers un dossier temporaire, contrôler les fichiers, puis le supprimer. Une sauvegarde jamais testée ne vaut rien.
À retenir
- Sauvegarde quotidienne automatique, chiffrée, vers un NAS — fichiers + bases.
- Le mot de passe du dépôt est la clé de tout : en garder une copie hors du serveur.
- Superviser =
restic snapshots+ le journal. Restaurer =restic restore … --target /restore. - Toute nouvelle instance est incluse automatiquement.
- Rétention automatique : quotidiens, hebdomadaires, mensuels — purge gérée par restic.
- Tester la restauration régulièrement — c'est la seule preuve qu'une sauvegarde est bonne.