Me dolió el codo

Y bueno la semana pasada encontré con que unos colegas que contrataron a “alguien” para hacer unas formas usaron una solución de fuente abierta [1] la cual después de platicar con ellos muy profesionalmente y que seguramente les llamaran para que nos compartieran el código pues cuando quedaron de enviarlo no lo hicieron… en fin encontré muy útil el asunto y como venia ahí que si te funcionaba, pues pasaras algo por paypal, desde un centavo y como en las opciones venia enviar un café, fue lo mínimo que se me ocurrió que valía el sacar a uno de un apuro en un bomberazo 2.95USD.

Para otro proyecto, que más bien es personal estuve buscando una solución para respaldo de WordPress en un host que no tiene acceso Shell, bueno el host no lo elegí yo, pero si implemente el sitio y varias cosas, como son un tanto payasos, ya que en ocasión anterior usando la herramienta de Cpanel para backups –¿ya mencione que yo no elegí el host?- nuestro hosting nos borro el archivo que porque incumplía los términos de servicio y no era un archivo de valido para servir en web, total que fue un show y aunque busque algún plugin de WP que satisficiera mis necesidades encontré tres, EZ Backup [2] que no me gusto, Complete Backup [3] que me pedía que me registrará con correo electrónico, nombre y apellido y Vaultpress [4]. El primero se veía promisorio, se puede respaldar theme, core ydb, pero para hacerlo automagico hay que pagarlo, el segundo prometía aún más pero para siquiera usarlo, hay que registrarlo “gratis” por cada dominio, cosa que ya no me gusto, según permite hacer backup y crear un api key para desde una ip lanzarlo, total que no poder ni probarlo sin registrarlo no me gusto, el ultimo provisto por Automattic.com es decir la parte corporativa de WordPress parece la mejor opción, automático, offsite, con deltas, pequeño inconveniente 15USD al mes cuando estoy sacando por este proyecto el equivalente a 76USD al mes… y bueno si me dolió el codo, pero sigo requiriendo una solución para el respaldo.

Recordando alguna vez un script que me ayudo Gunnar a hacer para conectar a una base de datos MySQL me cayo el veinte de que si en Perl no es complicado manipular una BD y lanzar algún comando de sistema de ser necesario [5] pues en php no debía serlo tampoco de hecho dando un par de búsquedas en google, encontré que tal cual no es complejo de hecho hasta encontré un buen ejemplo que casi hace todo lo que necesito [6]:

//servidor MySql
$C_SERVER='tu_servidor';
//base de datos
$C_BASE_DATOS='tu_base_de_datos';
//usuario y contraseña de la base de datos mysql
$C_USUARIO='tu_usuario';
$C_CONTRASENA='tu_contraseña';
//ruta archivo de salida
//(el nombre lo componemos con Y_m_d_H_i_s para que sea diferente en cada backup)
$C_RUTA_ARCHIVO = '/ruta_hasta/backups/backup_'.date("Y_m_d_H_i_s").'.sql';
//si vamos a comprimirlo, no queremos compresión para aprovechar los deltas.
$C_COMPRIMIR_MYSQL='false';
//comando
$command = "mysqldump --opt -h ".$C_SERVER." ".$C_BASE_DATOS." -u ".$C_USUARIO." -p".$C_CONTRASENA." -r \"".$C_RUTA_ARCHIVO."\" 2&>1";
//ejecutamos
system($command);
//comprimimos
if ($C_COMPRIMIR_MYSQL == 'true') {
system('bzip2 "'.$C_RUTA_ARCHIVO.'"');
}

Viendo esto, pues se me ocurrió que con system podría pasar de una vez tar cvfz y hacerme también de un respaldo de los archivos, pequeño detalle, con las imágenes, videos, modificaciones, pdf y demás archivos el respaldo ya va por el giga y medio, entonces y pensando en el pésimo cron que provee php, se me ocurrió hacer más dependiente de curl las cosas, por lo que en el host donde estoy haciendo el respaldo cree dos scripts en bash.

Uno que hacer curl a este al script de respaldar sql, ese se mete al crontab para ejecutarse cada noche, al fin la base de datos no crece tanto, el otro hace curl también pero a un archivo que solo genera un tar de los archivos, excluyéndose a sí mismo y después lo descarga con wget, una vez hecho esto envía curl a otro script que usando unlink borra el archivo.

### Este crea el respaldo de sql se corre diario @daily
#!/bin/bash
curl http://foo.bar/respaldo/backupsql.php

## por si las dudas esperamos a que termine, demos 10 min
sleep 10m

wget http://foo.bar/respaldo/backup_wp.sql

exit 0

### Este crea el respaldo del FS se corre una vez a la semana @weekly
#!/bin/bash
curl http://foo.bar/respaldo/backupfs.php

## por si las dudas esperamos a que termine, demos 120 min
sleep 120m

wget http://foo.bar.ficcm.org/ficmm.tar

# Este libera el espacio
curl http://foo.bar/respaldo/borratmp.php

exit 0

Digamos que no es tan bonito como Vaultpress, ni está en la “nube” como Total Backup, pero se me hace vale los 15USD que voy a ahorrar y me funciona mejor por las políticas del hosting que se tiene contratado, cosa que no podría cumplir más que con Vaultpress y que prefiero amortizar respaldando en mi propio host, si al cliente le he comentado de lo importante de los respaldos y de contratar algo como rsync.net o Vaultpress, pero no parece ser prioritario, baste mencionar que la página esta en un host de 1.95USD al mes.

Y bueno me dolió el codo pero resolví mi problema aprendí un par de cosas de php y aunque se me ocurre que seguro si meto condicionales lo puedo meter todo en php y tener un solo bash que obtenga el los dos respaldos, pero así me funciona y como añadido lo que está en mi host lo respaldo con rsnapshot por lo que tengo deltas diarios, semanales y mensuales de hasta tres meses de antigüedad.

[1] http://phpfmg.sourceforge.net/
[2] http://wordpress.org/extend/plugins/wordpress-ez-backup/
[3] http://wordpress.org/extend/plugins/wp-complete-backup/
[4] http://vaultpress.com/plans/
[5] http://blografia.net/vicm3/2006/03/y_bueno_aunque_nadie_ha_preguntado/
[6] http://blog-indomita.blogspot.com/2008/08/realizar-backup-mysql-desde-php.html

Esta entrada fue publicada en planetalinux, sysadmin, Trabajo, Web. Guarda el enlace permanente.

Deja un comentario

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

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>