22
0
Fork 0

grosse relecture et évolutions

This commit is contained in:
Gregory Colpart 2018-08-12 13:21:25 +02:00
parent c16787330f
commit 4db0d7b7bb
1 changed files with 248 additions and 312 deletions

View File

@ -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
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.
## Installation
## Cas 1 : utilisation avec Passenger
### Installation avec rbenv
* [Documentation de Passenger pour Apache](http://modrails.com/documentation/Users%20guide%20Apache.html)
* [Documentation de Ruby Enterprise Edition](http://www.rubyenterpriseedition.com/documentation.html)
* [Un howto pour Yaml](http://www.yaml.org/YAML_for_ruby.html) (en parallèle avec Ruby, mais simple à comprendre)
[rbenv](https://github.com/rbenv/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 !
### Installation
On installe d'abord Ruby 1.8 et ses dépendances utiles (`irb`, `rdoc`, `ri`, …).
> *Note* : vous devez mettre les droits `exec` sur la partition */home* pour cette installation
~~~
# 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)
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
Cela permet de bénéficier des mises à jour de sécurité de Ruby, tout en gérant les Gems par utilisateur.
~~~
# 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>
PassengerRoot /opt/ruby-enterprise-<version>/lib/ruby/gems/1.8/gems/passenger-3.0.0
PassengerRuby /opt/ruby-enterprise-<version>/bin/ruby
$ gem -v
2.5.2.1
PassengerEnabled off
#RailsAutoDetect off
#RackAutoDetect off
PassengerFriendlyErrorPages off
$ gem list
</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`,
et pour que les utilisateurs puissent les utiliser il y a deux options possibles :
* installée par un paquet Debian (`/usr/lib/ruby/2.3.0/`)
* 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.
1. Créer des liens symboliques dans `/usr/bin`.
Pour la deuxième solution, le script suivant permet d'automatiser la tâche :
Une application Rails contient un fichier `Gemfile` qui précise les Gems nécessaires et leurs versions :
~~~
#!/bin/bash
cd /usr/bin
for i in `ls -1d /opt/ruby-enterprise-*/bin/*`; do
ln -s $i
done
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.7.1'
# 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>
PassengerRoot /usr
PassengerRuby /usr/bin/ruby1.8
PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
PassengerDefaultRuby /usr/bin/ruby
# On ajoute les lignes suivantes:
PassengerEnabled off
RailsAutoDetect off
RackAutoDetect off
PassengerFriendlyErrorPages off
PassengerTempDir /var/tmp/
PassengerUploadBufferDir /var/tmp
@ -142,279 +272,85 @@ on commence par désactiver ce comportement dans `/etc/apache2/mods-available/pa
</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>
ServerName redmine.evolix.net
<VirtualHost>
ServerName foo.example.com
PassengerEnabled on
RailsAutoDetect on
#RailsEnv development
DocumentRoot /home/redmine/www/public
<Directory /home/redmine/www/public>
DocumentRoot /home/foo/www/current
<Directory /home/redmine/www/current>
Allow from all
Options -MultiViews
</Directory>
# Pour Apache 2 ITK
AssignUserID {user} {group}
# Pour Apache ITK
AssignUserID foo foo
</VirtualHost>
~~~
* [#apache-itk-users Information complémentaire sur Apache ITK]
* [Script de génération de VHost](http://forge.evolix.org/scm/viewvc.php/trunk/scripts/create_rails_vhost?view=markup&root=packweb)
> *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`.
### 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
`config/environment.rb` de l'application Rails.
## FAQ
Il faut donc y placer un propriétaire identique à celui utilisé dans AssignUserID
### GEM_HOME
#### 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.
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 :
On peut forcer l'environnement des Gems (pour ignorer `/var/lib/gems/2.3.0` 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
`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.
<http://rubyenterpriseedition.com/documentation.html>
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.
[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.
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
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 :
Si l'on utilise avec Passenger, on pourra forcer l'utilisation de REE ainsi :
~~~
# 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
(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
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
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
[trunk/scripts/list_gems](http://forge.evolix.org/scm/viewvc.php/trunk/scripts/list_gems?view=markup&root=packweb).
#### Économiser un peu d'espace
### Économiser un peu d'espace
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 :
~~~
gem: --no-rdoc --no-ri
~~~
À mettre aussi dans la `$HOME` de `root` si c'est lui qui installe les gems.
#### 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
~~~
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
*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)
~~~
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).
#### 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)
~~~