martes, 23 de febrero de 2010

Refrán informático


Gracias a la informática el 90% del trabajo se hace en el 10% del tiempo. El otro 10% del trabajo lleva el 90% del tiempo.

Adaptado de una Ley de Murphy.

miércoles, 17 de febrero de 2010

Cambiando el look a Redmine

(Scroll down for english description)

Tras trastear con la aplicación sólo faltaba tocar el tema por defecto: se ha modificado el tema libernix-redmine-ecogreen, haciéndole unas pocas modificaciones:


  • Imágenes de cabecera adaptadas al estilo AdminsQ3.
  • Se ha reducido el texto de los menús superiores para que quepan todos los plugins.
  • Se agrupa la búsqueda y el desplegable de proyectos para ganar en visibilidad de la cabecera de proyecto, ahora con subproyectos.
  • Efecto 3D en títulos y menús superiores (FF y IE).
Se puede descargar aquí. Luego basta con descomprimirlo en [redmine]\public\themes y cambiar en Administración ==> Configuración ==> Mostrar ==> Tema: AdminsQ3.

!Espero que os guste¡

English:

AdminsQ3 theme is a modified version of the Libernix-redmine-ecogreen theme. The main modifications are:
  • Changed top images to meet AdminQ3 style.
  • Font size of top menu was reduced to fit all the installed plugins.
  • Search panel and Project combo were grouped to maximize the project description, 'cos now there exits subprojects.
  • 3D CSS text on top menu and project description (IE & FF).
Download AdminsQ3 Redmine Theme here, unzip in [redmine]\public\themes and change in Administration ==> Settings ==> Display ==> Theme: AdminsQ3.

Enjoy!

miércoles, 3 de febrero de 2010

Refrán informático


NUNCA
discutas con un usuario, te hace bajar a su nivel... y ahí te gana por experiencia.

Administrador anónimo

Appliance Redmine+Apache+Phusion Passenger+Ruby Enterprise usando Ubuntu JeOS (4-Exprimiendo todavía más...)

En posts anteriores se ha visto cómo optimizar una máquina de VMware en menos de 5 minutos, cómo instalar Ubuntu JeOS (que no trae entorno gráfico) y manejarlo con Webmin, asi como las opciones más importantes a tocar para que no haga falta tocar el sistema.

También se ha visto de qué va Redmine y, usando el instalador de Bitnami, se ha creado un appliance listo para usar. Incluso se ha optimizado el appliance:
  • Usando servidores DHCP y DNS existentes para establecer la configuración del equipo en la red.
  • Haciendo que los ficheros que escribe residan en un share remoto Windows usando CIFS, facilitando el balanceo de la aplicación en caso de ser necesario.
  • Sacando la BD a otro servidor, con lo que la restauración del appliance se reduce a volver a levantar un backup de la máquina.
Y parece que va muy bien... Esto de Redmine funciona y parece que las mejoras, el soporte y los plugins aumentan cada día, incluso han sacado uno para Firefox.

Pues aplicando un poco de filosofía kaizen, el appliance montado en entradas anteriores es posible mejorarlo haciendo una instalación limpia (fresh install) de todos los componentes, pero esta vez desde su repositorio correspondiente para asegurarnos de tener una copia EXACTA y saber qué hemos puesto.

A fuerza de mirar esto de Ruby, he visto que hay una variante para trabajar desde Apache sin usar Mongrel: Phusion Passenger. Evita montar tanto cristo de instalación y es más fácilmente escalable y se recupera mejor ante fallos. Por otro lado he visto que la versión Enterprise de Ruby ofrece una mejora considerable en el uso de memoria, mejorando un 33% el rendimiento total (a mi incluso me parece mejor).

Pues ahora más, más rápido y desde las fuentes: se instala Ubuntu JeOS, se inicia sesión en consola y... (leer los comentarios ANTES de ejecutar cada instrucción):

# Instalar Servidor SSH (para usar consola remota yo uso Putty)
sudo apt-get install openssh-server

# Actualizar el sistema
sudo apt-get update && sudo apt-get upgrade -f -y --force-yes

# Instalar paquetes y dependencias necesarias
sudo apt-get install build-essential linux-headers-$(uname -r) apache2-threaded-dev subversion psmisc acpid wget perl libnet-ssleay-perl openssl libauthen-pam-perl libio-pty-perl libmd5-perl rdoc php5-imagick libmagick9-dev libopenssl-ruby libapr1-dev libaprutil1-dev libapache2-svn libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl libdigest-sha1-perl libapache2-mod-fcgid libfcgi-dev smbclient smbfs htop libmysqlclient15-dev apache2-threaded-dev libfcgi-dev libapr1-dev libaprutil1-dev git-core iptables cron at logrotate locate zip unzip -y --force-yes

# Instalar Webmin
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.500_all.deb
sudo dpkg -i webmin_1.500_all.deb
rm webmin_1.500_all.deb
# Ojo al usuario/contraseña para webmin
sudo /usr/share/webmin/changepass.pl /etc/webmin root adminsq3
# Se accede a webmin por https://x.x.x.x:10000

# Instalar Ruby Enterprise
sudo wget http://rubyforge.org/frs/download.php/68718/ruby-enterprise_1.8.7-2010.01_i386.deb
sudo dpkg -i ruby-enterprise_1.8.7-2010.01_i386.deb
sudo rm ruby-enterprise_1.8.7-2010.01_i386.deb

# Instalar RubyGems
cd /opt
sudo mkdir gems
cd /opt/gems
sudo wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
sudo tar -xzvf rubygems-1.3.5.tgz
sudo rm rubygems-1.3.5.tgz
cd rubygems-1.3.5
sudo ruby setup.rb -V
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem

# Instalar Redmine
cd /var/www
# Opción SVN
sudo svn co http://redmine.rubyforge.org/svn/trunk redmine
# Opción GIT (comentada)
# sudo mkdir redmine
# cd redmine

# sudo git clone git://github.com/edavis10/redmine.git


# Instalar Gems requeridos
cd redmine
sudo gem install activesupport activerecord actionpack actionmailer activeresource gem_plugin fastthread rails rake rack passenger rmagick mysql reek roodi --no-ri --no-rdoc
sudo gem install rubyist-aasm --source http://gems.github.com --no-ri --no-rdoc
sudo rake rails:update

# Como se supone que tenemos "una" configuración funcionando que queremos migrar,
# copiamos los ficheros existentes database.yml y email.yml a /var/www/redmine/config/
# En caso contrario, copiar y modificar los de ejemplo:

# database.yml.example ==> database.yml

# email.yml.example ==> email.yml

# Puede ser necesario reaplicar los permisos dentro de Webmin (Otros==>Explorador de archivos). Se muestran los más permisivos:

# Generar session stores y limpiar
sudo rake config/initializers/session_store.rb
sudo rake tmp:cache:clear
sudo rake tmp:sessions:clear

# Crear/migrar/actualizar BD a la nueva versión (el programa escoge)
# Si genera la estructura de una nueva BD, se accede con admin/admin
sudo rake db:migrate RAILS_ENV=production

# Migrar/actualizar información de plugins
sudo rake db:migrate_plugins RAILS_ENV=production

# Reaplicar permisos R/W a /var/www/redmine (root:www-data) con Webmin

# Opcional, para ver que todo va bien, probar con WebBrick en http://x.x.x.x:3000/
sudo ruby script/server webrick -e production

Hasta aquí se ha conseguido dejar la máquina con Redmine operativo, pero vamos a exprimirlo un poco más modificando el fichero /etc/fstab e incluir la linea para mapear el share de Windows a la carpeta /var/www/redmine/files (ver entrada anterior). A continuación configuraremos Apache para poder servir aplicaciones Ruby con Phusion Passenger:

# Configurar Apache y optimizar opciones de Phusion Passenger
# (crear los siguientes ficheros):

# "redmine.conf" -> Ver http://snippets.dzone.com/posts/show/10071
# "passenger" -> Ver http://snippets.dzone.com/posts/show/10073
# "virtualhost_redmine.conf" -> Ver http://snippets.dzone.com/posts/show/10075

# Integramos Passenger con Apache (Ojo a las instrucciones en pantalla)
sudo passenger-install-apache2-module


# En Webmin:
# Eliminar servidor virtual por defecto.

# Quitar modulos (Global Configuration): perl php5 dav dav_svn

# Poner módulos
(Global Configuration): proxy proxy_balancer cache proxy_http rewrite mem_cache deflate expires passenger

# Plugins que merecen la pena. Algunos requieren un fichero de traducción alternativo (es) inexistente; he creado unos para poderlos ver correctamente:

cd /var/www/redmine

# Charts (Gráficos): http://github.com/mszczytowski/redmine_charts
sudo ./script/plugin install git://github.com/pullmonkey/open_flash_chart.git
sudo git clone git://github.com/mszczytowski/redmine_charts.git redmine_charts

# Exception handler (avisos por email): https://projects.littlestreamsoftware.com/projects/show/redmine-exception
# Traducción http://snippets.dzone.com/posts/show/10079
sudo ./script/plugin install git://github.com/edavis10/redmine-exception-handler-plugin.git

# Reports (informes): http://github.com/edavis10/redmine_reports
# Traducción http://snippets.dzone.com/posts/show/10077
sudo ./script/plugin install git://github.com/edavis10/redmine_reports.git

