domingo, 29 de diciembre de 2013

Instalación de Redmine en Debian 7




A la hora de gestionar proyectos existen multitud de herramientas y opciones disponibles. Algunas son gratis, otras no, unas ofrecen la posibilidad de instalarlas en tus propios servidores, otras se contratan "en la nube".
Redmine es una de las que permiten instalarlo en tus propios servidores. Se trata de un gestor de proyectos escrito con Ruby on Rails, es multiplataforma y soporta múltiples bases de datos. Además es software libre con licencia GPLv2.
Entre sus características destaca el soporte multi-proyecto, sistema de roles y permisos muy flexible y personalizable, gestión de tareas, wikis, foros, subida de archivos y documentos, notificaciones por email y por RSS,...

Llevo casi 4 años utilizando Redmine en el día a día del trabajo (además de administrándolo) y después de instalarlo varias veces de cero y actualizarlo entre versiones otras tantas por fin me he decidido a juntar todas mis notas y escribir un tutorial actualizado.

Partimos de una Debian 7 64 bits recién instalada sin nada adicional a excepción de OpenSSH. Toda la instalación se realizará con un usuario no root en su home, aunque algunos comandos requieren el uso de sudo. Aunque Redmine viene configurado por defecto para utilizar MySQL, en mi caso lo voy a instalar utilizando Postgresql.

Instalación de Postgresql 9.3

En los repos de Debian no está la última versión por lo que lo mejor es utilizar un repo oficial. En la actualidad ya se ha publicado la versión 9.3.2 y será ésta la que utilicemos.

  • Añadir el repo de Postgres
  • sudo vi /etc/apt/sources.list.d/pgdg.list
    
    # Postgresql
    deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main
    
  • Añadir clave de verificación
  • wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
    
  • Actualizar los paquetes e instalar postgresql-9.3
  • sudo apt-get update
    sudo apt-get install postgresql-9.3
    
  • Damos permisos para conectarnos a las bases de datos
  • sudo vi /etc/postgresql/9.3/main/pg_hba.conf
    
    # Cambiar la siguiente línea:
    local   all             postgres                                peer
    
    # por:
    local   all             postgres                                trust
    
  • Reiniciar el servidor para que aplique los cambios:
  • sudo /etc/init.d/postgresql restart
    
  • Crear la base de datos
  • $ psql -U postgres
    psql (9.3.2)
    Type "help" for help.
    
    postgres=# CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'my-secret-password' NOINHERIT VALID UNTIL 'infinity';
    postgres=# CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
    

    Instalación de paquetes adicionales

    Para poder compilar las gemas de ruby que instalaremos más tarde necesitamos una serie de paquetes. Algunos son los mínimos para poder compilar cualquier fuente: gcc, make,... y otros son necesarios para las gemas.
    sudo apt-get install build-essential
    
    Instalar librería necesaria para utilizar Postgresql desde una aplicación Ruby on Rails
    sudo apt-get install libpq-dev
    

    Instalación de Apache

    Para poder servir el Redmine una vez instalado vamos a utilizar apache.
    Instalar apache2 y habilitar los módulos necesarios:
    sudo apt-get install apache2 libapache2-mod-fcgid libapache2-mod-proxy-html libfcgi-dev
    
    sudo a2enmod rewrite
    sudo a2enmod proxy_http
    sudo a2enmod proxy
    

    Instalación de ImageMagick

    Para la generación de pdfs y pngs Redmine utiliza ImageMagick, por lo que si queremos utilizar esta funcionalidad deberemos instalarlo junto con las librerías necesarias.
    $ sudo apt-get install imagemagick libmagickwand-dev libmagickcore-dev
    

    Instalación de Ruby

    Ahora ya podemos instalar Ruby. Utilizaremos la versión 1.9.3.
    sudo apt-get install ruby1.9.3
    

    Instalación de Redmine

    Por fin, después de haber instalado todas las dependencias podemos empezar con la instalación de Redmine.
  • Descargar la última versión disponible. En el momento de escribir este artículo es la versión 2.4.2
  • wget http://www.redmine.org/releases/redmine-2.4.2.tar.gz
    tar zxvf redmine-2.4.2.tar.gz
    ln -s redmine-2.4.2 redmine
    cd redmine
    
    La creación del enlace simbólico no es necesaria pero es una buena práctica. Además nos sirve en el futuro para actualizar la versión sin tener que tocar la configuración del Apache.
  • Crear el archivo de configuración de la base de datos a partir del que viene de ejemplo y editarlo
  • cp config/database.yml.example config/database.yml
    vi config/database.yml
    
    production:
      adapter: postgresql
      database: redmine
      host: localhost
      username: redmine
      password: "my-secret-password"
      encoding: utf8
    
    Importante quitar mysql de los environments de develop y test porque sino luego intentará instalar las dependencias y fallará. Poner "postgresql" en todos aunque no se configure nada más. Sólo vamos a usar el environment de producción.
  • Añadir una gema que luego utilizaremos para que se instale junto con el resto.
  • echo 'gem "fcgi"' > Gemfile.local
    
  • Instalar gema de postgresql
  • sudo gem install pg
    
  • Instalar gestor de gemas
  • sudo gem install bundler
    
  • Instalar todas las dependencias de Redmine
  • sudo bundle install --without development test
    
  • Crear las tablas de la base de datos
  • RAILS_ENV=production rake db:migrate
    
  • Crear los datos iniciales (recomendado en inglés)
  • RAILS_ENV=production rake redmine:load_default_data
  • Crear directorios y dar permisos
  • mkdir -p tmp tmp/pdf public/plugin_assets
    chmod -R 755 files log tmp public/plugin_assets
    
  • Generar el session store secret
  • rake generate_secret_token
    Y listo, ahora sólo falta probar que todo funciona correctamente. Para ello, ejecutamos el servidor web embebido (no utilizar en producción).
    $ ruby script/rails server webrick -e production
    => Booting WEBrick
    => Rails 3.2.13 application starting in production on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    [2013-12-28 11:05:17] INFO  WEBrick 1.3.1
    [2013-12-28 11:05:17] INFO  ruby 1.9.3 (2013-11-22) [x86_64-linux]
    [2013-12-28 11:05:17] INFO  WEBrick::HTTPServer#start: pid=25214 port=3000
    
    Nos conectamos con el navegador a http://localhost:3000 y nos logamos con admin/admin.

    Configuración de Apache

    Para servir el Redmine para poder utilizarlo en producción vamos a utilizar Apache junto con fcgi.
  • Desde el directorio redmine copiamos el archivo htaccess y de fcgi a partir de las plantillas.
  • cp public/htaccess.fcgi.example public/.htaccess
    cp public/dispatch.fcgi.example public/dispatch.fcgi
    chmod +x public/dispatch.fcgi
    
  • Editar el archivo de configuración de entornos para utilizar el de producción por defecto
  • vi config/environment.rb
    
    # Añadir la siguiente línea al principio del archivo
    ENV['RAILS_ENV'] ||= 'production'
    
  • Añadir el nuevo virtual host al apache
  • sudo vi /etc/apache2/sites-enabled/000-default
    
    <VirtualHost *:80>
        ErrorLog /var/log/apache2/redmine-error-log
        CustomLog /var/log/apache2/redmine-access-log combined
    
        ServerName redmine.my-domain.com
        ServerAdmin admin@my-domain.com
        DocumentRoot /home/ivan/redmine/public
        ProxyPreserveHost On
    
        <Directory "/home/ivan/redmine/public/">
            Options Indexes ExecCGI FollowSymLinks
            Order allow,deny
            Allow from all
            AllowOverride all
        </Directory>
    </VirtualHost>
    
  • Dar permisos de escritura al usuario de apache a algunos archivos y directorios
  • sudo chown -R www-data:www-data files log tmp public/plugin_assets
  • Reiniciar apache
  • sudo /etc/init.d/apache2 restart
    Y listo, si todo va bien deberíamos poder conectarnos a nuestro nuevo Redmine con el dominio que hayamos definido en nuestro virtual host, en este caso http://redmine.my-domain.com.

    Bola extra: Actualizar una versión antigua de Redmine

    Como he comentado al principio del artículo, llevo utilizando Redmine casi 4 años (empecé en la versión 0.9.6) y he actualizado de versión en bastantes ocasiones. El proceso de actualización es muy simple.

  • Instalar la nueva versión como hemos hecho hasta ahora y comprobar que todo funciona correctamente.
  • Parar apache y hacer una copia de seguridad de nuestra base de datos actual (espero que además hagas copias periódicas).
  • sudo /etc/init.d/apache2 stop
    pg_dump -U postgres redmine > db_redmine.sql
    
  • Después de instalar la nueva versión de redmine, en lugar de crear todas las tabla en la base de datos, lo que tenemos que hacer es ejecutar la migración de las mismas.
  • rake db:migrate RAILS_ENV=production
    
    Esto lo que hace es ejecutar todas las migraciones desde la versión que teníamos instalada hasta la versión actual para que el modelo de datos sea el adecuado.
  • Si tenemos plugins instalados, ejecutar sus migraciones.
  • rake redmine:plugins:migrate RAILS_ENV=production
  • Copiar los archivos subidos del directorio files del redmine antiguo al nuevo.
  • Limpiar cache y sesiones.
  • rake tmp:cache:clear
    rake tmp:sessions:clear
    
  • Finalmente reiniciar apache y logarnos de nuevo. Luego, en el menú Administration -> Information podemos comprobar que la migración se ha realizado correctamente y estamos con la versión adecuada:


    Para el que no esté muy seguro sobre las actualizaciones, decir que en todas las actualizaciones de estos años no he tenido ningún problema y todas han funcionado a la perfección. En esta última actualización he pasado directamente de la versión 1.4.4 a la 2.4.2. Han sido cinco versiones mayor (2.0, 2.1, 2.2, 2.3 y 2.4) y 27 versiones en total de diferencia entre ambas y cero problemas :-)