Rails : Installer la gem pg sous Debian Squeeze

L’installation d’un serveur PostgreSQL 9.1 en collaboration avec Rails a toujours été ma bête noire. En effet, je fais toujours face à au moins un problème… Ce doit être une malédiction…

Après tous ces déboires, j’en profite pour en partager quelques uns en compagnie de leur solution, en espérant pouvoir vous faire gagner du temps.

1. Autorisations d’accès à distance au serveur de base de données

L’un de mes premiers problèmes a été d’accéder depuis mon poste de travail à la base de données de développement, qui ne sont pas les mêmes machines, mais qui sont présents au sein du même réseau (réel ou virtuel).

PostgreSql gère ses autorisations d’accès réseau à l’aide d’un fichier nommé “pg_hba.conf”. Dans ce document, chaque ligne contient des autorisations en fonctions de la base de données, de l’utilisateur, et de l’adresse IP. Une logique y est associée permettant d’accepter ou de rejeter une connexion.

Par exemple, pour autoriser toutes les adresses IP du type 192.168.1.* pour toutes les bases de données, pour tous les utilisateurs, la ligne ressemblera à :

host all all 192.168.1.0/24 trust

Il ne faudra pas oublier non plus de modifier le fichier postgresql.conf pour indiquer au serveur d’écouter d’autres adresses que la boucle local (127.0.0.1). Il faudra donc remplacer :

listen_addresses = 'localhost'

par :

listen_addresses = '*'

2. Installation de la gem pg pour Ruby

Plus récemment, mon problème fut lié à l’installation de notre petite gem “pg”, à l’aide de la commande :

gem install pg

Malheureusement, la commande échouait avec une belle erreur, très compréhensible :

Building native extensions. This could take a while...
ERROR: Error installing pg:
ERROR: Failed to build gem native extension.
/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for pg_config... yes
Using config values from /usr/bin/pg_config
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.h... yes
checking for pg_config_manual.h... yes
checking for PQconnectdb() in -lpq... no
checking for PQconnectdb() in -llibpq... no
checking for PQconnectdb() in -lms/libpq... no
Can't find the PostgreSQL client library (libpq)
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
Provided configuration options:
--with-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby
--with-pg
--without-pg
--with-pg-dir
--without-pg-dir
--with-pg-include
--without-pg-include=${pg-dir}/include
--with-pg-lib
--without-pg-lib=${pg-dir}/lib
--with-pg-config
--without-pg-config
--with-pg_config
--without-pg_config
--with-pqlib
--without-pqlib
--with-libpqlib
--without-libpqlib
--with-ms/libpqlib
--without-ms/libpqlib
Gem files will remain installed in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/pg-0.14.0 for inspection.
Results logged to /usr/local/rvm/gems/ruby-1.9.3-p194/gems/pg-0.14.0/ext/gem_make.out

En regardant de plus près dans le log de la compilation présent dans le fichier “/usr/local/rvm/gems/ruby-1.9.3-p194/gems/pg-0.14.0/ext/mkmf.log” pour mon serveur, il s’avère que l’ensemble des erreurs concernent la librairie OpenSSL.

En vérifiant, la librairie SSL était bien installée, pg_config m’affichait bien sa dépendance à cette même lin, et RVM avait bien importé son package ssl. Voici un résumé des commandes permettant respectivement de vérifier ces points :

a. la librairie de Postgresql

pg_config --libs

doit afficher

-lssl -lpgport -lxslt -lxml2 -lpam -lssl -lcrypto -lkrb5 -lcom_err -lgssapi_krb5 -lz -ledit -lcrypt -ldl -lm

b. la librairie système

aptitude search libssl

doit afficher le flag “i” pour “installé”

i libssl-dev - SSL development libraries, header files and documentation
i libssl0.9.8 - SSL shared libraries

c. le package RVM

ls /usr/local/rvm/usr/lib/

doit afficher par exemple :

engines libcrypto.so libssl.a libssl.so.0.9.8 libyaml-0.so.2.0.2 libyaml.la libz.a libz.so.1 pkgconfig
libcrypto.a libcrypto.so.0.9.8 libssl.so libyaml-0.so.2 libyaml.a libyaml.so libz.so libz.so.1.2.7

En fait, le problème vient de RVM. Pour préparer mon serveur, j’avais installé Ruby 1.9.3 via RVM. Toujours très pratique, il a une facheuse tendance à compiler certaines librairies dans des dossiers que l’utilitaire gem ne connaît pas. La solution est donc de déplacer de dossier, ou mieux, de faire pointer un lien symbolique de l’un vers l’autre. Ainsi pour Debian Squeeze (6.0), les commandes sont :

aptitude install postgresql-9.1 libpq5 postgresql-server-dev-9.1
mv /usr/local/rvm/usr/lib/ /usr/local/rvm/usr/lib_rvm
gem install pg

Sachant que la commande

mv /usr/local/rvm/usr/lib/ /usr/local/rvm/usr/lib_rvm

doit pouvoir se remplacer par

ln -s /usr/local/rvm/usr/lib/ /usr/local/rvm/usr/lib_rvm

En espérant que cela pourra aider les âmes errantes, n’hésitez pas à me faire vos remarques !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *