Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

CouchDB est une base de données orientée documents. En simplifiant, on pourrait dire qu'une base CouchDB n'est rien de plus qu'une collection d'objets hétérogènes, dotés chacun de leurs propres attributs. Dans le vocabulaire officiel de CouchDB, ces objets sont appelés des documents. Mais vous pouvez bien sûr mettre tout ce que vous voulez dans une base CouchDB: des utilisateurs, des informations clients, votre inventaire, etc.

Pour ce premier article, nous allons voir comment installer CouchDB en environnement Linux Debian/Lenny à partir des sources. Ce dernier point est important, si comme moi vous souhaitez installer la toute dernière version stable de CouchDB. Et non pas celle disponible dans votre gestionnaire de paquet.

Note:

Pour cet article, j'ai effectué l'installation sur une machine virtuelle Xen créée pour l'occasion à l'aide des xen-tools:

sh# xen-create-image --hostname=couchdb --role=udev
sh# xm create couchdb.cfg
sh# ssh root@couchdb
...

Si vous installez CouchDB sur une machine déjà existante, vous aurez sans doute moins de bibliothèques à installer.

Téléchargement

Vous pouvez télécharger la dernière version de CouchDB à partir de l'adresse http://couchdb.apache.org/downloads.html. L'archive que j'ai utilisée lors de la rédaction de cet article était apache-couchdb-0.10.1.tar.gz

sylvain@couchdb:~$ wget 'http://apache.multidist.com/couchdb/0.10.1/apache-couchdb-0.10.1.tar.gz'
sylvain@couchdb:~$ wget 'http://www.apache.org/dist/couchdb/0.10.1/apache-couchdb-0.10.1.tar.gz.md5'
sylvain@couchdb:~$ md5sum --check apache-couchdb-0.10.1.tar.gz.md5 
./apache-couchdb-0.10.1.tar.gz: OK
sylvain@couchdb:~$ tar xzf apache-couchdb-0.10.1.tar.gz
sylvain@couchdb:~$ cd apache-couchdb-0.10.1

Une fois l'archive décompressée, le dossier apache-couchdb-0.10.1 contient les sources de CouchDB. Comme bien souvent le mantra pour installer un produit à partir des sources va être configure — make — make install. Sauf s'il manque des dépendances! Comme nous allons maintenant le constater...

Installation

Passons maintenant à l'installation. Je vais ici détailler pas à pas les manipulations que j'ai faites. Et les problèmes rencontrés. Ainsi, même si vous n'avez pas exactement la même configuration que moi – ou si vous installez pour la première fois un logiciel à partir des sources – vous devriez pouvoir adapter les manipulations à votre cas de figure particulier.

Environnement de développement de base

Première tentative ... et premier échec:

sylvain@couchdb:~/apache-couchdb-0.10.1$ ./configure
[...]
configure: error: in `/home/sylvain/apache-couchdb-0.10.1':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.

Effectivement, un compilateur est nécessaire. J'en profite aussi pour installer make(1):

sylvain@couchdb:~/apache-couchdb-0.10.1$ su root
password:
couchdb:/home/sylvain/apache-couchdb-0.10.1# apt-get -y install gcc make
couchdb:/home/sylvain/apache-couchdb-0.10.1# exit

Mozilla SpiderMonkey

Seconde tentative...

sylvain@couchdb:~/apache-couchdb-0.10.1$ ./configure
[...]
checking for JS_NewContext in -lmozjs... no
checking for JS_NewContext in -ljs... no
checking for JS_NewContext in -ljs3250... no
checking for JS_NewContext in -ljs32... no
configure: error: Could not find the js library.

Is the Mozilla SpiderMonkey library installed?

CouchDB a besoin de Mozilla SpiderMonkey – la bibliothèque JavaScript de la fondation Mozilla. A installer, donc:

sylvain@couchdb:~/apache-couchdb-0.10.1$ su root -c 'apt-get install libmozjs1d libmozjs-dev'

Remarque:

Il faut installer les paquets de développement (-dev) des diverses bibliothèques, puisque celles-ci sont utilisées pour compiler un logiciel. Sur une machine de production – si vous installez le logiciel déjà compilé – vous n'aurez pas besoin des bibliothèques de développement.

ICU

Troisième tentative. ICU manquant:

sylvain@couchdb:~/apache-couchdb-0.10.1$ ./configure
[...]
checking for icu-config... no
*** The icu-config script could not be found. Make sure it is
*** in your path, and that taglib is properly installed.
*** Or see http://ibm.com/software/globalization/icu/
configure: error: Library requirements (ICU) not met.

ICU (International Component for Unicode) est une bibliothèque développée par IBM et qui apporte le support pour Unicode et plus généralement l'internationalisation. Disponible ici encore dans les paquets Debian:

sylvain@couchdb:~/apache-couchdb-0.10.1$ su root -c 'apt-get install libicu38 libicu-dev'

cURL

Quatrième tentative. Il manque la bibliothèque curl.

sylvain@couchdb:~/apache-couchdb-0.10.1$ ./configure
[...]
checking for curl-config... no
*** The curl-config script could not be found. Make sure it is
*** in your path, and that curl is properly installed.
*** Or see http://curl.haxx.se/
configure: error: Library requirements (curl) not met.

Curl est à la fois un outil et une bibliothèque offrant le support pour le transfert de fichiers avec divers protocoles (http, https, ftp, etc.). Ici encore, ce logiciel est disponible dans les paquets de Debian:

sylvain@couchdb:~/apache-couchdb-0.10.1$ su root -c 'apt-get install -y libcurl3 libcurl4-openssl-dev'

Erlang

Cinquième tentative! Et là, c'est du gros...

sylvain@couchdb:~/apache-couchdb-0.10.1$ ./configure
[...]
checking for erl... no
configure: error: Could not find the `erl' executable. Is Erlang installed?

