Debian On Rails : Apache 2.2 + MySQL + Ruby + Rails + PHP + Mongrel + Mongrel_cluster + Subversion + Trac + Capistrano

Posted by on 11 janvier 2007

Il y a quelques mois de cela je louais un serveur dédié avec comme but initial d’héberger mes propres sites et ceux de quelques amis. Je pensais alors que l’installation et la configuration de mon serveur ne serait qu’une formalité [modeste]au vue de mon expérience[/modeste]… Je me trompai alors dans les grandes largeurs !

Effectivement ce n’est que quelques mois plus tard et au bout de multiples expériences plus ou moins avortées avec différents panels d’administration que j’arrive enfin avec une installation que je qualifierai de presque correcte de mon serveur web…

Je vais donc vous faire part dans cet article des étapes que j’ai suivies pour en arriver là.

  1. Objectifs
  2. Installation système et applications
    1. Installation - Debian et utilitaires
    2. Installation - Apache 2.2 & PHP5 (ou 4)
    3. Installation - MySQL
    4. Installation - Subversion
    5. Installation - Ruby, Rails and friends ;)
    6. Installation - Mongrel, Mongrel_cluster, Capistrano
    7. Installation - Trac
  3. Etude de cas : “monappli.com”
    1. Création du repository Subversion
    2. Configuration Trac & Accès Subversion
    3. Import de “monappli” dans Subversion
    4. Configuration de Capistrano
    5. Configuration Apache/Mongrel/Mongrel_Cluster
    6. Mise en ligne !
  4. Limites et idées d’amélioration
  5. Sources

1 - Objectifs

L’objectif numéro un de cette installation est d’obtenir un environnement d’hébergement d’un (ou plusieurs) projets RubyOnRails. Ceci devra inclure un serveur Apache récent couplé au serveur Mongrel, le projet devra être versionné en utilisant Subversion et il devra être géré en utilisant Trac (Wiki/Ticket d’incidents/WebSVN).

Le second objectif de cette installation est d’obtenir un environnement facile à administrer, ainsi nous utiliserons au maximum des paquets de la distribution Debian (sauf pour Rails installé par les gems). Cet objectif implique un choix stratégique sur la distribution, effectivement seule les Debian Etch et Sid (par opposition à Sarge) incluent une version suffisamment récente de Apache (2.2). L’installation sera donc faite sur une Debian Sarge mise à jour vers une Debian Etch. (Pour information, j’ai réalisé l’installation sur ma dédibox, je suis en train de la répéter pour écrire cet article sur une machine virtuelle vmware, la partie “déploiement” de cet article doit pouvoir s’adapter chez un hébergeur gratuit tel que Hostingrails.)

Je n’expliquerai pas ici la gestion des DNS (nom de domaines), si vous avez lu le plan, vous avez probablement vu que l’étude de cas portera sur “monappli.com”, un domaine fictif. Le seul prérequis donc est d’avoir votre propre nom de domaine fonctionnel, pointant sur votre serveur. Pour les besoins de l’article j’ai donc ajouté “monappli.com” à mon fichier /etc/hosts sur ma station de travail (Ubuntu) en le faisant pointer vers mon serveur (debian en vmware). (De mémoire le fichier hosts porte le même nom sous Windows, par contre je ne sais plus où il se trouve…)

Edit : Le fichier host sous W$ est ici C:\WINDOWS\system32\drivers\etc, merci Tarax.

2 - Installation système et applications

2.1 - Installation - Debian et utilitaires

Le but de cet article n’est pas d’expliquer comment installer une débian, pour cela Google devrait pouvoir vous aider. Nous allons donc commencer juste après l’installation du système, pour les utilisateurs dédibox comme moi, vous venez d’installer une Debian Sarge, il faut donc passer en “testing” (etch).

(NB : Je n’ai pas testé la procédure d’upgrade suivante sur ma dédibox car je suis en SID actuellement mais je reviendrai en Etch rapidement, je compléterai alors l’article. Dans tout les cas cette procédure devrait fonctionner car elle a marché sur ma machine virtuelle.)

(NB2 : Ca y est je suis en train de refaire l’installation sur ma dédibox, alors il semble que la mise à jour du noyau ne soit pas nécessaire, car déjà en 2.6.18. Utilisateurs de dédibox vous pouvez donc directement lancer le “dist-upgrade” après la modification du sources.list !)

Avant tout nous allons installer un éditeur texte et un petit utilitaire qui a fait la popularité de Ubuntu : sudo.

# su
# apt-get install vim 
# apt-get install sudo

Editez le fichier sudoers :

# vi /etc/sudoers

Ajoutez ceci : (user étant le nom de votre user)

# user ALL=(ALL) ALL

Vous pouvez alors quitter le shell root et exécuter une commande “en tant que root” en la préfixant par “sudo”. Ouvrons donc le fichier (/etc/apt/sources.list) :

# sudo vi /etc/apt/sources.list 

Modifiez le fichier en changeant les occurrences de stable en etch (le tag testing peut fonctionner aussi mais n’est pas recommandé, en effet lorsque debian changera de version, Sid passera en testing et Etch en stable ce qui fait que votre serveur changera de version vers SID sans que vous le souhaitiez réellement !) Ensuite mettez à jour votre liste de sources :

# sudo apt-get update

