Nuxeo contre Alfresco

Après un mois d’utilisation du logiciel de GED Nuxeo DM, le bilan est plutôt négatif. Je pensais naïvement avoir mis la main sur une application correcte (comme elle est en JAVA, elle peut tout au plus être correcte). Un pré-requis très important pour moi était la possibilité d’utiliser MySQL comme moteur de base de données. En réalité, bien que Nuxeo supporte MySQL officiellement, l’usage de ce moteur est absolument découragé. Les développeurs listent une série de raisons somme-toute valables, et qui peuvent se résumer comme ceci : il aurait fallu coder Nuxeo pour qu’il supporte les spécificités de MySQL, et on a eu la flemme. En réalité, rien ne fonctionne vraiment correctement si on utilise Nuxeo avec MySQL. À tel point qu’il ne devrait même pas être possible de choisir ce serveur de base de données dans les menus de configuration de Nuxeo. Et c’est bien ça qui me met en rogne. J’ai perdu un mois, et de nombreuses heures de travail pour un logiciel qui oscille finalement entre le “peu fiable” et le “carrément inutilisable”.
Entre alors en scène Alfresco. Un logiciel concurrent, codé lui aussi en (wait for it) JAVA. Ce dernier fonctionne très bien avec MySQL, je l’ai donc installé sans tarder pour me faire une opinion sur ses capacités. Les différences avec Nuxeo sont importantes.
Continue reading

Installation de Nuxeo DM sur FreeBSD, épisode 3

Avec un peu de travail, Nuxeo DM peut être abrité en HTTPS derrière un serveur Apache. Je fais l’impasse sur la configuration interne à Nuxeo, elle se fait très simplement à la première connexion via l’assistant fourni. Si vous êtes arrivés jusque là, il ne manque plus qu’un script de démarrage pour que tout fonctionne de manière transparente sur votre serveur.
Voici le contenu du script de lancement/arrêt pour une instance de Nuxeo DM, /usr/local/etc/rc.d/nuxeo. N’oubliez pas de remplacer la valeur de nuxeo_home par le chemin de votre répertoire nuxeo :

#!/bin/sh

# PROVIDE: nuxeo
# REQUIRE: DAEMON
# BEFORE: LOGIN

# Define these nuxeo_* variables in one of these files:
#       /etc/rc.conf
#       /etc/rc.conf.local
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
#
nuxeo_enable="${nuxeo_enable-NO}"
nuxeo_user="${nuxeo_user-nuxeo}"
nuxeo_home="/CHEMIN/DE/nuxeo"

. /etc/rc.subr

name="nuxeo"
rcvar=`set_rcvar`
start_cmd=${name}_start
stop_cmd=${name}_stop

nuxeo_start()
{
cd $nuxeo_home
$nuxeo_auditflags sudo -u $nuxeo_user ./bin/nuxeoctl startbg
}

nuxeo_stop()
{
cd $nuxeo_home
sudo -u $nuxeo_user ./bin/nuxeoctl stop
}

load_rc_config $name

run_rc_command "$1"

Une fois le fichier créé, rempli, et rendu exécutable, il faut ajouter ces quelques lignes à votre fichier /etc/rc.conf :

nuxeo_enable="YES"
nuxeo_user="NUXEO_USER"

Vous remplacerez bien sûr NUXEO_USER par le nom du compte utilisateur qui fera tourner l’application Nuxeo DM. Après cela, les commandes /usr/local/etc/rc.d/nuxeo restart, /usr/local/etc/rc.d/nuxeo stop et /usr/local/etc/rc.d/nuxeo start doivent fonctionner.
Attention, suivant la puissance de votre machine, et l’état de remplissage de Nuxeo, le temps de lancement peut varier énormément.

Côté mise à jour, vous pouvez accéder aux “hotfix” officiels, gratuitement pendant 30 jours, moyennant une inscription sur le site web de Nuxeo. L’inscription se passe facilement, par contre les mise à jour sont délicates et nécessitent de suivre scrupuleusement les instructions du support Nuxeo. Notamment, relancez bien l’application entre chaque mise à jour.

Installation de Nuxeo DM sur FreeBSD, épisode 2

Une application Tomcat ne devrait pas se trouver nue sur internet. J’ai pour habitude de toujours placer un frontal Apache devant. Cela autorise divers améliorations du service. Apache peut par exemple gérer l’authentification des utilisateurs, faire une balance de charge entre plusieurs instances de l’application, etc. Il permet aussi à votre application d’être joignable sur les port HTTP(S) standard (80 et 443) sans que l’application doive être lancée en root (et sans recourir à une redirection dans votre firewall).

