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 !