Servidor Redmine en Ubuntu desde cero

redmine-logo

Introducción

En esta entrada explicaré de cero una instalación y configuración de un servidor Linux (Ubuntu Sever) que soporte un entorno de producción mantenible de Redmine.

redmine-logo

Este trabajo es algo que cada año cambia, aparecen nuevos gestores de paquetes en Ruby, nuevas versiones de Rails, nuevas formas de servir las páginas web, … un sin fin de posibilidades que es muy costoso de evaluar, mucho más si no eres experto en administración de sistemas Linux.

Desde mi experiencia (no de experto) trato de llenar este hueco, desde luego como siempre estoy abierto a sugerencias/críticas/alternativas/…

Instalación de sistema operativo

En mi caso he empezado por la última distro disponible de Ubuntu Server 64 bits 13.04 (que pena de 1 mes para tener la 13.10).

Instalación normal, todos los paquetes los instalaremos a mano una vez instalado, no voy a describir cosas obvias como particiones, usuarios, … a gusto de consumidor. Sólo decir yo al menos prefiero no permitir que el sistema operativo se actualice sólo, prefiero hacerlo manual y conscientemente de manera periódica.

Configurar la red

Voy a proporcionar un ejemplo de entorno, dónde el servidor (IP 192.168.1.21) estará en una Intranet (red 192.168.1.0/24 con el router en la IP 192.168.1.1) detrás de un proxy HTTP (IP 192.168.1.2 puerto 1234), que cada uno lo adapte a sus necesidades reales.

Editamos el fichero de interfaces:
[bash]
sudo vim /etc/network/interfaces
[/bash]

Contenido del fichero:
[bash]
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.21
netmask 255.255.255.0
broadcast 192.168.1.255
post-up route add 192.168.1.1 dev eth0
post-up route add default gw 192.168.1.1
post-down route del 192.168.1.1 dev eth0
post-down route del default gw 192.168.1.1
[/bash]

Editamos el fichero de variables de entorno:
[bash]
sudo vim /etc/network/interfaces
[/bash]

Para agregar las siguientes líneas:
[bash]
http_proxy="http://192.168.1.2:1234/"
ftp_proxy="http://192.168.1.2:1234/"
https_proxy="http://192.168.1.2:1234/"
[/bash]

Finalmente tenemos que reiniciar la red y salir y entrar de sesión (para que se apliquen las variables de entorno):
[bash]
sudo service networking restart
exit
[/bash]

Una vez configurada la red, aprovechamos y dejamos el sistema operativo actualizado (tras esta actualización habitualmente habrá que reiniciar dado que casi seguro que el kernel se haya actualizado):
[bash]
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
[/bash]

Sino se ha hecho durante la instalación es conveniente habilitar el acceso remoto mediante SSH:
[bash]
sudo apt-get install openssh-server
[/bash]

A partir de este punto lo mejor es cambiar a la consola SSH.

Servidor web y de base de datos

Instalamos LAMP, es decir Apache + MySQL + PHP junto con el administrador de bases de datos phpmyadmin, lo mejor es instalarlo todo junto mediante (al instalar phpmyadmin necesitamos Apache y PHP, con lo que el gestor de paquetes será capaz de gestionar las dependencias):
[bash]
sudo apt-get install mysql-server phpmyadmin
[/bash]

Durante la instalación nos pedirán varios datos:

  1. Primero para instalar MySQL: nos pedirá que configuremos la clave de administrador del gestor de base de datos (habrá que introducirla 2 veces).
  2. Luego configuramos phpmyadmin: lo primero es que nos pedirá que servidor web queremos que configure, obviamente elegimos apache2, luego hay que configurar phpmyadmin (aceptando la pregunta de si queremos configurarlo, claro), nos pedirá la clave que configuramos antes para MySQL (una sola vez), y luego crear la clave que queremos configurar para administrar phpmyadmin (esta clave no es la misma que pusimos a MySQL sino una clave para el propio phpmyadmin, aunque lo recomendable es que pongáis la misma y listo).

Ahora lo suyo es probar que todo se ha instalado bien, primero Apache en http://192.168.1.21 y luego phpmyadmin en http://192.168.1.21/phpmyadmin (usuario root y clave la que hemos creado en el segundo paso).

Añadimos el soporte de SSL a Apache, dado que es conveniente usar Redmine con SSL para evitar fallos de seguridad, volvemos a reiniciar Apache después:
[bash]
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo service apache2 restart
[/bash]

Ahora podemos probar a acceder a la misma página de prueba de Apache, pero mediante protocolo seguro en https://192.168.1.21, eso sí te aparecerá una alerta de seguridad del navegador dado que el certificado SSL de esta configuración no ha sido certificado por una entidad de confianza homologada.

Debemos instalar algunos requisitos para Phusion Passenger:
[bash]
sudo apt-get install libcurl4-openssl-dev apache2-threaded-dev libapr1-dev libaprutil1-dev
[/bash]

Para satisfacer requisitos de algunas de las gemas de Redmine (nokogiri y rmagick):
[bash]
sudo apt-get install libxslt-dev libxml2-dev
sudo apt-get install libmagickwand-dev
[/bash]

Instalar Ruby en una jaula

Dado que la máquina puede ser utilizada para más cosas, no vamos a instarlo normalmente, es decir con apt-get, sino con una jaula con rvm, además separaremos el entorno de ejecución con un usuario específico para Redmine (que no pertenezca al grupo de administradores).

Lo primero, crear el nuevo usuario no administrador, y lo añadiremos de manera temporal al grupo sudo para poder instalar (al final lo quitaremos de dicho grupo):
[bash]
sudo adduser redmine
sudo adduser redmine sudo
[/bash]

Iniciamos sesión con los nuevos credenciales (mejor en otra ventana para no tener que ir cambiando de usuario todo el rato) e instalamos RVM:
[bash]
\curl -L https://get.rvm.io | bash
[/bash]

Reiniciamos sesión y probamos que se ha instalado bien, listando las versiones de Ruby que podemos instalar:
[bash]
rvm list known
[/bash]

En mi caso he elegido la última estable (2.0.0). Indicar que hay que nos pedirá la clave de usuario redmine en el proceso, para elevar los privilegios necesarios para instalar los requisitos de rvm en el sistema. El proceso tardará varios minutos, dado que baja e instala requisitos, baja los fuentes, los compila y finalmente instala ruby junto con rubygems:
[bash]
rvm install 2.0.0
[/bash]

Ahora quitamos los privilegios al usuario redmine:
[bash]
sudo deluser redmine sudo
[/bash]

Instalar Phusion Passenger

Desde la consola del usuario redmine:
[bash]
sudo gem install passenger
[/bash]

Una vez descargada la gema, es hora de instalar el módulo para Apache, esto en realidad compilará la gema adaptada a nuestro Apache y a nuestro sistema operativo, con lo que tardará varios minutos:
[bash]
passenger-install-apache2-module
[/bash]

Al finalizar el proceso se nos avisará para que añadamos unas líneas de configuración a la configuración de Apache, para lo cual crearemos el siguiente fichero, tenemos que volver primero a la consola del usuario administrador:
[bash]
sudo vim /etc/apache2/conf.d/passenger
[/bash]

Las líneas en cuestión son las siguientes, pero debes copiar las que te proponga el instalador por si las rutas cambian:
[bash]
LoadModule passenger_module /home/redmine/.rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.19/buildout/apache2/mod_passenger.so
PassengerRoot /home/redmine/.rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.19
PassengerDefaultRuby /home/redmine/.rvm/wrappers/ruby-2.0.0-p247/ruby
[/bash]

Si queremos ver si todo se ha instalado bien, tendremos que reiniciar Apache, aunque al no tener instalado todavía Redmine no hay mucho que probar, más allá que el propio reinicio de Apache no se queje de algún fallo:
[bash]
sudo service apache2 restart
[/bash]

Instalar Redmine

