Cómo usar Dropbox y un Shell Script para respaldo web

8 733

Tienes un sitio web o un blog que te ha costado muchas horas de trabajo y sacrificio. Imagina que por un fallo en el servidor, pierdes todo ese contenido (base de datos, imágenes, documentos, etc.)… una verdadera pesadilla no?

Aunque las compañías de hosting siempre nos aseguran que sus equipos son lo mejor que hay, que sus datacenters son de última generación y que cuentan con servicios de respaldo, siempre hay la posibilidad de que algo suceda. La integridad total de un sistema nadie la puede asegurar al 100%. Es por eso que siempre se deben hacer copias de seguridad por cuenta propia. Una buena práctica es tener al menos tres copias de respaldo de un sitio web, y dichas copias deben estar en lugares distintos.

Las opciones

La manera más directa de respaldo es la manual. Utilizando un cliente FTP (como Filezilla por ejemplo) se descarga de forma periódica el contenido de tu sitio web al PC. Luego, puedes grabar esos archivos en DVD’s, otros discos duros, subirlo a sitios como Amazon S3, Google Drive, etc.

Si utilizas WordPress, puedes instalar algún plugin que facilita esa tarea. Basta echar un vistazo a la lista de los plugins para respaldo, y encontrarás varios. Sólo hay que asegurarse de escoger alguno que tenga buena puntuación y que haya sido descargado muchas veces. Eso quiere decir que funciona y es de calidad.

También hay servicios online como Carbonite, MozyCodeGuard, etc. que ofrecen respaldar tu sitio web. Generalmente hay que pagar por su uso y algunos pueden ser algo costosos. Entre esos servicios de respaldo en la nube, hay uno que destaca por ser muy práctico y fácil de utilizar: Dropbox. Seguro lo conoces ya y hasta lo utilizas a diario. De entrada cuentas con 2 GB (que lo puedes extender hasta 16 GB) totalmente gratis. Y a cambio de una suma bastante moderada, puedes obtiener más espacio. Precisamente en este servicio se basa el método de respaldo que a continuación se explica.

Respaldo usando Dropbox y un Shell Script

Dropbox es más conocido en el ámbito de computadores personales o móviles. Pero resulta que también se puede instalar en servidores y funciona igual. Lo único es que no tiene la interfaz gráfica. La idea es la siguiente:

  1. Instalamos el cliente de Dropbox en el servidor.
  2. Usando un sencillo script, copiamos los archivos de nuestro sitio web y el respaldo de la base de datos, en la carpeta especial de Dropbox. Con esto, Dropbox se encargará de subir esos archivos a la nube y sincronizarlos con los equipos adicionales que deseemos. Ese script también borrará respaldos antiguos, dejando sólo los más recientes, para ahorrar espacio en el servidor.
  3. Creamos un Cron Job para que el script se ejecute automáticamente cada día a una cierta hora.

A la final tendremos un respaldo en el servidor donde corre nuestra página web, otro en la nube (Dropbox) y luego podemos sincronizar otros equipos o incluso el móvil. De esa manera, contamos con varias copias de seguridad, ubicadas en lugares distintos.

Consideraciones iniciales

Primero, hay que aclarar que este método es para sitios relativamente pequeños o personales. Las web comerciales y de compañías medianas o grandes, tienen (o al menos deberían tener) varios servidores a su disposición y los usan como réplica de contenido y respaldo.

Este método fue probado en servidores con Debian 7 y Ubuntu 12.04, por lo que la explicación se basa en esos sistemas operativos. (Aunque debe funcionar igual para otras distribuciones Linux).

Para poder utilizarlo, es necesario lo siguiente:

  • El sitio a respaldar debe correr en un servidor LAMP (Linux, Apache, Mysql, PHP/Perl/Python). Aunque igual vale para Nginx u otro servidor web.
  • Debemos tener acceso al servidor vía SSH.
  • Tener conocimientos de Linux para ejecutar comandos en el terminal.
  • Abrir una cuenta en Dropbox para los respaldos.