Il existe plusieurs moyens de présenter Nuxeo DM au travers d’un proxy Apache. J’ai choisi d’utiliser mod_proxy. Avec mod_proxy, la configuration est assez standard. Tout, ou presque, est réglé en 3 lignes si on se contente de l’HTTP. Mais pour sécuriser mes connexions à Nuxeo, qui contiendra mes documents personnels et confidentiels, j’ai décidé d’utiliser HTTPS.
J’ai donc un virtual host Apache, et un certificat SSL associé, dans le quel j’inclue les directives de mod_proxy.

<VirtualHost IP.DU.SER.VEUR:443>
   ServerName DOMAINE.TLD:443
   UseCanonicalName On
   DocumentRoot "/chemin/de/nuxeo/"

   SSLEngine on
   #... config SSL ...

   RequestHeader append nuxeo-virtual-host "https://DOMAINE.TLD/"
   <IfModule proxy_module>
     ProxyRequests Off
     <Proxy *> 
        Order deny,allow
        Allow from all
     </Proxy> 
     ProxyPass /nuxeo/ http://localhost:8080/nuxeo/
     ProxyPassReverse /nuxeo/ http://localhost:8080/nuxeo/
     ProxyPreserveHost On
   </IfModule>

</VirtualHost>

Ça c’est d’après la documentation. En réalité, ce n’est pas suffisant. Tout d’abord, il faut bien placer la directive RequestHeader à l’extérieur du bloc proxy_module, sinon elle est juste ignorée par le serveur. Il ne m’a pas fallu moins qu’un tcpdump pour localiser le problème.
J’ai aussi constaté qu’avec ces directives, la première connexion à l’application se fait bien, puis on est immédiatement redirigé vers le même virtual host mais sur le port 80. Je règle le problème avec une directive de redirection dans le vhost http :

<VirtualHost *>
    ServerName DOMAINE.TLD
    DocumentRoot /chemin/de/nuxeo
    Redirect / https://DOMAINE.TLD/ 
</VirtualHost>

Ce n’est pas totalement satisfaisant, mais faute de mieux, cela fonctionne parfaitement.
En relançant Apache à ce stade, on obtient un proxy fonctionnel et sécurisé par SSL pour Nuxeo.

Avant d’aller plus loin, on peut prendre quelques minutes pour créer une base de données MySQL (ou autre) et un utilisateur MySQL associé à cette base. C’est ce compte de base de données qu’il faudra fournir au moment de la configuration de Nuxeo.

Je fais totalement l’impasse sur la configuration de Nuxeo DM dans le “wizard”, elle est bien documentée, et plutôt simple. Il suffit de lancer l’application par la commande ad-hoc si ce n’est pas déjà fait :

# cd /chemin/du/répertoire/nuxeo
# sudo -u nuxeo_user ./bin/nuxeoctl startbg

Ensuite on se connecte à l’adresse https://DOMAINE.TLD/nuxeo et on peut entamer la configuration.

Installation de Nuxeo DM sur FreeBSD, épisode 1

J’ai récemment choisi Nuxeo DM comme application de GED. C’est une application en JAVA, tournant dans un serveur d’application Tomcat. Nuxeo est packagé sous différentes formes, une seule est utilisable sur FreeBSD : Nuxeo DM Tomcat bundle.
L’installation de Nuxeo sur FreeBSD nécessite trois choses : installer les pré-requis logiciels, configurer l’environnement pour sécuriser l’application, et configurer l’application elle-même.

Côté pré-requis, il faut tout d’abord installer le Java Runtime Environment, et le Java Development Kit. Sous FreeBSD, il faut donc installer les ports java/diablo-jdk16 et java/diablo-jre16. Pour une question de licence, il faut télécharger à la main les packages nécessaires chez Oracle. Il suffit simplement de suivre les instructions obtenues pour chaque port au moment du make. Par exemple :

$ cd /usr/ports/java/diablo-jdk16/
$ make
===>  License check disabled, port has not defined LICENSE
===>  Found saved configuration for diablo-jdk-1.6.0.07.02_12

 Because of licensing restrictions, you must fetch the distribution
 manually.

 Please open http://www.oracle.com/technetwork/java/javase/downloads/index.html
 in a web browser and follow the "Download" link for
 "JDK DST Timezone Update Tool - 1_3_42" to obtain the
 time zone update file, tzupdater-1_3_42-2011k.zip.

 Please place the downloaded file(s) in /usr/ports/distfiles.
 ...