Lo primero, ir a la web de descargas de Redmine http://www.redmine.org/projects/redmine/wiki/Download y descargarnos la última versión, en mi caso descargo la versión 2.3.3.

Con el espíritu de facilitar próximas actualizaciones iremos creando diversas carpetas auxiliares (para plugins, log, ficheros, …) así como enlaces a carpetas; esto hará que la configuración que lleve rutas a Redmine y algunas de sus carpetas no tengan que cambiar porque la ruta final incluya la versión.

Desde la consola de usuario redmine, descargamos la versión, extraemos y creamos un enlace a la carpeta:
[bash]
wget http://rubyforge.org/frs/download.php/77138/redmine-2.3.3.tar.gz
tar xzf redmine-2.3.3.tar.gz
ln -s redmine-2.3.3 redmine
[/bash]

Instalamos todas las gemas requeridas por Redmine, tardará unos pocos minutos:
[bash]
cd redmine
bundle install
cd ..
[/bash]

Configurando Redmine

Ahora moveremos las carpetas de Redmine para log, ficheros y plugins a la carpeta raíz; estas carpetas permanecerán sin alteraciones cuándo vayamos actualizando versiones de Redmine; además enlazaremos en la carpeta de Redmine a las carpetas recién movidas:
[bash]
mv redmine/files redmine-files
mv redmine/log redmine-log
mv redmine/plugins redmine-plugins
cd redmine
ln -s ../redmine-files files
ln -s ../redmine-log log
ln -s ../redmine-plugins plugins
cd ..
[/bash]

Ahora haremos lo mismo pero para los ficheros de configuración que copiaremos desde las muestras ofrecidas por Redmine, en este caso lo haremos fichero por fichero, dado que en la carpeta de configuración hay ficheros dependientes de la versión de Redmine:
[bash]
mkdir redmine-config
cd redmine-config
cp ../redmine/config/additional_environment.rb.example additional_environment.rb
cp ../redmine/config/configuration.yml.example configuration.yml
cp ../redmine/config/database.yml.example database.yml
cd ../redmine/config/
ln -s ../../redmine-config/additional_environment.rb
ln -s ../../redmine-config/configuration.yml
ln -s ../../redmine-config/database.yml
cd ../..
[/bash]

Editamos el fichero de configuración para configurar el envío de correos mediante SMTP, sustituye el servidor del ejemplo por el tuyo. En este fichero encontrarás un montón de configuraciones diferentes, usa la que más se adapte a tu servidor de correo, en el ejemplo se usa un servidor SMTP sin autenticación al encontrarse en una Intranet. Editamos el fichero de configuración:
[bash]
vim redmine-config/configuration.yml
[/bash]

[bash]
default:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: mail.mi-dominio.es
port: 25
[/bash]

Configurar la base de datos

Lo primero es crear un usuario especial para acceder a la base de datos, de modo que podamos separar los privilegios de acceso de Redmine de otras bases de datos. Esta tarea puede hacer desde la línea de comandos, pero dado que hemos instalado phpmyadmin, aprovechemos la herramienta.

Una vez iniciada la sesión en phpmyadmin, iremos a la solapa Usuarios, buscamos y pinchamos en el enlace Agregar usuario, rellenamos la siguiente información en la ventana que aparecerá:

  • Nombre de usuario: redmine
  • Servidor: localhost
  • Contraseña y su confirmación
  • Seleccionamos la opción Otorgar todos los privilegios al nombre que contiene comodín (username\_%)

Finalizamos pulsando el botón Agregar usuario.

Volviendo a la consola de usuario redmine, editamos la configuración de base de datos:
[bash]
vim redmine-config/database.yml
[/bash]

Y configuramos la bases de datos de producción (opcionalmente puedes configurar también el resto, sobre todo la desarrollo, la de pruebas es para ejecutar las pruebas unitarias de Redmine, no para que hagáis pruebas de Redmine, sino se configuran es recomendable borrarlas o comentarlas), sustituye los asteriscos de la clave por la clave que creamos en el paso anterior, las comillas son opcionales pero se convierten en obligatorias si usas caracteres que no sean letras o números:
[bash]
production:
adapter: mysql2
database: redmine_2_3_3
host: localhost
username: redmine
password: "********"
encoding: utf8
[/bash]

Ahora crearemos la base de datos y ejecutaremos las migraciones que la irán poblando con tablas y datos, además crearemos el token de seguridad:
[bash]
rake db:create
rake db:migrate
rake generate_secret_token
[/bash]

Configurar Apache

Volviendo a la consola del usuario administrador, crearemos un fichero para el nuevo sitio:
[bash]
sudo vim /etc/apache2/sites-available/redmine
[/bash]

El fichero de configuración permite redireccionar a nuestro Redmine mediante nombre redmine.mi-dominio.es, si has seguido todos los pasos, sólo necesitarás cambiar el nombre del servidor ServerName, como puedes ver se configura tanto el acceso HTTP como HTTPS, además en el host HTTP se redirige cualquier petición no segura hacia HTTPS:
[bash]
<VirtualHost *:80>
ServerName redmine.mi-dominio.es
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName redmine.mi-dominio.es
RailsEnv production
PassengerUser redmine
PassengerGroup redmine
DocumentRoot /home/redmine/redmine/public
<Directory /home/redmine/redmine/public>
Allow from all
Options -MultiViews
</Directory>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>
</IfModule>
[/bash]

Ya sólo falta habilitar el nuevo sitio, deshabilitar los sitios por defecto HTTP y HTTPS, habilitar el módulo rewrite (el que hacer la redirección de HTTP a HTTPS) y reiniciar Apache:
[bash]
sudo a2ensite redmine
sudo a2dissite default
sudo a2dissite default-ssl
sudo a2enmod rewrite
sudo service apache2 restart
[/bash]

Rotación de logs

Sólo nos falta hacer una gestión de los logs adecuada, para que no nos colapse el disco duro con megas y megas de logs…

Para ello haremos uso del estupendo paquete logrotate, lo primero es instalarlo (si es que no lo tuvieras ya instalado, dado que es de uso muy generalizado por otros paquetes) desde la consola de usuario administrador:

[bash]
sudo apt-get install logrotate
</pre>

Editamos un fichero de configuración para los logs de redmine:

[bash]
sudo vim /etc/logrotate.d/redmine
[/bash]

[bash]
/var/www/redmine-log/mongrel.log /var/www/redmine-log/production.log /var/www/redmine-log/development.log {
rotate 7
daily
compress
copytruncate
}
[/bash]

Este fichero rotará los logs todos los días, y comprimirá y guardará 7 copias de días pasados, para los logs de mongrel y de los entornos de producción y desarrollo.

Enlazar Redmine con la gestión de configuración

Si queremos que Redmine examine los cambios realizados en los repositorios que tengamos en Gestión de la Configuración (Subversion, CVS, GIT, Mercurial, …) tendremos que añadir una tarea al CRON para que examine cambios periódicamente:

[bash]
sudo vim /etc/cron.d/redmine_subversion
[/bash]

[bash]
*/30 * * * * redmine ruby /home/redmine/redmine/script/rails runner “Repository.fetch_changesets” –e production
[/bash]

En el ejemplo de arriba se examinarán cambios cada 30 minutos, esto puedes cambiarlo a tu gusto.

Conclusiones

Eso es todo amigos, la verdad es que poniendo todos los pasos juntos al final parece más complicado, pero al menos espero que os pueda resultar de utilidad, por lo menos hasta que todo vuelva a cambiar de nuevo… eso sí por el camino seguro que aprendemos algo más de administración de sistemas y aplicaciones.

Espero vuestro comentarios y mejoras. Gracias.

