itaeng

Script per il backup di database e webroot

Da tempo ero alla ricerca di uno script semplice e funzionale per effettuare i backup dei propri siti internet in modo automatizzato, che non desse lavoro una volta installato (tipo "installa e dimentica"). Alla fine mi sono imbattuto in questo vecchio post e nel bellissimo script che ancora adesso potete ammirare su quelle pagine. 

Naturalmente dovevo modificarlo per le mie necessità, cioè renderlo agnostico riguardo alla directory in cui è installato (basta creare una directory qualunque, buttarci dentro i due file qua sotto e al resto pensa lui) ed effettuare il dump dei database...

Ma bando alle ciance:

#!/bin/bash
CURPATH=$( cd $( dirname $0 ) ; pwd )

DIR_BKP="$CURPATH"
# ========== CONFIGURATION ============
# file con i pattern da escludere dal backup
EXCLUDES="$CURPATH/excludes"
# nr di giorni da consevare
NDAY=14

# prefisso della directory del backup
PRE="backup_dati"
# directory da backuppare
TARGET="$CURPATH/../"

# configurazione dati di accesso al database
DBUSERNAME="username"
DBPASSWORD="password"
DBHOST="host.com"

# ====================================
echo "=> Fase 0 ($(date '+%d-%m-%Y %H:%M')): Backup database"
mysqldump --opt --user="$DBUSERNAME" --password="$DBPASSWORD" --host="$DBHOST" --all-database | gzip -v >  "$DIR_BKP/database.tar.gz"

# ====================================
echo "=> Fase 1 ($(date '+%d-%m-%Y %H:%M')): Cambio \
permessi e rimozione del backup piu' vecchio <="
# cambio permessi
chmod -R 700 "$DIR_BKP/$PRE."*

# Viene eseguita solo alla prima esecuzione
if [ -e "$DIR_BKP/$PRE.0" ]; then
    echo "*"
else
    echo "Prima esecuzione !!!"
    mkdir "$DIR_BKP/$PRE.0"
fi;

# rimozione del backup più vecchio
if [ -d "$DIR_BKP/$PRE.$NDAY" ] ; then
    echo "  rm -rf $DIR_BKP/$PRE.$NDAY"
    rm -rf "$DIR_BKP/$PRE.$NDAY"
fi

# ====================================
echo "=> Fase 2 ($(date '+%d-%m-%Y %H:%M')): Shifto \
di una unita' i backup esistenti <="
while [ $NDAY -gt 1 ]; do
    NDAY2=$(($NDAY-1))
    if [ -d "$DIR_BKP/$PRE.$NDAY2" ] ; then
        echo "  mv $PRE.$NDAY2 $PRE.$NDAY"
        mv "$DIR_BKP/$PRE.$NDAY2 $DIR_BKP/$PRE.$NDAY"
    fi;
    NDAY=$NDAY2;
done

# ====================================
echo "=> Fase 3 ($(date '+%d-%m-%Y %H:%M')): Creo \
hard link del backup piu' recente <="
if [ -d "$DIR_BKP/$PRE.0" ] ; then
    echo "cp -al $PRE.0 $PRE.1"
    cp -al "$DIR_BKP/$PRE.0 $DIR_BKP/$PRE.1"
fi;

# ====================================
echo "=> Fase 4 ($(date '+%d-%m-%Y %H:%M')): Eseguo \
il backup <="

# Verifica se c'è il file per le esclusioni
if [ -r $EXCLUDES ] ; then
    EXCL="--delete-excluded --exclude-from=$EXCLUDES"
else
    EXCL=""
fi;

#Comando di backup
rsync -av --delete $EXCL $TARGET "$DIR_BKP/$PRE.0"

#Sposto il backup del database
mv "$DIR_BKP/database.tar.gz" "$DIR_BKP/$PRE.0/database.tar.gz"

echo "=> Fase 5 ($(date '+%d-%m-%Y %H:%M')): Cambio i permesi in sola lettura <="
chmod -R 500 "$DIR_BKP/$PRE."*

# ====================================
echo "=> FINE ($(date '+%d-%m-%Y %H:%M')) <="

ed impostare nel file "excludes" i files e le directory che si vogliono escludere dal backup:

- backups/
- logs/
- Maildir/
- tmp/
- cms.tar.bz2
- .links/
- .ssh

Fatto! Ora basterà lanciare da shell (o da crontab) lo script in questo modo:

sh backups/bk_daily.sh e al resto penserà lui da solo...