Comme je travaille sur OpenERP, je n'utilise pas la version des dépôts, mais j'installe les instances OpenERP manuellement, depuis les sources. Cette méthode simplifie la gestion des patchs personnalisés, l'utilisation d'une version spécifique pour chaque projet, le lancement de plusieurs instances sur un même serveur...

Dans cet article, j'explique comment mettre en place une instance d'OpenERP v7.0 dont l'exécution est gérée par supervisor.

Préparation de l'environnement

Serveur PostgreSQL

Pour faire fonctionner OpenERP, il est nécessaire d'avoir un serveur PostgreSQL disponible. Ce serveur peut ne pas se trouver sur la même machine sur le serveur OpenERP, il faudra alors permettre l'accès depuis la machine sur laquelle est installé OpenERP.

OpenERP liste automatiquement les bases de données appartenant à cet utilisateur et affiche cette liste sur l'écran de login. Il est donc conseillé de créer un utilisateur Postgres spécifique pour OpenERP.

$ createuser -SdRE openerp

Note : Dans le cas de plusieurs instances d'OpenERP, il est préférable de créer un utilisateur Postgres par instance.

Dépendances

La seule dépendance nécessaire est Python, langage dans lequel est développé OpenERP, ainsi qu'un certain nombre de modules python. Comme l'instance d'OpenERP est installée en dehors des dépôts, je préfère installer les modules python dans un virtualenv. De cette manière, on maîtrise la mise à jour des modules python, pour éviter les risques d'incompatibilité d'une version récente d'un module python avec une instance d'OpenERP. Cela permet aussi à chaque instance OpenERP installée sur le serveur de fonctionner avec ses propres versions des modules python.

Pour la gestion du virtualenv, il faut installer les paquets python-virtualenv, ainsi que python-pip, qui installera de nouveaux modules dans le virtualenv.

Il faut aussi installer supervisor, qui sera chargé de gérer le processus OpenERP.

Certains modules python nécessaires à OpenERP devront être compilés au cours de leur installation dans le virtualenv. Il est donc indispensable de disposer du compilateur gcc ainsi que des bibliothèques de développement utilisées pour l'installation des modules.

$ sudo apt-get install --no-install-recommends python-virtualenv python-pip supervisor gcc python-dev postgresql-server-dev-9.1 libxml2-dev libxslt1-dev libjpeg62-dev

Lors de sa compilation, le module python PIL recherche les bibliothèques uniquement dans le répertoire /usr/lib/. Comme Debian installe les bibliothèques qu'il utilise dans le répertoire /usr/lib/<arch>-linux-gnu/, il faut ajouter manuellement des liens symboliques vers ces bibliothèques dans le répertoire /usr/lib/.

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/

Modules python

Comme dit précédemment, l'instance OpenERP sera lancée dans un virtualenv. Il faut donc le créer, et y installer tous les modules python utilisés par OpenERP.

Ce virtualenv sera placé dans le répertoire /opt/virtualenv/<VenvName>/.

$ sudo mkdir /opt/virtualenv
$ sudo virtualenv /opt/virtualenv/<VenvName>

Une fois le virtualenv créé, on y installe les modules nécessaires.

$ sudo /opt/virtualenv/<VenvName>/bin/pip install http://download.gna.org/pychart/PyChart-1.39.tar.gz babel docutils jinja2 lxml mako mock pil psycopg2 python-dateutil python-openid pyyaml reportlab simplejson unittest2 werkzeug

Attention : Il faut bien donner le chemin complet de l'exécutable pip dans le virtualenv, sinon les modules seront installés sur le système, et pas dans le virtualenv.

Note : La liste des modules python nécessaire peut varier selon la version d'OpenERP utilisée, et les modules OpenERP installés. Par exemple, l'installation du module OpenERP base_vat recommande l'installation du module python vatnumber pour assurer la validation des codes de TVA.

Utilisateur spécifique

