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
|
||||
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)
|
||||
~~~
|
Loading…
Reference in a new issue