Nous allons maintenant commencer par mettre à jour le noyau avant de mettre à jour le reste de la distribution, choisissez le noyau qui vous convient parmi la liste obtenue en tapant la commande suivante :

# sudo apt-cache search linux-image

Une fois que vous avez choisit le votre (linux-image-486 pour ma machine virtuelle), installez le avec ses headers, puis rebootez.

# apt-get install linux-image-486  linux-headers-2.6.18-3-486
# sudo reboot

Après le redémarrage il ne vous reste plus qu’a mettre à jour le reste de votre distribution :

# sudo apt-get dist-upgrade

Vous pouvez vous servir un p’tit café pendant les téléchargements, vous en aurez probablement besoin pour la suite du tuto !

2.2 - Installation - Apache 2.2 & PHP5 (ou 4)

# sudo apt-get install apache2 libapache2-mod-php5

(ou libapache2-mod-php4 si vous préférez php4 !)

Pour vérifier que l’installation s’est correctement déroulée vous pouvez ouvrir votre navigateur favoris Firefox à l’adresse www.monappli.com, un message indiquant “It works!” devrait apparaître.

2.3 - Installation - MySQL

# sudo apt-get install mysql-server

Comme vous le dira Debconf (l’utilitaire de configuration Debian), il est fortement recommandé de mettre un mot de passe. Personnellement si j’étais debconf je l’obligerais ;). Mettez donc un mot de passe (un vrai) et ne mettez pas le même que celui que vous utilisez partout…

Pour le tester faites la commande suivante :

# mysql -u root -p

Entrez votre mot de passe, vous devriez alors avoir un prompt mysql, c’est bon, quittez.

# mysql > quit

2.4 - Installation - Subversion

# sudo apt-get install subversion subversion-tools libsvn-dev libsvn1 libapache2-svn

Personnellement je stockerai mes dépôt subversion dans le répertoire /var (partition séparée sur mon serveur dédié), il faut donc créé le répertoire /var/svn

# sudo mkdir /var/svn/
# sudo chown www-data:root -R /var/svn

2.5 - Installation - Ruby, Rails and friends ;)

Attaquons nous maintenant à ce qui nous intéresse le plus Ruby, Ruby On Rails et les différentes librairies utiles. Avant tout il nous faut installer le paquet build-essential qui nous fournira les outils de compilation nécessaires à l’installation des gems.

# sudo apt-get install build-essential

Installons ensuite Ruby (1.8) et ses pots ;) :

# sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8

Etant donné que ces paquets sont versionnés dans leur nom, il est nécessaire de créér leurs équivalents non versionnés afin de les utiliser ensuite, pour cela il suffit de créer 4 liens :

# sudo ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby
# sudo ln -s /usr/bin/irb1.8 /usr/local/bin/irb
# sudo ln -s /usr/bin/ri1.8 /usr/local/bin/ri
# sudo ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc

Il faut aussi installer les “bindings” Mysql pour ruby :

# sudo apt-get install libmysql-ruby1.8

Je conseille aussi l’installation de la librairie de manipulation d’image “ImageMagick” pour ruby

# sudo apt-get install librmagick-ruby1.8 libmagick9-dev

Passons maintenant à Rails : Rails existe dans les dépôts Debian, seulement ce n’est pas la méthode recommandé pour l’installer car Rails est fourni par un autre système de paquetages : les RubyGems. Avant d’installer Rails nous allons donc récupérer ce gestionnaire de paquetage pour Ruby (J’ai déjà décrit la procédure dans un précédent article, je la reprendrai donc tel quel ici.)

Récupération, décompression et installation de RubyGems :

# cd 
# wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
# tar xvfz rubygems-0.9.0.tgz
# cd rubygems-0.9.0
# sudo ruby setup.rb
# cd ..

Installation de Rails

# sudo gem install rails --include-dependencies

Installation de Rmagick :

# sudo gem install rmagick

Enfin pour rester cohérent je placerai me sites rails dans le répertoire /var ainsi il faut créer le répertoire /var/rails

# sudo mkdir /var/rails
# sudo chown user:root -R /var/rails

(user étant votre nom d’utilisateur sur la machine, /var/rails a besoin de ces droits car le déploiement d’une application Rails depuis subversion grâce à Capistrano se fera sous l’autorité de user.)

2.6 - Installation - Mongrel, Mongrel_cluster, Capistrano

Mongrel, mongrel_cluster et Capistrano s’installent tous grâce aux fameuses gems :

# sudo gem install daemons gem_plugin mongrel mongrel_cluster capistrano --include-dependencies

Il vous sera demandé de faire un choix pour mongrel, prennez le premier à priori.

Activez ensuite les modules Apaches nécessaires au bon fonctionnement de Mongrel et mongrel_cluster :

# sudo a2enmod rewrite
# sudo a2enmod proxy
# sudo a2enmod proxy_balancer
# sudo a2enmod proxy_http

2.7 - Installation - Trac

Pour ceux qui n’en ont jamais entendu parlé, Trac est un gestionnaire de projets dans le sens ou il fournit un wiki, un système de ticket d’incidents et une interface web à subversion. Il est (selon sa description) particulièrement adapté aux projets web.

# sudo apt-get install trac libapache2-mod-python

Il vous faut répondre par l’affirmative lorsque debconf vous demandera d’activer le module python pour apache, sinon activez le ensuite à la main :

# sudo a2enmod mod_python

