| Generar copias de seguridad incrementales automáticamente | ||
|---|---|---|
| Anterior | ||
HacÃa falta un sistema seguro para almacenar copias de seguridad automáticamente, sin intervención humana para evitar olvidos. La copia debÃa contener tanto documentos como bases de datos, páginas web, configuraciones del equipo, etc.
El script resultante realizará una copia completa cada domingo y copias incrementales los demás dÃas de la semana. Las copias de los domingos se sobreescriben cada dos semanas, por si hemos borrado algo y tardamos en darnos cuenta.
En palabras claras, el domingo dÃa 1 se hace copia completa. El lunes solo se salvaguarda lo que haya cambiado respecto al domingo. El martes se guarda lo que haya cambiado respecto al lunes, y asà hasta el domingo dÃa 7 en que se realiza una nueva copia completa y se archiva la anterior. La semana siguiente se hacen copias incrementales hasta el domingo dÃa 14, cuando se archiva la copia del domingo 7 sobreescribiendo la del domingo 1.
Como las copias de seguridad se hacen en el disco duro principal, cada noche sincronizaremos la copia de seguridad hacia otro dispositivo, para poder recurrir a ellas en caso de fallo del disco duro principal. Este dispositivo puede ser un equipo remoto, pero en nuestro caso aprovecharemos un disco duro que estaba cogiendo polvo y lo instalaremos como disco secundario, con la particularidad de que estará apagado todo el dÃa salvo a la hora de realizar la copia de seguridad. De este modo no solo ahorramos energÃa, sino que además evitamos un desgaste prematuro del disco y mantenemos más frÃo y silencioso el habitáculo del servidor.
![]() | No debemos olvidarnos de colocar el script en la carpeta cron.daily |
#!/bin/bash
#
# cron script to save a backup copy of Server configuration, web pages && databases
# Incremental copies on mon-sat, and full backup on sunday
#
#################### VARIABLES ####################
BAK=/home/datos/backups
DBPASS=MYSQL_PASSWORD_GOES_HERE
NUMDIA=`date +%u`
case $NUMDIA in
1) DIA=lun;;
2) DIA=mar;;
3) DIA=mie;;
4) DIA=jue;;
5) DIA=vie;;
6) DIA=sab;;
7) DIA=dom;;
esac
case $DIA in
lun) AYER=dom;;
mar) AYER=lun;;
mie) AYER=mar;;
jue) AYER=mie;;
vie) AYER=jue;;
sab) AYER=vie;;
dom) AYER=sab;;
esac
#################### FUNCIONES ####################
# Las bases de datos la copiamos entera todos los dÃas, ya que al ser 1 solo fichero no podemos
# hacer copias incrementales.
function dbbackup {
DB=$1
DBDIR=$BAK/databases
FILENAME=$2
mysqldump -p$DBPASS --opt $DB > $DBDIR/$DB'_'$DIA.sql
cd $DBDIR
tar -cjvf $FILENAME'_'$DIA'.tar.bz2' $DB'_'$DIA'.sql' 2> /tmp/backuplog > /dev/null
rm $DBDIR/$DB'_'$DIA'.sql'
}
# Hacemos una copia completa el domingo, renombrando las incrementales de la
# semana pasada y borrando la del domingo anterior
function backup {
# Pasamos como parámetro la carpeta que queremos salvar (e.g: /etc/apache2)
# Como segundo parámetro pasamos la carpeta donde guardaremos la salvaguarda
# Como tercer parámetro pasamos el fichero destino
SOURCE=$1
DEST=$2
FILENAME=$3
if [ -d $DEST ]
then
true
else
mkdir -p $DEST
fi
if [ $DIA == "dom" ]
then
# Comprimimos y guardamos copia del domingo anterior por si hay que recuperar alguna copia incremental.
mv $DEST/$FILENAME'_'$DIA'.tar.bz2' $DEST/$FILENAME'_'$DIA'_ant.tar.bz2'
tar -cjvf $DEST/$FILENAME'_'$DIA'.tar.bz2' $SOURCE 2> /tmp/backuplog > /dev/null
else
# Hacemos copias incrementales respecto a la del dÃa anterior entre lunes y sábado
# y borramos las del mismo dÃa de la semana anterior
LASTCHG=`date +%y%m%d -r $DEST/$FILENAME'_'$AYER'.tar.bz2'`
tar -cjvf $DEST/$FILENAME'_'$DIA'.tar.bz2' --newer-mtime $LASTCHG $SOURCE 2> /tmp/backuplog > /dev/null
fi
}
#################### PROGRAMA ####################
##### Bases de datos #####
# jvc_joomla
dbbackup jvc_joomla jvc_joomla
# Geneweb
dbbackup gedview gedview
# mythweb
#dbbackup mythconverg mythweb
# Gallery
dbbackup jvc_gallery jvc_gallery
##### Configuraciones, spools #####
# Usage: backup "folder_to_save" "dest_folder" "compressed_filename"
# e.g: backup /etc/apache2 $BAK/etc apache2
# will make a copy of /etc/apache2 into $BAK/etc in a filename called apache2.tar.bz2
# Configuraciones
backup /etc/apache2 $BAK/etc/apache2 apache2
backup /etc/apache2_asterisk $BAK/etc/apache2_asterisk apache2_asterisk
backup /etc/bind $BAK/etc/bind bind
backup /etc/cups $BAK/etc/cups cups
backup /etc/dhcp3 $BAK/etc/dhcp3 dhcpd
backup /etc/openvpn $BAK/etc/openvpn openvpn
backup /etc/postfix $BAK/etc/postfix postfix
backup /etc/sane.d $BAK/etc/sane.d saned
backup /etc/ssl $BAK/etc/ssl ssl
backup /etc/mysql $BAK/etc/mysql mysql
backup /var/lib/mysql $BAK/var/lib/mysql mysql
backup /etc/acidbase $BAK/etc/acidbase acidbase
backup /etc/snort $BAK/etc/snort snort
backup /etc/squid $BAK/etc/squid squid
backup /var/lib/mldonkey $BAK/var/lib/mldonkey mldonkey
backup /etc/calamaris $BAK/etc/calamaris calamaris
backup /var/www/seguridad $BAK/var/www/seguridad seguridad
backup /var/lib/awstats $BAK/var/lib/awstats awstats
backup /etc/samba $BAK/etc/samba samba
backup /var/lib/samba $BAK/var/lib/samba samba
backup /srv/tftp $BAK/srv/tftp tftp
#backup /etc/ejabberd $BAK/etc/ejabberd ejabberd
#backup /var/lib/jabber $BAK/var/lib/jabber jabber
# Webs
backup /var/www/jesusvillaverde.com $BAK/var/www/jesusvillaverde.com jesusvillaverde.com
backup /var/www/phpgedview $BAK/var/www/phpgedview phpgedview
backup /var/www/hermes.vigowireless.info $BAK/var/www/hermes.vigowireless.info hermes.vigowireless.info
# Asterisk
# Previamente hemos programado una copia de seguridad diaria en freepbx
#rsync --delete -gopt -Rlzrv /var/lib/asterisk/backups/DailyBackup $BAK/ > /dev/null
#rsync --delete -gopt -Rlzrv /etc/asterisk $BAK/ > /dev/null
#rsync --delete -gopt -Rlzrv /etc/dahdi $BAK/ > /dev/null
# Gallery
backup /home/datos/Imagenes/gallery $BAK/home/datos/Imagenes gallery
backup /var/www/gallery $BAK/var/www/gallery gallery
# Ficheros sueltos, varios
cp /etc/sudoers $BAK/etc
cp /etc/exports $BAK/etc
cp /etc/fstab $BAK/etc
cp /etc/dkim-filter.conf $BAK/etc
cp -r /etc/cron.weekly $BAK/etc
cp -r /etc/default $BAK/etc
cp /etc/rkhunter.conf $BAK/etc
cp /etc/init.d/iptables $BAK/etc/init.d
cp /etc/init.d/mldonkey-server $BAK/etc/init.d
# Varios
backup /home/jesus/sincronizar $BAK/home/jesus sincronizar
backup /home/xbmc $BAK/home/xbmc xbmc
#################### SINCRONIZAR ####################
# Sincronizamos hacia otro equipo para tener copia de respaldo.
# rsync --delete -gopt -e "ssh -p666" $BAK/* jesus@sip.jesusvillaverde.com:/media/datos/backups
# Generar registro de errores de la copia de seguridad
cat /tmp/backuplog |grep -v "no ha cambiado" >> /var/log/backup_stderr
rm /tmp/backuplog
|