OpenERP 6.1 sur Raspberry Pi

OpenERP 6.1 sur Raspberry Pi

Il arrive qu'on me demande si OpenERP est « lourd ». Les gens qui nous posent cette question veulent souvent être rassurés vis à vis de l'image véhiculée par les PGI traditionnels ou propriétaires, souvent considérés comme des systèmes « lourds ». La réponse est clairement : non. OpenERP n'est pas lourd et la meilleure façon de le prouver est de montrer qu'il est possible de le faire fonctionner sur l'une des machines les plus  petites et les moins chères disponibles actuellement : le Raspberry Pi.

Pour rappel cette machine coûtant environ 20 €, fait exactement la taille d'une carte de visite et est pourvu d'un petit processeur ARM à 700MHz, 256Mo de RAM, d'un port pour une carte SD et d'autres caractéristiques que vous pourrez découvrir sur le lien précédent. Elle est conçue pour fonctionner avec un système GNU/Linux. Grâce à une puce graphique assez honnête, elle est  idéale pour fabriquer un petit système multimedia pouvant lire des vidéos full-HD à 30 images par seconde au travers de son interface HDMI. Mais pour OpenERP les capacités graphiques n'ont aucun intérêt : c'est surtout le CPU et la carte SD qui vont fonctionner. La carte ci-dessous nous a été prêtée par Hack Spark.

Prérequis

En plus de la Raspberry Pi, il faut se procurer un câble réseau, un clavier USB, une carte SD de 4Go ou plus, un cable HDMI et un écran ou un projecteur qui accepte le HDMI. Pour l'alimentation, ça fonctionne soit avec la prise d'alimentation, soit par USB. Pour la carte SD choisissez le modèle le plus rapide que vous pouvez trouver, son influence est énorme pour une application comme OpenERP fonctionnant avec une base Postgresql.

Installation du système

La page downloads contient des images disques déjà prêtes donc l'installation du système Linux ne pose aucun problème. Les instructions pour copier l'image disque sur la carte SD se trouvent ici. Une fois le système installé, il suffit de tout brancher et de démarrer. La Raspberry Pi doit être branchée sur une connexion internet pour la suite, afin de pouvoir installer des paquets depuis l'internet.

Installation d'OpenERP

Pour installer OpenERP sur la Raspberry Pi (ou sur n'importe quel système), nous utilisons l'outil buildout, qui nous permet en quelques lignes de construire une application OpenERP personnalisée avec en incluant des addons provenant de diverses sources (bzr, git, hg, svn ou local). Le point clé facilitant l'installation se situe dans la recipe anybox.recipe.openerp. N'hésitez pas à lire sa documentation pour savoir comment l'utiliser.

L'installation commence par des dépendances systèmes :

$ sudo aptitude install libxslt1-dev libyaml-dev libjpeg8-dev libldap2-dev libfreetype6-dev libsasl2-dev$ sudo aptitude install build-essential python-dev python-imaging python-pybabel libpq-dev postgresql

Il faut également créer un utilisateur pour Postgresql :

$ sudo -u postgres createuser pi

L'installation se fait ensuite intégralement avec un compte utilisateur, dans un répertoire isolé, et plus rien n'est installé sur le système.

On crée un répertoire pour l'installation, dans lequel on ajoute deux fichiers : un fichier bootstrap.py permettant d'installer buildout dans un bac à sable, et le fichier de description du buildout, contenant la configuration de notre application OpenERP :

$ mkdir openerp$ cd openerp
$ wget http://svn.zope.org/repos/main/zc.buildout/tags/1.5.2/bootstrap/bootstrap.py$ editor buildout.cfg

Contenu du fichier buildout.cfg :

[buildout]
parts = openerp 
versions = versions
find-links = http://download.gna.org/pychart/

[openerp]
recipe = anybox.recipe.openerp:server
eggs = PIL        pychart 
version = 6.1  

[versions]
MarkupSafe = 0.15
PIL = 1.1.7
PyXML = 0.8.4
anybox.recipe.openerp = 0.15 
babel = 0.9.6
feedparser = 5.1.1 
gdata = 2.0.16 
lxml = 2.3.3 
mako = 0.6.2
psycopg2 = 2.4.4
pychart = 1.39
pydot = 1.0.28
pyparsing = 1.5.6
python-dateutil = 1.5
python-ldap = 2.4.9
python-openid = 2.2.5
pytz = 2012b 
pywebdav = 0.9.4.1
pyyaml = 3.10 
reportlab = 2.5
simplejson = 2.4.0
vatnumber = 1.0
vobject = 0.8.1c 
werkzeug = 0.8.3
xlwt = 0.7.3
zc.buildout = 1.5.2
zc.recipe.egg = 1.3.2
zsi = 2.0-rc3

Ce fichier indique de créer une application composée d'un seul morceau : la « part » openerp, prise en charge par la recette anybox.recipe.openerp. Une fois que ce fichier est créé, il faut lancer la construction de l'application, qui doit télécharger OpenERP, l'installer dans le buildout et créer un script de démarrage. À noter qu'il est possible de définir les options d'OpenERP dans la section [openerp]. Consultez la documentation de la recipe pour en savoir plus.

$ python bootstrap.py -d
$ bin/buildout

(L'option « -d » force l'utilisation de distribute au lieu de setuptools. Elle est fortement conseillée)

Démarrage

Un script de démarrage doit avoir été créé pendant la construction de l'application : bin/start_openerp. Le nom de ce script est formé de start_ + le nom de la part. Cela signifie que si vous définissez plusieurs parts OpenERP dans le fichier buildout, par exemple deux serveurs openerp1 et openerp2, vos scripts de démarrage s'appelleront start_openerp1 et start_openerp2. Ces scripts peuvent ensuite être lancés et surveillés par un outil comme supervisor.

$ bin/start_openerp

Pour pouvoir accéder à l'OpenERP lancé dans la Raspbery Pi, il faut au préalable connaître son adresse IP. Celui-ci vous sera donné par la commande : ifconfig (au niveau de l'interface eth0).