¿Por qué abrir una nueva cuenta de Dropbox si ya tengo una? En su versión para escritorio, Dropbox permite configurar cuales carpetas o archivos queremos sincronizar en un equipo. Esto es muy útil, ya que si no se filtran, todas las demás carpetas que tenemos en nuestra cuenta personal de Dropbox, y que no tienen nada que ver con nuestro sitio web, igual se almacenarán en nuestro servidor. Esto no es muy bueno que digamos, por razones de espacio y consumo de ancho de banda. Hay una forma de hacer eso también en un servidor sin interfaz gráfica, usando la CLI (Interfaz de Línea de Comandos) para Dropbox . Pero para simplificar las cosas, es preferible abrir una cuenta nueva en Dropbox y utilizarla exclusivamente para el servidor. Así no mezclamos lo personal con nuestra web.

Habiendo aclarado las ideas y los objetivos, vamos a empezar con lo interesante.

Paso 1: Instalar Dropbox en el servidor

A partir de aquí, asumimos que ya tienes tu nueva cuenta en Dropbox y que estás conectado a tu servidor vía SSH (terminal). Lo primero que hacemos es crear un nuevo usuario en el servidor para los respaldos (no queremos que Dropbox tenga los privilegios de nuestro usuario de administrador). Ese nuevo usuario lo llamamos « respaldo ». Puedes usar el nombre que quieras, sólo recuerda hacer los cambios necesarios en adelante.

sudo adduser respaldo

Ingresa la clave para el nuevo usuario cuando el terminal lo solicite. No hace falta llenar el resto de las opciones. Sólo pulsa « Enter » hasta el final. Ahora debes salir de tu conexión como administrador y  continuar como el usuario « respaldo » para la instalación de Dropbox.

su respaldo

Lo siguiente es instalar Dropbox en la carpeta de ese nuevo usuario. Averiguamos la versión del sistema operativo en nuestro servidor (32 o 64 bits). Si ya lo sabes, no es necesario hacer esta verificación. Escribe en el terminal lo siguiente:

uname -m

Si el resultado es i686, ejecuta lo siguiente (para 32 bits):

cd ~ && wget -O - "https://www.dropbox.com/download/?plat=lnx.x86" | tar xzf -

Si el resultado es x86_64, ejecuta lo siguiente (para 64 bits):

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

El comando anterior primero verifica que estas en carpeta del nuevo usuario (« /home/respaldo »), descarga el archivo .tar (32 o 64 bits) y extrae su contenido en « /home/respaldo/.dropbox-dist ». A continuación, debemos correr el instalador de Dropbox escribiendo lo siguiente:

~/.dropbox-dist/dropboxd

Si todo resulta bien, verás en el terminal algo similar a esto:

Esta computadora no está vinculada a ninguna cuenta de Dropbox...
Visita https://www.dropbox.com/cli_link?host_id=1c20d43376x0ad2f582f85aa755a44d7 para vincular este dispositivo.

Esa comprobación se repite cada cierto tiempo y quiere decir que el cliente de Dropbox ya está instalado, pero aún no se ha asociado con tu cuenta de Dropbox. El número (token) que aparece es único para cada máquina (por eso el tuyo será diferente al que se muestra aquí, que es sólo un ejemplo). Visita el link que aparece en tu terminal (no éste), ingresa tus credenciales en Dropbox y con eso, automáticamente se creará la  carpeta « /home/respaldo/Dropbox » en tu servidor, quedando así asociado a tu cuenta. El mensaje del terminal debe cambiar a lo siguiente:

Esta computadora está vinculada a Dropbox. Te damos la bienvenida, [Tu_Nombre_En_Dropbox].

Para salir del daemon de Dropbox y seguir usando el terminal, pulsa « Ctrl C ».

Paso 2: Agregar Dropbox a los procesos de inicio en el servidor

