[HowTo] Backup automático de tu sitio web o blog por FTP usando rsync.

Lo que sigue debe de ser una de las formas mas ineficientes de hacer un backup de un sitio existiendo tantas otras alternativas. No es por nada que cpanel, plesk, ispadmin y demáses te ofrecen la posibilidad de descargar un único .tar.gz conteniendo toda la información de tu sitio de un solo plumazo, pero ¿y cuando no tenés acceso al panel de control o login de shell?

Este caso es un clásico:

  • Tenés únicamente acceso FTP al espacio en donde alojás tu sitio, CMS, Blog o lo que fuere.
  • Querés hacer backups de vez en cuando de todo el contenido así cuando todo se vaya al bombo tenés desde donde recuperarlo.

Te explico como lo hago en mi caso, que es una de las tantas alternativas existentes. Con suerte, podrías trasladarlo al tuyo o inclusive, usar pedazos de mi idea en algún otro de tus proyectos.

La cuestión no es si vas a perder tus datos o no. La cuestión es cuando y por que.

La cuestión no es si vas a perder tus datos o no. La cuestión es cuando y por que.

Herramientas necesarias:

  • Una PC corriendo Linux
  • curlftp instalado o la posibilidad de escalar privilegios a super-usuario para poder instalar la herramienta.
  • rsync

Curlftpfs es una implementación basada en FUSE que usa libcURL como backend para todo lo que hace a la transferencia de archivos. Te permite montar -de manera transparente para el sistema operativo y por intermedio del protocolo FTP- un directorio remoto cualquiera y trabajarlo como si fuera un directorio local mas del montón.

Si no lo instalaste ya, tirá de tu gestor de paquetes de cabecera e instalálo. Lo he probado en Gentoo y Debian, de los dos lados el paquete se llama igual: curlftpfs.

Rsync por otro lado, ni necesita presentación y suele venir pre-instalado en cualquier distribución de medio pelo para arriba.

 

Como funciona:

Con curlftpfs instalado y siempre como root o precediendo el comando con un buen “sudo”, esta es la sintaxis para montar un directorio remoto en el equipo local:

curlftpfs usuario:[email protected] /ruta/al/directorio_local

Que siendo un poco mas realistas, debería verse mas o menos como sigue:

curlftpfs bill:[email protected] /mnt/blog_remoto

Y que para simplificar todo el asunto, podés agregar a tu /etc/fstab como sigue:

curlftpfs#bill:[email protected] /mnt/blog_remoto fuse defaults 0 0

Y de esta forma, obviar todo el comando larguísimo y en su lugar usar este comando cortito cada vez que quieras montar o desmontar el directorio FTP:

mount /mnt/blog_remoto

¿Vieron en donde en el fstab dice “defaults”? Eso es por que podés montar el sistema de archivos especificando diferentes atributos como por ejemplo: caché, uid, umask y un pequeño etcétera que podés encontrar ejecutando: man curlftpfs.

Teniendo montado el sistema de archivos remoto, solo tenés que tirar de rsync para sincronizar dos directorios arbitrarios:

rsync –av /mnt/blog_remoto /mnt/blog_local

Lo que hará que todo el contenido del directorio blog_remoto se replique dentro del directorio blog_local.

La primera ejecución traerá todos los archivos que hubiera en el sitio web por lo que podés esperar que se tome su tiempo pero de ahí en mas, cada ejecución consecutiva del comando sólo te va a descargar archivos nuevos o modificados. Ahorrás tiempo y ancho de banda.

Automatización:

Para que todo lo anterior ocurra sin tu intervención, podés hacer un script “backup.sh” que contenga algo parecido a esto:

#!/bin/bash

mount /mnt/blog_remoto

rsync –av /mnt/blog_remoto /mnt/blog_local

sync

umount /mnt/blog_remoto

Depués de que hubieras hecho a tu backup.sh ejecutable, podés llamarlo todos los días a las 13:00 por ejemplo, si en tu crontab dice:

00 13 * * * /ruta/al_archivo/backup.sh >/dev/null 2>&1

 

Mas tunning:

¿Y la base de datos?

Si tuvieras una o mas bases de datos MySQL, podés hacer un volcado de la misma a un .sql antes de correr tu backup.sh simplemente poniendo un script.php que se encargue de eso, por ejemplo:

Montás tu FTP en local:

mount /mnt/blog_remoto

Creás un directorio para alojar tus backups:

mkdir /mnt/blog_remoto/public_html/sqlbackup

Le das privilegios de escritura y ejecución:

chmod 777 /mnt/blog_remoto/public_html/sqlbackup

Ponés dentro de la carpeta recientemente creada un archivo “backup.php” como el que saqué de acá que dentro diga:

<?php

$dbhost   = “mysql.tusitio.com”;
$dbuser   = “tu_nombre_de_usuario”;
$dbpwd    = “tu_contraseña”;
$dbname   = “tu_base_de_datos”;
$dumpfile = $dbname . “_” . date(“Y-m-d_H-i-s”) . “.sql”;

passthru(“/usr/bin/mysqldump –opt –host=$dbhost –user=$dbuser –password=$dbpwd $dbname > $dumpfile”);

// report – disable with // if not needed
// must look like “– Dump completed on …”

echo “$dumpfile “; passthru(“tail -1 $dumpfile”);

?>

Y agregás una línea a tu backup.sh para que ejecute backup.php antes de iniciar el rsync, de modo que todo el script te quedaría mas o menos así:

#!/bin/bash

curl http://www.tusitio.com/sqlbackup/backup.php &&

mount /mnt/blog_remoto &&

rsync –av /mnt/blog_remoto /mnt/blog_local &&

sync &&

umount /mnt/blog_remoto

Para no llenar tu directorio sqlbackup con mierda dumps mysql, te recomiendo agregar en donde mas te guste una línea “rm *.sql” que se lleve puesto cualquier backup anterior que hubieras alojado ahí.

 

Reportes vía email:

Y por último, si te interesa recibir por mail un reporte del backup, podrías modificar tu crontab para que diga:

00 13 * * * /ruta/al_archivo/backup.sh | mail –s “Backup Diario – `date`” [email protected]_email.com

Ah, y si tu linux todavía no se comunica con vos por mail, podés seguir esta guía que escribí en su momento para usar una cuenta de Gmail a tal efecto.

Maldito Nerd

Informático por elección, linuxero por convicción, viejo y choto por que no queda otra, el tiempo pasa. Escribo sobre lo que mas me gusta: La música y las computadoras.

More Posts - Website - Twitter - Facebook - Google Plus

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *