grosse relecture et évolutions
This commit is contained in:
parent
c16787330f
commit
4db0d7b7bb
560
HowtoRails.md
560
HowtoRails.md
|
@ -1,138 +1,268 @@
|
||||||
**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.**
|
---
|
||||||
|
categories: web
|
||||||
|
title: Howto Rails
|
||||||
|
...
|
||||||
|
|
||||||
# Howto Rails
|
* Documentation : <https://guides.rubyonrails.org/>
|
||||||
|
* YAML Cookbook for Ruby : <http://www.yaml.org/YAML_for_ruby.html>
|
||||||
|
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/rbenv>
|
||||||
|
|
||||||
<http://blog.phusion.nl/2012/09/21/the-right-way-to-deal-with-frozen-processes-on-unix/>
|
[Ruby On Rails](https://rubyonrails.org/) est un framework web libre écrit en Ruby appliquant le principe MVC (Modèle-Vue-Contrôleur). Nous l'utilisons notamment dans le logiciel [Chexpire](https://chexpire.org/).
|
||||||
|
|
||||||
Mettre en place un environnement de production "Ruby On Rails" exige de trouver les bons compromis
|
## Installation
|
||||||
entre les composants système - stable et robuste par nature - et l'environnement de développement
|
|
||||||
"Ruby On Rails" très volatile et changeant. Voici comment nous mettons cela en oeuvre.
|
|
||||||
|
|
||||||
## Cas 1 : utilisation avec Passenger
|
### Installation avec rbenv
|
||||||
|
|
||||||
* [Documentation de Passenger pour Apache](http://modrails.com/documentation/Users%20guide%20Apache.html)
|
[rbenv](https://github.com/rbenv/rbenv) permet d'avoir un environnement compilé par utilisateur.
|
||||||
* [Documentation de Ruby Enterprise Edition](http://www.rubyenterpriseedition.com/documentation.html)
|
C'est donc le développeur qui gère sa version de Ruby, ses Gems, etc... on ne lui installe même pas Ruby !
|
||||||
* [Un howto pour Yaml](http://www.yaml.org/YAML_for_ruby.html) (en parallèle avec Ruby, mais simple à comprendre)
|
|
||||||
|
|
||||||
### Installation
|
> *Note* : vous devez mettre les droits `exec` sur la partition */home* pour cette installation
|
||||||
|
|
||||||
On installe d'abord Ruby 1.8 et ses dépendances utiles (`irb`, `rdoc`, `ri`, …).
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
# aptitude install ruby-full irb rubygems rails libactionpack-ruby1.8 libactionmailer-ruby1.8
|
# apt install rbenv build-essential libssl-dev libreadline-dev zlib1g-dev
|
||||||
~~~
|
# apt install liblzma-dev libmariadbclient-dev
|
||||||
|
|
||||||
Installer les bindings MySQL et OpenSSL (voir [#les-gems Les gems]) :
|
$ eval "$(rbenv init -)"
|
||||||
|
$ mkdir ~/.rbenv/plugins
|
||||||
|
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
|
||||||
|
$ rbenv install --list
|
||||||
|
$ TMPDIR=~/tmp rbenv install 2.5.1
|
||||||
|
$ rbenv global 2.5.1
|
||||||
|
$ gem install bundler rails
|
||||||
|
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
|
||||||
|
|
||||||
|
$ ruby -v
|
||||||
|
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
|
||||||
|
|
||||||
|
$ gem list
|
||||||
|
|
||||||
|
*** LOCAL GEMS ***
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
# aptitude install libmysql-ruby libopenssl-ruby libmysqlclient15-dev
|
actioncable (5.2.1)
|
||||||
~~~
|
actionmailer (5.2.1)
|
||||||
|
actionpack (5.2.1)
|
||||||
|
actionview (5.2.1)
|
||||||
|
activejob (5.2.1)
|
||||||
|
activemodel (5.2.1)
|
||||||
|
activerecord (5.2.1)
|
||||||
|
activestorage (5.2.1)
|
||||||
|
activesupport (5.2.1)
|
||||||
|
arel (9.0.0)
|
||||||
|
bigdecimal (default: 1.3.4)
|
||||||
|
builder (3.2.3)
|
||||||
|
bundle (0.0.1)
|
||||||
|
bundler (1.16.3)
|
||||||
|
[…]
|
||||||
|
~~~~
|
||||||
|
|
||||||
### Les gems #les-gems
|
|
||||||
|
|
||||||
Les gems sont des paquets contentant des librairies et/ou des applications écrites en Ruby. Elles sont énormément utilisées, notamment dans Rails.
|
### Installation avec ruby système
|
||||||
|
|
||||||
Par défaut, aucune librairie n'est installée sous forme de gem à part les bindings MySQL et Rack (qui est une dépendance de Passenger)
|
Cela permet de bénéficier des mises à jour de sécurité de Ruby, tout en gérant les Gems par utilisateur.
|
||||||
Il est préférable d'installer les bindings MySQL à la main (`libmysql-ruby`) car ils nécessitent la compilation d'extensions en C et
|
|
||||||
risquent d'être utilisés par tous les utilisateurs.
|
|
||||||
|
|
||||||
OpenSSL fait normalement partie de la librairie standard Ruby, mais n'est pas inclus dans Debian. Rails en a besoin pour fonctionner, il convient
|
|
||||||
donc d'installer `libopenssl-ruby` manuellement.
|
|
||||||
|
|
||||||
### Ruby Enterprise Edition (REE)
|
|
||||||
|
|
||||||
REE est une version patchée de Ruby optimisée pour les applications Web et créée par les mêmes développeurs que Passenger.
|
|
||||||
REE est donc censé s'intégrer parfaitement avec Passenger.
|
|
||||||
|
|
||||||
Des paquets (ubuntu) existent pour REE, mais le plus simple est de le compiler à la main.
|
|
||||||
Par défaut il s'installera dans le dossier `/opt`, en totale isolation du reste du système.
|
|
||||||
Rubygems est livré avec REE, et est placé dans le dossier de ce dernier.
|
|
||||||
|
|
||||||
Il suffit de récupérer une [archive des sources sur le site de REE](http://rubyenterpriseedition.com),
|
|
||||||
de la décompresser et de lancer le script `./installer --no-dev-docs` en tant que root. Le reste de la procédure est indiqué
|
|
||||||
par l'installateur.
|
|
||||||
|
|
||||||
À noter qu'il faut avoir installé les paquets `libreadline-dev`, `libz-dev`, `libssl-dev` et avoir une suite de
|
|
||||||
compilation fonctionnelle (gcc, g++, make, patch, …)
|
|
||||||
|
|
||||||
### Utilisation avec Passenger
|
|
||||||
|
|
||||||
Passenger est livré avec REE sous forme de gem, on peut donc l'installer juste après REE. Le mode d'installation est alors quelque peu différent :
|
|
||||||
|
|
||||||
Avant tout on installe toutes les librairies nécessaires : celles de REE listées précédemment, plus les libs de développement d'Apache
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
# aptitude install libreadline-dev libz-dev libssl-dev apache2-prefork-dev libcurl4-openssl-dev
|
# apt install ruby ruby-dev rails
|
||||||
~~~
|
# apt install liblzma-dev libmariadbclient-dev
|
||||||
|
|
||||||
On installe ensuite REE selon la procédure définie ci-dessus, et une fois cette installation terminée, on lance la commande :
|
$ export PATH="$HOME/.gem/ruby/2.3.0/bin:$PATH"
|
||||||
|
$ gem install bundler
|
||||||
|
$ echo 'PATH="$HOME/.gem/ruby/2.3.0/bin:$PATH"' >> ~/.bashrc
|
||||||
|
|
||||||
|
$ ruby -v
|
||||||
|
ruby 2.3.3p222 (2016-11-21) [x86_64-linux-gnu]
|
||||||
|
|
||||||
|
$ gem list
|
||||||
|
|
||||||
|
*** LOCAL GEMS ***
|
||||||
|
|
||||||
|
actionmailer (4.2.7.1)
|
||||||
|
actionpack (4.2.7.1)
|
||||||
|
actionview (4.2.7.1)
|
||||||
|
activejob (4.2.7.1)
|
||||||
|
activemodel (4.2.7.1)
|
||||||
|
activerecord (4.2.7.1)
|
||||||
|
activesupport (4.2.7.1)
|
||||||
|
arel (6.0.3)
|
||||||
|
atomic (1.1.16)
|
||||||
|
bigdecimal (1.2.8)
|
||||||
|
binding_of_caller (0.7.2)
|
||||||
|
blankslate (3.1.3)
|
||||||
|
builder (3.2.2)
|
||||||
|
bundle (0.0.1)
|
||||||
|
bundler (1.16.3, 1.13.6)
|
||||||
|
[…]
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
|
||||||
|
## Utilisation
|
||||||
|
|
||||||
|
### Démarrer un projet Rails
|
||||||
|
|
||||||
|
<https://guides.rubyonrails.org/getting_started.html>
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
/opt/ruby-enterprise-<version>/bin/passenger-install-apache2-module
|
$ rails --version
|
||||||
|
Rails 4.2.7.1
|
||||||
|
|
||||||
|
$ rails new foo
|
||||||
|
$ cd foo
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
L'installateur nous guide dans la procédure. Dans le cas ou le MPM d'Apache est ITK, il préviendra :
|
On peut alors ajuster la configuration (routes, base de données, etc.), coder son projet, le stocker dans un repository Git, etc.
|
||||||
|
|
||||||
|
Pour voir en local le résultat :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
WARNING: Apache doesn't seem to be compiled with the 'prefork' or 'worker' MPM
|
$ cd foo
|
||||||
|
$ ./bin/rails server
|
||||||
|
=> Booting WEBrick
|
||||||
|
=> Rails 4.2.7.1 application starting in development on http://localhost:3000
|
||||||
|
=> Run `rails server -h` for more startup options
|
||||||
|
=> Ctrl-C to shutdown server
|
||||||
|
[2018-08-12 11:43:15] INFO WEBrick 1.3.1
|
||||||
|
[2018-08-12 11:43:15] INFO ruby 2.3.3 (2016-11-21) [x86_64-linux-gnu]
|
||||||
|
[2018-08-12 11:43:15] INFO WEBrick::HTTPServer#start: pid=12383 port=3000
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
On peut cependant continuer l'installation en ignorant l'avertissement. Une fois terminée, l'installateur donne la configuration pour Apache
|
On peut alors le visualiser sur <http://127.0.0.1:3000>
|
||||||
|
|
||||||
Dans `/etc/apache2/mods-available/passenger.load` on mettra la ligne :
|
### Les environnements de Rails
|
||||||
|
|
||||||
|
Rails propose trois environnements d'exécution distincts·: `production`, `development` et `test`.
|
||||||
|
|
||||||
|
Chacun a un but précis facilement devinable depuis son nom.
|
||||||
|
|
||||||
|
Pour lancer dans un certain environnement les commandes qui agissent avec l'application (par exemple les
|
||||||
|
tâches [Rake](http://guides.rubyonrails.org/command_line.html#rake-is-ruby-make)), il suffit de définir la
|
||||||
|
variable d'environnement RAILS_ENV, par exemple·:
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
LoadModule passenger_module /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-3.0.0/ext/apache2/mod_passenger.so
|
$ RAILS_ENV=production rake db:migrate
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
et dans `/etc/apache2/mods-available/passenger.conf` :
|
### Redémarrage optimisé
|
||||||
|
|
||||||
|
Pour redémarrer une application Rails de façon optimisée, il suffit de créer ou de mettre à jour le timestamp du fichier
|
||||||
|
`tmp/restart.txt` (avec la commande `touch` par exemple). À la prochaîne requête, l'application sera redémarrée et tout l'environement chargé de nouveau.
|
||||||
|
|
||||||
|
Pour que l'application redémarre à chaque requête on peut aussi créer un fichier `tmp/always_restart.txt` et le supprimer une fois qu'on ne souhaite plus ce comportement.
|
||||||
|
|
||||||
|
### Unité systemd
|
||||||
|
|
||||||
|
TODO, cf https://wiki.evolix.org/HowtoSystemd#systemd-par-utilisateur
|
||||||
|
|
||||||
|
### Les Gems et Bundler
|
||||||
|
|
||||||
|
Les [Gems](https://rubygems.org/) sont des paquets contentant des librairies et/ou des applications écrites en Ruby.
|
||||||
|
Elles sont souvent utilisées, notamment dans Rails.
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
<IfModule passenger_module>
|
$ gem -v
|
||||||
PassengerRoot /opt/ruby-enterprise-<version>/lib/ruby/gems/1.8/gems/passenger-3.0.0
|
2.5.2.1
|
||||||
PassengerRuby /opt/ruby-enterprise-<version>/bin/ruby
|
|
||||||
|
|
||||||
PassengerEnabled off
|
$ gem list
|
||||||
#RailsAutoDetect off
|
|
||||||
#RackAutoDetect off
|
|
||||||
PassengerFriendlyErrorPages off
|
|
||||||
|
|
||||||
</IfModule>
|
$ gem env
|
||||||
|
RubyGems Environment:
|
||||||
|
- RUBYGEMS VERSION: 2.5.2.1
|
||||||
|
- RUBY VERSION: 2.3.3 (2016-11-21 patchlevel 222) [x86_64-linux-gnu]
|
||||||
|
[…]
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Puis : `a2enmod passenger`
|
Les Gems peuvent se trouver à plusieurs endroits :
|
||||||
|
|
||||||
Une fois REE installé il reste un dernier soucis, les binaires sont dans `/opt/ruby-enterprise-<version>/bin`,
|
* installée par un paquet Debian (`/usr/lib/ruby/2.3.0/`)
|
||||||
et pour que les utilisateurs puissent les utiliser il y a deux options possibles :
|
* installée en temps que Gem système (`/var/lib/gems/2.3.0/`)
|
||||||
|
* installée en temps que Gem utilisateur (`~/.gem/ruby/2.3.0/`)
|
||||||
|
|
||||||
1. Rajouter ce chemin dans le PATH par défaut de tous les utilisateurs.
|
Une application Rails contient un fichier `Gemfile` qui précise les Gems nécessaires et leurs versions :
|
||||||
1. Créer des liens symboliques dans `/usr/bin`.
|
|
||||||
|
|
||||||
Pour la deuxième solution, le script suivant permet d'automatiser la tâche :
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
#!/bin/bash
|
source 'https://rubygems.org'
|
||||||
cd /usr/bin
|
|
||||||
for i in `ls -1d /opt/ruby-enterprise-*/bin/*`; do
|
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
||||||
ln -s $i
|
gem 'rails', '4.2.7.1'
|
||||||
done
|
# Use sqlite3 as the database for Active Record
|
||||||
|
gem 'sqlite3'
|
||||||
|
# Use SCSS for stylesheets
|
||||||
|
gem 'sass-rails', '~> 5.0'
|
||||||
|
# Use Uglifier as compressor for JavaScript assets
|
||||||
|
gem 'uglifier', '>= 1.3.0'
|
||||||
|
[…]
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
|
[Bundler](https://bundler.io/) est l'outil de prédilection pour installer les Gems nécessaires.
|
||||||
|
|
||||||
### Configuration de Passenger/mod_rails
|
Avec la présence d'un fichier `Gemfile`, il suffit de lancer la commande :
|
||||||
|
|
||||||
Par défaut, Passenger est activé pour tous les sites d'Apache et propose une auto-détection des environnements Rails et Rack,
|
~~~
|
||||||
on commence par désactiver ce comportement dans `/etc/apache2/mods-available/passenger.conf` :
|
$ bundle install
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Un snapshot des Gems installées est aussi gardé dans un fichier `Gemfile.lock` permettant d'accélérer la résolution des dépendances.
|
||||||
|
|
||||||
|
En général, on inclut les fichiers `Gemfile` et `Gemfile.lock` dans le repository du projet.
|
||||||
|
|
||||||
|
### Capistrano
|
||||||
|
|
||||||
|
[Capistrano](https://capistranorb.com/) est un outil de déploiement populaire, notamment pour les applications Rails.
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
|
||||||
|
## Serveur web
|
||||||
|
|
||||||
|
Pour une utilisation en production d'une application Rails, on peut utiliser plusieurs solutions : Puma, Unicorn, Passenger, etc.
|
||||||
|
|
||||||
|
### Puma
|
||||||
|
|
||||||
|
[Puma](http://puma.io/) est...
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### Unicorn
|
||||||
|
|
||||||
|
[Unicorn](https://bogomips.org/unicorn/) est...
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### Passenger
|
||||||
|
|
||||||
|
TODO : à tester / ajuster
|
||||||
|
|
||||||
|
[Passenger](https://www.phusionpassenger.com/) est un serveur d'application qui propose des fonctionnalités avancées.
|
||||||
|
|
||||||
|
On peut l'installer sous forme de Gem pour le développement :
|
||||||
|
|
||||||
|
~~~
|
||||||
|
$ gem install passenger
|
||||||
|
|
||||||
|
$ passenger start
|
||||||
|
=============== Phusion Passenger Standalone web server started ===============
|
||||||
|
Environment: development
|
||||||
|
Accessible via: http://0.0.0.0:3000/
|
||||||
|
You can stop Phusion Passenger Standalone by pressing Ctrl-C.
|
||||||
|
~~~
|
||||||
|
|
||||||
|
On peut l'installer pour [Apache](HowtoApache) ainsi :
|
||||||
|
|
||||||
|
~~~
|
||||||
|
# apt install libapache2-mod-passenger
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Par défaut, Passenger est activé pour tous les sites d'Apache et propose une auto-détection des environnements Rails et Rack, on commence par désactiver ce comportement dans `/etc/apache2/mods-available/passenger.conf` ainsi que d'autres ajustements :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
<IfModule mod_passenger.c>
|
<IfModule mod_passenger.c>
|
||||||
PassengerRoot /usr
|
PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
|
||||||
PassengerRuby /usr/bin/ruby1.8
|
PassengerDefaultRuby /usr/bin/ruby
|
||||||
|
|
||||||
# On ajoute les lignes suivantes:
|
# On ajoute les lignes suivantes:
|
||||||
PassengerEnabled off
|
PassengerEnabled off
|
||||||
RailsAutoDetect off
|
RailsAutoDetect off
|
||||||
RackAutoDetect off
|
RackAutoDetect off
|
||||||
|
PassengerFriendlyErrorPages off
|
||||||
|
|
||||||
PassengerTempDir /var/tmp/
|
PassengerTempDir /var/tmp/
|
||||||
PassengerUploadBufferDir /var/tmp
|
PassengerUploadBufferDir /var/tmp
|
||||||
|
@ -142,279 +272,85 @@ on commence par désactiver ce comportement dans `/etc/apache2/mods-available/pa
|
||||||
</IfModule>
|
</IfModule>
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
### Exemple de VirtualHost pour Rails
|
> *Note* : Passenger stocke tous ses fichiers temporaires dans le répertoire /tmp/ par défaut. Pour diverses raisons (de place, de droits voire de performance), il peut être intéressant d'en définir un autre. Cela ce fait via la directive Apache du module Passenger `PassengerTempDir`.
|
||||||
|
|
||||||
|
Et voici un VirtualHost minimal pour Apache :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
<VirtualHost *:80>
|
<VirtualHost>
|
||||||
ServerName redmine.evolix.net
|
ServerName foo.example.com
|
||||||
PassengerEnabled on
|
PassengerEnabled on
|
||||||
RailsAutoDetect on
|
RailsAutoDetect on
|
||||||
|
#RailsEnv development
|
||||||
|
|
||||||
DocumentRoot /home/redmine/www/public
|
DocumentRoot /home/foo/www/current
|
||||||
<Directory /home/redmine/www/public>
|
<Directory /home/redmine/www/current>
|
||||||
Allow from all
|
Allow from all
|
||||||
Options -MultiViews
|
Options -MultiViews
|
||||||
</Directory>
|
</Directory>
|
||||||
|
|
||||||
# Pour Apache 2 ITK
|
# Pour Apache ITK
|
||||||
AssignUserID {user} {group}
|
AssignUserID foo foo
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
* [#apache-itk-users Information complémentaire sur Apache ITK]
|
> *Note* : Passenger détermine sous quel utilisateur il va lancer l'application en se basant sur le propriétaire du fichier `config/environment.rb` de l'application Rails. Pour Apache ITK, il faut donc y placer un propriétaire identique à celui utilisé dans `AssignUserID`.
|
||||||
* [Script de génération de VHost](http://forge.evolix.org/scm/viewvc.php/trunk/scripts/create_rails_vhost?view=markup&root=packweb)
|
|
||||||
|
|
||||||
### Trucs, astuces et détails
|
> *Note* : par défaut, Passenger fait tourner l'application en mode *production*. On peut forcer un certain environnement en ajustant la directive `RailsEnv` dans le VirtualHost.
|
||||||
|
|
||||||
#### Apache ITK #apache-itk-users
|
|
||||||
|
|
||||||
Passenger détermine sous quel utilisateur il va lancer l'application en se basant sur le propriétaire du fichier
|
## FAQ
|
||||||
`config/environment.rb` de l'application Rails.
|
|
||||||
|
|
||||||
Il faut donc y placer un propriétaire identique à celui utilisé dans AssignUserID
|
### GEM_HOME
|
||||||
|
|
||||||
#### Les environnements de Rails
|
On peut forcer l'environnement des Gems (pour ignorer `/var/lib/gems/2.3.0` par exemple) :
|
||||||
|
|
||||||
Rails propose trois environnements d'exécution distincts : `production`, `development` et `test`.
|
|
||||||
|
|
||||||
Chacun a un but précis facilement devinable depuis son nom.
|
|
||||||
|
|
||||||
Par défaut, Passenger fait tourner l'application en mode production. On peut forcer un certain environnement
|
|
||||||
en plaçant la directive `RailsEnv <env>` dans le fichier de configuration du VHost.
|
|
||||||
|
|
||||||
Pour lancer dans un certain environnement les commandes qui agissent avec l'application (par exemple les
|
|
||||||
tâches [Rake](http://guides.rubyonrails.org/command_line.html#rake-is-ruby-make)), il suffit de définir la
|
|
||||||
variable d'environnement RAILS_ENV, par exemple :
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
$ RAILS_ENV=production rake db:migrate
|
$ export GEM_HOME=/$HOME/.gem/ruby/2.3.0
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
#### Redémarrage de l'application
|
### Ruby Enterprise Edition (REE)
|
||||||
|
|
||||||
Pour redémarrer une application Rails, il suffit de créer ou de mettre à jour le timestamp du fichier
|
<http://rubyenterpriseedition.com/documentation.html>
|
||||||
`tmp/restart.txt` (avec la commande `touch` par exemple). À la prochaîne requête, l'application sera
|
|
||||||
redémarrée et tout l'environement chargé de nouveau.
|
|
||||||
|
|
||||||
Pour que l'application redémarre à chaque requête on peut aussi créer un fichier `tmp/always_restart.txt`
|
[REE](http://rubyenterpriseedition.com/) est une version patchée de Ruby optimisée pour les applications Web et créée par les mêmes développeurs que Passenger.
|
||||||
et le supprimer une fois qu'on ne souhaite plus ce comportement.
|
On peut l'installer en le compilant à la main (par défaut il s'installera dans e dossier `/opt` en totale isolation du reste du système)
|
||||||
|
Il suffit de récupérer [les sources](http://rubyenterpriseedition.com/download.html), de la décompresser et de lancer le script `./installer --no-dev-docs` en tant que root. Le reste de la procédure est indiqué par l'installateur.
|
||||||
|
Les dépendances classiques de compilations seront nécessaires (`apt install build-essential libssl-dev libreadline-dev zlib1g-dev`).
|
||||||
|
|
||||||
#### `umask`s spéciaux
|
Si l'on utilise avec Passenger, on pourra forcer l'utilisation de REE ainsi :
|
||||||
|
|
||||||
Sur certains système, l'umask par défaut rend les fichiers installés par root non lisibles par le commun des utilisateurs.
|
|
||||||
Si celà est une bonne idée, combinée avec Rubygems et Apache ITK, celà devient moins évident, et il faut veiller
|
|
||||||
à `chmod`er correctement le dossier de Ruby pour que tous les utilisateurs puissent l'utiliser.
|
|
||||||
|
|
||||||
Un exemple avec REE :
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
# chmod -R u=rwX,g=rX,o=rX /opt/ruby-enterprise-1.8.7-2010.02/
|
<IfModule passenger_module>
|
||||||
|
PassengerRoot /opt/ruby-enterprise-<version>/lib/ruby/gems/1.8/gems/passenger-3.0.0
|
||||||
|
PassengerRuby /opt/ruby-enterprise-<version>/bin/ruby
|
||||||
|
</IfModule>
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
#### Priorités de chargement
|
### Lister les Gems
|
||||||
|
|
||||||
Par défaut, même lorsque `rubygems` est activé, Ruby utilisera en priorité les librairies système
|
Il n'existe pas de moyen de lister les Gems installées uniquement sur le système, la commande `gem` cherche
|
||||||
(celles installées par les paquets) plutôt que les gems. On peut cependant forcer l'utilisation d'une gem,
|
|
||||||
et même fixer la version désirée (sinon c'est la plus récente qui est automatiquement utilisée).
|
|
||||||
|
|
||||||
Cette gestion des versions doit être faite par le développeur, qui peut installer les librairies qu'il souhaite indépendamment du système.
|
|
||||||
L'important est de savoir qu'il y a trois endroits ou on peut trouver une librairie Ruby :
|
|
||||||
|
|
||||||
* Installée par un paquet (`/usr/lib/ruby/1.8/`)
|
|
||||||
* Installée en temps que gem système (`/var/lib/gems/1.8/`)
|
|
||||||
* Installée en temps que gem utilisateur (`~/.gem/ruby/1.8/`)
|
|
||||||
|
|
||||||
#### Lister les gems
|
|
||||||
|
|
||||||
Il n'existe pas de moyen de lister les gems installées uniquement sur le système, la commande `gem` cherche
|
|
||||||
à la fois dans le dossier `.gem` de l'utilisateur et le dossier système. La solution est d'utiliser un script
|
à la fois dans le dossier `.gem` de l'utilisateur et le dossier système. La solution est d'utiliser un script
|
||||||
spécialisé qui fait cette recherche.
|
spécialisé qui fait cette recherche (un script `list_gems` doit traîner dans un coin…).
|
||||||
|
|
||||||
Le script est disponible dans le dépôt Subversion du Pack Web Evolix, dans
|
### Économiser un peu d'espace
|
||||||
[trunk/scripts/list_gems](http://forge.evolix.org/scm/viewvc.php/trunk/scripts/list_gems?view=markup&root=packweb).
|
|
||||||
|
|
||||||
#### Économiser un peu d'espace
|
|
||||||
|
|
||||||
Par défaut, `gem` installe la documentation aux formats RDoc (documentation html) et RI (documentation console)
|
Par défaut, `gem` installe la documentation aux formats RDoc (documentation html) et RI (documentation console)
|
||||||
pour les gems installées. Pour éviter celà, créer un fichier `.gemrc` dans la `$HOME` de l'utilisateur avec le
|
pour les Gems installées. Pour éviter celà, créer un fichier `.gemrc` dans la `$HOME` de l'utilisateur avec le
|
||||||
contenu suivant :
|
contenu suivant :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
gem: --no-rdoc --no-ri
|
gem: --no-rdoc --no-ri
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
À mettre aussi dans la `$HOME` de `root` si c'est lui qui installe les gems.
|
### rails_env
|
||||||
|
|
||||||
#### Rails 2.3.2->2.3.5 & Passenger & les logs
|
|
||||||
|
|
||||||
Une petite erreur en environnement de production affecte les versions 2.3.2 à 2.3.5 (incluse) de Rails. Les logs
|
|
||||||
de l'application ne sont pas écrits dans le fichier `log/production.log`. Pour pallier cette erreur, il faut appliquer
|
|
||||||
le patch qu'on trouve [ici](https://rails.lighthouseapp.com/projects/8994/tickets/3577-failsafe-middleware-should-flush-the-logger)
|
|
||||||
(deuxième fichier).
|
|
||||||
|
|
||||||
#### Répertoire temporaire de Passenger
|
|
||||||
|
|
||||||
Passenger stocke tous ses fichiers temporaires dans le répertoire /tmp/ par défaut. Pour diverses raisons (de place, de droits voire de performance), il peut être intéressant d'en définir un autre. Cela ce fait via la directive Apache du module Passenger _PassengerTempDir_. Par exemple, nous mettons :
|
|
||||||
|
|
||||||
~~~
|
|
||||||
PassengerTempDir /var/tmp/
|
|
||||||
~~~
|
|
||||||
|
|
||||||
### Mise à jour de Passenger
|
|
||||||
|
|
||||||
Passenger est installé en tant que gem dans _/opt/ruby-enterprise-<version-ree>/lib/ruby/gems/1.8/gems/_.
|
|
||||||
Voici la procédure pour le mettre à jour :
|
|
||||||
|
|
||||||
~~~
|
|
||||||
gem update passenger
|
|
||||||
~~~
|
|
||||||
|
|
||||||
~~~
|
|
||||||
/opt/ruby-enterprise-<version-ree>/lib/ruby/gems/1.8/gems/passenger-<nouvelle-version-passenger>/bin/passenger-install-apache2-module
|
|
||||||
|
|
||||||
~~~
|
|
||||||
Puis modifier les chemins vers mod_passenger dans la conf d'Apache _/etc/apache2/mod-available/passenger_.{conf,load} pour pointer vers la nouvelle version (notamment les directives _LoadModule_ et _PassengerRoot_).
|
|
||||||
Enfin, redémarrer Apache pour prendre en compte le nouveau module.
|
|
||||||
|
|
||||||
### Mise à jour de REE
|
|
||||||
|
|
||||||
Pour mettre à jour REE, il suffit de recommencer la procédure d'installation, la nouvelle version sera installé dans /opt/ruby-enterprise-<nouvelle-version> et ne perturbera donc pas la prod existante.
|
|
||||||
|
|
||||||
Pour prendre en compte la nouvelle installation de REE, il faut modifier les chemins vers REE dans la configuration d'Apache.
|
|
||||||
|
|
||||||
*Important :* pour la migration de REE 1.8.7-2010.02 vers 1.8.7-2011.01, il faut ajouter cette directive dans la configuration d'Apache :
|
|
||||||
|
|
||||||
~~~
|
|
||||||
RackBaseURI /
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Et enlever les éventuelles directives `RailkBaseURI`.
|
|
||||||
|
|
||||||
|
|
||||||
## Cas 2 : utilisation avec rbenv + Unicorn
|
|
||||||
|
|
||||||
*rbenv* permet d'avoir un environnement compilé par utilisateur.
|
|
||||||
C'est donc le développeur qui gère sa version de Ruby, ses Gems, etc...
|
|
||||||
on ne lui installe même pas Ruby !
|
|
||||||
|
|
||||||
Note préalable : mettre les droits _exec_ sur la partition /home
|
|
||||||
|
|
||||||
~~~
|
|
||||||
# aptitude install build-essential curl mg
|
|
||||||
~~~
|
|
||||||
|
|
||||||
~~~
|
|
||||||
# aptitude install python-pygments zlib1g-dev libxml2-dev \
|
|
||||||
libxslt1-dev libmysqlclient-dev libcurl4-openssl-dev \
|
|
||||||
libmagickcore-dev libmagickwand-dev libreadline-dev imagemagick
|
|
||||||
~~~
|
|
||||||
|
|
||||||
~~~
|
|
||||||
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
|
|
||||||
$ git clone git://github.com/sstephenson/ruby-build.git .rbenv/plugins/ruby-build
|
|
||||||
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
|
|
||||||
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
|
|
||||||
$ . .bash_profile
|
|
||||||
$ rbenv install 1.9.2-p290
|
|
||||||
$ rbenv global 1.9.2-p290
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Astuces diverses :
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
rails_env = `head -1 $(HOME}/www/current/config/database.yml | tr ':' ' '`
|
rails_env = `head -1 $(HOME}/www/current/config/database.yml | tr ':' ' '`
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
### Debian 9
|
### Rails 2.3.2->2.3.5 & Passenger & les logs
|
||||||
|
|
||||||
#### Utiliser une version spécifique de ruby avec rbenv
|
Une petite erreur en environnement de production affecte les versions 2.3.2 à 2.3.5 (incluse) de Rails. Les logs de l'application ne sont pas écrits dans le fichier `log/production.log`. Pour pallier cette erreur, il faut appliquer le patch qu'on trouve [ici](https://rails.lighthouseapp.com/projects/8994/tickets/3577-failsafe-middleware-should-flush-the-logger) (deuxième fichier).
|
||||||
|
|
||||||
*rbenv* permet d'avoir un environnement compilé par utilisateur.
|
|
||||||
|
|
||||||
C'est donc le développeur qui gère sa version de Ruby, ses Gems, etc... on ne lui installe même pas Ruby !
|
|
||||||
|
|
||||||
Note préalable : mettre les droits _exec_ sur la partition /home
|
|
||||||
|
|
||||||
~~~
|
|
||||||
# apt install build-essential curl mg
|
|
||||||
# apt install python-pygments zlib1g-dev libxml2-dev \
|
|
||||||
libxslt1-dev libmysqlclient-dev libcurl4-openssl-dev \
|
|
||||||
libmagickcore-dev libmagickwand-dev libreadline-dev imagemagick
|
|
||||||
# apt install rbenv libssl-dev
|
|
||||||
|
|
||||||
$ eval "$(rbenv init -)"
|
|
||||||
$ mkdir ~/.rbenv/plugins
|
|
||||||
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
|
|
||||||
$ rbenv install --list
|
|
||||||
$ TMPDIR=~/tmp rbenv install 2.5.1
|
|
||||||
$ rbenv global 2.5.1
|
|
||||||
$ gem install bundle
|
|
||||||
|
|
||||||
$ ruby -v
|
|
||||||
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
|
|
||||||
$ gem list
|
|
||||||
*** LOCAL GEMS ***
|
|
||||||
|
|
||||||
bigdecimal (default: 1.3.4)
|
|
||||||
bundle (0.0.1)
|
|
||||||
bundler (1.16.3)
|
|
||||||
cmath (default: 1.0.0)
|
|
||||||
csv (default: 1.0.0)
|
|
||||||
date (default: 1.0.0)
|
|
||||||
did_you_mean (1.2.0)
|
|
||||||
etc (default: 1.0.0)
|
|
||||||
fcntl (default: 1.0.0)
|
|
||||||
fiddle (default: 1.0.0)
|
|
||||||
fileutils (default: 1.0.2)
|
|
||||||
io-console (default: 0.4.6)
|
|
||||||
ipaddr (default: 1.2.0)
|
|
||||||
json (default: 2.1.0)
|
|
||||||
minitest (5.10.3)
|
|
||||||
net-telnet (0.1.1)
|
|
||||||
openssl (default: 2.1.0)
|
|
||||||
power_assert (1.1.1)
|
|
||||||
psych (default: 3.0.2)
|
|
||||||
rake (12.3.0)
|
|
||||||
rdoc (default: 6.0.1)
|
|
||||||
scanf (default: 1.0.0)
|
|
||||||
sdbm (default: 1.0.0)
|
|
||||||
stringio (default: 0.0.1)
|
|
||||||
strscan (default: 1.0.0)
|
|
||||||
test-unit (3.2.7)
|
|
||||||
webrick (default: 1.4.2)
|
|
||||||
xmlrpc (0.3.0)
|
|
||||||
zlib (default: 1.0.0)
|
|
||||||
~~~
|
|
||||||
|
|
||||||
|
|
||||||
#### Utiliser ruby système (2.3) et Gem locales
|
|
||||||
|
|
||||||
Cela permet de bénéficier des mises à jour de sécurité de ruby (mais pas des gems).
|
|
||||||
|
|
||||||
~~~
|
|
||||||
# apt install ruby ruby-dev
|
|
||||||
|
|
||||||
$ export GEM_HOME=/$HOME/.gem/ruby/2.3.0
|
|
||||||
$ export PATH="$HOME/.gem/ruby/2.3.0/bin:$PATH"
|
|
||||||
$ gem install bundle
|
|
||||||
|
|
||||||
$ ruby -v
|
|
||||||
ruby 2.3.3p222 (2016-11-21) [x86_64-linux-gnu]
|
|
||||||
$ gem list
|
|
||||||
|
|
||||||
*** LOCAL GEMS ***
|
|
||||||
|
|
||||||
bigdecimal (1.2.8)
|
|
||||||
bundle (0.0.1)
|
|
||||||
bundler (1.16.3)
|
|
||||||
did_you_mean (1.0.0)
|
|
||||||
io-console (0.4.5)
|
|
||||||
json (1.8.3)
|
|
||||||
minitest (5.9.0)
|
|
||||||
net-telnet (0.1.1)
|
|
||||||
power_assert (0.2.7)
|
|
||||||
psych (2.1.0)
|
|
||||||
rake (10.5.0)
|
|
||||||
rdoc (4.2.1)
|
|
||||||
test-unit (3.1.7)
|
|
||||||
~~~
|
|
Loading…
Reference in a new issue