Backups automaticos en servidor linux

Actualizado el domingo, 19 junio, 2016

A veces, nos encontramos con la necesidad de hacer una copia de seguridad a un equipo linux, ya sea desktop o server, podemos backupear directorios importantes, o hacer un full backup de todo el sistema. Y todo lo haremos con un simple script.

Que hace el script:

  1. Crea una carpeta donde se guardará todo, y esta carpeta es la que luego se comprimirá.
  2. Esta carpeta tendrá de nombre el año, mes y día presente, por ejemplo hoy esa carpeta se llamaría: 2014-10-28
  3. Copia /etc/ (y todo su contenido) a esa carpeta.
  4. Copia logs (/var/log/) hacia esa carpeta antes mencionada.
  5. Exporta las bases de datos de MySQL que tengamos.
  6. Comprime con un password (PASSWORD) esa carpeta, la comprime en .RAR.
  7. Genera un archivo (data.info) con todo el log de lo antes hecho (log de copia de archvios y compresión a .rar), además de poner en este archivo el tamaño (en MBs) del archivo .RAR.
  8. Borra la carpeta en la que pusimos los archivos y que luego comprimimos.
  9. Envía emails a los administradores o personas relacionadas con el servidor, informando que el backup se hizo de forma correcta, y se les enviará adjunto en ese email el archivo con el log de todo (data.info.rar)

Script

#!/bin/sh
#
# -*- ENCODING: UTF-8 -*-
#
 
NAME="VPS_Backup-Script"                # Nombre script.
#Descripción:            Script de backup de files y DBs del VPS
: ${VERSION:=0.1}                     # Versión script.
: ${DATE:=$(date +'%Y-%m-%d')}    # Variable para Fecha.
: ${TIME:=$(date +'%R')}                # Variable para Hora.
: ${WORK_DIR:=/home/backups/$DATE}            # Directorio de trabajo actual.
: ${LOG_FILE:=/home/backups/$DATE/record.log}   # Archivo de log.
: ${ADMIN1a:=admin@midominio.net}              # Email de Administrador No.1
: ${ADMIN1b:=mi.correo@gmail.com}              # Email de Administrador No.1
: ${ADMIN2a:=webmaster@midominio.net}      # Email de Administrador No.2
: ${ADMIN2b:=email.webmaster@riseup.net}        # Email de Administrador No.2
: ${LINE:="-"}
: ${DB_PASS:=dbpasswordyeah}        # Password de MySQL.
 
# Creando directorio donde se trabajará, si es que no existe.
if ! -d "`dirname $LOG_FILE`" ; then mkdir -p "`dirname $LOG_FILE`"; fi
 
# Cambiando a directorio donde trabajaremos.
cd $WORK_DIR
 
# Copiando /ETC/ hacia directorio de trabajo actual.
cp -Rv /etc/ $WORK_DIR > $LOG_FILE
echo $LINE >> $LOG_FILE
 
# Creando carpeta para logs.
mkdir $WORK_DIR/logs
 
# Copiando LOGs.
cp /var/log/apache2/ $WORK_DIR/logs/ -Rv >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/aptitud* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/auth* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/daemon* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/dmes* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/kern* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/mail* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/message* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/mysql/ $WORK_DIR/logs/ -Rv >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/mysql.* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
cp /var/log/sys* $WORK_DIR/logs/ -v >> $LOG_FILE && echo $LINE >> $LOG_FILE
 
# Creando carpeta para DBs.
mkdir $WORK_DIR/dbs
 
# Exportando DBs.
mysqldump --opt -hlocalhost -uroot -p"$DB_PASS" misitio > "$WORK_DIR/dbs/misitio.sql"
mysqldump --opt -hlocalhost -uroot -p"$DB_PASS" mysql > "$WORK_DIR/dbs/mysql.sql"
mysqldump --opt -hlocalhost -uroot -p"$DB_PASS" blogdb > "$WORK_DIR/dbs/blogdb.sql"
mysqldump --opt -hlocalhost -uroot -p"$DB_PASS" pastebin > "$WORK_DIR/dbs/pastebin.sql"
 
# Saliendo un nivel más arriba (/home/backups/).
cd ..
 
# Comprimiendo directorio de trabajo actual.
#tar czvf "$DATE.tar.gz" "$DATE"
rar a $DATE.rar -hpPASSWORD $WORK_DIR >> $LOG_FILE && echo $LINE >> $LOG_FILE
 
# Preparando información para enviar por email.
touch data.info
echo "El archivo $DATE.rar tiene un tamaño de:" > data.info
du -bsh $DATE.rar >> data.info
echo $LINE >> data.info
cat $LOG_FILE >> data.info
tar czvf data.info.tar.gz data.info
 
# Eliminando directorio una vez comprimido.
rm -R "$WORK_DIR"
 
# Enviando emails a administradores.
mail -s "VPS | Status de Backup." $ADMIN1a < data.info.tar.gz
mail -s "VPS | Status de Backup." $ADMIN1b < data.info.tar.gz
mail -s "VPS | Status de Backup." $ADMIN2a < data.info.tar.gz
mail -s "VPS | Status de Backup." $ADMIN2b < data.info.tar.gz
 
# Haciendo copia por SSH hacia cuenta en otro servidor o hosting.
#scp -P 922 "/home/backups/$DATE.rar" account@serverhosting.com:/home/backups/
 
echo "                  #######################"
echo "                  ## BACKUP REALIZADO! ##"
echo "                  #######################"
 
# Fin del script.
exit 0

Recuerda darle los permisos correspondientes:
chmod +x vps_backup-script.sh

Y lo guardamos (ejemplo): como: /root/vps_backup-script.sh

Para que se ejecute todos los días a las 12AM:

echo "* 12    * * *   root    cd /root && ./vps_backup-script.sh" >> /etc/crontab && /etc/init.d/cron restart

 

Una respuesta

  1. luzzifer
    08/09/2015

Agregar comentario