Debemos crear un script para agregar el daemon de Dropbox a los procesos de inicio del servidor. Además ese script nos servirá para iniciar el servicio. Hay que hacerlo con el usuario de administrador, ya que el usuario « respaldo » no tiene el permiso necesario. En el terminal, escribe lo siguiente:

su TU_USUARIO_DE_ADMINISTRADOR

cd ~ && sudo nano /etc/init.d/dropbox

En el nuevo documento (que está vacío), copiamos lo siguiente:

#!/bin/sh

### BEGIN INIT INFO
# Provides: dropbox
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: false
# Short-Description: Servicio de Dropbox
# Description: Servicio de Dropbox como start-stop-daemon
### END INIT INFO

# Usuario.
USUARIO="respaldo"

# Daemon.
DAEMON=.dropbox-dist/dropboxd

start() {
   echo "Iniciando Dropbox..."
   HOMEDIR=`getent passwd $USUARIO | cut -d: -f6`
   if [ -x $HOMEDIR/$DAEMON ]; then
       HOME="$HOMEDIR" start-stop-daemon -b -o -c $USUARIO -S -u $USUARIO -x $HOMEDIR/$DAEMON
   fi
   echo "Dropbox se ha Iniciado."
}

stop() {
   echo "Deteniendo Dropbox..."
   HOMEDIR=`getent passwd $USUARIO | cut -d: -f6`
   if [ -x $HOMEDIR/$DAEMON ]; then
       start-stop-daemon -o -c $USUARIO -K -u $USUARIO -x $HOMEDIR/$DAEMON
   fi
   echo "Dropbox se ha Detenido."
}

status() {
    dbpid=`pidof dropbox`
    if [ -z "$dbpid" ]; then
        echo "Dropbox está Detenido."
    else
        echo "Dropbox está Activo (PID: $dbpid)."
    fi
}

case "$1" in

   start)
       start
       ;;
   stop)
       stop
       ;;
   restart|reload|force-reload)
       stop
       start
       ;;
   status)
       status
       ;;
   *)
       echo "Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}"
       exit 1

esac

exit 0

Presiona « F2 », luego « S » y « Enter » para salvar. A continuación, debemos hacer ejecutable al script y agregar el daemon a los procesos de inicio del servidor. Para eso usa los comandos siguientes:

sudo chmod +x /etc/init.d/dropbox

sudo update-rc.d dropbox defaults

Ahora utilizando las opciones start | stop | reload | force-reload | restart | status, podemos controlar el servicio como solemos hacer con otros daemons. Y si necesitamos reiniciar el servidor por algún motivo, Dropbox se inicia también, sin necesidad de hacer nada más. Para ponerlo en marcha, escribe lo siguiente:

sudo service dropbox start

Ya con Dropbox en marcha… falta probar si funciona! Cambiamos nuevamente al usuario « respaldo » y creamos una carpeta nueva « Mi_Web », dentro de la carpeta especial « Dropbox ». Puedes colocarle otro nombre si quieres, pero recuerda hacer los cambios necesarios en adelante. Y guardamos un archivo « Prueba.txt » en ella (sólo como prueba).

su respaldo

cd ~ && mkdir ~/Dropbox/Mi_Web

nano ~/Dropbox/Mi_Web/Prueba.txt

En « Prueba.txt » escribe lo que quieras, por ejemplo, Hola Mundo! Salva con « F2 » « S » « Enter ». Ahora visita tu cuenta Dropbox, y deberías ver la carpeta « Mi_Web » y en su interior el archivo « Prueba.txt ». Igual debe funcionar en sentido contrario. Con eso tenemos listo la parte de Dropbox.

Paso 3: Creamos el Shell Script para copiar los datos

Colocar los archivos manualmente en « /home/respaldos/Dropbox/Mi_Web » no es muy eficiente. Además, debemos respaldar también la base de datos, de manera que la podamos recuperar en caso de algún fallo. Por eso usaremos un Shell Script básico que comprime nuestra web en un archivo .tar, crea un archivo .sql (también comprimido) de la base de datos y los copia a ambos en « /home/respaldos/Dropbox/Mi_Web ».