Vous pouvez ensuite accéder à l'instance d'OpenERP depuis une autre machine, avec votre navigateur via une URL du type : http://192.168.0.102:8069/ (qui peut varier en fonction de votre configuration réseau).

Quelques benchmarks

Création d'une base de données

Le premier test a été effectué avec une carte SD Kingston classe 4 bas de gamme. Le temps de création est prohibitif, on atteint une heure (!) juste pour créer une base OpenERP vierge, sans données de démo, et avec la localisation française.La charge CPU ne dépassant pas 3% pendant toute la procédure, il était clair que la carte SD était trop lente. La création d'une base implique de nombreux accès en écriture par PostgreSQL, il fallait utiliser une carte plus rapide. On recommence avec une carte haut de gamme Samsung classe 10 Plus Extreme Speed, et là on tombe à 10min au lieu d'une heure ! Mais même avec la nouvelle carte SD, le CPU était rarement chargé à plus de 40 ou 50% donc le facteur limitant est encore le sous-sytème de stockage. Par comparaison, le temps nécessaire sur un petit serveur dédié de type Dedibox SC est de 1min 30, et sur un laptop Lenovo T420s on tombe à 12 secondes !

matériel temps nécessaire
Raspberry Pi + Carte SD Kingston classe 4 1h
Raspberry Pi+ Carte SD Samsung classe 10 10min
Dedibox SC 1min 30
Lenovo T420s + SSD intel 12s

Performance CPU

Python est fourni avec un petit utilitaire permettant de réaliser un test de vitesse de l'interprêteur, ce test est simpliste mais il permet de voir les ordres de grandeur. On peut le lancer depuis la ligne de commande avec :

$ python -c "from test import pystone; pystone.main()"

Matériel Pystones/sec
Raspberry Pi (ARM 700 MHz) 2850
Dedibox SC (Via Nano) 38000
Lenovo T420s (Core i5) 132000

Consommation mémoire

La consommation mémoire du processus Python d'OpenERP tourne aux alentours de 100Mo, auxquels il faut ajouter la consommation mémoire de Postgresql qui est inférieure à 50Mo. Par conséquent les 256Mo du Raspberry Pi sont tout à fait suffisants pour que ça fonctionne, à condition de ne pas faire de traitement lourd.

Conclusion

OpenERP démarre sans problème sur une Raspberry Pi. Le résultat est bien entendu lent, mais utilisable pour des tâches simples et sans gros volume de données. Le démarrage se fait en quelques secondes, et chaque clic sur l'interface d'OpenERP pour accéder à une liste ou un formulaire prend de 1 à 3 secondes. Il ne faut bien sûr pas en demander plus. Mais si on considère les différences gigantesques de performances entre ce matériel et les machines récentes qui sont disponibles pour déployer OpenERP, on comprend pourquoi un serveur actuel modeste peut accueillir un nombre important d'instances OpenERP ou d'utilisateurs. Il arrive qu'on trouve des traitements extrêmement gourmands en ressources, comme la génération du Grand Livre, mais ce sont des problèmes applicatifs localisés qui peuvent être résolus avec du profilage et des optimisations. L'infrastructure d'OpenERP elle-même est légère, performante et scalable.

Merci à Jonathan de Hack Spark pour le prêt de la carte Raspberry Pi !