====== [SCRIPT] OVH backup tools ======
======Descripción======
Conjunto de scripts para realizar un backup al ftp para backups que provee OVH.
======Funcionamiento======
El conjunto consta de 3 scripts, uno para ficheros, uno para MySQL (ya publicado) y otro que lanza ambos y los sube al servidor.
=====Petición de espacio=====
El espacio para backups se puede pedir a OVH mediante el Manager:
Servidor -> Servicios -> Gestión de Backups -> Backup FTP
=====Backup de Ficheros=====
El script es muy simple, al finalizar dejará un fichero comprimido conteniendo todos los directorios que son objetivo del backup:
#!/bin/bash
echo "Backup Script by dodger!"
# This var contains the destination dir where all will be stored!
# be sure to has full access to this dir!
DESTINATION="/home/backup/files/"
# Escluded files
#EXCLUDEFILES=".[Bb][aA][kK] [cC]ache tmp"
EXCLUDEFILES=".[Bb][aA][kK] tmp"
EXCLUDEFILE="/tmp/excludefile.tmp"
# date SHOT!
MYDATE=`date +%Y%m%d`
SERVERNAME=`uname -a | awk '{ print $2 }'`
BACKUPFILE=$DESTINATION"/"$SERVERNAME"_"$MYDATE".tar.gz"
LOGFILE=$DESTINATION"/"$SERVERNAME"_"$MYDATE".log"
EXCLUDED=$DESTINATION"/"$SERVERNAME"_"$MYDATE".excluded"
# this var contains all the desired backed-up dirs all in 1 line separated by spaces
# example: "/etc /home /my/preferred/dir"
BACKUPDIRS="$(dirname $0)/$(basename $0 .sh).dirs"
# chown and chmod permission for files
CHOWN="root:admins"
CHMOD="440"
rm -f $EXCLUDEFILE 2>> $LOGFILE
for i in $(cat $BACKUPDIRS)
do
echo $i
for j in $EXCLUDEFILES
do
find $i -name "*$j*" >> $EXCLUDEFILE
done
done
echo "Backing up your selected dirs ($BACKUPDIRS), this will take a while"
echo "file will be: $BACKUPFILE"
echo "log will be: $LOGFILE"
echo "Taring"
for i in $(cat $BACKUPDIRS)
do
if [[ "$AUXDIR" ]]
then
AUXDIR="$AUXDIR $i"
else
AUXDIR="$i"
fi
done
echo $AUXDIR
nice --adjustment=19 tar czfv "$BACKUPFILE" --exclude-from=$EXCLUDEFILE $AUXDIR > "$LOGFILE" 2>> $EXCLUDED
cat $EXCLUDEFILE >> $EXCLUDED
rm -f $EXCLUDEFILE 2>> $LOGFILE
find $DESTINATION -type f -exec chmod $CHMOD {} \;
find $DESTINATION -type f -exec chown $CHOWN {} \;
echo "Ok, all done, you can read the log file in:"
echo " ->$LOGFILE"
Variables a tener en cuenta:
^Nombre ^ Descripción ^
|DESTINATION|Donde irá el backup de ficheros|
|EXCLUDEFILES|Regex que contendrá los patrones de exclusión del backup|
|BACKUPDIRS|Fichero que contiene la lista de directorios de los que se hará backup (1 directorio por linea)|
|CHOWN|Dueño de los ficheros al terminar la ejecución del script|
|CHMOD|Permisos de los ficheros al terminar la ejecución del script|
=====Backup de Mysql=====
Se usa el script standard de mysql:
* [[dba:mysql:script_backup_mysql|Script para realizar y recuperar backups de mysql]]
=====Script Global=====
El script global como se puede apreciar, llama a los dos scripts anteriores:
#!/bin/bash
BACKUPFILES="/home/root/backup/backup_files.sh"
BACKUPMYSQL="/home/root/backup/backup_mysql.sh"
BACKUPFILESDIR="/home/backup/files"
BACKUPMYSQLDIR="/home/backup/mysql"
WORKDIR="/home/backup/ftp_backup"
MYDATE="$(date +%Y%m%d)"
LFTPSCRIPT="$WORKDIR/$MYDATE.lftp"
FTPUSER="ksXXXXX.ovh.com"
FTPPASSWD="PASSWORD"
FTPSERVER="ftp-server"
HISTORIC="$(dirname $0)/$(basename $0 .sh).historic"
let MAXBACKUPS=20
check_dirs()
{
if ! [ -d $WORKDIR ]
then
mkdir -p $WORKDIR/$MYDATE
else
if [ -d $WORKDIR/$MYDATE ]
then
rm -fr $WORKDIR/$MYDATE
fi
mkdir -p $WORKDIR/$MYDATE
fi
}
do_backups()
{
$BACKUPFILES
$BACKUPMYSQL
find $BACKUPFILESDIR -type f -name "*$MYDATE*" -exec cp -fv {} $WORKDIR/$MYDATE/ \;
find $BACKUPMYSQLDIR -type f -name "*$MYDATE*" -exec cp -fv {} $WORKDIR/$MYDATE/ \;
}
upload_backup()
{
echo "set dns:cache-enable off" > $LFTPSCRIPT
echo "open -p 21 $FTPSERVER" >> $LFTPSCRIPT
echo "user $FTPUSER $FTPPASSWD" >> $LFTPSCRIPT
echo "lcd $WORKDIR" >> $LFTPSCRIPT
echo "mirror -Rc $MYDATE" >> $LFTPSCRIPT
lftp -f $LFTPSCRIPT
rm -fr $WORKDIR/$MYDATE
echo $MYDATE >> $HISTORIC
}
purge_backup()
{
let LINES=$(cat $HISTORIC | wc -l)
let HEAD=0
if [ $LINES -gt $MAXBACKUPS ]
then
echo "COMPROBAR PURGADO BACKUP FTP" | mail -s "comprobacion" YOUR_MAIL@DOMAIN.com
let HEAD=$LINES-$MAXBACKUPS
echo "set dns:cache-enable off" > $LFTPSCRIPT
echo "open -p 21 $FTPSERVER" >> $LFTPSCRIPT
echo "user $FTPUSER $FTPPASSWD" >> $LFTPSCRIPT
for i in $(head -$HEAD $HISTORIC)
do
echo "rm -fr $i" >> $LFTPSCRIPT
done
lftp -f $LFTPSCRIPT
fi
}
check_dirs
do_backups
upload_backup
purge_backup
Variables a tener en cuenta:
^ Nombre ^ Descripción ^
|BACKUPFILES="/home/root/backup/backup_files.sh"
|Path al script de backup de ficheros |
|BACKUPMYSQL="/home/root/backup/backup_mysql.sh"
|Path al script de backup de MySQL|
|BACKUPFILESDIR="/home/backup/files"
|Donde se almacenan los backups de ficheros|
|BACKUPMYSQLDIR="/home/backup/mysql"
|Donde se almacenan los backups de MySQL|
|WORKDIR="/home/backup/ftp_backup"
|Directorio temporal de trabajo|
|FTPUSER="ksXXXXX.ovh.com"
|Usuario del ftp de backups (provisto por OVH)|
|FTPPASSWD="PASSWORD"
|Password del ftp de backups (provisto por OVH)|
|FTPSERVER="ftp-server"
|Servidor ftp de backups (provisto por OVH)|
|let MAXBACKUPS=20
|Máximo número de backups que se conservarán en el Ftp|
====== New version WIP ======
===== Concept =====
digraph Incremental {
compund=true;
subgraph cluster0 {
Monday [shape=box];
Full [shape=doubleoctagon,label="Full Uncompressed backup"];
{ rank = same;
Monday;
Full;
}
Monday->Full;
}
subgraph cluster1 {
restofdays [shape=record,label="{Tuesday|...|Sunday}"];
find [shape=mdiamond];
config[shape=folder,label="Selected folders"];
zip[shape=mdiamond];
{ rank = same;
restofdays;
find;
config;
zip;
}
restofdays->find;
find->config;
config->zip;
}
FTP[shape=box,label="OVH FTP"];
{ rank = same;
zip;
FTP;
}
Monday->restofdays;
restofdays->Monday;
Full->FTP;
zip->FTP;
}