Noticias Weblogs Foros Wiki Código
Sponsors:

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

PlanetaCódigo en inglés

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

Syntax Error

Sistema de backups automático con Hostgator

Diciembre 29th, 2006 - [Enlace local]

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:

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í:

PLAIN TEXT
PHP:
exec("/home/usuario/public_html/cronjobs/mysqlbackup.sh");

?>

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

» Leer más, comentarios, etc...