# Graphs: (Gráficos): http://github.com/bradbeattie/redmine-graphs-plugin
#
Traducción http://snippets.dzone.com/posts/show/10081
sudo ./script/plugin install git://github.com/bradbeattie/redmine-graphs-plugin.git

# Kanban (organizador):
http://theadmin.org/articles/2009/07/22/redmine-kanban-plugin/
#
Traducción http://snippets.dzone.com/posts/show/10083
sudo ./script/plugin install git://github.com/edavis10/redmine_kanban.git

# Migrar BD a la nueva versión
sudo rake db:migrate RAILS_ENV=production
# Actualizar información de plugins
sudo rake db:migrate_plugins RAILS_ENV=production

# Limpiar al final
sudo apt-get autoclean

# Reiniciar el appliance (única vez) para asegurarnos que
# monta bien el share CIFS automáticamente y que todo arranque bien.

# Abrir la página de Redmine en http://x.x.x.x


Con esto se ha pasado a usos de RAM de 100 Mb a 210 Mb como mucho (en producción), además de la mejora en velocidad. Junto con las optimizaciones que se han publicado en entradas anteriores, hacen que este appliance vaya como la seda.

Y no se tarda tanto en montarlo... ¿no?.

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.

miércoles, 22 de julio de 2009

Appliance Redmine con Ubuntu JeOS (2-Configurando Webmin)


Esta es la 2ª parte de cómo crear un appliance de Redmine 0.8.4 con Ubuntu Jeos 8.04.3 y Webmin usando el Bitnami Redmine Stack. Este artículo se centra en la integración de los tres para obtener una plataforma estable y manejable. Todos los pantallazos de Webmin son usando el tema Stressfree.

Una vez creada y funcionando la máquina virtual (ver entrada anterior), hay que asegurarse de que dure dura, asi que vamos a "endurecerla" mediante Webmin, una herramienta para manejar servidores que, bien manejada, ayuda mucho a la administración. Primero vamos a borrar los módulos que no se usan en el appliance, desde Webmin ==> Configuración de Webmin ==> Modulos de Webmin ==> Delete (ojo, por dependencias entre sí no se pueden borrar de golpe):
  • Linux Bootup Configuration
  • LDAP Users and Groups
  • PHP Configuration
  • Kerberos5
  • LDAP Client
  • SMART Drive Status
  • Sendmail Mail Server
  • System Logs NG
  • Shoreline Firewall
  • TCP Wrappers
  • SpamAssassin Mail Filter
  • WU-FTP Server
  • Webalizer Logfile Analysis
  • Squid Proxy Server
  • Squid Report Generator
  • Usermin Configuration
  • Voicemail Server
  • idmapd daemon
  • Security Sentries
  • QMail Mail Server
  • ProFTPD Server
  • Procmail Mail Filter
  • SSL Tunnels
  • Samba Windows File Sharing
  • Postfix Mail Server
  • PostgreSQL Database Server
  • NIS Client and Server
  • OpenSLP Server
  • PPP Dialin Server
  • PPP Dialup Client
  • PPTP VPN Client
  • PPTP VPN Server
  • Printer Administration
  • MON Service Monitor
  • NFS Exports
  • Exim Mailserver
  • Filter and Forward Mail
  • Majordomo List Manager
  • Frox FTP Proxy
  • HTTP Tunnel
  • Heartbeat Monitor
  • IPsec VPN Configuration
  • Jabber IM Server
  • LDAP Server
  • Extended Internet Services
  • MySQL Database Server
  • Fetchmail Mail Retrieval
  • Cluster Usermin Servers
  • Cluster Users and Groups
  • Cluster Webmin Servers
  • Cluster Copy Files
  • Configuration Engine
  • Cluster Cron Jobs
  • DHCP Server
  • Cluster Shell Commands
  • Disk Quotas
  • Cluster Software Packages
  • Dovecot IMAP/POP3 Server
  • BIND DNS Server
  • Bacula Backup System
  • CD Burner
  • CVS Server
  • Cluster Change Passwords
  • ADSL Client
Luego, como hay que enterarse si pasa algo "anormal" y tener prueba de ello en la Bandeja de Entrada, se crean las alertas básicas de aviso entrando en Otros ==> Estado de Sistema y Servidor:


Lo primero de todo es configurar el envío de alertas mediante email y que revise cada x tiempo los monitores que añadiremos a continuación:


El primer monitor que añadimos es Alive System, que indica los encendidos/apagados,


luego añadimos el de Espacio en disco, para indicarle sobre "\" (todo el disco) que avise cuando haya menos de 1 Gb. libre (por ejemplo),


Estado de Interfaz de Red indica si hay conexión de red,


Media de Carga indica cuando hay un consumo de recursos (CPU) excesivo,


