The trashiest blog in the World...

Aller au contenu | Aller au menu | Aller à la recherche

Installer Redmine 0.9 sur CentOS

Pour les besoins du boulot, je me suis récemment plongé dans les différents logiciels de gestion de projets. J'en avais sorti quelques uns du lot en fonction de critères qui nous sont propres, à savoir : Redmine, DotProject, Collabtive, ...
Une seconde, puis une troisième sélection ont laissé en lice Redmine et DotProject.

DotProject - en dehors de son interface pour le moins vieillotte - avait semblé répondre à nos attentes, mais voilà : la dernière version stable n'est pas compatible PHP 5.3, et la branche 2.0 du logiciel ne semble plus évoluer au profit de la future version 3 qui sera basée sur Zend Framework. Cette ré-écriture n'en est qu'à son tout début. Pas très engageant que tout cela...

Redmine de son côté semble bénéficier d'un développement très régulier, et d'une communauté relativement importante et vivante. Un hic : c'est du ruby-on-rails ; et je ne connais pas le moins du monde cette technologie.

Autre « souci » à prendre en considération, le serveur sur lequel devra tourner cette application est sous CentOS et non sous Fedora ; je vais y revenir sous peu...

Donc, je me lance, je récupère une version 0.8 de Redmine que j'essaie d'installer sur mon PC du boulot, en Fedora 12. Pas trop de problèmes à noter, j'ai balbutié un peu et me suis complètement cassé les dents lorsque j'ai voulu brancher apache sur l'installation...

Entre temps, je découvre qu'une demande de revue a été faite sur le Bugzilla pour redmine ! Youpi :-) En y regardant de plus près, la page des pré-requis de Redmine m'apprend que la version de Rails de Fedora 12 n'est pas suffisante (2.3.4) ; de même que la version de Rack (1.0.0). Je vérifie sous Fedora 13, on a un Rails en 2.3.5 et un Rack en 1.1.0. Ça devrait aller.

Oui, mais... ça devrait :-/ La version de Rack requise est la version 1.0.1, strictement. Ni la version 1.0.0, ni la version 1.1.0 ne fonctionnent ! En local et à des fins de tests, il est toujours possible d'installer la bonne version du composant avec la commande :

$ gem install rack -v 1.0.1

Il est bien entendu hors de question que je lance une telle commande avec un utilisateur privilégié, la bonne version de rack reste donc installée sur un compte utilisateur local ; du coup, l'intégration dans apache ne fonctionne pas (ben oui, la version système de rack n'est pas la bonne, suivez un peu :-D ). Un petit coup d'oeil sur ma CentOS m'apprend que de ce côté je ne dispose pas non plus de la bonne version de Ruby, etc. Y'a plus qu'à ; comme dirait l'autre.

Dans un premier temps, je crée un utilisateur dédié à ce service :

# useradd -r -m redmine

Ensuite, je récupère la dernière version du trunk de Redmine (récupérer cette version n'est pas une obligation, bien loin de là ; mais l'intégration il y a quelques jours de la notion de sous-tâches directement dans Redmine m'intéressait au plus haut point :-p ).

$ svn co http://redmine.rubyforge.org/svn/trunk ./redmine

Voyons à installer les versions de Ruby et consorts dont nous avons besoin. J'ai re-compilé un certain nombre de paquets sur mon dépôt personnel EL5 (en version 64bits uniquement) à cet effet :

  • ruby
  • rubygems
  • rubygem-actionmailer
  • rubygem-actionpack
  • rubygem-activerecord
  • rubygem-activeresource
  • rubygem-activesupport
  • rubygem-fcgi
  • rubygem-mocha
  • rubygem-rack
  • rubygem-rails
  • rubygem-sqlite3-ruby
  • ruby-mysql
  • ruby-RMagick
  • ImageMagick-6.5.8.10

Pour bénéficier de ces versions, vous pouvez soit les récupérer sur mon dépôt à l'adresse http://rpms.ulysses.fr/el5/x86_64/ ; soit installer mon dépôt :

# rpm -ivh http://rpms.ulysses.fr/el5/x86_64/trashy-release-el5-1.noarch.rpm

Pour ensuite installer les programmes (ruby-RMagick n'est requis que pour l'export PNG des diagrammes de Gantt. Vous pouvez l'omettre si cette fonctionnalité ne vous est pas utile ;-) ) :

# yum --enablerepo=trashy install rubygem-rails ruby-mysql ruby-RMagick

/!\ ATTENTION /!\ Ce dépôt personnel est intrusif et remplace des paquets de base de CentOS. Ne l'activez pas par défaut, ou alors à vos risques et périls.

Nous voilà parés ; tous les composants logiciels sont présents, nous pouvons procéder à l'installation. Dans un premier temps, créons notre base MySQL (PostgreSQL est également supporté, référez-vous à la documentation de Redmine pour connaître la procédure à suivre) :

$ mysql -u root -p
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'my_password';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
mysql> flush privileges;

Depuis le dossier où vous avez stocké votre Redmine (/var/www/redmine dans mon cas), copiez le fichier config/database.yml.example vers config/database.yml puis éditez-le de la sorte :

production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: my_password
  encoding: utf8
  socket: /var/lib/mysql/mysql.sock

Les variables sont bien entendu à renseigner en fonction des choix que vous avez faits. Notez l'ajout de l'entrée socket sans laquelle je m'étais heurté à de jolies erreurs (il semblerait que ce soit un bogue d'un des composants ruby).
Redmine permet l'utilisation de diverses instances (production, développement, ...). Vous devrez donc dupliquer les informations relatives à la base dans les différentes instances que vous souhaitez utiliser. Une fois de plus, référez-vous à la documentation de Redmine pour en savoir plus à ce sujet.

Puisque j'ai utilisé une version SVN ultérieure à la révision 3055 ; j'ai eu à lancer la commande :

$ rake generate_session_store

Initialisons ensuite la base de données, et profitons-en pour y placer quelques données par défaut :

$ RAILS_ENV=production rake db:migrate
(in /var/www/redmine)
==  Setup: migrating ==========================================================
-- create_table("attachments", {:force=>true})
   -> 0.0812s
[...]
$ RAILS_ENV=production rake redmine:load_default_data
(in /var/www/redmine)

Select language: bg, bs, ca, cs, da, de, el, en, es, eu, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sv, th, tr, uk, vi, zh, zh-TW [en] fr
====================================
Default configuration data loaded.

Fort bien ! Nous avons désormais une installation de Redmine fonctionnelle :-) Certains répertoires doivent être accessibles en écriture, mais le checkout svn ayant été fait avec l'utilisateur redmine qui se chargera de lancer le serveur de tests, nous n'avons pas à nous en préoccuper... Lançons donc ce fameux serveur :

$ ruby script/server webrick -e production
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-03-16 20:15:58] INFO  WEBrick 1.3.1
[2010-03-16 20:15:58] INFO  ruby 1.8.6 (2010-01-11) [x86_64-linux]
[2010-03-16 20:15:58] INFO  WEBrick::HTTPServer#start: pid=14469 port=3000

Et voilà ; en vous connectant à http://monhote:3000 vous accéderez à votre instance Redmine. admin est le login et le mot de passe par défaut. Vous aurez peut-être à ouvrir le port 3000 pour la durée de ce test, ne l'oubliez pas ;-)

Vient ensuite la mise en ligne de l'application... À des fins de tests, je me suis risqué à essayer une technique très peu orthodoxe depuis apache... Mais qui n'a pas fonctionné comme escompté. Voici le fichier de configuration que j'avais utilisé (en substance) :

<VirtualHost *:80>
  ServerName redmine.mondomaine.com

  ErrorLog /var/log/httpd/redmine_error_log
  AccessLog /var/log/httpd/redmine_access_log combined

  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

