Nos da bastante miedo la posibilidad de que Amazon la líe y se muera la instancia, o de que ocurra una catástrofe planetaria y nos quedemos sin blog de un día para otro, así que os contamos un par de cosas que se nos han ocurrido. La clave es prevenir, prevenir, prevenir. Esta entrada no será entretenida, así que podéis ignorarla sin sentir culpabilidad.

Los precios por las nubes, y los archivos también
Como sabéis, haciendo es como mejor se aprenden las cosas, y por ese motivo he optado por mancharme las manos e intentar crear un plan de respaldo a pelo. Hay soluciones freemium como ManageWP, que por lo poco que he probado funciona bien y admite enviar a Dropbox, o incluso otras gratuitas, que seguramente resuelvan este problema sin tanta alharaca, pero si todo te lo dan hecho no tiene tanta gracia. En fin, avisados quedan.
Para empezar, todo lo que subimos al directorio /uploads se queda también en nuestros Dropbox personales. Como ambos tenemos varios ordenadores, existen múltiples copias de la carpeta /mbmb_es en todos ellos, y ahí van casi todas las fotos. El problema es que están todas desperdigadas de cualquier manera, sin respetar la estructura de directorios de WordPress; luego hablaremos más de esto y de cómo evitarlo.
Hemos instalado el plugin WP-DB backup, que nos permite hacer y enviar por correo un respaldo automático de la base de datos MySQL de WordPress. Así tenemos copias de la base de datos en los intervalos que queramos, que contienen el texto de las entradas, los comentarios, ajustes y en general lo más importante del sitio. Hemos elegido un backup semanal enviado por correo, porque tampoco meneamos tanto este blog. Instalar este plugin es trivial, solo hay que buscarlo.
Queríamos instalar Dropbox para asegurar una copia de la carpeta /uploads con su estructura de directorios, porque de otro modo un respaldo exigiría volver a subir todas las fotos a mano. ¡El infierno en vida! Esto trae sus problemas, porque, salvo apaños rarunos, el usuario que ejecuta Dropbox (ec2-user) no es el mismo que el que sube y maneja las fotos y archivos del blog (apache) y puede ocurrir que haya problemas con los permisos. Y cuando digo puede ocurrir en realidad quiero decir seguro que los habrá. No se preocupen, hay apaños.
Después de muchos intentos, el método que mejor ha funcionado es instalar y ejecutar Dropbox como usuario (ec2-user) y volcar periódicamente el directorio /wp-content a un directorio de /home/ec2-user/Dropbox. ¡Vamos!
Instalar Dropbox en la máquina Amazon EC2
Después de entrar en la máquina remota mediante ssh, hay dos pasos para instalar Dropbox: descargar el ejecutable, y descargar un script en Python que te facilita la vida. Desde la propia Dropbox no se explican demasiado bien, así que nos vamos a extender.
En primer lugar, descargamos el ejecutable y lo descomprimimos:
cd ~ && wget -O - "http://www.dropbox.com/download?plat=lnx.x86" | tar xzf -
Y ejecutamos el demonio de Dropbox:
~/.dropbox-dist/dropboxd
La instalación requerirá que copiemos y peguemos un enlace en nuestro navegador para enlazar la máquina a Dropbox. Una vez hecho esto, la máquina remota se pondrá a sincronizar, si estamos usando una cuenta de Dropbox que ya albergue contenido. Si queréis crear una cuenta nueva, os agraceceríamos que nos usarais como referencia
Parece fácil, pero si no estás familiarizado con Linux te puedes liar. Al completar el enlace, no vuelves a la línea de comandos automáticamente: dropboxd se sigue ejecutando y no vuelve el cursor. ¿Y cómo salgo de aquí? Has de pulsar CTRL+Z para recuperar la línea de comandos, y luego ejecutar
bg
…para enviar el trabajo dropboxd a segundo plano. Ahora Dropbox está ejecutándose, sincronizando los archivos a /home/ec2-user/Dropbox. Aún así, ni guardamos nada en ese directorio, ni se volverá a ejecutar Dropbox al reiniciar. ¿Qué hacemos?
Ejecutar Dropbox al inicio
En teoría, Dropbox te permite descargar un ejecutable Python para configurar los servicios desde la línea de comandos:
wget https://www.dropbox.com/download?dl=packages/dropbox.py
python dropbox.py
Aunque es recomendable bajárselo, porque nos da una lista de comandos para ver el estado de Dropbox, hay algún inconveniente: por ejemplo, el autostart que recomiendan no funciona, porque el Linux que te da Amazon no es el Ubuntu normal.
Una manera de resolverlo es convertirlo en un servicio y ejecutarlo como root, al igual que ya hicimos con MySQL y Apache en una entrada anterior. Esta solución no me gusta porque ejecutarlo como root podría suponer problemas de seguridad. En lugar de eso, vamos a agregarlo a .bashrc para que el usuario ec2-user lo ejecute automáticamente, sin permisos fuertes. Aunque hubiera vulnerabilidades en Dropbox, al menos nos aseguramos de que los atacantes no podrían obtener acceso de administrador.
Escribimos
nano ~/.bashrc
Y añadimos las líneas
# Demonio de dropbox
~/.dropbox-dist/dropboxd &
Así ejecutaremos Dropbox automáticamente en cada reinicio, con los privilegios de usuario de ec2-user.
Sincronizar regularmente las carpetas a Dropbox
Podríamos hacerlo a lo bestia, pero existe rsync para facilitarnos la labor. Este comando está pensado para hacer copias de seguridad y admite copias incrementales. Es decir, la primera vez tardará un rato, y luego solo cambiará lo que sea distinto respecto al último respaldo.
sudo rsync -a --compress --progress /%%LADIRECCIONDETUBLOG /home/ec2-user/Dropbox
Cambia %%LADIRECCIONDETUBLOG por la carpeta donde lo guardes, y la carpeta de destino por la que elijas. Este comando convendría ejecutarlo automáticamente, para no tener que hacer las copias a mano, y para eso están cron y los bash scripts. Por motivos de seguridad, no podemos añadir una línea de comando sin más a cron, así que tenemos que crear un archivo .sh
cd ~
nano rsync-bkp.sh
Y en este archivo copiamos la orden anterior. Guardamos con CTRL+O, salimos con CTRL+X y luego incluimos esta orden en cron, como vimos en la otra entrada:
sudo crontab -e
Y en el crontab añadimos la línea
40 5 * * Tue root /home/ec2-user/rsync-bkp.sh
Esto hace que todos los MARTES, a las 5:40 AM, se ejecute la copia incremental que hemos definido arriba, con los privilegios del usuario root para que todo se copie localmente. Por supuesto, podemos elegir otro momento para realizar la copia.
Con todo esto deberíamos tener el blog razonablemente bien conservado. Si se cayera algo o Amazon matase la máquina, tendríamos una copia del último martes, o con la periodicidad que queramos. ¡Saludos!
Referencias
Nos han venido muy bien para redactar esta entrada los tutoriales de Kwazi: http://blog.kwazi.co.il/ec2/amazons-ec2-tomcat-mysql-dropbox-101/ y de Cerebellum Strategies: http://www.cerebellumstrategies.com/wordpress-backups-dropbox/