Memoria Libre no tiene mayor explicación,


Chequear Proceso sirve para comprobar si hay un comando en ejecución; usaremos /opt/ruby/bin/.ruby.bin /opt/ruby/bin/mongrel_rails start para comprobar que el clúster de Mongrel está activo, indicando en Número de procesos que deben existir para que el monitor lo considere como ejecutándose el nº de nodos de Mongrel que tengamos iniciados,


y ya sólo falta el Servidor Web Apache,


con lo que nos tiene que quedar esta bonita pantalla


donde se puede apreciar de un rápido vistazo el estado del sistema. Por cierto, Apache figura mal porque no se ha configurado... en Servidores ==> Servidor Web Apache ==> Configuración del módulo, se pueden establecer los parámetros para que apunte al servidor web Apache que está instalado con Redmine:


Ahora vamos a tocar el Firewall por encima. Entramos en Red ==> Cortafuegos Linux y dejamos la siguiente configuración (ojo al orden de las reglas):


Ahora a mantener la hora sincronizada con un servidor externo, para que no haya problemas... Hardware ==> Hora del Sistema ==> Time Server Sync:


Ahora vamos a crear una serie de Comandos Personalizados que nos faciliten la vida, entrando en Otros ==> Comandos personalizados:


Estado de Redmine, comprobar el estado de los servicios: /opt/ctlscript.sh status
Parar Redmine, detener los procesos de Mongrel: /opt/ctlscript.sh stop redmine
Arrancar Redmine, iniciar los procesos de Mongrel: /opt/ctlscript.sh start redmine
Parar Apache, detener el servidor web: /opt/ctlscript.sh stop apache
Arrancar Apache, iniciar el servidor web: /opt/ctlscript.sh start apache
Contenido de carpeta files, ficheros subidos a Redmine: dir /opt/apps/redmine/files

Y también crearemos Editores de Archivo para facilitar las modificaciones a mano de archivos de configuración de Redmine:
  • Editar redmine.conf:


  • Editar database.yml:



Editar mongrel_cluster.yml:


Con esto se facilitan las modificaciones puntuales de Redmine, que luego viene el jefe con prisas y ya se sabe...

Y por supuesto, no olvidarse de rotar los logs de Redmine ni de Apache... ¿Que qué son los logs? Son los registros de la aplicación, muy útiles para analizar el uso y los errores de una aplicación, pero si no se hace nada con ellos pueden crecer hasta llenar el disco y eso es un problema. Aquí, una vez más, nos apoyamos en Webmin y la utilidad de rotación de logs, que cogerá esos ficheros cada n días, los comprimirá y, tras truncarlos (borrar su contenido), dejará los anteriores comprimidos (n copias) en la carpeta que le digamos. Es más, antes de ello parará la aplicación y a continuación la reiniciará (segundos), tanto en el caso de Apache como en el de Redmine. Vamos a ver cómo entrando en Sistema ==> Rotación de históricos (Logs) y añadiendo la de Apache en Agregar un nuevo archivo de bitácora para rotar:


Luego añadimos la rotación de logs para Redmine:


Con esto tenemos la rotación de logs controlada y sabemos que por aquí no va a romperse. Los ficheros quedan en una carpeta desde donde los podremos mover, enviar por email o dejarles que se borren (guarda un histórico de n rotaciones):


Y si nos queremos asegurar que funciona correctamente, abajo hay un botón de Rotar Ahora. Este es el aspecto de la carpeta de logs de Redmine antes de rotar:


Durante la rotación de los ficheros observamos la salida de los comandos que se ejecutan antes y después, en este caso parando Redmine antes de rotar e iniciándolo tras acabar el proceso (asi no se escapa nada):



El aspecto de la carpeta de logs de Redmine después de la rotación es este, donde puede apreciarse que los ficheros han quedado vacios:


¿Y dónde están ahora...? Comprimidos, en la carpeta que hemos indicado antes:


Por cierto, ejecutando esto diariamente se minimiza el uso de disco y se reciclan los procesos (al reiniciar los servicios), liberando memoria.

Si la política de la empresa te pide almacenar 6 meses de logs, ya sabes, a hacer copia de la carpeta todas las semanas; no recomiendo almacenar muchos logs dentro del appliance por la posible falta de espacio en disco y porque se almacenan mejor en un servidor de ficheros.

Y lo último que nos queda es comprobar que la rotación de logs está activa entrando en Sistema ==> Tareas Planificadas:


Y hasta aquí hemos llegado por hoy, consiguiendo que el appliance de Redmine gane en seguridad, estabilidad y facilidad de administración gracias a la integración con Webmin. En la próxima entrega veremos como optimizar el funcionamiento de Redmine para poder exprimirlo al máximo.

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.