Un peu barbare, certes, mais c'était pour tester « rapidement ». Cette configuration a d'ailleurs fonctionné... Sur certains postes :-( Sur d'autres, j'avais la page de login correcte ; et une fois loggué ; plus de CSS ni de JS. Pas top donc. J'ai décidé de pousser le test plus loin, et d'utiliser le mod_fcgid pour accéder à cette application. Il faudra pour ce faire installer les composants qui vont bien :

# yum --enablerepo=trashy install mod_fcgid rubygem-fcgi

Créons ensuite le fichier de configuration apache qui va bien (/etc/httpd/conf.d/redmine.mondomaine.com.conf par exemple) :

<VirtualHost *:80>
        ServerName redmine.mondomaine.com

        # Logs :
        ErrorLog /var/log/httpd/redmine_errors.log
        CustomLog /var/log/httpd/redmine_access.log combined

        # Dossier contenant les pages
        DocumentRoot /var/www/redmine/public/

        <Directory /var/www/redmine/public/>
                Options Indexes ExecCGI FollowSymLinks
                Order allow,deny
                Allow from All
                AllowOverride All
        </Directory>
</VirtualHost>

Côté redmine, copiez le fichier fcgi d'exemple vers sa destination finale :

$ cp public/dispatch.fcgi.example public/dispatch.fgci

Attribuons maintenant les droits adéquats aux dossiers :

# cd /var/www/redmine
# chown -R apache:redmine files log tmp public/plugin_assets
# chown -R redmine: files/.svn log/.svn tmp/.svn

N'oubliez pas de spécifier ensuite quelle instance de Redmine devra être démarrée (production, development, ...). Pour ce faire, éditez le fichier config/environment.rb puis décommentez (et éditez au besoin) la ligne :

ENV['RAILS_ENV'] ||= 'production'

Pour vérifier que ça ne va pas vous claquer de suite entre les doigts, essayez simplement de lancer le dispatch.fcgi en ligne de commande (vous pouvez ignorer sereinement les erreurs sur les accès aux fichiers de log pour l'heure) :

$ /var/www/redmine/public/dispatch.fcgi

Enfin, une fois que tout est OK, relancez votre serveur apache :

# service httpd restart

Et admirez le résultat :-)

Il m'est arrivé, en fonction des configurations, que ça ne fonctionne pas comme escompté... Dans ce cas, l'une des premières choses à faire, est de commenter les ifModule (et leur contenu, évidemment) pour les mod_cgi mod_fastcgi ; ça ma « sauvé la vie » ;-)


Fatal error: Uncaught Error: [] operator not supported for strings in /var/www/svn_softs/dotclear_hg/inc/core/class.dc.postmedia.php:61 Stack trace: #0 /var/www/svn_softs/dotclear_hg/inc/core/class.dc.media.php(592): dcPostMedia->getPostMedia(Array) #1 /tmp/cbtpl/cd/17/cd17a781eadeb1772ccb06ad3a49b8f0.php(137): dcMedia->getPostMedia('94', NULL, 'attachment') #2 /var/www/svn_softs/dotclear_hg/inc/libs/clearbricks/template/class.template.php(268): include('/tmp/cbtpl/cd/1...') #3 /var/www/svn_softs/dotclear_hg/inc/public/class.dc.template.php(231): template->getData('post.html') #4 /var/www/svn_softs/dotclear_hg/inc/public/lib.urlhandlers.php(122): dcTemplate->getData('post.html') #5 /var/www/svn_softs/dotclear_hg/inc/public/lib.urlhandlers.php(523): dcUrlHandlers::serveDocument('post.html') #6 /var/www/svn_softs/dotclear_hg/inc/libs/clearbricks/url.handler/class.url.handler.php(166): dcUrlHandlers::post('16/03/2010/Inst...') #7 /var/www/svn_softs/dotclear_hg/inc/public/lib.urlhandlers.php(187): urlHandler->callHandler('pos in /var/www/svn_softs/dotclear_hg/inc/core/class.dc.postmedia.php on line 61