Ce code rencontre des problèmes car il ne suprimme pas ou mal les anciennes versions historisées. A corriger.
Nous allons utiliser le planificateur de tâches de synology pour lancer un script de manière régulière.
Ce script aura la charge de sauvegarder toute une liste de répertoires critiques au fonctionnement d'un serveur Synology customisé.
Il s'appuiera sur un deuxième script qui a la charge de compresser en un tar les fichiers d'un répertoire puis de les archiver dans un répertoire cible donné, ainsi que de suprimmer les archives trop anciennes.
A noter que tous les scripts serons placés dans un répertoire donné et que celui-ci sera également sauvegardé.
Voici le script qui devra être lancé par le planificateur de tâches, à placer dans le répertoire /volume1/backups/syno/scripts/tarbackups.syno.sh
.
#!/opt/bin/bash # uncomment the following to have bash output every command before executing it #set -x DESTROOT="/volume1/backups/syno/tarbackups" BACKUPSCRIPT="/volume1/backups/syno/scripts/backup-with-history.sh" time_start=`date +%s` # Backup of /etc $BACKUPSCRIPT /etc $DESTROOT etc.tar.bz2 # Backup of /usr/syno $BACKUPSCRIPT /usr/syno $DESTROOT usr-syno.tar.bz2 # Backup of /volume1/@appstore $BACKUPSCRIPT /volume1/@appstore $DESTROOT appstore.tar.bz2 # Backup of /var/packages $BACKUPSCRIPT /var/packages $DESTROOT var-packages.tar.bz2 # Backup of /volume1/backups/syno/scripts $BACKUPSCRIPT /volume1/backups/syno/scripts $DESTROOT backup-scripts.tar.bz2 ## Calculate script duration and write file indicating last backup. time_end=`date +%s` time_elapsed=$((time_end - time_start)) convertsecs() { ((h=${1}%86400/3600)) ((m=${1}%3600/60)) ((s=${1}%60)) printf "%02d:%02d:%02d\n" $h $m $s } duration=$(convertsecs $time_elapsed) NOW="$(date +"%d-%m-%Y")" echo "$duration - $time_elapsed seconds"
On voit que ce script fait un appel au script backup-with-history.sh
par répertoire à sauvegarder.
Voici donc le script backup-with-history.sh
à placer dans le répertoire volume1/backups/syno/scripts/
:
#!/opt/bin/bash # uncomment the following to have bash output every command before executing it #set -x #fix the path PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin:/volume1/@appstore/java7/jre/bin # Options utilisées pour tar TAROPTS="-cjf" # Nombre de jours à conserver j=50 # Date du jour NOW="$(date +"%Y-%m-%d")" # Emplacemment du dossier de backup local DEST="$2" # Le nom du fichier tar qui sera créé file=$3 # On cree le répertoire du jour à la destination [[|! -d $DEST/$NOW ]] && mkdir -p $DEST/$NOW # Si un backup du même jour existe, on le renome [[|-f $DEST/$NOW/$file ]] && mv $DEST/$NOW/$file $DEST/$NOW/$file.bak # On se déplace dans le répertoire à sauvegarder cd $1 # On lance le backup : /opt/bin/tar $TAROPTS $DEST/$NOW/$file * #nbre de jour de backup a conserver j_a_delete=$(date +%Y-%m-%d --date "$j days ago") # Suppression des anciennes sauvegardes rm -rf $DEST/$j_a_delete/* rmdir $DEST/$j_a_delete