Déploiement d'une application Ruby On Rails sur serveur dédié
- Catégories:
- Ruby On Rails
Une fois que vous avez votre application Ruby On Rails, vous aimeriez la publier et la rendre accessible par tout le monde. Comment faire ?
Si sur Heroku tout est bien expliqué, il est par contre plus difficile de comprendre comment déployer une application Ruby On Rails sur un serveur dédié.
Le but de ce billet est de vous donner un pense-bête et un guide "pas à pas" pour l'installation et le lancement de votre première application Rails sur un tel serveur.
Le serveur dédié
Pas d'obligations au niveau du prestataire. C'est selon les goûts de chacun. De toutes façons, le propre d'un serveur dédié c'est qu'il vous appartient puisque vous le louez (d'où le dédié). Vous pouvez donc y installer ce que bon vous semble (ça marche aussi pour les VPS d'ailleurs).
La seule chose importante à retenir c'est qu'il vaut mieux éviter de prendre un serveur dédié tout nu. A moins que vous ne soyez un pro de la configuration et que vous avez déjà mis en place beaucoup de serveurs Apache avec interface d'administration + mails + dns + ... je vous conseille vivement d'opter pour une configuration de base offerte par votre hébergeur.
Personnellement, j'ai opté pour la configuration suivante : Plesk, Ubuntu + Apache déjà installé + QMail et plein d'autres choses.
L'avantage de Plesk, c'est qu'il propose pas mal de modules Apache dès le départ, y compris FastCGI qui est requis, si vous ne le saviez pas déjà, pour faire fonctionner des applications Rails à travers Apache (et Passenger).
Il est bon aussi d'avoir Python d'installé car certaines gems Ruby requièrent Python pour s'exécuter correctement. C'est étrange mais c'est comme ça.
Installation de l'environnement Ruby On Rails
Même si je suis sous Ubuntu (ce tutoriel a été rédigé pour Ubuntu LTS 12.04), l'installation de cet environnement Ruby On Rails est quasi similaire pour beaucoup de systèmes d'exploitation. (Windows mis à part, mais qui commande un serveur dédié Windows pour héberger des applis Ruby On Rails ? Je vous le demande ').
En fait, installer Rails n'est absolument pas compliqué et ressemble beaucoup à ce que nous avons vu dans le billet sur l'installation de Ruby On Rails sous Ubuntu.
Je ne vais donc pas refaire le même laïus, le billet cité ci-dessus explique déjà tout : installer surtout RVM, puis Ruby (dans sa dernière version de préférence), puis Rails. Pas de différence, si vous suivez bien mon autre tutoriel, cela devrait se dérouler sans accrocs.
Faites bien gaffe tout de même à l'installation de RVM et à vos exigences. Si vous souhaitez l'installer pour du multi-utilisateur, c'est un peu différent puisqu'il faut rajouter sudo avant la commande d'installation de RVM.
Installation de Passenger
Voilà pourquoi il est mieux de partir sur une configuration où Apache est déjà opérationnel. Nous allons en effet utiliser Passenger (une gem Ruby) pour que nos applications Rails puissent fonctionner à travers Apache (notez que ça marche aussi avec NGinx).
Notez que Passenger n'est pas une obligation. Il existe d'autres moyens de mettre en ligne une application Ruby On Rails et de la faire tourner sur un serveur dédié. Toutefois Passenger a une grande expérience dans l'exécution d'applications Rails ce qui lui confère une certaine robustesse et rapidité d'exécution de telles applications. De plus, cela vous permet d'héberger des applications Rails facilement avec un minimum de configuration. Et les applications hébergées avec Passenger ne sont pas forcément plus lentes que celles utilisant un autre type de serveur. Ce que j'aime avec Passenger, c'est la facilité et la rapidité de déploiement d'une nouvelle application Rails tout en gardant les avantages qu'offre un serveur Apache.
Bref ! Passons à l'installation. Nous allons installer la version OpenSource. Mais si vous avez le buget pour la version Pro, allez-y, rien ne vous retient.
Pour l'installation de Passenger, c'est aussi simple qu'installer une gem. Ouvrez donc un terminal et connectez-vous en ssh à votre serveur dédié (ou utilisez Putty pour les Windowsiens). Une fois connecté et avec le bon utilisateur, lancez la commande suivante :
$ gem install passenger
Ajoutez un "sudo" si vous avez installez RVM en tant que root ou en tant que sudoer. Cette gem est, si je puis dire, le serveur Rails proprement dit. Reste à installer ce qui va faire le pont entre Apache et ce serveur. Donc une fois fait, vous devez installer le module appache-passenger qui va permettre la communication entre appache et passenger :
$ sudo passenger-install-apache2-module
Remplacez apache2 par nginx pour ceux qui ont nginx. Et cela va installer le module adéquat. En même temps, cela vérifiera que votre serveur Apache possède bien tous les modules nécessaires au bon fonctionnement de votre futur application Rails. Si certaines dépendances ne sont pas trouvées, on vous le signale et je vous invite à toutes les installer. De toutes façons, l'installation du module passenger n'est possible que si toutes les dépendances sont bien installées.
A la fin de l'installation du module passenger, vous avez une petite note vous signalent qu'il faut insérer certaines lignes dans un fichier de configuration d'apache. Ces lignes commencent par "LoadModules", elles indiqueront à Apache de charger les modules Passenger à chaque lancement du serveur apache. Copiez donc ces lignes dans votre presse-papier (ctrl+c). Puis rendez-vous dans le dossier de configurations d'apache2.
Alors, là, ce peut malheureusement être différent pour chaque distribution. Le dossier Apache2 n'est jamais au même endroit. Bon, le plus souvent il est tout de même dans /etc. Autrement je vous invite à le trouver par vous-même comme ceci :
$ cd /
$ sudo find ./* -iname apache*
Cette commande, bien qu'un peu longue, devrait faire l'affaire pour vous permettre de trouver le dossier apache2. (Le i devant name, c'est pour non sensible à la casse).
Une fois ce dossier trouvé, allez dedans et vous devriez y voir le dossier 'conf.d'. Allez également dedans puis créez le fichier passenger.conf :
$ sudo touch passenger.conf
$ sudo vim passenger.conf
J'espère que vous connaissez l'éditeur vim ? (et qu'il est bien installé sur votre serveur). Pour ceux qui ne connaissent pas, vous devez appuyer sur la touche "insert" pour passer en mode édition. Pour quitter le mode édition, il faut appuyer sur "Echap". Donc, en mode édition, collez-y les lignes "LoadModules" fournies lors de l'installation du module passenger. Quittez le mode édition (échape) puis appuyez sur ":" puis mettez "wq" puis appuyez sur "entrée". Cela sauvegardera votre fichier et quittera vim. N'oubliez pas de l'éditer en tant que 'sudoer' autrement la sauvegarde ne passera pas.
Et voilà avec ça, vous n'avez plus qu'à relancer le serveur Apache (sudo /etc/init.d/apache2 restart) et en principe Passenger est correctement chargé et donc installé.
Mise en place de notre première application Rails
Bon, là encore cela dépend de votre configuration de départ. Moi j'ai Plesk, et les dossiers sont rangés d'une façon particulière. Gardez à l'idée que pour qu'une application Rails se lance correctement vous devrez trifouiller le fichier "virtual host (vhost)" de votre application. Et selon votre serveur, ce fichier ne se trouve pas toujours au même endroit. Là je ne peux malheureusement pas trop vous aider, à vous de le trouver à l'aide de la commande "find".
Ce que je vais indiquer ici fonctionne très bien sous Plesk. Sachez que la marche à suivre pour d'autres types d'interface d'administration est tout à fait similaire à celle que je vais expliquer. Donc ce n'est pas parce que vous n'avez pas Plesk que ce que je vais dire ne va pas vous être utile.
Sous Plesk (ou sous votre interface d'administration de votre serveur), créez un nouveau domaine. Par exemple "monapplirails.com". Lors de la création de ce domaine, Plesk (et toute interface d'administration) configure Apache et crée les dossiers adéquates pour que vous n'ayez plus qu'à télécharger vos fichiers par FTP pour pouvoir accéder à votre application à travers ce nom de domaine (évidemment, n'oubliez pas de faire les redirections DNS au niveau de l'organisme chargé de l'enregistrement de votre nom de domaine, je ne vais pas vous expliquer comment faire, ce n'est pas l'objet de ce billet).
Remarque : en principe les redirections DNS ne sont pas nécessaires pour une première visualisation de votre site. Une grande majorité d'hébergeurs offrent un domaine gratuit pour accéder en prévu à vos applications. Ca peut tout bonnement être l'adresse IP de votre serveur dédié. En principe, c'est indiqué.
Bon sauf que pour Rails, ce n'est pas aussi simple. Vous pouvez déjà télécharger les fichiers de votre application Rails dans le répertoire de votre application sur votre serveur dédié par (s)FTP (supprimez les éventuels fichiers qui s'y trouvent déjà).
Comme je vous le disais, il va falloir trifouiller le fichier vhost de votre application. Sous votre terminal, et connecté à votre serveur, trouvez donc ce fichier. Sous plesk, il se trouve dans : /var/www/vhosts/monapplirails.com/conf (si vous avez du mal à accéder au dossier, connectez-vous temporairement en tant que root : su root).
Ou plutôt il ne s'y trouve pas. Du moins, quand je crée un nouveau domaine sous plesk ce fichier n'est pas créé. Créez le donc :
$ sudo touch vhost.conf
$ sudo vim vhost.conf
Et insérez dedans les lignes suivantes : (toujours dans l'éditeur vim, je vous invite à lire de la documentation au sujet de cet éditeur pour éviter de faire n'importe quoi si vous ne le connaissez pas).
ServerName monapplirails.com
ServerAlias monapplirails.com.domaine_previsualisation.com
DocumentRoot /var/www/vhosts/serveur_dedie/monapplirails.com/public
RailsEnv "production"
<Directory "/var/www/vhosts/serveur_dedie/monapplirails.com/public" >
AllowOverride All
Options Indexes FollowSymLinks -MultiViews
XSendFile on
XSendFilePath "/var/www/vhosts/serveur_dedie/monapplirails.com/public"
</Directory>
Alors... ServerName : nom de votre serveur (en général le nom de domaine de votre application Web).
ServerAlias : Adresse secondaire pour accéder à votre application. En général, l'adresse de prévisualisation de votre site web. Facultatif !
DocumentRoot : Le répertoire public de votre application Rails. Pour connaître le chemin absolu vers ce répertoire, je vous invite à vous y rendre puis à exécuter la commande "pwd" dans votre terminal.
RailsEnv : l'environnement par défaut dans lequel doit s'exécuter votre application Rails. Ici c'est production. Mais vous pourriez mettre "test" si vous êtes encore en phase de test. Directory : Balise pour définir des configurations spécifiques pour le répertoire ciblé, ici le répertoire public. Les deux lignes suivantes sont communes à toutes applications rails et définissent les accès aux fichiers se trouvant dans le dossier public.
XSendFile & XSendFilePath : peut-être connaissez-vous le module "XSendFile" d'Apache ? Il permet d'envoyer des fichiers aux utilisateurs de vos applications Apache. Rails requiert ce module pour l'envoie de fichiers. Activez le donc et indiquez le répertoire dans lequel ces fichiers sont stockés. En général il s'agit du répertoire "public".
Et voilà, vous n'avez plus qu'à relancer Apache et en principe... ça ne marche pas ! Oui, il reste quelques petites choses à installer, évidemment ! Mais nous avons fait le gros du travail.
Les broutilles
Les Gems
Bon, première chose, maintenant que votre application Rails est sur votre serveur, il faut installer les Gems de cette dernière. Rendez-vous dans le répertoire racine de votre application Rails sur votre serveur dédié et faites un petit :
$ bundle install
Pour installer vos gems sur votre serveur.
NodeJS
Rails 3.x requiert nodejs du fait de coffeescript (notamment). Il vous faut l'installer. Je vous invite à suivre le tutoriel de la documentation Ubuntu pour cette installation. Il est très bien fait. Autrement vous pouvez vous rendez sur le site officiel de nodejs.
Module XSendFile et Fast CGI
Oui nous avions défini dans notre fichier Vhost.conf quelque chose à propos de XSendFile. Mais si ce module n'est pas installé, il faut l'installer :
$ sudo apt-get install libapache2-mod-xsendfile
Egalement vérifiez que le module FastCGI est activé pour votre application. Ce peut-être vérifié en principe dans votre interface d'administration quand vous cliquez sur 'gérer le domaine'. Sinon, il vous faudra l'installer et/ou configurer cela manuellement.
Configuration de l'application Rails
J'espère que vous n'avez pas oubliez de modifier le fichier conf/database.yml comme il faut pour pouvoir vous connecter à la base de données de votre serveur dédié. N'oubliez pas également de :
Créez la base de donnée : RAILS_ENV=production rake db:create
Migrer : RAILS_ENV=production rake db:migrate
Précompiler les 'assets' : rake assets:precompile
Configurer action_mailer dans production.rb pour l'envoie de mails, et dans ce cas, créer l'adresse mail adéquate (moi j'ai réussi à faire ça avec Plesk + QMail + le port 587 sur Ubuntu - je pourrai créer un nouveau billet si besoin)
N'oubliez pas aussi de configurer comme il faut vos fichiers conf/application.rb et conf/environments/production.rb . Par exemple, il faut activer xsendfile pour chaque application Rails dans l'environnement de production. En principe, il s'agit d'une toute petite ligne à dé-commenter. C'est même marqué que c'est fait pour "Apache". Et il y a même l'équivalent pour NGinx (sont merveilleux ces développeurs Rails).
Paperclip
Il reste le cas particulier de la gem Paperclip, tellement utilisée que je l'intègre dans ce tutoriel. Pour qu'elle fonctionne correctement, n'oubliez pas qu'elle a besoin d'ImageMagick + que vous spécifiez dans production.rb le chemin vers l'exécutable d'ImageMagick. C'est expliqué dans la documentation de la Gem.
Pour installer ImageMagick, il faut installer : libmagickcore-dev et libmagickwand-dev. Après vous pourrez installer ImageMagick. Des "sudo apt-get install" devraient faire l'affaire. Et voilà, je crois n'avoir rien oublié. Si c'est le cas, n'hésitez pas à me faire signe. J'espère que ce petit guide permettra à d'autres que moi d'avoir un pense-bête sur ce qu'il faut faire pour mettre en place une nouvelle application Rails. Grâce à Passenger mettre en place une nouvelle application Rails est très rapide : création du domaine dans l'interface d'administration, upload des fichiers par FTP, création et/ou édition du fichier vhost.conf, installation des gems, restart du serveur Apache et voilà !
Notez que je ne fais pas mention de Capistrano, c'est une autre histoire et ce sera sûrement l'objet d'un autre billet.
Index
--
Article précédent: Créer un petit éditeur de texte pour forums - Etape 2
--
Article suivant: Les encodages Ruby
3 Commentaire
Hello,
Ce tutoriel avait été rédigé avec la version 12.04 LTS d'Ubuntu.
Par Kulgar, le 6 Juillet 2015
Tu peux nous dire quelle distribution d'ubuntu tu utilises ?
Par pseud, le 6 Juillet 2015
Très bon tutoriel !
Merci beaucoup, j'ai moi-même fait un tutoriel, mais avec Nginx qui est moins gourmand en ressources :
http://paulgruson.fr/2014/04/23/ror-deployer-votre-application-avec-capistrano-nginx-et-unicorn/
Merci !
Par Paul Gruson, le 24 Avril 2014