Comme pour la plupart des applications, il est déconseillé d'exécuter OpenERP en tant que root. Il faut donc lui créer un utilisateur dédié.

$ sudo adduser <OpenerpUsername>

Note : Il faut aussi créer un utilisateur PostgreSQL spécifique.

Note : Lorsque je mets plusieurs instances en place sur un même serveur, je crée un utilisateur système et un utilisateur PostgreSQL différent pour chaque instance, afin d'éviter les conflits.

Mise en place de l'instance OpenERP

Récupérer les sources, et les placer dans le répertoire de l'utilisateur. Dans cet article, je place les sources dans le répertoire ~/openerp.

$ sudo -i -u <OpenerpUsername>
$ mkdir ~/openerp
$ bzr branch --stacked lp:openobject-server/7.0 ~/openerp/server
$ bzr branch --stacked lp:openobject-addons/7.0 ~/openerp/addons
$ bzr branch --stacked lp:openerp-web/7.0 ~/openerp/web

Note : Le paramètre --stacked permet de ne télécharger que le contenu du répertoire de travail, et pas tout l'historique des branches bazaar.

Il faut ensuite générer le fichier de configuration, que je place dans le même répertoire que les différentes branches du projet. Je ne donne ici que les paramètres nécessaires, mais d'autres peuvent être donnés, pour changer les ports, par exemple. En cas d'erreur, le fichier de configuration généré peut évidemment être modifié manuellement par la suite.

$ . /opt/virtualenv/openerp/bin/activate
$ ~/openerp/server/openerp-server --stop-after-init -c ~/openerp/openerp.conf -s -r <DbUsername> -w <DbPassword> --db_host=<DbHostName> --addons-path=~/openerp/addons,~/openerp/web/addons

Il est ensuite possible de vérifier que tout est bien installé en vérifiant que le serveur se lance bien.

$ ~/openerp/server/openerp-server -c ~/openerp/openerp.conf

Si le chargement de la page http://<Hostname>:8069 ne provoque pas l'affichage d'erreurs dans le log du serveur, vous pouvez le stopper avec Ctrl+c, puis passer à l'étape suivante.

Lancement automatique du service

Le processus OpenERP sera lancé par supervisor. Il faut donc établir un fichier de configuration supervisor pour notre instance OpenERP.

Le chargement d'un virtualenv python consiste en la modification des variables d'environnement. Nous utilisons donc le paramètre environment pour permettre l'utilisation du virtualenv.

[program:openerp]
command=/home/<OpenerpUsername>/openerp/server/openerp-server -c /home/<OpenerpUsername>/openerp/openerp.conf
directory=/home/<OpenerpUsername>/openerp/server/
environment=LOGNAME=<OpenerpUsername>,PATH="/opt/virtualenv/openerp/bin:/usr/local/bin:/usr/bin:/bin"
user=<OpenerpUsername>
stdout_logfile=/var/log/openerp/openerp-access.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=7
stderr_logfile=/var/log/openerp/openerp-errors.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=7

Note : La définition de la variable d'environnement LOGNAME permet au processus OpenERP d'utiliser le bon nom d'utilisateur pour créer son répertoire de sessions. Sans ce paramètre, le répertoire de sessions serait /tmp/oe-sessions-root, ce qui pose problème dès qu'il y a plusieurs instances en fonctionnement.

Note : Dans la variable d'environnement PATH, il faut mettre le PATH correspondant à votre système. La meilleure méthode est de charger le virtualenv, puis de récupérer la valeur des variables d'environnement.

Il reste à créer le répertoire qui contiendra les fichiers de log d'OpenERP.

$ sudo mkdir /var/log/openerp
$ sudo chown root:adm /var/log/openerp

Pour prendre en compte ce nouveau fichier de configuration, il faut appeler la commande update de supervisor.

$ sudo supervisorctl update

L'instance OpenERP devrait avoir été lancée automatiquement par supervisor.