lunes, septiembre 23, 2013

Respaldando un repositorio SVN

Hace poco necesitamos empezar a respaldar regularmente el SVN de la empresa en la cual trabajo. La idea es poder manejar respaldos regulares en una máquina distinta a aquella donde opera el repositorio de código.

Como es habitual, este artículo es de contenido técnico. SI no entiende nada de lo que escribo, entonces simplemente pase a saludar :)

El SVN se encuentra en una máquina Linux que está virtualizada.
La máquina donde se va a hacer el respaldo es una máuina física y está en otra red.

Lo primero es hacer que las máquinas se vean vía SSH sin necesidad de password. Para ello generamos certificados RSA, Pueden buscar por SSH public key no password login y algo encontrarán.

Lo segundo es mapear una carpeta física de la máquina destino (donde se hará el respaldo) dentro de la máquina del SVN. Esto lo haremos usando sshfs, que como quizás puedan deducir es un sistema de archivos (Files System) que opera vía SSH. Voy a suponer que ya tiene el sshfs instalado.
Entonces se deberán ejecutar los siguientes comandos en la máquina SVN:
SVN:~# sshfs @<>:
SVN:~# svnadmin dump | gzip -9 > `date +%Y%m%d%H%M%S`_.dump.gz
Para efectos de simplicidad, decidí automontar la carpeta. Para ello hay que tener un gran cuidado, e indicar en los parámetros que se reconecte la unidad al reiniciary que se permita la escritura a otros usuarios. también es importante indicar el uuid y el gid del usuario que se está conectando:
Editar el archivo /etc/fstab y agregar al final la siguiente línea:
sshfs#sshfs @<>:  fuse comment=sshfs,auto,users,exec,uid=,gid=,allow_other,_netdev,reconnect,transform_symlinks,BatchMode=yes 0 0
Y además agregué un script para realizar el respaldo.
Crear el archivo /bin/svnbackup con permisos 755 y las siguientes líneas:
#!/bin/bashsvnadmin dump $1 | gzip -9 > $2`date +%Y%m%d%H%M%S`_$3.dump.gz
Donde $1 es la carpeta del repositorio SVN, $2 es la carpeta de destino (importante terminarla en / ya que es una carpeta), y $3 es un identificador que permitirá distinguir el respaldo de otros (en caso de haber más repositorios).

Y si quieren simplificar aún más las tareas de respaldo, pongan el script en una línea en su archivo cron. Importante: Si van a usar cron usen el script, ya intenté poner el comando completo y no pude conseguir que funcionara.