20 comentarios

  1. 56ks dice: Responder

    buenas,

    me gustaría saber si este plugin puede ser instalado bajo windows 7 x64 en redmine 2.6.1-1. Estaría agradecido si me orientase un poco en esta tarea.

    gracias

  2. Gabriel dice: Responder

    Hola, Emilio.
    Yo acabo de instalar tu plugin de scrum a mi servidor de redmine pero no en mi sprint todas los postits me aparecen sin la descrupcion, sin el asignado y siempre solamente están en el cuadro de Product backlog items. ¿Por que puede ser eso? Uso la ultima version de redmine y la version 0.11.1 del plugin.

  3. Oscar dice: Responder

    Hola,
    Emilio tienes alguna documentación sobre el uso de tu plugin de Scrum para redmine?
    Un Saludo y gracias de antemano.

  4. doublefint dice: Responder

    Hi Emilio
    Sorry to send a information here, but your redmine server (https://redmine.ociotec.com/projects/redmine-plugin-scrum) is down with error “It exited before signalling successful startup back to Phusion Passenger” .

    1. I already knew it, but thanks in any case, I just needed some time (& energy) to review the Redmine install after Ubuntu server upgrade.
      The site should be online again 🙂

  5. social media consulting

    Servidor Redmine en Ubuntu desde cero « OCIO y TECnología

  6. アウトドア バッグ ギア収納サイト

    Servidor Redmine en Ubuntu desde cero « OCIO y TECnología

  7. the social network critica

    Servidor Redmine en Ubuntu desde cero « OCIO y TECnología

  8. 自動車用バッテリー 国産車用

    Servidor Redmine en Ubuntu desde cero « OCIO y TECnología

  9. Forbidden dice: Responder

    Despues de la instalacion al navegar a la pagina obtengo un error 403 – forbidden

    ¿Alguna idea porque?

    la carpeta redmine y redmine/public le pertenece a redmine y tiene los permisos apropiados..

    1. Forbidden dice: Responder

      ya encontre el problema, por si alguien mas lo tiene, en la pagina inicial de apache dice:

      ” If your site is using a web document root located elsewhere (such as in /srv) you may need to whitelist your document root directory in /etc/apache2/apache2.conf.”

      lo que agregue fue:

      Options Indexes FollowSymLinks
      AllowOverride None
      Require all granted

  10. como ganar dinero haciendo encuestas

    Servidor Redmine en Ubuntu desde cero « OCIO y TECnología

  11. Heiner dice: Responder

    Hola Emilio,

    I did not found an email address, so i try to submit a bugfix for https://redmine.ociotec.com/issues/677 this way.

    in plugins/advanced_roadmap/lib/advanced_roadmap/query_patch.rb line 11

    use

    Milestone.includes(:project).where(project_statement).where(options[:conditions])

    instead of

    Milestone.find(:all,
    :include => :project,
    :conditions => Query.merge_conditions(project_statement, options[:conditions]))

    hope that will work.

    Greetings and thanks,

    Heiner

  12. Hi Emilio

    Sorry to send a question here, but I couldn’t find a way to send message in either your redmine server or a email.

    A questions if the Redmine Plugin Advanced Roadmap still is in development?
    There have started to get some issues with upgrade to Redmine 2.5.0 and calender doesn’t work anymore and the Roadmap text is centered instead of being to the left.

    Thanks for your time

    / Andreas

    1. Hi Andreas,

      No problem, I’ve reviewed the Redmine configuration about email sending… It was wrong (due to internal changes in Redmine email sending), so now you can register as user (I expect you will receive the confirmation email, if not let me know here again).

      Then you could add a new issue to support new Redmine (I have checked the problem with alignment in the Roadmap, but I will need more info to reproduce the calendar issue, in my development installation is not failing).

      Thanks Andreas 🙂

  13. Hola Emilio, realmente bueno el tuto pero me quede en la instalacion del Passenger al ejecutar el comando “passenger-install-apache2-module”

    recibo unos errores relaticos a un certificado de apache snakeoil.key me gustaria saber si me puedes ayudar.

    1. Fredy dice: Responder

      Jeffrey lo solucionaste?? mi me da el mismo problema

  14. I suppose ‘sudo gem install passenger’ should be : ‘rvmsudo gem install passenger’

  15. sudo apt-get openssh-server => sudo apt-get install openssh-server

    1. Muchas gracias por el fix 🙂

Deja un comentario