Volviendo una vez más a tu  usuario de administrador, creamos una carpeta nueva que llamamos « .scripts » (puedes llamarla como quieras). Allí vamos a guardar el script que llamaremos « respaldo.sh ».

su TU_USUARIO_DE_ADMINISTRADOR

cd ~ && mkdir ~/.scripts

sudo nano ~/.scripts/respaldo.sh

Dentro de « respaldo.sh » copiamos lo siguiente:

#!/bin/sh

# Asigna los valores a las variables.
# --------------------------------------------------
# Directorio donde está tu web.
DIR_WEB="/var/www"

# Directorio donde vas a guardar los respaldos.
DIR_RES="/home/respaldo/Dropbox/Mi_Web"

# Nombre de la base de datos.
NOM_BD="Nombre_Base_Datos"

# Usuario de la base de datos.
USR_BD="Usuario_Base_Datos"

# Password de la base de datos.
PASS_BD='Password_Base_Datos'

# Cantidad de días que quieres conservar el respaldo.
DIAS=1

# --------------------------------------------------
# No cambiar nada de aquí en adelante.

# Fecha de respaldo.
FECHA=`date +%d-%m-%y`

# Crear copia de la base de datos en el directorio de respaldo.
mysqldump -u $USR_BD -p${PASS_BD} $NOM_BD | gzip > ${DIR_RES}/Base_Datos_${FECHA}.sql.gz

# Crear copia de la web en el directorio de respaldo.
tar cvzf ${DIR_RES}/Archivos_${FECHA}.tar.gz $DIR_WEB

# Buscar y borrar copias con más de x días.
find ${DIR_RES}/Base_Datos_* -mtime +${DIAS} -exec rm {} \;
find ${DIR_RES}/Archivos_* -mtime +${DIAS} -exec rm {} \;

Como directorio web, se ha colocado el que usa Apache por defecto (« /var/www »). Modifica la ruta si tu web tiene otra ubicación. También se ha colocado « 1 » en los días que se conservarán los respaldos. Usando « 1 », tendrás el respaldo de hoy y el de ayer. Los más antiguos se borrarán. Si prefieres retener más copias, cambia ese valor. Coloca los valores para las demás variables y salva el script (« F2 » « S » « Enter »). A continuación, debemos hacer que el script sea ejecutable.

sudo chmod +x ~/.scripts/respaldo.sh

Al ejectutar ese script, obtendremos copias como por ejemplo « Base_Datos_12-02-14.sql.gz » y « Archivos_12-02-14.tar.gz », para la base de datos y los archivos web respectivamente. Esas copias se salvarán en la carpeta « /home/respaldo/Dropbox/Mi_Web ». Estando allí, serán subidas automáticamente a Dropbox y se sincronizarán con los otros dispositivos que tengas asociados a esa cuenta. Prueba el script escribiendo lo siguiente:

sudo ~/.scripts/respaldo.sh

Ya casi estamos listos. Ahora falta automatizar la ejecución del script con un Cron Job.

Paso 4: Automatizar el proceso con un Cron Job

Los Cron Jobs nos permiten asignar tareas que deben cumplirse periódicamente en el servidor. Si no estás muy familiarizado con ellos, puedes consultar fuentes de información, como por ejemplo, Wikipedia.

El proceso de respaldo usa muy pocos recursos en el servidor, pero igual siempre es bueno escoger un momento en el que sabemos que nuestra web tiene poca actividad. Como ejemplo, vamos a crear un Cron Job que ejecute el script todos los días a la una de la madrugada. Puedes asignar la frecuencia y hora que quieras. En el terminal escribe lo siguiente:

sudo crontab -e

Si es la primera vez que configuras un Cron Job, el terminal te preguntará qué editor quieres usar. Escribe « 2 » para escoger nano. Al final del archivo « crontab » escribimos lo siguiente:

0 1 * * * /home/TU_USUARIO_DE_SERVIDOR/.scripts/respaldo.sh

Salva y ya tienes creado el Cron Job. Por defecto, los Cron Jobs, una vez que se ejecutan, envían un email al administrador del servidor para avisar que se realizó la tarea. Si no quieres recibir esas notificaciones, agrega « >/dev/null 2>&1 » al final, así:

0 1 * * * /home/TU_USUARIO_DE_SERVIDOR/.scripts/respaldo.sh >/dev/null 2>&1

Con eso finalizamos… Ya tenemos el sistema de respaldo automático funcionando!

Revertir todo lo hecho

Si luego de hacer las pruebas, decides que no quieres continuar usando éste método de respaldo, puedes revertir todo ejecutando (con el usuario de administrador) los siguientes comandos, uno a la vez:

# Desinstalar Dropbox.
sudo service dropbox stop
sudo rm /etc/init.d/dropbox
sudo update-rc.d dropbox remove
sudo killall -u respaldo
sudo deluser respaldo
sudo rm -rf /home/respaldo

# Remover el Script Shell.
sudo rm -r ~/.scripts

# Entra en crontab y borra el Cron Job.
sudo crontab -e

Notas finales

La intención de éste artículo ha sido reunir la información básica necesaria para implementar un sistema de respaldo automático. A partir de aquí, se pueden hacer cambios y mejoras para adaptarlo a tus necesidades particulares.

En cuanto a la seguridad, es necesario estar conscientes del hecho que Dropbox se ejecuta en el sistema que está asociado, y que tiene los mismos permisos de acceso que tiene el usuario bajo el cual se instaló. Por eso se creó el usuario « respaldo », que no tiene privilegios de sudo. Para mejorar aún más la seguridad, se puede instalar Dropbox en una jaula chroot o limitar el acceso del daemon de Dropbox usando AppArmor. Pero eso ya queda fuera de la cobertura de este tutorial.

Por último, nunca hagas las pruebas iniciales directamente en el servidor de producción. Siempre utiliza un servidor de pruebas para ello. Una vez que estés conforme con el funcionamiento, puedes utilizarlo en el servidor principal.

Fuente Foro Dropbox Bash Shell LinuxCommand

Más Temas Interesantes

8 Comentarios

  1. andrison Dice

    buen trabajo!!!

    1. TecnoTemas Dice

      Andrison, muy bueno saber que te resultó útil.

      Saludos y gracias por comentar.

  2. Cedar Dice

    Increíble la utilidad y la explicación, sin lugar a duda totalmente recomedable. Felicidades por el artículo

    1. TecnoTemas Dice

      Cedar, saber que este artículo te resultó útil es muy satisfactorio.

      Muchas gracias a ti por el agradable comentario.

      Saludos.

      1. Cae Dice

        Disculpe

        Intento poner esto:
        0 1 * * * /home/TU_USUARIO_DE_SERVIDOR/.scripts/respaldo.sh

        Lógicamente poniendo mi usuario roto pero no se me ejecuta mi copia de seguridad.

        Q hago mal?

        1. TecnoTemas Dice

          Hola, probaste el script antes de crear el Cron Job?

          Si hiciste la prueba y funciona correctamente, entonces puede ser cuestión de permisos.

  3. Rod Dice

    Hola saludos, como seria el respaldo con postgres ? . Gracias de antemano.

    1. TecnoTemas Dice

      Hola, con postgres deberías reemplazar:
      “mysqldump -u $USR_BD -p${PASS_BD} $NOM_BD | gzip > ${DIR_RES}/Base_Datos_${FECHA}.sql.gz”

      con algo así:

      “pg_dump –dbname=postgresql://$USR_BD:${PASS_BD}@localhost/$NOM_BD | gzip > ${DIR_RES}/Base_Datos_${FECHA}.sql.gz”

      No ha sido probado, pero debería funcionar.

      Saludos.

Deja un Comentario

Tu dirección de correo electrónico no será publicada.