CouchDB est écrit dans le langage Erlang. Il faut donc installer sur votre machine les outils de développement associés. La mauvaise nouvelle? Et bien la version d'Erlang disponible dans les paquets de Debian est trop ancienne. Il faut donc installer une version récente d'Erlang à partir des sources...

Commençons donc par télécharger Erlang sur le site officiel http://ftp.sunet.se/pub/lang/erlang/download.html. Dans mon cas, j'ai pris la version R13B03:

sylvain@couchdb:~/apache-couchdb-0.10.1$ cd
sylvain@couchdb:~$ wget 'http://ftp.sunet.se/pub/lang/erlang/download/otp_src_R13B03.tar.gz'
sylvain@couchdb:~$ tar xzf otp_src_R13B03.tar.gz 
sylvain@couchdb:~$ cd otp_src_R13B03

Et bien sûr, ./configuremakemake install:

sylvain@couchdb:~/otp_src_R13B03$ ./configure
[...]
configure: error: No curses library functions found

Et oui! Il manque des bibliothèques...

sylvain@couchdb:~/otp_src_R13B03$ su root -c 'apt-get install -y libncurses5 libncurses5-dev'
sylvain@couchdb:~/otp_src_R13B03$ ./configure
[...]
*********************************************************************
**********************  APPLICATIONS DISABLED  **********************
*********************************************************************

jinterface     : No Java compiler found
odbc           : ODBC library - link check failed
orber          : No C++ compiler found

*********************************************************************
*********************************************************************
**********************  APPLICATIONS INFORMATION  *******************
*********************************************************************

wx             : Can not link the wx driver, wx will NOT be useable

*********************************************************************
*********************************************************************
**********************  DOCUMENTATION INFORMATION  ******************
********************************************************************* 

documentation  : 
                 xsltproc is missing.
                 fop is missing.
                 The documentation can not be built.

*********************************************************************

Dans ma configuration, configure va au bout – mais m'avertit qu'un certain nombre de programmes ne seront pas compilés à cause de dépendances manquantes. Ça n'est pas un problème pour CouchDB. Nous pouvons donc poursuivre:

sylvain@couchdb:~/otp_src_R13B03$ make
test X"$ERTS_SKIP_DEPEND" = X"true" || (cd erts/emulator && ERL_TOP=/home/sylvain/otp_src_R13B03 make generate depend)
make[1]: Entering directory `/home/sylvain/otp_src_R13B03/erts/emulator'
make -f x86_64-unknown-linux-gnu/Makefile generate
make[2]: Entering directory `/home/sylvain/otp_src_R13B03/erts/emulator'
LANG=C /usr/bin/perl utils/make_tables -src x86_64-unknown-linux-gnu -include x86_64-unknown-linux-gnu beam/atom.names beam/bif.tab
Can't locate File/Basename.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at utils/make_tables line 21.
BEGIN failed--compilation aborted at utils/make_tables line 21.
make[2]: *** [x86_64-unknown-linux-gnu/erl_bif_table.c] Error 2
make[2]: Leaving directory `/home/sylvain/otp_src_R13B03/erts/emulator'
make[1]: *** [generate] Error 2
make[1]: Leaving directory `/home/sylvain/otp_src_R13B03/erts/emulator'
make: *** [depend] Error 2

