Una de las mayores preocupaciones a la hora de administrar una página web, es encontrarnos con algún problema en el servidor y perder los datos que tenemos en el mismo.

Para evitar ésto, lo mejor es realizar copias de seguridad periódicas de nuestras bases de datos y archivos y mandarlos a un servidor externo (nuestro servidor doméstico o de la empresa).

A continuación os presento un script que hice en bash para automatizar dichas tareas, para usarlo sólo hay que cambiar las variables del inicio y programar la tarea con cron. Básicamente lo que hace es mandar por SCP la copia de seguridad de las bases de datos y los ficheros, permitiendo añadir una lista negra de palabras clave que harán que no se añada algún dominio o base de datos concreta. Además nos informará por correo electrónico si hubo algún problema.

El script está preparado para la estructura de un servidor con panel Plesk, adaptarlo a otro es muy sencillo, sólo hay que modificar la ruta donde están los dominios.

#!/bin/bash
##### Configuración
SERVER="xxxxxxxxxx.xxx"        # Dominio o IP destino
PORT="22"                      # Puerto SSH
USER="usuario"                 # Nombre de usuario de login
DBUSER="usuariodb"             # Nombre de usuario DB
DBPASSWD="usuariopass"         # Contraseña usuario DB
DESTDIR="/ruta/directorio"     # Directorio de destino
ADMINMAIL="mail@dominio.com"   # Correo para notificaciones
EXCLUDE=(nombre nombre.com)    # Lista negra de dominios o bases de datos
 
ERROR=""
fecha=$(date "+%F")
fechamail=$(date "+%d/%m/%Y")
 
##### Copia de seguridad de las bases de datos
mkdir /tmp/db_backup_full
DATABASES="$(mysql -u $DBUSER -p$DBPASSWD -Bse 'show databases')"
for db in $DATABASES
do
  case "${EXCLUDE[@]}" in *"$db"*) 
    ;;
  *)
    mysqldump --password=$DBPASSWD --user=$DBUSER --databases $db > /tmp/db_backup_full/$db.sql 2>/dev/null;;
  esac
done
tar cvjf "/tmp/databases $fecha.tar.bz2" -C /tmp db_backup_full > /dev/null
ERROR=$(scp -P $PORT -q "/tmp/databases $fecha.tar.bz2" $USER@$SERVER:$DESTDIR 2>&1)
rm -fr /tmp/db_backup_full
rm "/tmp/databases $fecha.tar.bz2"
 
##### Copia de seguridad de los archivos
mkdir /tmp/files_backup
for i in $( find /var/www/vhosts -name httpdocs ); do
  ARCHIVO=$(echo $i | sed -e 's/\/httpdocs//' -e 's/\.\///' -e '/\.skel/d')
  DOMINIO=$(echo $ARCHIVO | sed 's/\/var\/www\/vhosts\///g' | sed 's/\/.*//g')
  if [ "$DOMINIO" != "" ]; then
    case "${EXCLUDE[@]}" in *"$DOMINIO"*) 
      ;;
    *)
      FICHERO=$(echo $ARCHIVO.tar.gz | sed 's/\/var\/www\/vhosts\///g' | sed 's/\/subdomains\//_/g' | sed 's/\//_/g')
      CONF=$(echo $i | sed 's/httpdocs/conf/g')
      tar cvzf "/tmp/files_backup/$FICHERO $fecha.tar.gz" $i $CONF &> /dev/null
      ERRORNEW=$(scp -P $PORT -q "/tmp/files_backup/$FICHERO $fecha.tar.gz" $USER@$SERVER:$DESTDIR 2>&1)
      if [ "$ERRORNEW" != "" ]; then
        if [ "$ERROR" != "" ]; then
          ERROR="$ERRORNEW"
        else
          ERROR="${ERROR}\n${ERRORNEW}"
        fi
      fi;;
    esac
  fi
done
rm -fr /tmp/files_backup
 
# Comprobamos si hubo algún error al enviar el fichero
if [ "$ERROR" != "" ]; then
  echo -e "Error encontrado:\n$ERROR" | mutt -s "Error en backup de servidor web $fechamail" $ADMINMAIL
fi

Los comentarios no están permitidos.