Toujours par soucis de cohérence au niveau de l’arborescence de mes répertoires, mes projets trac seront installé dans /var/trac

# sudo mkdir /var/trac/
# sudo chown www-data:root -R /var/trac

3 - Étude de cas : “monappli.com”

Notre serveur est a priori installé mais… loin d’être configuré !

Nous allons donc maintenant nous attaquer à la partie la plus intéressantes de l’article, à savoir, comment mettre “monappli” sous contrôle subversion, sous gestion Trac et finalement en ligne grâce à la “magie” de Capistrano…

3.1 - Création du repository Subversion

La première étape consiste à créer le répository ou sera déposé le projet, ce dépôt se présente en général sous cette forme :

+monappli

|- trunk

|- branches

|- tags

Le répertoire trunk devra alors contenir la version de développement du projet, étant un tout récent utilisateur de subversion je ne saurais encore vous dire à quoi servent les répertoires branches et tags. (si quelqu’un peut m’éclairer, c’est pas de refus ! ). Le répertoire “trunk” sera créé plus tard lors de l’import du projet.

On va donc créer cette arborescence pour l’importer dans subversion, dans votre home directory tapez ces commandes :

# mkdir ~/monappli
# mkdir ~/monappli/tags
# mkdir ~/monappli/branches

Ensuite on importe le tout dans subversion après avoir créez le dépôt :

# sudo svnadmin create /var/svn/monappli
# sudo chown -R www-data:root /var/svn/monappli
# sudo svn import ~/monappli file:///var/svn/monappli -m "Création du projet, import de l'arborescence type"

Après le “-m” vient un commentaire, à vous de mettre ce que vous souhaitez ! Nous pouvons ensuite effacer le répertoire contenant l’arborescence importée :

# rm -drf ~/monappli

Ensuite, éditez le fichier de configuration de votre dépôt svn :

# sudo vi /var/svn/monappli/conf/svnserve.conf

Et modifiez le pour que les lignes suivantes aient ces valeurs :

anon-access = none 
auth-access = write
authz-db = /etc/apache2/trac_svn_access.rules
realm = Mon Appli Repository

(anon-access signifie accès anonyme, si vous voulez donc qu’un utilisateur anonyme puis récupérer les sources de votre dépot mettez cet accès à read)

Ok, donc maintenant on a un dépôt SVN avec une arborescence prête à accueillir votre petit projet sur lequel vous travaillez depuis un bout de temps. Avant de procéder à l’import de votre projet, nous allons configurer les accès à notre tout récent dépot.

Il y a différente façon d’accéder à un dépot svn, directement sur la machine, par connexion ssh pour beaucoup de sécurité ou encore par connexion http dans la plupart des cas. Nous allons nous interesser à la connexion http que nous allons mettre en place en même temps que Trac.

3.2 - Configuration Trac & Accès Subversion

Création du projet Trac

Trac est une application web, elle a donc besoin d’un serveur web pour fonctionner. Nous allons donc configurer Apache pour accéder à Trac. Pour des raisons de commodité trac sera accessible à l’adresse trac.monappli.com. Configurez donc vos DNS ou, si vous faites la manip pour tester comme moi en ce moment, modifiez le fichier /etc/hosts en conséquence.

Avant tout créez un nouveau projet Trac :

 # sudo trac-admin /var/trac/monappli initenv

Répondez aux questions comme ci dessous :

  1. Project Name [My Project]> Mon appli
  2. Database connection string [sqlite:db/trac.db]>
  3. Repository type [svn]>
  4. Path to repository [/path/to/repos]> /var/svn/monappli
  5. Templates directory [/usr/share/trac/templates]>

… et tout devrais bien se passer ;)

Gestion des utilisateurs

Il est nécessaire ensuite de pouvoir gérer les utilisateurs de notre dépot subversion mais aussi de notre Trac, ainsi nous allons créer le fichier suivant :

# sudo vi /etc/apache2/trac_svn_access.rules

et nous allons y ajouter le contenu suivant :

[groups]
developpers = pierre, manuel

[/] @developpers = rw

C’est assez lisible, ici, les utilisateurs pierre et manuel font parti du groupe “developpers”, groupe qui possède les droits de lecture (r) et écriture (w) sur TOUT le dépot subversion. Plus d’information peut être trouvée à cette adresse concernant ce fichier.

Nous avons donc 2 utilisateurs auquels nous devons associer un mot de passe :

# sudo htpasswd -c /etc/apache2/dav_trac_svn.passwd pierre
# sudo htpasswd /etc/apache2/dav_trac_svn.passwd manuel

Nous devons informer Trac maintenant de l’existance d’un administrateur, prenons pierre :

# sudo trac-admin /var/trac/monappli permission add pierre TRAC_ADMIN

Donnons les droits de création/modification aux développeurs :

# sudo trac-admin /var/trac/monappli permission add developpers WIKI_CREATE WIKI_MODIFY TICKET_CREATE TICKET_MODIFY

Enfin interdisons la modification/création pour les anonymes

# sudo trac-admin /var/trac/monappli permission remove anonymous WIKI_CREATE WIKI_MODIFY TICKET_CREATE TICKET_MODIFY

Ces droits pourrons être changés par la suite grâce à une interface d’administration plus conviviale !

Trac.ini

Nous avons maintenant besoin de faire un tour dans la configuration de notre instance Trac :

#  sudo vi /var/trac/monappli/conf/trac.ini

