domingo, 26 de julio de 2009

Appliance Redmine con Ubuntu JeOS (3-Puliendo Redmine)

Para probar Redmine por primera vez en la Intranet del trabajo usé una máquina virtual limpia con Redmine Bitnami Stack, porque instalar los componentes a mano es muy tedioso (pero no imposible). Pero en cuanto se empezaron a animar a usarlo más y más usuarios, se empezaron a crear proyectos a patadas, se subió el tamaño de adjuntos de 5 a 10 Mb. y se vió que había problemas de rendimiento. En un primer momento se pensó que era por los procesos de Mongrel; cada nodo responde a una petición y si ya está procesando algo aparecen los retrasos en las respuestas. Se añadieron nodos de Mongrel y el tiempo de respuesta mejoró, pero no lo suficiente... El nº de nodos de Mongrel viene por defecto a 2, tengo unos 30 usuarios con un uso moderado y, tras las pruebas, con 3 nodos rinde perfectamente (VMware 1 CPU, 256 Mb. RAM). Supongo que no se pueden meter nodos ilimitadamente, pues consumen 50-70 Mb. de RAM cada uno y hacen un uso exhaustivo de la CPU, asi que en caso de necesitar más potencia habría que balancear entre varias máquinas.



Luego vino el problema de la administración y configuración de la propia máquina y de Redmine, que se solventó usando Webmin (ver entrada anterior), para que los no iniciados en Linux puedan realizar tareas básicas.

Los usuarios se quejaban de acceder a traves de una IP, así que hubo que asignar un nombre a la máquina a través del servidor DHCP. Luego se quejaron del /Redmine de la URL y hubo que quitarlo tocando la configuración de Apache, asi como crear un proxy para balancear con el cluster de Mongrel:

httpd.conf

redmine.conf

Otro problema son las copias de seguridad de la máquina virtual, ya que su tamaño no hace más que crecer por los ficheros adjuntos, la base de datos y los logs... Así que ¿cómo montar esto con lo mínimo? A ver, si ya tengo un servidor de bases de datos y otro de ficheros, ambos con los backups ya programados, ¿por qué complicarme con más servidores?

Para la configuración de red y cambiar el nombre de la máquina virtual me valgo de un servidor DHCP (Windows Server) donde, en una reserva por MAC, le puedo activar la opción Nombre de Host para que automáticamente se configure a Redmine. Además añado la entrada de Host en el servidor DNS.

Luego hay que sacar la bases de datos a un servidor externo haciendo un backup que restauraremos en el servidor ya existente, donde ya tenemos toda la infraestructura montada ( almacenamiento y copias de seguridad). Hay que conceder acceso en el servidor MySQL para el usuario de Redmine, pero ojo si se pretende asignar el nombre de máquina explícitamente en el permiso: mi experiencia me ha demostrado que, aunque en principio funcione bien, hay un momento en el que la aplicación llama usando el nombre de host '%' (cualquiera) y falla. Puede que sea cosa del nombre de la máquina o del servidor DNS, el caso es que los permisos los asigno por usuario y no por el par usuario-host.

Por último hay que lograr que Redmine use un servidor de ficheros externo, Windows en mi caso. Para ello no hay más que montar el recurso compartido con CIFS (no SAMBA) en la carpeta /files durante el arranque de la máquina virtual modificando el fichero /etc/fstab y añadiendo una línea al final (asegúrate de que haya un salto de línea después):

//Servidor/Recurso /opt/apps/redmine/files cifs rw, root, username=miusuario, password=miclave 0 0

En caso de tener que asignar por usuario y grupo de Linux, usar:

//Servidor/Recurso /opt/apps/redmine/files cifs rw, uid=root, gui=www-data, username=miusuario, password=miclave 0 0

Ojo, si el recurso de red no está disponible en el arranque de la máquina puede haber problemas de funcionamento, revisar que monte bien la ubicación remota con las credenciales asignadas y no aparezca el siguiente error en /var/log/syslog:

CIFS VFS: Error connecting to IPv4 socket. Aborting operation
CIFS VFS: cifs_mount failed w/return code = -111


Al final ha quedado una máquina virtual con 256 Mb. de RAM asignada, un consumo de disco de poco más de 1 Gb. y que rinde perfecamente con 30 usuarios. Su backup (.7z) ocupa <300 style="font-style: italic;">trunk de Redmine, la diferencia de rendimiento usando Phusion Passenger en vez de Mongrel, el cambio a Ruby Enterprise por temas de gestión optimizada de la memoria y la instalación de nuevos plugins para mejorar el trabajo. Merecerá la pena.