Une fois les ports java/diablo-jdk16 et java/diablo-jre16 installés, il faut installer un serveur web comme Apache 2.2, un serveur de bases de données (MySQL ou PostgreSQL par exemple), et à minima pdftohtml. Il est aussi possible d’installer OpenOffice, mais comme il n’existe pas de version “headless” dans les ports de FreeBSD, cela vous embarque dans l’installation complète avec gestionnaire de fenêtre et tutti quanti. Une calamité.
Pour utiliser l’application sur une connexion sécurisée (HTTPS), il faut qu’Apache dispose d’un certificat SSL adéquat.

Quand tout ceci est installé et configuré, il faut encore ajouter un compte utilisateur pour l’application Nuxeo. Les paresseux pourront la faire tourner sous le compte www. J’ai préféré un utilisateur indépendant, plus facile à tracer via auditd et l’accounting.

On peut alors télécharger et décompresser le package multiplateforme à partir du site internet de Nuxeo. On obtient un répertoire nommé nuxeo-dm-5.4.2-tomcat. J’ai pour habitude d’exploiter une application à partir d’un répertoire ne portant pas de numéro de version. On aura intérêt à renommer ce répertoire en nuxeo, car ici, faire un lien symbolique de nuxeo-dm-5.4.2-tomcat vers nuxeo ne donne pas vraiment satisfaction.
Pour en finir avec les fichiers, il faut faire un chown -R sur le répertoire nuxeo pour que les fichiers appartiennent tous à l’utilisateur non privilégié que l’on a créé plus haut.

Ensuite, comme nous sommes sur FreeBSD et pas Linux, il faut revoir certains scripts shell. Ces derniers ont un shebang qui pointe vers /bin/bash alors que notre bash est dans /usr/local/bin/. Les scripts à modifier sont les suivants : bin/monitorctl.sh, bin/nuxeoctl, bin/pack.

Arrivé là, il est intéressant de lancer l’application via la ligne de commande pour tester qu’au moins elle se lance et répond sur le port 8080 :

# cd nuxeo
# sudo -u nuxeo_user ./bin/nuxeoctl startbg
...
No current configuration, generating files...
Configuration files generated.
Server started with process ID 1438.

Le serveur est lancé, et il écoute bien sur le port 8080 :

# netstat -alnf inet | grep 8080
tcp4       0      0  *.8080                 *.*                    LISTEN

Ce que l’on peut aisément vérifier avec un client HTTP en ligne de commande, ou un coup de telnet :

$ curl http://127.0.0.1:8080
<META HTTP-EQUIV="refresh" CONTENT="0;URL=/nuxeo">

On a maintenant une application Tomcat/Java qui tourne sur notre serveur FreeBSD, sous un compte utilisateur dédié. Il reste à brancher devant un proxy Apache HTTPS, créer un script de démarrage automatique pour l’application, et configurer cette dernière.

La suite au prochain épisode :)

La gestion électronique de documents, épisode 3

Une fois qu’on a choisi un système de GED, et qu’on a passé avec un succès relatif les épreuves de l’installation, il reste le plus important : l’utilisation quotidienne.

L’ajout de documents déjà électroniques est assez trivial. Dans Nuxeo en prime on peut le faire par glisser-déposer, c’est super cool™. La difficulté finalement à ce niveau, c’est le classement. Avec le papier c’est simple : on n’a pas vraiment le choix. Soit le classeur rouge, soit le chasseur vert, mais pas les deux. Le classement électronique permet quant à lui de créer autant de dossiers qu’on le souhaite, et de surcharger ce classement par des étiquettes (tags). Une facture d’examen médical pourrait être classée dans “Santé” ou “Factures”, ou dans “Santé/Factures”, ou dans “Factures/Santé”, ou ne pas être classée du tout mais porter les étiquettes “Santé” et “Facture”, ou d’autres combinaisons de ces éléments.
Plus j’y réfléchi, et plus je me dis que le classement en dossiers/sous dossiers est archaïque. J’ai d’ailleurs toutes les peines à choisir une structure figée dans la quelle je puisse ranger à la fois l’existant, mais aussi les futurs documents. Le classement par tags a un bel avenir, sous réserve que l’application de GED choisie sache gérer ces étiquettes de manière ergonomique pour la recherche et la navigation.