Modifiez alors les lignes suivantes :

[project]
descr = Projet Mon Appli
name = Mon appli
url = http://trac.monappli.com/

[ticket]
restrict_owner = true

[trac]
authz_file = /etc/apache2/trac_svn_access.rules

Configuration apache

Créons ensuite le fichier trac.monappli.com dans les sites disponibles de votre debian afin de pouvoir accéder à notre Trac.

 # sudo vi /etc/apache2/sites-available/trac.monappli.com

Mettez y la configuration suivante :

<VirtualHost *>
ServerAdmin votreemail@monappli.com
ServerName trac.monappli.com

DocumentRoot /var/trac/monappli
<Location />
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv /var/trac/monappli
    PythonOption TracUriRoot /
    PythonPath "sys.path + ['/var/trac/monappli']"
</Location>

ErrorLog  /var/log/apache2/error.trac.monappli.com.log
CustomLog /var/log/apache2/access.trac.monappli.com.log combined

<Location /svn>
    DAV svn
    SVNPath /var/svn/monappli

    # Access control policy
    AuthzSVNAccessFile /etc/apache2/trac_svn_access.rules

    # only authenticated users may access the repository
    Require valid-user

    AuthType Basic
    AuthName "Monappli Subversion repository"
    AuthUserFile /etc/apache2/dav_trac_svn.passwd
    <LimitExcept GET PROPFIND OPTIONS REPORT> 
        Require valid-user
    </LimitExcept>
</Location>

<Location "/login">
    AuthType Basic
    AuthName "Trac login"
    AuthUserFile /etc/apache2/dav_trac_svn.passwd
    Require valid-user
</Location>

</VirtualHost>

Apache a besoin d’accéder aux fichiers de trac, changez donc le propriétaire de votre instance trac :

# sudo chown -R www-data:root /var/trac/monappli/

Ensuite, il ne vous reste qu’a activer le site et redémarrez Apache pour que toute votre configuration soit prise en compte :

# sudo a2ensite trac.monappli.com
# sudo /etc/init.d/apache2 restart

Si tout vas bien, trac devrait maintenant être disponible à l’adresse suivante : trac.monappli.com. On en a pas fini pour autant avec lui, effectivement il faut maintenant lui ajouter un module d’administration qui nous permettra d’éviter de le manipuler avec la ligne de commande ;)

Trac WebAdmin

Nous allons récupérer un installeur, l’installer puis récupérer le plugin, le renommer et enfin l’installer !

# wget http://peak.telecommunity.com/dist/ez_setup.py
# sudo python ez_setup.py
# wget http://trac.edgewall.org/attachment/wiki/WebAdmin/TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip?format=raw
#  mv TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip\?format\=raw TracWebAdmin-0.1.2dev_r4240-py2.4.egg
# sudo easy_install TracWebAdmin-0.1.2dev_r4240-py2.4.egg

Pour activer ce plugin dans notre instance de trac, il nous faut éditer le fichier trac.ini :

# sudo vi /var/trac/monappli/conf/trac.ini

et y ajouter à la fin la partie suivante :

[components]
webadmin.* = enabled

3.3 - Import de “monappli” dans Subversion

Personellement je travaille avec le couple Eclipse/Radrails (voir un précédent article pour savoir comment installer le tout), je présenterai donc comment importer un projet Rails existant grâce à Eclipse. Pour ceux qui travaille avec un autre environnement adaptez la démarche suivante ;)

Un prérequis pour travailler avec Subversion depuis Eclipse est l’utilisation du fameux plugin Subclipse, un tutoriel sur son installation est disponible sur leur site internet.

Une fois que le plugin subversion est installé, ouvrez donc Eclipse, créez un nouveau projet Rails ou ouvrez le projet sur lequel vous travailliez déjà, faites un clic droit sur le nom du projet dans la fenêtre de gauche puis sélectionnez “Team > Share Project”. (Mon installation d’éclipse est en anglais, donc adaptez !). Dans la fenêtre suivante, sélectionnez un dépôt de type SVN, et ensuite créez en un nouveau.

Pour ce nouveau dépôt, entrez cette url : http://trac.monappli.com/svn puis cliquez sur suivant. Ensuite indiquez que vous voulez utiliser un nom de dossier particulier et entrez “trunk” (Vous pouvez aussi le sélectionner en “parcourant” le dépôt SVN, pour cela, il faudra vous identifiez avec les nom d’utilisateurs que vous avez créez précédemment.) Cliquez sur suivant, vous pourrez alors entrer un commentaire spécial pour votre “import” ou laisser celui par défaut. Ensuite éclipse devrait vous demander de sélectionner les fichiers à importer, à priori vous pouvez tout sélectionner sauf le fichier .project qui est propre à votre environnement, mettez un commentaire puis validez !

Maintenant vous devriez avoir votre projet sous contrôle subversion. Cela permettra de pouvoir travailler à plusieurs sur le projet, ou tout simplement de pouvoir travailler seul mais en gérant ses versions de fichiers.

Cependant, il reste un peu de configuration à faire. Effectivement certains fichiers n’ont pas besoins d’être sous contrôle subversion, il faut donc modifiez un peu la configuration SVN, il est possible de faire cette manipulation en mode graphique dans éclipse je vais donc essayer de l’expliquer ci dessous :

Gestion du fichier database.yml