Une fois n'est pas coutume, c'est le make qui échoue. Une rapide recherche dans les paquets de Debian m'apprend que le fichier manquant (Basename.pm) est dans le paquet perl-modules:

sylvain@couchdb:~/otp_src_R13B03$ su root -c 'apt-get install -y perl-modules'
sylvain@couchdb:~/otp_src_R13B03$ make
sylvain@couchdb:~/otp_src_R13B03$ su root -c 'make install'
sylvain@couchdb:~/otp_src_R13B03$ erl -version
Erlang (ASYNC_THREADS) (BEAM) emulator version 5.7.4

Bon, Erlang est installé. Retournons donc voir si CouchDB accepte enfin de se compiler!

Enfin...

sylvain@couchdb:~/otp_src_R13B03$ cd
sylvain@couchdb:~$ cd apache-couchdb-0.10.1
sylvain@couchdb:~/apache-couchdb-0.10.1$ ./configure
You have configured Apache CouchDB, time to relax.

Run `make && sudo make install' to install.

Plus qu'à compiler et installer:

sylvain@couchdb:~/apache-couchdb-0.10.1$ make
sylvain@couchdb:~/apache-couchdb-0.10.1$ su root -c 'make install'

Ouf! Même si c'était plus fastidieux que compliqué, vous pouvez tout de même laisser un légitime sentiment de satisfaction vous envahir. Mais, avant de vraiment se relaxer, vérifions que CouchDB fonctionne (vous pourrez à tout moment quitter CouchDB en tapant contrôle-c):

sylvain@couchdb:~/apache-couchdb-0.10.1$ su root -c couchdb
Apache CouchDB 0.10.1 (LogLevel=info) is starting.
Apache CouchDB has started. Time to relax.
[info] [<0.2.0>] Apache CouchDB has started on http://127.0.0.1:5984/

Piège:

Si vous voulez pouvoir accéder à CouchDB à partir d'une autre machine, vous devrez modifier la section httpd du fichier de configuration /usr/local/etc/couchdb/local.ini:

[httpd]
;port = 5984
bind_address = 0.0.0.0

La valeur par défaut est 127.0.0.1 qui n'accepte que les connexions locales. En mettant 0.0.0.0, j'accepte toutes les connexions.

Il faut bien sûr relancer CouchDB pour que les modifications apportées soient prises en compte.

Tester

Reste qu'à vous connecter à votre serveur (par son nom, adresse IP, éventuellement localhost – selon votre configuration), port 5984 pour vous assurer que tout est en ordre:

sh$ firefox http://couchdb:5984

couchdb:5984?

Sur mon installation, CouchDB est installé sur l'hôte couchdb. Bien sûr, dans les exemples de cette section, il faut remplacer ce nom par le nom ou l'adresse IP de votre serveur. Et pour ceux qui ont installé CouchDB en local, le serveur est évidemment localhost.

Si vous êtes amateurs de la ligne de commande, vous préférerez peut-être utiliser un client http en mode console, comme curl:

sh$ curl http://couchdb:5984
{"couchdb":"Welcome","version":"0.10.1"}

Ou encore, pour les plus curieux, telnet:

sh telnet couchdb 5984
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /

HTTP/1.1 200 OK
Server: CouchDB/0.10.1 (Erlang OTP/R13B)
Date: Thu, 28 Jan 2010 19:06:35 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 41
Cache-Control: must-revalidate

{"couchdb":"Welcome","version":"0.10.1"}
Connection closed by foreign host.


Bien sûr, dans un premier temps, vous préférerez peut-être utiliser Futon – l'interface web conviviale de CouchDB:

sh$ firefox http://192.168.8.110:5984/_utils

Lancement automatique

Avant de terminer cet article sur l'installation de CouchDB, reste tout de même à configurer son lancement automatique au démarrage de la machine.

Sur un système qui utilise des scripts d'initialisation système V comme Debian, le lancement automatique d'une tâche au démarrage de la machine se fait en ajoutant un script de démarrage dans /etc/init.d et en ajoutant les liens symboliques vers ce script dans les répertoires /etc/rc?.d correspondants aux différents niveaux d'exécution (runlevels).

Piège:

D'un système à l'autre – et d'une distribution à l'autre – le nombre et la signification des runlevels varient. Les exemples ci-dessous sont pour Linux/Debian. Et sans doute à adapter si vous utilisez un autre système. Référez-vous au manuel de votre système ou à la page wikipedia:runlevel pour vérifier.

Utilisateur couchdb

Ça n'est jamais une bonne idée de faire tourner un serveur avec les privilèges du super-utilisateur (root). Donc, avant d'automatiser le démarrage de notre serveur CouchDB, nous allons créer un utilisateur spécifique, et le doter des droits minimums nécessaires pour lancer CouchDB.

Piège:

D'un système à l'autre – et d'une distribution à l'autre – la manière de créer un utilisateur varie. Non seulement les options à indiquer sur la ligne de commande peuvent changer, mais on trouve aussi une variété d'utilitaires plus ou moins incompatibles d'un système à l'autre. À titre d'illustration, Debian possède à la fois adduser et useradd. Si vous n'utilisez pas Debian/Lenny, un coup d'oeil au man peut s'imposer...

Sous Debian/Lenny, vous pouvez créer un nouvel utilisateur système ainsi:

couchdb:~# adduser --system \
            --home /usr/local/var/lib/couchdb \
            --no-create-home \
            --shell /bin/bash \
            --group \
            --gecos "CouchDB Administrator" \
            couchdb
Adding system user `couchdb' (UID 112) ...
Adding new group `couchdb' (GID 116) ...
Adding new user `couchdb' (UID 112) with group `couchdb' ...
Not creating home directory `/usr/local/var/lib/couchdb'.

Remarque:

L'option --group force la création d'un groupe couchdb en plus de l'utilisateur couchdb.

Reste à affecter un certain nombre de répertoires à couchdb:

couchdb:~# chown -R couchdb:couchdb /usr/local/etc/couchdb
couchdb:~# chown -R couchdb:couchdb /usr/local/var/lib/couchdb
couchdb:~# chown -R couchdb:couchdb /usr/local/var/log/couchdb
couchdb:~# chown -R couchdb:couchdb /usr/local/var/run/couchdb

Script de démarrage

CouchDB est livré en standard avec un script de démarrage. Celui-ci, après installation, se trouve à l'emplacement /usr/local/etc/init.d/couchdb.

Vous pouvez le copier dans /etc/init.d – ou comme moi ici, préférer faire un lien symbolique vers ce fichier. Cela vous dispensera de le mettre à jour en même temps que CouchDB.

couchdb:~# ln -s /usr/local/etc/init.d/couchdb /etc/init.d/local-couchdb

Créer les liens

Sous Debian, vous pouvez utiliser l'utilitaire update-rc.d pour créer les liens qui permettent le démarrage automatique:

couchdb:~# cd /etc/init.d
couchdb:/etc/init.d# update-rc.d local-couchdb defaults
 Adding system startup for /etc/init.d/local-couchdb ...
   /etc/rc0.d/K20local-couchdb -> ../init.d/local-couchdb
   /etc/rc1.d/K20local-couchdb -> ../init.d/local-couchdb
   /etc/rc6.d/K20local-couchdb -> ../init.d/local-couchdb
   /etc/rc2.d/S20local-couchdb -> ../init.d/local-couchdb
   /etc/rc3.d/S20local-couchdb -> ../init.d/local-couchdb
   /etc/rc4.d/S20local-couchdb -> ../init.d/local-couchdb
   /etc/rc5.d/S20local-couchdb -> ../init.d/local-couchdb

Si votre système ne possède pas update-rc.d, vous pouvez toujours créer ces liens à la main (dans ce cas, attention aux runlevels utilisés par votre système!):

couchdb:/etc/init.d# # Liens pour démarrer CouchDB'
couchdb:/etc/init.d# for i in 2 3 4 5; do
          ln -s /etc/init.d/local-couchdb /etc/rc"$i".d/S20local-couchdb
    done
couchdb:/etc/init.d# # Liens pour arrêter CouchDB'
couchdb:/etc/init.d# for i in 0 1 6; do
          ln -s /etc/init.d/local-couchdb /etc/rc"$i".d/K20local-couchdb
    done

Et voilà: désormais CouchDB se lancera automatiquement au démarrage de la machine. Et se terminera à l'extinction. Je vous laisse essayer pour voir:

couchdb:~# reboot

La suite?

Maintenant que CouchDB est installé, reste à nous en servir. Avec Futon, c'est facile. Mais, on peut aussi accéder à CouchDB directement avec des requêtes http. C'est ce que nous verrons dans l'article "Accéder à une base CouchDB via l'interface REST".

Ressources