J’ai un (autre) regret au sujet de Nuxeo : quand j’importe un PDF contenant des méta-données, ces dernières ne sont pas indexées par l’application. Je m’étais naïvement attendu à ce qu’un PDF dont le champs “Author” est renseigné puisse être retrouvé par une recherche sur le nom de l’auteur. Ce n’est pas le cas.
Globalement, j’ai l’impression que les outils de GED ne font pas vraiment la part belle aux méta-données contenues dans les documents. Nuxeo en tout cas considère que les méta-données importantes sont celles qui entourent la vie de votre document dans l’application. Certaines de ces informations sont gérées automatiquement (qui l’a mis en ligne, qui l’a modifié la dernière fois…), mais la majorité sont gérées manuellement par les utilisateurs : date d’expiration, sujets, source, nature, langue, flux de travail, relations entre documents, commentaires…

L’ajout de documents papier passe quant à lui par une étape de numérisation. On sort un peu du périmètre de l’application, mais il est intéressant de se pencher sur la question. Numériser en masse une foule de documents différents nécessite du temps et de la méthode. Ceux qui ont de la chance ont quelque part à porté de main un copieur numérique connecté. Ce genre de grosse machine d’entreprise permet de traiter les documents exactement comme le fait une photocopieuse classique : par lot, recto-verso, avec réduction ou agrandissement, avec optimisation du contraste, etc. Le résultat de la numérisation est en général un fichier PDF envoyé par email, ou déposé sur un serveur. Si vous avez un de ces copieurs à disposition, prenez le temps d’en assimiler les réglages et l’interface. Certains permettent de créer des programmes personnalisés. Ainsi, en pressant une seule touche, je suis capable de numériser recto-verso une pile de documents, avec un réglage spécial de résolution, de contraste, et de destination. Le PDF est déposé sur un serveur WebDAV où je peux le récupérer sans limite de taille. Ensuite, j’utilise un logiciel de reconnaissance de caractères qui me permet de transformer mon PDF “image” en “image+texte”. Ainsi, le contenu de chaque document ajouté à Nuxeo est indexé, et peut être retrouvé par le moteur de recherche de l’application. En effet, je ne conçois pas la GED sans la possibilité de rechercher mes documents par leur contenu.

Maintenant au boulot. Il me reste deux cartons d’archives et deux gros classeurs de papiers à numériser.

La gestion électronique de documents, épisode 2

Suite de l’épisode 1

Et donc j’ai choisi Nuxeo. Dans les grandes lignes, voici quelques raisons objectives :

  • accès au support
  • facilité de tester l’application
  • choix du moteur de bases de données
  • interface et fonctionnalités

Nuxeo est livrée clé en main, sous la forme d’une archive à décompresser. L’archive utilisable sur FreeBSD est celle qui est destinée à Linux, mais elle nécessite quelques modifications. Notamment les scripts de lancement de l’application devront être révisés (chemin du shell, entre autre).
Quoi qu’il en soit, il y a beaucoup de travail entre le moment où l’application est fonctionnelle et le moment où elle est vraiment utilisable (sécurisée, servie dans les règles de l’art).
Rien n’est précisé par exemple en terme de bonnes pratiques. L’utilisateur béotien risque de se retrouver avec une application fonctionnelle mais peu sécurisée. Avant même de lancer l’application pour s’y connecter, il est souhaitable d’utiliser un compte utilisateur non privilégié pour faire tourner ce serveur. Il est aussi fortement recommandé de mettre un serveur web en frontal qui redirigera les requêtes du port standard vers le port 8080. De même, il ne faut pas lancer l’application sur toutes les IP, mais la restreindre à 127.0.0.1.
L’utilisation d’un serveur web comme Apache se fait très simplement si on se contente du protocole HTTP, mais configurer un frontal HTTPS (donc avec chiffrement des transactions) est une autre paire de manches. Ici, même la documentation officielle n’est pas suffisante, et j’ai du utiliser tcpdump pour venir à bout des problèmes de configuration.

Et ça, c’était la partie drôle. Ça se gâte vraiment quand on souhaite mettre à jour l’application. Tout d’abord, il faut enregistrer l’instance de Nuxeo chez l’éditeur, une fois que c’est fait, le système de mise à jour interne devient accessible. Ce système de mise à jour est une énorme calamité. Une bouse monumentale. C’est un concentré des sept plaies de l’Égypte.
Après installation, j’avais une bonne quinzaine de mises à jour à installer. Mes 5 ou 6 premières tentatives se sont soldées par des échecs, nécessitant une réinstallation complète de l’application (ou une restauration à partir d’un snapshot, dans mon cas). En fait, la clé du succès est sur le site de support de Nuxeo. Il y a bien sûr un ordre pour appliquer les mises à jour, mais il faut surtout redémarrer l’application après chaque patch et suivre les recommandations spécifiques à la lettre.

Finalement, cette application si simple à installer au premier abord m’aura fait perdre de longues heures avant même que j’ai l’occasion de m’en servir pour archiver mes documents.