lundi, mars 10, 2008

Déployer une application ruby on rails dans Tomcat

Je viens de déployer ma première application rails dans un Tomcat avec JRuby.
Contrairement à ce que la longueur de ce post pourrait laisser penser c'est très simple et très rapide (env 2H30 pour quelqu'un d'expérimenté en tomcat, mysql et rails et 30 min si tout est pré-installé).
Le lien indispensable pour déployer une application rail 1.1 ou 2.0 se trouve sur le wiki de JRuby: Jruby on Rails on Tomcat
Je vous conseille la page du wiki qui est beaucoup plus succinte en premier!
Sinon voilà une autre version si vous partez vraiment de zéro avec beaucoup plus de détails et/ou de "bonnes pratiques" ;)
En gros il y a 2 cas:
  1. Vous préparez le ".war" (généralement un développeur ruby/java en charge de la livraison) Nous l'appellerons Mr R.
  2. Vous déployez sur la machine de production (généralement l'admin système ou un gars des opérations). Nous l'appellerons Mr A.
Versions et environnent testé: Windows XP + Tomcat(6.0.16) + JRuby(1.0.3) + MySql(5) + Java(jre1.6.0_03)
Cas numéro 1: Création du "War"
  1. JRuby
    • Télécharger JRuby
    • Dezipper JRuby (ex: c:\jruby)
    • Ajouter JRUBY_HOME=c:\jruby
    • Ajouter %JRUBY_HOME%\bin à la variable d'environnement 'Path'
  2. Tomcat
    • Télécharger l'installer: apache-tomcat-6.0.16.exe
    • Installler (suivre le wizard)
    • Générallement Tomcat est installé ici: C:\Program Files\Apache Software Foundation\Tomcat 6.0
  3. MySQL
    • Installer MySql (encoding utf-8 de préférence)
    • Se Connecter en 'root'
    • Créer un schema appli_[env]
    • Créer un user spécial:
      GRANT ALL ON appli_production.* TO 'appli'@'localhost' IDENTIFIED BY 'appli';
  4. Warbler:
        c:\...\appli> jruby -S gem install -y rails warbler
        c:\...\appli> jruby -S rake db:migrate RAILS_ENV=production
        c:\...\appli> jruby -S rake db:structure:dump RAILS_ENV=production
        c:\...\appli> jruby -S warble war 
        c:\...\appli> jruby -S warble config
    
    Avec la commande "db:structure:dump", on a généré un fichier: production_structure.sql (utilisé par Mr. A)
  5. Aller dans le "appli>tmp/war/WEB-INF/web.xml" et ajouter les lignes suivantes si vous êtes dans le cas décrit dans le wiki de JRuby:
    <context-param>
        <param-name>jruby.session_store</param-name>
        <param-value>db</param-value>
    </context-param>
  6. Copier/Coller le web.xml modifié dans le répertoire config pour ne pas avoir a refaire cette manip à chaque fois que vous généré le war.
  7. Vérifiez les paramètres de connexion à la production dans database.yml
  8. Figer toutes les versions de rails et warbler:
        c:\...\appli> jruby -S rake rails:freeze
        c:\...\appli> jruby -S warble pluginize
    
  9. Regénérer le war avec le web.xml modifié:
        c:\...\appli> jruby -S warble war:clean
        c:\...\appli> jruby -S warble war
    
  10. Le copier dans le répertoire webapp de Tomcat
  11. Démarrer Tomcat
  12. Tester l'application: http://localhost:8080
Cas numéro 2: Production
  1. Installer Tomcat
  2. Installer MySql
  3. Créer le schéma de production
    CREATE SCHEMA appli_production;
  4. Charger les tables dans le schéma (j'utilise MySql Query Browser pour ça; je ne connait pas la commande exacte), On utilisera le fichier généré par Mr. R (cf Cas numéro 1: production_structure.sql)
  5. Se mettre d'accord sur les paramètres de connexion à la base avec Mr. R (schema name/username/password)
  6. Créer un user spécial:
    GRANT ALL ON appli_production.* TO 'appli'@'localhost' IDENTIFIED BY 'appli';
  7. Récupérer le war de Mr. R
  8. Le copier dans le répertoire webapp de Tomcat
  9. Démarrer Tomcat
  10. Tester l'application: http://localhost:8080
Conclusion: Voilà j'ai peut-être oublié des choses ou fait des erreurs de frappe mais l'essentiel est là ;)
Rem: Il y a autant de manières de créer une application que de personnes, certaines pratiques sont une affaire de goût :)
N'hésitez pas à ajouter vos commentaires...
Technorati tags:

5 commentaires:

jean-sébastien a dit…

très intéressant ce post. as-tu fais des benchmarks rails + nginx vs jruby + tomcat ?
je sais que tomcat est très long à démarrer mais je n'ai pas encore eu l'occasion de l'essayer.

Benjamin Francisoud a dit…

Non je me suis juste concentré sur la partie déploiement.

En terme de perf, mis à pas une petite lenteur lors de l'affichage la première fois, j'ai trouvé la version tomcat aussi rapide que sous mongrel. Mais c'est juste une estimation "à la louche", je n'ai pas fait de benchmark.

Vu que mon appli va être utilisé par une seul personne, les perf ne sont pas du tout un problème dans mon cas.

Mickael a dit…

Merci !

Julien a dit…

Salut salut !

Rails 1.1 ou 2.0 ??
Pas de rails 3 ?

Y aurait-t-il des soucis à reproduire ce step by step avec rails 3

Benjamin Francisoud a dit…

L'article date du "lundi, mars 10, 2008"

Rails 3 existait pas à l'époque ;)

Je sais pas comment ça se passe maintenant...