Veremos como usar shell scripts para realizar el backup de un sitio web. Automatizaremos la tarea de realizar el backup tanto de la base de datos MySQL como de los archivos del sitio — paginas, imagenes, videos, etc. Si bien existe un plugin de WordPress para automatizar el backup de la base de datos, no nos viene mal tener a mano estos scripts. Si me han seguido durante algun tiempo, sabran que este sitio se encuentra hosteado en la computadora de mi casa. Lo cual tiene sus ventajas y desventajas. El porque de mi eleccion de autohosting esta fundamentada en el siguiente post: Soberania Informatica Una de las tareas habituales de mantenimiento es la de realizar los backups periodicos tanto del sitio como de archivos importantes. En la automatizacion de tareas repetitivas es justamente donde brillan los scripts de shell y, si a esto le sumamos el cron, podremos olvidarnos de hacer tareas rutinarias para concentrarnos en hacer tareas que requieran mayor creatividad, o simplemente disponer de mas tiempo libre. En esta nota no expondre en detalle el funcionamiento del sistema cron, sino que nos concentraremos en los scripts que realizan la tarea. Baste saber que poniendo un shell script dentro de la carpeta /etc/cron.daily este se ejecutara diariamente. Tambien disponemos de la carpeta /etc/cron.weekly para frecuencias semanales y la carpeta /etc/cron.montly para tareas que requieran una ejecucion mensual.

Shell script para hacer el backup de los archivos de un sitio

Copiamos el siguiente script en la carpeta **/etc/cron.daily ** (o /etc/cron.weekly — dependiento de la frecuencia con la que queramos realizar el backup )

Las siguientes variables se usan para parametrizar el script:

  • blogdir: debe apuntar al directorio origen donde reside el blog o sitio.
  • BCK_PREFIX: Un prefijo a nuestra eleccion, para poner delante de los archivos de backup generados.
  • backupdir: Debe apuntar al directorio destino donde queremos que se almacene la copia backup.

IMPORTANTE: El directorio destino backupdir debe tener permiso de escritura. Si vemos que nuestro script funciona bien cuando lo ejecutamos manualmente, pero no se produce ningun efecto en forma automatica, probablemente la carpeta destino no tenga los permisos de escritura para el daemon del cron.

# cat /etc/cron.daily/blogbackup

#! /bin/bash
#
# dir_backup.sh  -  hace un backup de un sitio web,
# le agrega un timestamp y lo guarda en el directorio backupdir configurado
#
# Autor: Sebastian Narvaez - http://snarvaez.poweredbygnulinux.com
############################################################
## Editar las siguientes variables para configurar el script

BCK_PREFIX="libertad"

tempdir="/tmp"

blogdir="/chroot/usr/share/wordpress/"

backupdir="/home/tux/backup"

## Fin Editar. No hace falta modificar de aqui para abajo.
###############################################################

E_DIRNOVALIDO=66

currentdatetime=`date '+%y%m%d_t%H%M%S'`

#  chequeamos los directorios ...

[ -d "${blogdir}" ] || {
    echo "error: directorio fuente no valido: ${blogdir}"
    exit $E_DIRNOVALIDO
}

# check if blogdir is readable by user
[ -r "${blogdir}" ] || {
    echo "error: no tiene permiso para leer: ${blogdir}"
    exit $E_DIRNOVALIDO
}

# check if blogdir is executable (directory listing) by user
[ -x "${blogdir}" ] || {
    echo "error: no tiene permiso para leer: ${blogdir}"
    exit $E_DIRNOVALIDO
}

[ -d "${backupdir}" ] || {
    echo "error: directorio destino no valido: ${backupdir}"
    exit $E_DIRNOVALIDO
}

# chequear si el usuario puede escribir en directorio destino
[ -w "${backupdir}" ] || {
    echo "error: no tiene permiso para escribir en : ${backupdir}"
    exit $E_DIRNOVALIDO
}

# cambia cada ocurrencia de '/' por '_'
normalizedname=`echo "${blogdir}" | tr [/] [_]`

backupfile="${tempdir}/${BCK_PREFIX}${normalizedname}_${currentdatetime}.tar.gz"

tar -cvvzf "${backupfile}" "${blogdir}" > "${backupfile}.list" 2>&1

cp "${backupfile}" "${backupdir}" && rm "${backupfile}"
cp "${backupfile}.list" "${backupdir}"  && rm "${backupfile}".list

exit 0

El script para realizar el backup de la base de datos MySQL

Copiar el siguiente script dentro de la carpeta /etc/cron.daily Nota: modificar las variables para configurar la conexion con la base de datos y el directorio donde se almacenara el backup.

# cat /etc/cron.daily/mysqlbackup

#! /bin/bash
#
# mysql_backup.sh  -  genera un archivo backup (dump) de la base configurada
# le agrega un timestamp y lo guarda en el directorio indicado
#
# Autor: Sebastian Narvaez - http://snarvaez.poweredbygnulinux.com
############################################################

## MODIFICAR LAS SIGUIENTES VARIABLES ANTES DE EJECUTAR EL SCRIPT

# PREFIJO PARA PONERLE AL ARCHIVO BACKUP
BCK_PREFIX="libertad"

# EL DIRECTORIO DONDE SE GUARDARA EL ARCHIVO CON EL BACKUP DE LA BASE.
backupdir="/home/tux/backup/"

# DATOS PARA CONECTARNOS A LA BASE.
# Nota: desde fuera del chroot no me funciono con localhost, pero sin con 127.0.0.1
DBHOST=127.0.0.1
DBNAME=elnombredelabase
DBUSER=elusuario
DBPASS=laclave

# FIN DE CONFIGURACION.  NO ES NECESARIO EDITAR DE AQUI PARA ABAJO.
###############################################################

E_DIRNOVALIDO=66

# FORMATO DE LA FECHA Y HORA PARA PONER EN EL NOMBRE DEL ARCHIVO.
currentdatetime=`date '+%y%m%d_t%H%M%S'`

#  checking dir here
[ -d "${backupdir}" ] || {
    echo "error: directorio destino no valido: ${backupdir}"
    exit $E_DIRNOVALIDO
}

# chequear si el usuario puede escribir en directorio destino
[ -w "${backupdir}" ] || {
    echo "error: no tiene permiso para escribir en : ${backupdir}"
    exit $E_DIRNOVALIDO
}

backupfile="${backupdir}/${BCK_PREFIX}_${currentdatetime}.mysqldump.txt"

mysqldump -h "${DBHOST}" -u "${DBUSER}" -p"${DBPASS}"  -a  --databases "${DBNAME}" > "${backupfile}"

exit 0

Tambien te puede interesar:

Instrucciones paso a paso y varios metodos en el sitio de WordPress (en ingles)

Backups perfectos de particiones o instalaciones.

Dejanos tu comentario

Si tienes una pregunta, sugerencia, correccion, o simplemente quieres agradecer, por favor escribe un comentario sobre este articulo. Tambien puedes copiar el articulo completo y ponerlo en tu sitio, siempre y cuando pongas un link bien claro referenciando a este sitio, y mantengas la informacion de copyright que figura al pie.

Copyright: http://snarvaez.poweredbygnulinux.com Sebastian Narvaez
este documento ha sido publicado bajo la siguiente licencia: “Verbatim copying and distribution of this entire article are permitted in any medium provided this notice is preserved.”