L'ECM, un exemple avec Alfresco
Alfresco, un ECM Open Source
Alfresco est un ECM Open Source sous licence LGPL.
Historique et versions
Il utilise la technologie Java JEE. Fondé par John Newton, co-fondateur de Documentum qui est le logicel de référence dans le domaine de l'ECM (aussi le plus cher).
2 Versions sont disponibles :- Community qui est la version gratuite, libre mais qui n'offre aucun support.
- La version Enterprise offre le support, les garanties, la fiabilité, ainsi que l'accès au support d'Alfresco et de ses partenaires.
- Community : 20 Janvier 2011, version 3.4 c
- Enterprise : 21 Janvier 2011, version 3.4
L'installation sur un système comme Debian lenny (stable) est assez fastidieuse, voici comment installer Alfresco.
Installation d'Alfresco
Il est possible d'installer le package Alfresco avec son serveur Apache Tomcat, et tous les composants. Mais à long terme, ce type d'installation s'avère dur à maintenir car les mises à jour doivent se faire manuellement. Nous avons donc opté pour une installation composant par composant.
Installation de la base de données
Plusieurs bases de données peuvent être installées, les plus courantes sont MySQL et PostgreSQL.
Nous choisissons d'installer PostgreSQL.
alfresco:/home/alfresco# apt-get install postgresql
Création de l'utilisateur de la base de données (PostgreSQL) :
alfresco:/home/alfresco# su - posgres postgres:/home/ postgres # psql postgres=# create user alfresco with password 'alfresc0'; alfresco:/home/alfresco# su postgres -c "createdb --owner alfresco --encoding UTF8 --lc-ctype fr_FR.UTF8 --lc-collate fr_FR.UTF8 --template template0 alfresco"
Rajouter dans le fichier /etc/apt/sources.list, non-free à la fin de chaque source pour pouvoir installer sun-java6-jdk sur Debian.
alfresco:/home/alfresco# vi /etc/apt/sources.list # deb http://debian.mirror.inra.fr/debian/ lenny main deb http://debian.mirror.inra.fr/debian/ lenny main non-free deb-src http://debian.mirror.inra.fr/debian/ lenny main non-free deb http://security.debian.org/ lenny/updates main non-free deb-src http://security.debian.org/ lenny/updates main non-free deb http://volatile.debian.org/debian-volatile lenny/volatile main deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
Mettre à jour les sources aptitude :
alfresco:/opt/tomcat# apt-get update
Installation de SWFTools
SWFTools permet de générer directement dans le Share d'Alfresco des prévisualisations d'images, de documents OpenOffice.
Il n'est pas présent dans les dépôts Debian, il faut l'installer SWFTools à la main en le compilant :
alfresco:/home/alfresco/swftools-2011-01-23-1815# wget http://www.swftools.org/swftools-2011-01-23-1815.tar.gz --2011-01-27 16:09:01-- http://www.swftools.org/swftools-2011-01-23-1815.tar.gz Resolving www.swftools.org... 212.112.241.67 Connecting to www.swftools.org|212.112.241.67|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 2671198 (2.5M) [application/x-gzip] Saving to: `swftools-2011-01-23-1815.tar.gz' 16% [==========> ] 447,809 351K/s alfresco:/home/alfresco/swftools-2011-01-23-1815# tar –xvf swftools-2011-01-23-1815.tar.gz
Dépendances nécessaires à la compilation de SWFTools :
alfresco:/home/alfresco/swftools-2011-01-23-1815# apt-get install make g++ zlib1g-dev libfreetype6-dev libgif-dev libjpeg62-dev libpg-java unzip … Setting up make (3.81-5) ... Setting up linux-libc-dev (2.6.26-26lenny1) ... Setting up libc6-dev (2.7-18lenny7) ... Setting up g++-4.3 (4.3.2-1.1) ... Setting up libstdc++6-4.3-dev (4.3.2-1.1) ... Setting up g++ (4:4.3.2-2) ... Setting up zlib-bin (1:1.2.3.3.dfsg-12) ... Setting up libfreetype6-dev (2.3.7-2+lenny4) ... Setting up libgif4 (4.1.6-6) ... Setting up libgif-dev (4.1.6-6) ... Setting up libjpeg62-dev (6b-14) ... alfresco:/home/alfresco/swftools-2011-01-23-1815# ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu alfresco:/home/alfresco/swftools-2011-01-23-1815# make making all in m4... cd m4;make all make[1]: Entering directory `/home/alfresco/swftools-2011-01-23-1815/m4' make[1]: Leaving directory `/home/alfresco/swftools-2011-01-23-1815/m4' making all in lib... cd lib;make all make[1]: Entering directory `/home/alfresco/swftools-2011-01-23-1815/lib' alfresco:/home/alfresco/swftools-2011-01-23-1815# make install making install in m4... cd m4;make install make[1]: Entering directory `/home/alfresco/swftools-2011-01-23-1815/m4' make[1]: Nothing to be done for `install'. make[1]: Leaving directory `/home/alfresco/swftools-2011-01-23-1815/m4' making install in lib...
Nettoyage, les binaires sont installés sur le système :
alfresco:/home/alfresco/swftools-2011-01-23-1815# cd .. alfresco:/home/alfresco# rm -r swftools-2011-01-23-1815
Openoffice.org 3.2
Pour que la prévisualisation fonctionne dans Share pour les documents Word, Powerpoint, Excel, etc ... Il faut installer Openoffice.org en version 3.2 au minimum.Dans sources.list rajouter à la suite du fichier /etc/apt/sources.list, la source suivante :
alfresco:/home/alfresco# cat >> /etc/apt/sources.list deb http://www.backports.org/debian lenny-backports main contrib non-free CTRL+D alfresco:/home/alfresco# apt-get -t lenny-backports install
Ensuite, on installe tous les composants d'OpenOffice.org avec sun-java6-jdk :
alfresco:/home/alfresco# apt-get install sun-java6-jdk openoffice.org-core openoffice.org-java-common openoffice.org-writer openoffice.org-impress openoffice.org-calc imagemagick xvfb Reading package lists... Done ...
Installation d'Apache Tomcat
alfresco:/opt/# cd /opt alfresco:/opt/# wget http://mir2.ovh.net/ftp.apache.org/dist/tomcat/tomcat-6/v6.0.30/bin/apache-tomcat-6.0.30.tar.gz alfresco:/opt/# tar -xvf apache-tomcat-6.0.30.tar.gz alfresco:/opt/# mv apache-tomcat-6.0.30 /opt/tomcat
Il ne faut pas oublier d'ajouter la ligne shared.loader au fichier /opt/tomcat/conf/catalina.properties car sinon, le serveur ne retrouvera pas certaines librairies d'Alfresco (livrée avec l'application web d'Alfresco).
alfresco:/opt/tomcat# vi conf/catalina.properties shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
Il est possible que la librairie pour l'accès à la base de données ne soit pas présente, il faut la copier :
alfresco:/opt/tomcat# cp /usr/share/java/postgresql-jdbc3-8.2.jar lib/
S'il est impossible de trouver le fichier /usr/share/java/postgresql-jdbc3-8.2.jar, c'est que le package libpg-java n'est pas installé.
alfresco:/opt/tomcat# apt-get install libpg-java
Voici les lignes à rajouter dans /opt/tomcat/bin/catalina.sh ou dans le fichier de lancement du serveur. On peut le personnaliser en fonction de nos besoins, si le serveur possède beaucoup de mémoire vive, il est possible d'augmenter ces valeurs pour autoriser l'utilisation de plus de mémoire :
JAVA_OPTS="-Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m"
Installation de l'application web Alfresco
La version finale est disponible sur plusieurs plateformes. Pour une installation propre, les fichiers d'installation sont disponibles ici (en version 3.4c). Il est possible qu'il y ait une mise à jour d'ici là, pour être sûr d'avoir la dernière version, il suffira alors d'aller sur la page de téléchargement d'Alfresco et de choisir "Custom Installs & Optional Modules". Comme nous avons installé tous les composants manuellement, nous n'allons télécharger sur cette liste que les fichiers correspondants au .war d'Alfresco et le Share.
alfresco:/home/alfresco/Desktop# wget http://www.alfresco.com/elqNow/elqRedir.htm?ref=http://dl.alfresco.com/release/community/build-3335/alfresco-community-3.4.c.zip?dl_file=release/community/build-3335/alfresco-community-3.4.c.zip alfresco:/home/alfresco/Desktop# unzip alfresco-community-3.4.c.zip Archive: alfresco-community-3.4.c.zip creating: licenses/ creating: licenses/3rd-party/ creating: web-server/ creating: web-server/conf/ creating: web-server/lib/ creating: web-server/shared/ creating: web-server/shared/classes/ alfresco:/home/alfresco/Desktop# cd web-server/ alfresco:/home/alfresco/Desktop/web-server# mv * /opt/tomcat/
L'application web Alfresco peut s'installer sur un serveur d'applications Apache Tomcat ou encore Glassfish. Une fois la décompression terminée, la configuration de base de l'application web Alfresco est définie dans /opt/tomcat/shared/classes/alfresco-global.properties
Configuration d'Alfresco
Le fichier de configuration alfresco-global.properties contient les principaux paramètres de configuration d'Alfresco. Toute notre configuration qui va suivre va se faire dans ce fichier.
Par convention, nous ne devons modifier que les fichiers qui se situent dans cette arborescence :
- /opt/tomcat/shared/classes
Ils contiennent les différentes configurations du serveur ainsi que des exemples de configuration. Par exemple, les fichiers suivants
- /opt/tomcat/shared/classes/alfresco/alfresco-global.properties
- /opt/tomcat/shared/classes/alfresco/extension/file-servers-custom.xml
Un exemple de configuration est disponible ici.
À la base le fichier alfresco-global.properties.sample n'est pas utilisé, nous le renommons en retirant l'extension .sample pour qu'il soit utilisé.
alfresco:/opt/tomcat# mv shared/classes/alfresco-global.properties.sample shared/classes/alfresco-global.properties # PostgreSQL db.name=alfresco db.username=alfresco db.password=alfresc0 db.host=localhost db.port=5432 # Sample custom content and index data location dir.root=/opt/tomcat/alf_data # PostgreSQL connection (requires postgresql-8.2-504.jdbc3.jar or equivalent) db.driver=org.postgresql.Driver db.url=jdbc:postgresql://${db.host}:${db.port}/${db.name} # PostgreSQL dialect hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.query.substitutions=true TRUE, false FALSE # # External locations #------------- ooo.exe=/usr/bin/soffice jodconverter.officeHome=/usr/lib/openoffice ooo.enabled=true swf.exe=/usr/local/bin/pdf2swf img.exe=/usr/bin/convert img.dyn=/usr/lib img.root=/usr
S'il y a une erreur Context initialization failed, c'est à cause des restes de la base de données Apache Derby (générée automatiquement au lancement si aucune base de données n'est configurée dans la ligne hibernate.dialectt du fichier fichier alfresco-global.properties). Pour afficher les logs et voir les erreurs, le fichier situé dans /opt/tomcat/logs/catalina.out.
Pour y remédier, il faut supprimer le dossier ./alf_data, dropper la base de données et la recréer :
alfresco:/opt/tomcat# su - posgres postgres=# DROP DATABASE alfresco; DROP DATABASE postgres=# CREATE DATABASE alfresco; CREATE DATABASE
Démarrage d'Alfresco
alfresco: /opt/tomcat# bin/startup.sh Règle iptable pour acceder au serveur sur le port 80 (HTTP) et sur le port 8080 iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Il est possible d'utiliser un script init.d pour le lancer automatiquement Alfresco au démarrage du serveur (/etc/init.d/alfresco) :
#! /bin/sh # Start/Stop Script case "$1" in start) iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 /opt/tomcat/bin/startup.sh ;; stop) /opt/tomcat/bin/shutdown.sh ;; *) echo "Usage: /etc/init.d/alfresco {start|stop}" exit 1 ;; esac exit 0
Lancer automatiquement Alfresco au démarrage du serveur
alfresco:/opt/tomcat# chmod +x /etc/init.d/alfresco alfresco:/opt/tomcat# update-rd.d /etc/init.d/alfresco defaults
Les technologies utilisées dans la mise en oeuvre d'une architecture simple, puis répliquée
L'architecture simple
Le serveur est pour l'instant configuré en mono-serveur comme ci-dessous :

Figure 2 : Architecture simple
Cette solution présente quelques inconvénients en termes de disponibilité. Il est possible que le serveur tombe en panne, il n'y a alors pas de secours. Alfresco possède une solution de haute disponibilité où l'on peut redonder chacun des composants dans le schéma ci-dessus.
On arrive donc à une solution plus disponible mais qui est plus chère et plus complexe à configurer.
L'architecture répliquée

Figure 3 : Architecture répliquée
L'architecture répliquée est utilisée lorsque le nombre d'utilisateur augmente grandement et qu'on a besoin de monter en charge.
Voici les éléments clés dans une architecture répliquée :
- Répartiteur de charge : Un répartiteur de charge qui supporte les Sticky Sessions. C'est-à-dire que dans l'en-tête, un cookie JSESSIONID qui permet d'assurer que les requêtes sont toujours aiguillées vers le même serveur Alfresco situé derrière le répartiteur de charge.
Cela peut être un serveur HAProxy. - Tomcat : Le serveur d'applications où l'on déploie le WAR d'Alfresco.
- L2 Cache : Utilise EHCache, pour activer le clustering du cache L2.
Nous pouvons activer le clustering en 2 étapes :
- Définir un alfresco.cluster.name dans le fichier de configuration alfresco-global.properties.
- Pour activer la réplication EHCache, renommer ehcache-custom.xml.sample.cluster en ehcache-custom.xml situé dans /opt/tomcat/shared/classes/alfresco/extensions.
alfresco:/opt/tomcat# mv shared/classes/alfresco/extension/ehcache-custom.xml.sample.cluster shared/classes/alfresco/extension/ehcache-custom.xml
On peut paramétrer différents paramètres de synchronisation, les périodes, méthodes, etc ...
Dans le fichier alfresco-global.properties, il faut modifier la ligne suivante pour fonctionner en TCP :
alfresco.jgroups.defaultProtocol=TCP
Ensuite, les ports avec les noms des nœuds qui sont membres du cluster :alfresco.tcp.initial_hosts=noeud1[7800],noeud2[7800]
Chaque nœud serveur doit pouvoir accéder aux noms des nœuds via l'IP routée. Si on peut joindre le nœud1 avec ping nœud1 mais que les réponses viennent de 127.0.0.1, c'est que le fichier /etc/hosts est mal configuré.
Enfin, définir dans le fichier /etc/hosts, l'adresse IP routée du noeud1 192.x.x.x : Sur le noeud1 et noeud2 (fichier /etc/hosts) :192.168.1.145 noeud1 192.168.1.129 noeud2
Sur le noeud1, par exemple, on doit pouvoir joindre le noeud1 et noeud2 comme cela :alfresco:~# ping noeud1 PING noeud1 (192.168.1.145) 56(84) bytes of data. 64 bytes from noeud1 (192.168.1.145): icmp_req=1 ttl=64 time=0.914 ms 64 bytes from noeud1 (192.168.1.145): icmp_req=2 ttl=64 time=0.071 ms ^C --- noeud1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1005ms rtt min/avg/max/mdev = 0.071/0.492/0.914/0.422 ms alfresco:~# ping noeud2 PING noeud2 (192.168.1.129) 56(84) bytes of data. 64 bytes from noeud2 (192.168.1.129): icmp_req=1 ttl=64 time=0.731 ms 64 bytes from noeud2 (192.168.1.129): icmp_req=2 ttl=64 time=0.279 ms ^C --- noeud2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.279/0.505/0.731/0.226 ms
- Base de données : Plusieurs bases de données peuvent être choisies (PostgreSQL, MySQL, Hypersonic, ...). Il est conseillé de mettre la base de données dans un autre serveur que le disque partagé pour avoir plus de performances. Dans notre cas, nous avons lancé le serveur de base de données sur le même serveur que le noeud1. Cela a été fait pour les besoins de ce guide.
Dans notre cas, notre base de donnée est configurée en local, nous la rendons accessible depuis une autre machine (fichier /etc/postgresql/8.3/main/postgresql.conf) :
listen_addresses = 'noeud1, localhost'
Le fichier /etc/postgresql/8.3/main/postgresql/8.3/main/pg_hba.conf permet de restreindre l'accès à la base de données au réseau local seulement.
host all all 192.168.1.0/24 md5
Il y a la possibilité de répliquer la base de donnée mais nous ne rentrons pas dans ce cas là.
- Contenu des fichiers : Le contenu des fichiers est stocké sur un disque partagé NFS. Ce disque peut être redondé lui-même pour offrir plus de disponibilité. De même que pour la base de données, le contenu des fichiers est stocké sur le noeud1, si l'on veut le stocker ailleurs, il suffit d'indiquer un chemin vers autre serveur de fichiers.
Du côté du serveur de fichiers :
alfresco:/opt/tomcat# apt-get install nfs-kernel-server alfresco:/opt/tomcat# mkdir -p /srv/data alfresco:/opt/tomcat# chown -R alfresco:alfresco /srv/data/
Toujours sur le serveur, rajouter le dossier partagé :
alfresco:/opt/tomcat# cat >> /etc/exports /srv/data noeud2(rw,no_root_squash) noeud1(rw,no_root_squash) CTRL+D alfresco:/opt/tomcat# exportfs -a
Ensuite, sur le/les client, on installe les packages pour communiquer en NFS et on monte le disque partagé :
alfresco:/opt/tomcat# apt-get install portmap nfs-common alfresco:/opt/tomcat# mkdir /data alfresco:/opt/tomcat# mount -t nfs noeud1:/srv/data /data
Sur le client, Il est possible de monter le disque automatiquement au démarrage du client, grâce au fichier /etc/fstab :
noeud1:/srv/data /data nfs soft,timeo=5,intr,rsize=8192,wsize=8192 0 0
Au final, nous obtenons le fichier alfresco.global.properties ci-dessous :
# Il faut absolument qu'il y ait un nom pour que le service de cluster demarre (a declarer pour chaque noeuds du cluster) alfresco.cluster.name=noeud2 # Pour l'acces a la base de donnees a distance db.host=noeud1 alfresco.jgroups.defaultProtocol=TCP alfresco.tcp.initial_hosts=noeud1[7800],noeud2[7800] # Dossier local qui stocke les index de recherche Lucene dir.root=/opt/tomcat/alf_data # Chemin du contenu des fichiers (/data est le chemin vers le partage NFS du serveur de fichiers) dir.contentstore=/data/alfresco/alf_data/contentstore dir.contentstore.deleted=/data/alfresco/alf_data/contentstore.deleted dir.auditcontentstore=/data/alfresco/alf_data/audit.contentstore