A l'image de NiKo, la sauvegarde de mon environnement me titille depuis quelques jours. Le tout dans le même contexte que NiKo à savoir un accès SSH disponible sur mon environnement.

Mes objectifs :
  • sauvegarde régulière (mensuelle, hebdomadaire et quotidienne)
  • dépôt de chaque sauvegarde sur un serveur FTP
Pourquoi autant de saves différentes ?
Car les besoins de restore peuvent être différents :
  • Le crash disque exige l'information la plus à jour possible et donc une ''save quotidienne''.
  • La modification d'un paramètre s'avère avoir corrompu vos données mais vous ne vous en apercevez que 10 jours plus tard. Réponse : "la save hebdo".
  • Vous avez fait le ménage dans votre blog. Mais au bout de quelques mois, vous vous dites que ce vieil article sur la prose sous Bash était pas si mal. "Save mensuelle" :-)
Principes de ce script :
  • prise en paramètre de la périodicité,
  • création de 3 répertoires /mybackup/mois, semaine et jour tant en local que sur le serveur FTP
  • banalisation des noms des sauvegardes permettant leur écrasement de manière régulière et automatique :
    • quotidienne (7 saves en rotation): de 01-blog.tar.gz à 06-blog.tar.gz
    • hebdo (5 saves en rotation) : de 0-blog.tar.gz à 4-blog.tar.gz
    • mensuelle (12 saves en rotation) : de 01-blog.tar.gz à 12-blog.tar.gz
Edit: On peut jouer sur la profondeur de rétention de ces saves en travaillant sur le calcul du SERIALNUMBER.

Exemple : pour passer la save quotidienne d'une rétention de 7 jours à 2 jours, il faut remplacer la portion de ligne "$jour % 7" par "$jour % 2".

Mise en oeuvre via CRON :
0  23 1 * * /chemin/save_blog.sh mois
20 23 * * 0 /chemin/save_blog.sh semaine
40 23 * * 1-6 /chemin/save_blog.sh jour
Une save mensuelle le 1er de chaque mois. Une save hebdo tous les dimanches. Une save qutodienne du lundi au samedi.

Script save_blog.sh basé sur celui de NiKo avec modification :
 #!/bin/bash
# ### save_blog.sh : script de NiKo(c) adapté pour le dépôt FTP et la retention des saves
# ### Ref : http://www.prendreuncafe.com/blog/2006/01/22/382-programmer-ses-backups-dotclear-grace-a-un-script-bash-et-cron

# ### Initialisation des variables ###

# variables concernant les repertoires
DIR_BLOG="/var/www/blog" # repertoire racine du site (blog)
DIR_BASE_BACKUP="/var/mybackup" # repertoire de base de stockage des backups
DIR_BACKUP="$DIR_BASE_BACKUP/$1" # on recupere le premier parametre du script qui indique le type de backup

# variables concernant la base de donnees
SQL_HOST="host"
SQL_USER="user"
SQL_PASS="password"
SQL_BASE="databasename"

CURRENTDATE=$(date +%Y%m%d)

# ### Periodicite de sauvegarde ###

case "$1" in

"mois" )
#CURRENTDATE=$(date +%Y%m%d)
SERIALNUMBER=$(date +%m)
;;

"semaine" )
jour=$(date +%d)
let "SERIALNUMBER=$jour / 7"
;;

"jour" )
jour=$(date +%d)
let "SERIALNUMBER=$jour % 7"
;;

* )
echo "Usage: $0 "
echo "Sauvegarde du blog avec periodicite passee en parametre"
echo ""
echo "periodicite: jour, semaine ou mois"
exit
esac


# ### Sauvegarde ###

DBDUMP_FILENAME="$SERIALNUMBER-dump.sql"
BLOGARCHIVE_FILENAME="$SERIALNUMBER-blog"

echo "Export de la base de données..."
touch $DIR_BACKUP/$DBDUMP_FILENAME
mysqldump -h $SQL_HOST -u $SQL_USER --password=$SQL_PASS $SQL_BASE > $DIR_BACKUP/$DBDUMP_FILENAME

echo "Compression de l'export..."
tar czf $DIR_BACKUP/$DBDUMP_FILENAME.tar.gz $DIR_BACKUP/$DBDUMP_FILENAME

echo "Création de l'achive globale..."
tar czf $DIR_BACKUP/$BLOGARCHIVE_FILENAME.tar.gz $DIR_BLOG $DIR_BACKUP/$DBDUMP_FILENAME.tar.gz

# ### Envoi FTP ###

echo "Envoi FTP de la sauvegarde du blog ..."
ftp -n siteftp <<Fin-De-Session
user username "password"
binary
cd mybackup
cd $1
lcd $DIR_BACKUP
put "$BLOGARCHIVE_FILENAME.tar.gz"
bye
Fin-De-Session

# ### Nettoyage ###

echo "Suppression des fichiers temporaires..."
rm -f $DIR_BACKUP/$DBDUMP_FILENAME
rm -f $DIR_BACKUP/$DBDUMP_FILENAME.tar.gz

echo "Sauvegarde effectuee dans $DIR_BACKUP/$BLOGARCHIVE_FILENAME.tar.gz"