martes, 21 de julio de 2009

Appliance Redmine con Ubuntu JeOS (1-Creando la base)



Gracias a Bitnami y sus cómodos instaladores de aplicaciones, una de las últimas incorporaciones en el trabajo ha sido Redmine, un gestor de proyectos sencillo de aprender y "relativamente potente". Lo de "relativamente" es porque este software presenta una serie de cuellos de botella si se pretende virtualizar usando el instalador de Bitnami (la opción fácil de instalación):
  • La base de datos (MySQL) reside en el propio appliance.
  • Los ficheros se almacenan en el propio appliance, dentro de la carpeta de la aplicación.
La experiencia (VMware) me ha demostrado que el uso de disco en una máquina virtual es un problema debido a las bajas tasas de transferencia, asi que hay que sacar estas partes del disco virtualizado y redirigirlas a servidores existentes, con discos en RAID y varios procesadores,para aportar más fiabilidad a los datos sin añadir costes. El appliance no contendrá datos, sólo la configuración y la aplicación; un único backup bastará. Por otro lado, el uso de un servidor de ficheros externo a la carpeta de la aplicación permite el acceso desde varios appliances, pudiendo balancear mejor la carga en caso de ser necesario, cosa que se aplica también al uso de un MySQL externo. Gracias a esto, el tamaño en disco dentro de cada appliance no crecerá con el uso (excepto por los logs).

Ahora los componentes internos que instala el Stack Redmine de Bitnami:
  • MySQL. La base de datos.
  • Carpeta files. Por pemisos tiene que estar en la carpeta de la aplicación y almacena todos los ficheros adjuntados. Redmine modifica los nombres para que no haya problemas.
  • Apache. Hace de puerta de entrada (web) para redirigir las peticiones a Mongrel.
  • Mongrel. Funciona con n procesos (en modo clúster), haciendo cada proceso las llamadas a la aplicación en Ruby. Por defecto se instalan 2 nodos.
  • Ruby on Rails y Ruby Gems, el lenguaje y sus extensiones.
  • Subversion. Es un sistema de versionado. No se va a usar.
Como sistema operativo, en vez de Fedora 9 que puede estar bien para instalar directamente sobre hardware, voy a usar Ubuntu JeOS, una versión especial de Ubuntu Server para uso virtualizado que consume MUY POCOS recursos.

Para la carpeta files se usará un recurso compartido en un servidor de Windows mediante CIFS.
Para MySQL, se usará un servidor ya activo en la red, en el que se levantará una base de datos de Redmine.

Lo siguiente es crear una máquina virtual, ya explicado en una entrada anterior. Una vez creada la máquina hay que actualizarla e instalar Webmin. Como esto si que cambia respecto a Fedora 9, pongo los comandos necesarios:

sudo apt-get update

sudo apt-get upgrade


sudo apt-get install acpid wget perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl openssh-server iptables cron at logrotate

wget http://prdownloads.sourceforge.net/webadmin/webmin_1.480_all.deb

sudo dpkg -i webmin_1.480_all.deb

sudo /usr/share/webmin/changepass.pl /etc/webmin root MyNewPassw0rd


Con esto (1 y 2) se actualiza el sistema operativo, (3) se instalan dependencias necesarias y aplicaciones para un uso posterior, (4) se descarga Webmin (1.480) y (5) se instala. la última línea (6) es para cambiar la contraseña de root a MyNewPassw0rd. Y ya se puede acceder a Webmin a través de https://xx.xx.xx.xx:10000 (xx.xx.xx.xx puede ser la IP o el nombre DNS del appliance). Si te hace falta parar el Firewall momentaneamente para acceder, usa.

sudo iptables -F

Dentro de Webmin ya se puede configurar el Firewall, Apache, etc... para acceder a todo de una manera más cómoda. Hasta aquí, la máquina arranca usando unos 31 Mb de RAM:


Ahora hay que instalar Redmine:

wget http://bitnami.org/files/stacks/redmine/bitnami-redmine-0.8.4-0-linux-installer.bin


sudo chmod +x bitnami-redmine-0.8.4-0-linux-installer.bin


sudo ./bitnami-redmine-0.8.4-0-linux-installer.bin


(1) Descargar el fichero ~90Mb, (2) asignarle permisos de ejecución y (3) lanzar la instalación: Usar la carpeta /opt, el nombre de usuario y contraseña se usarán para MySQL, el correo para avisos por SMTP, Spanish, no configurar de momento SMTP, continuar, arrancar Redmine tras la instalación y la última pregunta no se ve. Igual es ¿acabar con el hambre en el mundo? como pueda ser ¿formatear Internet?, NPI... le doy que Yes, salgo y borro el instalador:

rm bitnami-redmine-0.8.4-0-linux-installer.bin

Ahora ya se puede acceder a la aplicación desde la URL http://maquina/redmine Las credenciales de acceso para administrar Redmine son los proporcionados durante la instalación.

Pero, pero, pero... siempre hay un "pero". Al reiniciar la máquina virtual no arranca Redmine... No responde porque no han arrancado los servicios... Pues a arreglarlo: se modifica el fichero /etc/rc.local y se añade ANTES del EXIT 0 unos comandos para arrancar Redmine al inicio del sistema, de hecho sólo arrancaremos Apache y Redmine, dejando MySQL y Subversion inactivos:

/opt/ctlscript.sh start redmine
/opt/ctlscript.sh start apache


y como los ficheros PID de Mongrel inactivos estorban, antes de arrancar el servicio, borrarlos también

rm /opt/apps/redmine/tmp/pids/mongrel.300?.pid

Espero que no se lie nadie. Por cierto, si se instala Webmin es para cosas de estas:


Si quieres funcionar con el MySQL integrado, añade la línea además de las anteriores:

/opt/ctlscript.sh start mysql

Una vez reiniciado el equipo deberás ver que el consumo de RAM aumenta:


Y si además arrancaste MySQL:


Pues nada, sencillito y funcional, ya está funcionando la máquina virtual con Redmine, para los que quieran ir probando, con 256 Mb de RAM y 3 Gb de HD será suficiente. Los de Bitnami ofrecen algo de virtualización basado en Suse, creo, pero el sistema operativo me gusta hacermelo a mi gusto.

Si esto interesa a los lectores, en una próxima entrega se verá cómo personalizar Webmin para este appliance, la conexión a un servidor de ficheros externo sin romper la aplicación para almacenar attachments (ficheros adjuntos), la conexión a un MySQL externo, ampliar el nº de nodos de Mongrel para soportar mayor carga de usuarios, estimar un dimensionamiento en RAM, etc... porque no es lo mismo trabajar con 5 usuarios que con 50.