sauvegarde

un script de sauvegarde

ce script a pour but de faire une sauvegarde sur une machine dans un dossier dédié a cela, puis de télécharger la sauvegarde vers un serveur FTP, il est simple et il faut son petit truc plutôt bien... . évidement il est modifiable pour mieux accommoder vos envies et besoins

ce qu'il faut :

pour que ce script fonctionne "tel que" il faudra le choses suivantes :

  • NCFTP : il faut donc installer ncftp, puis créer un "bookmark" en enregistrant le mot de passe. ATTENTION il faut faire ça sous l'utilisateur qui va exécuter le script de sauvegarde, dans mon cas j'ai peur de rien, c'est root.. .. .
  • bzip2 : ce truc va nous servir a compresser les archives, on peut s'en passer si on veut juste faire des ".tar.gz" a la place, pour cela il faudra changer "tar jcfp" en "tar zcf" dans le script

paramétrage

la ça va être simple, mais bon c'est en anglais donc je comment ici en fr_FR

  • BACKUPROOT : ceci est le répertoire racine pour stocker les sauvegardes.NOTE: dans ce répertoire le script va créer un lien "current" vers le répertoire de la dernière sauvegarde effectué.
  • DAYS : ici on défini le nombre de jours qu'on sauvegarde, c'est a dire que ce qui est plus vieux que ce qui est défini ici sera supprimé, c'est un bon moyen de ne pas explosé l'espace disque
  • BACKUPDIRS : c'est la qu'on va (enfin) définir les répertoires a sauvegardé, suffit de mettre les répertoires séparé par un espace
  • NCFTPBOOKMARK : ici mettre le nom du bookmark ncftp a utiliserIMPORTANT : pour indiquer a ncftp ce qu'il doit faire, je fait un fichier /root/ftpcommands qui contient les commandes a exécuter, j'ai mis un exemple dans le script (dans mon cas je me connecte au serveur ftp, j'efface ce qui y est, et ensuite j'upload la sauvegarde courant

utilisation

le plus simple est de mettre le script dans /usr/local/sbin/backup.sh et de simplement exécuter le script. encore mieux serait de dire a crontab de le faire tout seul régulièrement par exemple ainsi (tout les jours a 5h du matin) :

echo "0 5 * * * root /usr/local/sbin/backup.sh"

le script

alors le script est la ci-dessous pour les fans du copie collage, sinon y'a moyen de le télécharger directement pour les fans de wget

#!/bin/bash # this script creates tar.bz2 archives and places them in a backup folder ordered by date # where the latest is linked to a folder called "current" # DEPENDS: bunzip2 ncftp (for ncftp create a bookmark with saved password) # TODO: - simplify ftp uploading # - do something about scp/rsync maybe # AUTHOR: Emmanuel REVAH manu-AT-manurevah.com http://manurevah.com/ # i'm not sure about a licence so whatever, just don't sue me.. . ... :] # o/ logger "backup script: started" DATE=$(date +%a_%d_%b_%Y_%Hh%Mm%S) MONTH=$(date +%B_%Y) ########### configuration options ############## # where we keep all the backups BACKUPROOT="/home/backup/mybackup" BACKUP="${BACKUPROOT}/${MONTH}/backup_${DATE}/" # how many days worth of backups do we need to keep ? DAYS="5" # folders to backup: space separated values BACKUPDIRS="/etc /var/log" BACKUPDIRS=`ls -d ${BACKUPDIRS}` # ncftp (create a bookmark with saved password) # you will also need a file with ftp commands in /root/ftpcommands mine contains: # cd backup # rm -rf current # put -r /home/backup/current # quit NCFTPBOOKMARK="ftpbookmark" # either place a file containing ONLY the password in clear text (chmod 600 and chown root of course) # or just replace the password here MYSQL_USER_PASS="--user=root --password=`cat /root/.sqlpasswd`" ############ end of configuration ################ # cleanup up the "current" folder and link the new one rm -f ${BACKUPROOT}/current test -d ${BACKUP} || mkdir -p ${BACKUP}/mysql ln -s ${BACKUP} ${BACKUPROOT}/current # make some archive files for DIRS in ${BACKUPDIRS}; do DIRNAME=`echo ${DIRS}|sed 's///_/g'` tar jcfp ${BACKUP}/${DATE}${DIRNAME}.tar.bz2 ${DIRS}; done # mysql: please test this line to make sure it correctly lists the names of the databases MYBASES="`ls -1 /var/lib/mysql |grep -v ib_* |grep -v debian-5.0.flag | grep -v mysql_upgrade_info`" for DBS in ${MYBASES};do mysqldump --databases ${DBS} ${MYSQL_USER_PASS} > ${BACKUP}/${DATE}_${DBS}.sql done logger "backup script: local backup done :]" ncftp ${NCFTPBOOKMARK} < /root/ftpcommands logger "backup script: upload current backup to ${NCFTPBOOKMARK}" # erase older data find ${BACKUPROOT} -type f -mtime +${DAYS} -exec rm -rf {} ; rmdir -p ${BACKUPROOT}/*/*/* logger "backup script: removed backups older than ${DAYS} days" exit