Ce fichier est spécifique aux différents développeurs ainsi qu’au serveur, nous allons donc créer une version pour chacun.

  1. Copiez collez le fichier config/database.yml dans le même répertoire et renommez le en database.yml.prd (Version pour le serveur)
  2. Ajoutez ce fichierau contrôle de version. Clic droit > Team > Add To Version Control
  3. Renomez database.yml en database.yml.example. (Version pour les autres développeurs)
  4. Indiquez à subversion de ne plus versionner votre prochain database.yml : Clic droit sur le répertoire config > Team > Set property > Property name = svn:ignore, dans le champs texte tappez “database.yml”
  5. Mettez à jour votre serveur subversion. Clic droit sur le nom du projet > Team > Commit (Mettez un commentaire comme “Gestion du fichier database.yml”)
  6. Recréez votre database.yml en local dans le répertoire config (File > new > File).
  7. Conclusion : database.yml doit contenir la config de votre appli en local, database.yml.prd celle de votre serveur et database.yml.example une config type que pourrons utiliser les développeurs.

Gestion .project

Ce fichier est spécifique à éclipse, on peut donc indiquer à subversion de ne pas le prendre en compte. Sur le répertoire projet, clic droit > Team > Set property > Property name = svn:ignore, dans le champs texte tappez “.project”.

Commit ! (Quand je dis commit il faut faire clic droit sur le nom du projet > Team > Commit et entrer un commentaire…)

Gestion des logs

Les logs sont aussi des fichiers spécifiques à chaque environnement. Nous allons donc indiquer à subversion de les ignorer :

  1. Clic droit sur le répertoire log > Team > Set property > Property name = svn:ignore, dans le champs texte tappez “*.log”
  2. Commit !

Gestion des fichiers temporaires

Le répertoire tmp contient 3 sous répertoires temporaires spécifiques à chacun, on procède de la même manière pour indiquer à Subversion de les ignorer :

  1. Clic droit sur le répertoire tmp/cache > Team > Set property > Property name = svn:ignore, dans le champs texte tappez “*” (pour tout ignorer)
  2. Clic droit sur le répertoire tmp/sessions > Team > Set property > Property name = svn:ignore, dans le champs texte tappez “*” (pour tout ignorer)
  3. Clic droit sur le répertoire tmp/sockets > Team > Set property > Property name = svn:ignore, dans le champs texte tappez “*” (pour tout ignorer)
  4. Commit !

Voila ! Vous êtes OK avec Subversion, un nouveau développeur peut alors faire un “checkout” du projet, il récupérera lui aussi les propriétés que vous avez définies ici.

3.4 - Configuration de Capistrano

Quelques explications

Avant d’expliquer comment faire, je vais commencer par expliquer son utilité car, au début, j’ai eu du mal à comprendre ce qu’était Capistrano ( ;) ). Pour tout savoir je vous conseille de lire comme moi le manuel officiel, sinon je vais tenter en quelque lignes d’expliquer ce que cela va nous amener.

Capistrano est donc un “utilitaire” permettant de gérer le déploiement d’une application. Il n’est pas spécifique à RubyOnRails mais s’y adapte parfaitement. L’utilisateur de capistrano devra donc écrire une “recette” (fichier de configuration) indiquant comment va se dérouler le déploiement. L’avantage d’un tel outil est qu’en lançant une seule commande sur sa station de travail, un utilisateur va pouvoir “mettre en ligne” son application sur autant de serveur qu’il le souhaite, sans s’occuper de déplacer, modifier ou archiver manuellement l’existant.

Voici donc le fonctionnement de Capistrano (arrêtez moi si je me trompe, j’en suis à ma première utilisation !) :

  1. L’utilisateur lance le déploiement de son application sur sa station de travail (une ligne de commande), Capistrano lit alors la recette à suivre pour faire le déploiement.
  2. Capistrano checke le serveur subversion à la recherche de la dernière version.
  3. Capistrano archive monappli.com dans un répertoire daté
  4. Capistrano récupère la dernière version depuis le serveur subversion et la met à la place de la version archivée
  5. Capistrano exécute les tâches spécifiques comme la modification d’un fichier, la création de liens ou encore toute autre tâche que nous lui aurons indiquer. (On peut imaginer d’archiver la base de donnée, de réaliser des migrations ou encore plein d’autres choses.)

La magie est que cette opération peut être réalisée en même temps sur X serveurs identiques et qu’en plus elle est réversible. Imaginez que vous metttez la toute dernière version de votre application en ligne et que dans la minute qui suit vous vous apercevez d’un gros bug critique, en une seule commande, vous pourrez alors revenir dans une version précédente !

Adaptation pour monappli.com

Nous avons déjà installé capistrano, il ne nous manque qu’a écrire un fichier de recette en local. Ce fichier s’appelle deploy.rb et devra être créé dans le répertoire config de votre application. Cependant avant de le créer, nous allons indiquer à subversion de ne pas en tenir compte. (C’est un choix personnel, vous pouvez très bien le versionner et donc le fournir aux autres développeurs si vous le souhaitez…)

Dans éclipse, Clic droit sur le répertoire config > Team > Show properties > Clic droit sur l’existante > modify> et ajoutez “deploy.rb”.

Créez ensuite ce fichier dans le répertoire config, puis renseigner le comme suit :

#############################
####### Ma recette Capistrano ! ####
#############################

#############################
## Configuration
#############################

