Sistema de backups automático con Hostgator
29 de Diciembre de 2006 en Linux, Hosting
Lecturas: 6,255

Recién me he instalado un ordenador como servidor casero (éso es, para gestionar la mula, las fotos, almacén, ...) y se me ha ocurrido crear un sistema de backup del hosting a mi servidor de casa.

El sistema es muy simple pero es rápido y efectivo. Se basa en un shell script que realiza un dump de las bases de datos y comprime el archivo. Luego lo mete en directorios para organizarlo por días, meses y semanas. En torno a él, se monta todo el sistema usando el cron del hosting y el cron local de alguna forma para esquivar las limitaciones de mi plan contratado (no acceso a shell script). En éste artículo explico el tinglado.

Un saludo especial a Mr Nice! Lo hicimos todo desde su casa con el putty, sentados en el sofá :)

Lado servidor

Todo parte del script de backup. Instalado en un cron se va a ejecutar diáriamente (yo lo he puesto a las 00:00 de cada día) y el script va a generar los archivos.gz diarios, semanales, y mensuales cuando toque. El script tiene su web original aquí, pero lo he guardado aquí para no perderle la pista. Para copiarlo, selecciónalo todo y guárdalo como mysqlbackup.sh.

Antes de subirlo, tenemos que especificar los parámetros del script. Lo abrimos y encontramos algo como ésto:

# Username to access the MySQL server e.g. dbuser
USERNAME=usuario_hosting

# Username to access the MySQL server e.g. password
PASSWORD=contraseña_hosting

# Host name (or IP address) of MySQL server e.g localhost
DBHOST=localhost

# List of DBNAMES for Daily/Weekly Backup e.g. "DB1 DB2 DB3"
DBNAMES="nombre_db1 nombre_db2"

# List of DBBNAMES for Monthly Backups (See docs below)
MDBNAMES="mysql $DBNAMES"

# Backup directory location e.g /backups
BACKUPDIR=/ruta/absoluta/de_tu/directorio_de/destino/en_tu/hosting/

# Separate backup directory and file for each DB? (yes or no)
SEPDIR=yes

# Mail backup log? (yes or no)
MAILLOG=yes

# Email Address to send log to? (user@domain.com)
MAILADDR=tu@email.com

Nota: El script está pensado para bajarse varias bases de datos de golpe usando un sólo usuario y contraseña, pero si hemos creado cosas con el Fantastico, cada una tendrá su usuario y contraseña, cosa que no se puede definir en el script. En Hostgator, con la contraseña de tu cuenta en Hostgator tienes acceso a todas las bases de datos, así que en nuestro ejemplo (como es mi caso) vamos a hacer todas las bases de datos de todos los dominios en mi cuenta de golpe, usando el script una sóla vez.

Las variables que definiremos son:

  • USERNAME: Usuario de la cuenta de Hostgator
  • PASSWORD: Contraseña de la cuenta de Hostgator
  • DBHOST: Es el nombre de la máquina al que conectarse. Casi siempre es "localhost".
  • DBNAMES: Nombres de las bases de datos que se van a bajar, separados por espacios dentro del entrecomillado. Puede ser una o varias. No funciona el asterisco [*]
  • BACKUPDIR: Ruta absoluta que lleva al directorio base de los backups, por ejemplo "/home/usuario/public_html/Backups/"
  • MAILADDR: Dirección de correo dónde enviar el log del proceso una vez finalizado.

Guárdalo y súbelo a un directorio de tu hosting, por ejemplo, cronjobs, sétale derechos de ejecución para todos (incluso el nobody) y abre el CPanel de Hostgator. Allí hay un icono llamado Cron jobs, lo clicamos y ya lo tenemos.

Hostgator CronJob

Aquí le especificamos la ruta absoluta al script y la frecuencia con el que lo llamaremos. Luego guardamos y listo.

Por otro lado, tenemos que crear el directorio base para los backups, que será el que tengamos especificado en BACKUPDIR. Recuerda de darle permisos de escritura para el usuario nobody!

Ok, ya tenemos preparado el sistema en el lado servidor. Cada día a las 00:00 se ejecutará y nos creará los backups que toque. Para probarlo lo único que podemos hacer (mi plan no me da servicio de ssh) es crear un archivo PHP que utilice la instrucción exec() para ejecutarlo y ver si lo crea todo bién. Sería algo así:

PHP:
  1. exec("/home/usuario/public_html/cronjobs/mysqlbackup.sh");
  2.  
  3. ?>

Apuntamos al navegador dónde lo hayamos subido y ejecutamos.

Ahora nos queda recogerlo des de casa...

Lado local

Nota: Para hacer ésta parte supongo que se dispone de una máquina con Linux encendida siempre (o, almenos a unas horas determinadas). Supongo que con Windows podría llegar a funcionar, pero ésta solución requiere un Linux. Si cuando vas a dormir apagas el ordenador, esta solución se puede adaptar fácilmente. Simplemente pasa del setado del cron y ejecuta directamente cuando quieras el backup el sh que vamos a crear.

Primero de todo necesitamos una manera para conectarnos al servidor, que sea fácilmente "scriptable", es decir, sequenciarla en un proceso automático que pondremos en un cron. Tenemos que recordar que no tenemos acceso a ssh y, por tanto, no podemos hacer un scp. Podríamos intentar jacer un scp inverso, es decir, en vez de conectarnos al hosting desde casa para bajarnos los archivos, podríamos conectarnos desde le hosting a casa y enviarlos (imaginando que el scp cliente estuviera permitido), pero lo bamos a hacer muuuucho más sencillo: por wget.

Como el wget puede funcionar con FTP, usaremos éste para conectarnos especificando el numbre de usuario y la contraseña, y la ruta al directorio base de los backups. Además, le pondremos el modificador -r para que lo baje todo a partir del directorio especificado. Yo también le pongo el parámetro -a con un nombre de archivo para que me guarde log del trabajo hecho.

Pero tenemos que recordar que wget lo guarda en el directorio desde dónde se ejecuta, así que debemos cambiar al directorio dónde queremos que se guarde, así que al final lo mejor es meterlo todo en un script sh (por ejemplo, backup_hostgator.sh), que tiene el siguiente contenido:

cd /directorio/destino

wget -r -a /directorio/destino/backup.log ftp://usuario:contraseña@ftp.midominio.com/public_html/Backups/

luego le damos derechos de ejecución y ya lo podemos probar. Si no tienes una máquina encendida siempre, éste es tu final. Ejecuta este archivo periódicamente para bajarte los backups generados en el hosting.

El último paso es automatizar la bajada poniendo el script en el cron. Para editar el archivo de acciones del cron tecleamos

crontab -e

y añadimos la siguiente línia (consulta Using cron para saber más):

0 1 * * * * /ruta/del/script/backup_hostgator.sh

Y ya lo tenemos! Cada día a las 00:00 va a generar los archivos de backup, y cada día as 01:00 va a descargarse los archivos a local.

Preguntas fáciles

  • El archivo de log puede llegar a crecer desmesuradamente! Pues si.
  • Si los archivos de backup ya existen? Se sobreescribirán
  • En el servidor se van a ir acumulando los backups! Pues si. Tendrás que ir haciendo limpieza. Puede que haga otro cron para ello ;)

 Enviar a Fresqui

Leer los Comentarios

[ # 41 ] Comment desde Moises [17 de Enero de 2007, 02:51]

Yo tengo algo similar y si que controla los backups acumulados. Puedes verlo aqui:
http://wiki.quarkblog.org/index.php?title=Sistema_simple_de_backup

[ # 48 ] Pingback desde Scailay.net » Cómo programar backups periódicos [30 de Enero de 2007, 10:32]

[…] Actualización (18:13): en Syntax Error contaban lo mismo hace una semana escasa, pero ahí también explican cómo podemos descargar de forma automática la copia del servidor a nuestro ordenador en el caso de que usemos Linux. Escrito en Internet | RSS de este post | TrackBack URI […]

[ # 524 ] Comment desde Jorge [12 de Abril de 2007, 05:44]

Para mi el s Sistema de backups automático de dw-studio.com.ar es excelente!.

[ # 58168 ] Comment desde Activania [16 de Febrero de 2009, 07:27]

Muy bueno.

Por cierto, tengo pensado pasarme a Hostgator, concretamente a un reseller. He oído que el Hostgator tiene algo limitado el ssh ¿es cierto? ¿Tienes buenas impresiones de Hostgator?

Saludos.

[ # 58170 ] Comment desde Xavi [16 de Febrero de 2009, 08:23]

Lo tiene limitado por defecto, pero es tan simple como que abras un Chat con el soporte técnico y lo pidas. A mi no me dieron ningún problema.

Salu10!

Escribe un Comentario





Estadísticas