require 'mongrel_cluster/recipes'
# le nom de votre utilisateur SSH sur votre serveur
set :user, 'user'
# le nom de votre application
set :application, "monappli.com"
# le nom de votre user SVN
set :svn_user, ENV['svn_user'] || "pierre"
set :svn_password, Proc.new { Capistrano::CLI.password_prompt('SVN Password: ') }

# la configuration du dépôt SVN
set :repository,
  Proc.new { "--username #{svn_user} " +
             "--password #{svn_password} " +
             "http://trac.monappli.com/svn/trunk/" }

# definition de variables
role :web, application
role :app, application
role :db, application, :primary => true

# Lieu ou va être déployée votre application (le répertoire /var/rails/monappli)
set :deploy_to, "/var/rails/#{application}"

# La configuration de votre cluster Mongrel.
set :mongrel_conf, "#{current_path}/config/mongrel_cluster.yml"

# Nous indiquons que nous utilisons sudo pour executer des commandes en tant que root
set :use_sudo, true

set :restart_via, :run

# Le type de checkout SVN
set :checkout, "export"

#############################
## Liste de tâches à exécuter 
#############################

#Tâche 1
#Réalisée après la création des liens symboliques necessaires.
task :after_symlink, :roles => [:web, :app] do
    # Changer l'environnement de développement à production
    run "perl -i -pe \"s/# ENV\\['RAILS_ENV'\\] \\|\\|= 'production'/ENV['RAILS_ENV'] ||= 'production'/\" #{current_path}/config/environment.rb"
    
    # Renomer le fichier database.yml.prd 
    run "cp #{current_path}/config/database.yml.prd #{current_path}/config/database.yml"
    
    # Conserver le même répertoire tmp qu'avant le déploiement, création de liens sympliques
    run "rm -drf #{current_path}/tmp"
    run "ln -s #{shared_path}/tmp #{current_path}/tmp"
end

#Tâche 2
#Exemple d'une tâche qui fait en sorte de conserver les même répertoire rep1 et rep2 avant et après déploiement
#Utile pour un répertoire d'images uploadées par exemple.
# task :after_update_code do
#  %w{rep1 rep2}.each do |share|
#  run "rm -drf #{release_path}/public/#{share}"
#    run "ln -s #{shared_path}/#{share} #{release_path}/public/#{share}"
#  end
#end

Nous avons maintenant décris comment nous mettre en place notre application, il nous reste encore à configurer le serveur pour pouvoir afficher cette application !

3.5 - Configuration Apache/Mongrel/Mongrel_Cluster

Nous allons à nouveau travailler sur le serveur, reconnectez vous dessus et créons un nouvel hôte virtuel apache :

 # sudo vi /etc/apache2/sites-available/monappli.com

Voici son contenu, il faut savoir que cette configuraiton peut être améliorée, je ne maîtrise pas encore tous les secrets des proxy, des clusters, du modrewrite et du moddeflate :

<VirtualHost *>
ServerName monappli.com
DocumentRoot /var/rails/monappli.com/current/public

<Directory "/var/rails/monappli.com/current/public">
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

<Proxy balancer://mongrel_cluster>
     BalancerMember http://127.0.0.1:8000
     BalancerMember http://127.0.0.1:8001
     BalancerMember http://127.0.0.1:8002
    Allow from localhost
</Proxy>

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f
RewriteRule (.*) $1 [L]

ProxyPass / balancer://mongrel_cluster/
ProxyPassReverse / balancer://mongrel_cluster/

# Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

ErrorLog /var/log/apache2/error.monappli.com.log
CustomLog /var/log/apache2/access.monappli.com.log combined
</VirtualHost>

Ensuite activez ce site et redémarrer apache :

 # sudo a2ensite monappli.com
 # sudo /etc/init.d/apache2 reload

Ne tenez pas compte du warning concernant l’existance du répertoire /var/rails/monappli/current/public il sera créé par le déploiement capistrano.

Un peu d’explication sur ce fichier : en fait nous indiquons à apache (et plus particulièrement à son mod_proxy) que les requêtes doivent être passée à un cluster de serveur mongrels écoutant sur les ports 8000, 8001et 8002.

Il nous faut donc maintenant configurer ces clusters, si vous jettez un oeil au fichier de recette capistrano, vous verrez qu’il fait référence à un fichier censé définir la configuration du cluster. Nous revenons donc dans éclipse et nous allons créer dans le répertoire config le fichier mongrel_cluster.yml contenant la configuration suivante :

--- 
cwd: /var/rails/monappli.com/current
port: "8000"
environment: production
address: 127.0.0.1
pid_file: log/mongrel.pid
servers: 3

Faites ensuite un commit afin de mettre ce fichier sous contrôle subversion.

Avant la mise en ligne, pour que capistrano fonctionne dans un environnement de test en local avec ma vmware, il faut ajouter ces lignes dans le fichier host du serveur si vous ne disposez pas d’un véritable nom de domaine. (elles sont normalement déjà dans votre host de la station de travail)

# sudo vi /etc/hosts

192.168.2.101   monappli.com
192.168.2.101   trac.monappli.com

L’adresse ip étant celle de votre machine virtuelle ;)

3.6 - Mise en ligne !

Avec capistrano la mise en ligne ne devrait être qu’une formalité, sur votre station de travail, à la racine de votre application entrez les commandes suivantes (vos mots de passe user ssh et svn vous serons demandés)

# cap setup

… cela devrait générer l’environnement Capistrano sur votre serveur, puis faites :

# cap deploy

… si tout vas bien, cela mettre votre application en ligne à partir des sources SVN et cela effectueras les différentes tâches de la recette capistrano !

4 - Limites et idées d’amélioration

Les limites de cet articles sont mes propres limites, en effet les configurations et les commandes que j’ai données ne sont le fruit que des très longues heures (et même journées) de recherche. Je ne détiens aucun vérité donc je suis ouvert à toutes remarques et/où idées d’améliorations !

NB : Si vous venez à bout de ce tuto, laissez moi un feedback pour me dire comment ça c’est passé ;)

Script de lancement des process mongrel

Une première idée d’amélioration de cet article (que j’ai trouvée ici) est la création d’un script qui sera lancé à chaque démarrage du serveur et dont le rôle sera de lancer tout les process mongrels des sites installés dans /var/rails. Si vous l’utilisez n’oubliez pas de changer la variable suivante en début de script :

# APP_DIR = '/var/rails/'

5 - Sources

Rendons à César ce qui est à César, sans tous ces très bons articles, blogs et sites, mon article n’aurait pas vu le jour, en vrac voici le contenu de mon répertoire de bookmarks “Serveur ROR” :

68 Comments on Debian On Rails : Apache 2.2 + MySQL + Ruby + Rails + PHP + Mongrel + Mongrel_cluster + Subversion + Trac + Capistrano

Respond | Trackback

  1. nuxwin dit :

    @ Pierre ;

    Ok pour la traduction de ton tuto. Si tu souhaite me donner un accès, envoi moi les identifiants par mail à cette adresse redactionATnuxwin.com.

    Sinon, afin d’épurer ton tuto et éviter aux lecteurs d’avoir à taper X commandes, tu pourrais par exemple remplacer ceci :

    # sudo ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby
    # sudo ln -s /usr/bin/irb1.8 /usr/local/bin/irb
    # sudo ln -s /usr/bin/ri1.8 /usr/local/bin/ri
    # sudo ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc
    

    Par ceci :

    sudo ln -s /usr/bin/{ruby1.8,irb1.8,ri1.8,rdoc1.8} /usr/local/bin
    

    Le résultat est identique.

  2. nuxwin dit :

    Oup,

    Pour la commande, oublie.

  3. nuxwin dit :

    Bonsoir ;

    J’ai bien reçu les identifiants. Merci.

    Sinon, en ce qui concerne mon poste précédent, la bonne commande est la suivante :

    for f in /usr/bin/*1.8; do ln -s $f /usr/local/bin/`basename $f 1.8`; done
    

    Voilà.

  4. Kadoudal dit :

    Merci Pierre pour ce tutorial.. j’ai commandé/reçu ma dedibox Samedi, et elle tourne Debian 4.0/Plesk 8.2.1 Installé Rails/Mongrel/Capistrano… pas encore testé Jusqu’à présent je tournais en hébergé sur une autre Dedibox, et ja n’avais pas encore eu à me confronter à la gestion du système 5c’est + facile en local avec OS X…) avant d’aller + loin , j’ai une question stupide : Plesk (VHSC pour toi…) est simple d’utilisation, et permet de créer des utilisateurs et des domaines… ex : http://www.domaine1.net et http://www.domaine2.org: est-ce si simple que celà ? ne faut-il pas ajouter des infos pour Apache ou PLex/VHSC les rajoutent automatiquement ? ça me semble trop simple …. alors je doute et comme j’attends la propagation du DNS, je n’ai pas pu tester…

    merci de tes infos

    kadoudal bzh

  5. kadoudal dit :

    Bon… j’ai trouvé comment installer les domaines/sous-domaines sur ma dedibox… Plesk 8.2 s’occupe de tout… enfin presque ..

    après avoir suivi tes instructions jusqu’au Trac .. arrêt avant la configuration Apache, ensuite :

    • modifié les DNS chez l’hébergeur de mon domaine ‘domaine1.net’ : sd-xxxx.dedibox.fr et nssec.dedibox.fr attendu quelques minutes seulement… le domaine etait en parking donc la propagation n’a pas été longue….

    • créé les domaines / sous-domaines avec Plesk domaine1.net et trac.domaine1.net

    • ecrits les host.vconf pour chaque domaine/sous-domaine si nécessaire (ex / j’utilise trac.domaine1.net donc le vconf va dans var/www/hosts/domaine1.net/subdomains/trac/conf )

    • relancé Plesk /usr/local/psa/admin/sbin/websrvmng -u —vhost-name=trac.domaine1.net

    et c’est tout !!! je donne ça au cas où ça intéresserais certains…

  6. kadoudal dit :

    Est-ce qu’il n’y a pas une étape qui manque avant la mise en ligne ?

    lorsque qu’on relance apache, tu indiques bien “Ne tenez pas compte du warning concernant l’existence du répertoire /var/rails/monappli/current/public il sera créé par le déploiement capistrano.’ il n’y a donc rien dans ‘monappli’ puisque l’application est encore dans le repository….

    donc si on lance : .6 - Mise en ligne ! cap setup

    … cela devrait générer l’environnement Capistrano sur votre serveur

    … on obtiens : /usr/lib/ruby/gems/1.8/gems/capistrano-2.1.0/lib/capistrano/configuration/loading.rb:184:in `find_file_in_load_path’: no such file to load — config/deploy (LoadError)

    ce qui semble normal….

  7. Pierre Rigal dit :

    Bonjour Kadoudal,

    Lors de la rédaction de cet article j’ai pris le temps de le tester sur ma dédibox et sur une machine virtuelle vmware sous debian… Je pense donc que la manipulation marchais alors.

    Depuis de nombreux paquets ont été mis à jour (notemment capistrano qui a changé de version majeure), il faut donc voir si les commandes n’ont pas changé depuis et si leur rôle est toujours le même…

    Dans tous les cas de mémoire, la commande créait bien l’environnement et il ne fallais en aucun cas créer la structure (current/public/etc…) car elle est entièrement gérée par capistrano.

  8. kadoudal dit :

    Salut Pierre

    Effectivement j’ai installé Capistrano 2 donc je vais re-testé.. Comme je ne suis qu’au début de l’install de ma dédibox, j’ai décidé de tout scratcher et de recommencer à zéro .. (Debian 4 + Plesk 8.2.1, puis Rails, Mongrel, Capistrano) petit problème …. ayant tout viré je ne devrais plus rien avoir de Trac…, mais mais lorsque j’indique un sous-domaine type dev.aelmat.net, pas de problème -> non trouvé, si j’indique trac.aelmat.dev… le favicon de trac apparait ! et ça mouline , puis time out….. et pourtant je n’ai plus de vhost.conf pour trac.aelmat.net…. pourquoi Apache ne réponds pas de la même manière … avec un système tout neuf de chez neuf ?

    il y a-t-il des fichiers cachés ?

    note : Kadoudal… bzh, j’habite à 500m de son mausolé !

  9. kadoudal dit :

    j’ai réinstallé ma dedibox Debian 4.0 + Plesk 8.2.1 ( je sais que ce n’est pas ta distri.. )

    j’accède à ma console Plesk via SSL sans problème , mais lorsque je veux installer Rails ..

    sd-3397:~# gem install rails —include-dependencies INFO: gem install -y is now default and will be removed INFO: use —ignore-dependencies to install only the gems you list ERROR: While executing gem … (Gem::Exception) SSL is not installed on this system

    alors que : d-3397:~# a2enmod ssl This module is already enabled!

    j’y perd mon latin.. une piste ???

  10. kadoudal dit :

    Enfin ma première appli Rails standard déployée , sur Dedibox Debian 4, Plesk 2.1, cluster Mongrel, Capistrano 2.1

    je me suis beaucoup inspiré de ton tuto, avec quelques modifs, dues au fait que je gère du multi-clients, multi-projets avec Plesk (donc des sous-domaines dans une structure Apache 2 un peu différente), mais aussi dues aux versions…. en particulier Capistrano 2 …

    j’attaque les migrations avec Capistrano, puis le multi-staging… , encore du taff, masi merci pour m’avoir mis sur la voie céleste !!!

  11. Pierre Rigal dit :

    Tiens j’étais passé à coté de tes derniers commentaires. Mais c’est pas si mal, du coup tu as fait les questions et les réponses ;)

    Il doit être pas mal ton serveur au final, tu me diras un peu ce que ça donne en montée en charge une fois que tu auras des clients !

    Personnellement, je teste actuellement la version open source de litespeed et ruby-lsapi. Le couple semble bien marcher et c’est surtout très facile en mettre en place car bien documenté. A suivre.

  12. Lebasque dit :

    Bonjour,

    j’ai un petit problème je n’arrive pas à atteindre trac.monappli.com ! Auriez vous une solution ?

    Merci d’avance

    Salutations

    LeBasque

  13. mrbark dit :

    partition separee sur mon serveur dedie, j’ai su mal à comprendre, j’avoue :) en tout cas merci pour ce bilmlet intéresant ! c’est toujours sympathique de passer su rce blog :)

  14. Florent dit :

    Salut Pierre, Ton tuto est génial, et merci pour ton énorme boulot. Malheureusement, il a un peu vieillit, notamment en ce qui concerne le déploiement via capistrano (v2.x) J’ai trouvé un petit site (en anglais désolé) qui je l’espère aidera ceux qui comme moi ont découvert ton blog un an trop tard ;)

    http://www.rubyrobot.org/article/deploying-rails-20-to-mongrel-with-capistrano-21

    Bonne continuation

  15. Florent Vaucelle dit :

    Ne serait-il pas utile de mettre à jour rubygems (version 1.1.1) ?
    gem update —system

    Superbe tuto, et de plus en français !

  16. Sun Location dit :

    Super ce tuto pour installer une configuration LAMP complète ! Merci :)

  17. Pierhomme dit :

    Salut, sympa ton installe. Moi aussi je viens du PHP et c’est pas facil de tout rapprendre. Par contre je suis d’accord avec toi concernant l’install de ROR sur un Debian, le LAMP est tellement simple (suffit de faire apt-get phpmyadmin)! (P.S.:Ton tuto ne marche plus avec ruby1.9 :-( )

  18. altheakak dit :

    Sorry, for off top, i wanna tell one joke) What’s the difference between an oral thermometer and a rectal thermometer? The taste.


          --/ <a href="http://cialisis.order-vigrarx.info/site_map.html" rel="nofollow">cialisis buy  New York</a> /--
    

Respond

Comments

Comments: