La grosse particularité de ce serveur est d'être écrit en Erlang, un langage de programmation méconnu, qui rend ce projet très robuste. EJabberd a la réputation de bien tenir la charge, et il se révèle un très bon choix pour mettre en place un réseau de messagerie instantanée basé sur XMPP au sein d'une entreprise.

EJabberd supporte les bases de données MySQL, MSSQL, PostGreSQL et Mnesia, cette dernière étant la base native venant avec le langage Erlang. Notez que MySQL n'est pas pleinement supporté, il est donc recommandé d'être prudent quand à son utilisation avec EJabberd.

Il s'agit d'un serveur très simple à installer et configurer, qui de plus accepte la mise en place de cluster et arrive d'office avec une interface web d'administration.

Notez que les exemples contenus dans ce billet sont valables sous Ubuntu Server 8.04 Hardy Heron et Debian 5.0.3 Lenny. Il peut être nécessaire d'adapter certaines parties, notamment concernant les chemins de fichiers/dossiers, avec d'autres distributions.

jabber.jpg


Installation

Comme toujours avec Ubuntu et apt-get, rien de plus simple :

sudo apt-get install ejabberd

Ou encore plus simplement : apt.png


Configuration du serveur

EJabberd se configure via le fichier /etc/ejabberd/ejabberd.cfg.

Il est possible une fois la configuration du serveur mise en place d'utiliser l'interface web accessible par "http://votreserveur:5280/admin" pour réaliser les tâches d'administration.

Mais avant tout, il est préférable de créer un certificat valide pour le domaine que vous allez utiliser :

sudo mv /etc/ejabberd/ejabberd.pem /etc/ejabberd/edjabberd.pem.orig
openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem
openssl rsa -in privkey.pem -out privkey.pem
cat privkey.pem >> server.pem
rm privkey.pem
sudo mv server.pem /etc/ejabberd/ejabberd.pem

Il est primordial de répondre à la question "Common Name" avec votre nom de domaine :

Common Name (eg, YOUR name) : votredomaine.tld

Notez le mot de passe demandé au début, même si vous ne devriez plus en avoir besoin par la suite.

Il faut également penser à ouvrir dans votre firewall les ports TCP 5222 et 5269 pour le protocole XMPP, ainsi que le port TCP 5280 pour l'interface web d'administration.


Passons maintenant à la configuration de ejabberd.cfg

Notez que les commentaires dans ce fichier utilisent la syntaxe du langage Erlang.
Il faut ainsi employer le caractère % et non pas # ou ; pour commenter une ligne. De plus, n'oubliez pas les "." terminant les lignes, ils sont indispensables !

sudo vim /etc/ejabberd/ejabberd.cfg

Indiquons tout d'abord le nom du compte administrateur du serveur, puis renseignons le nom d'hôte utilisé :

%% Admin user
{acl, admin, {user, "adminjabber", "votredomaine.tld"}}.

%% Hostname
{hosts, ["votredomaine.tld"]}.

Il est tout a fait possible de renseigner plusieurs administrateurs.
Ensuite, on peut indiquer l'adresse de courriel qui va recevoir les notifications de nouveaux comptes :

%% Notify this user whenever a new account is registered
{registration_watchers, ["admin@votredomaine.tld"]}.

Les deux lignes suivantes à modifier éventuellement permettent ou non d'autoriser les utilisateurs à créer eux-même leurs comptes sur le serveurs. Si la ligne contenant "deny" est commentée, alors tout les utilisateurs pourront s'enregistrer librement. Si c'est la ligne contenant "allow" qui est commentée, alors l'administrateur sera le seul à pourvoir enregistrer de nouveaux comptes. Dans l'exemple ci-dessous, les utilisateurs sont autorisés à créer leurs comptes :

% Every username can be registered via in-band registration:
{access, register, [{allow, all}]}.

% None username can be registered via in-band registration:
%{access, register, [{deny, all}]}.

Il est possible de modifier les ports TCP par défauts et de spécifier l'adresse IP où écouter dans la section "Listened Ports" :

{listen,
 [
% Client to Server Connection
  {5222, ejabberd_c2s, [
                        {ip, {67, 159, 22, 54}},
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536},
                        starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}
                       ]},

% Server to Server connection
  {5269, ejabberd_s2s_in, [
                        {ip, {67, 159, 22, 54}},
                        {shaper, s2s_shaper},
                        {max_stanza_size, 131072}
                       ]},

% HTTP service
  {5280, ejabberd_http, [
                        {ip, {67, 159, 22, 54}},
                        http_poll,
                        web_admin
                       ]}
]}.

Avec cette configuration, il est nécessaire d'utiliser des enregistrements DNS de type SRV sur votre serveur DNS dans le fichier de zone de votre domaine, ainsi :

_xmpp-client._tcp.tondomaine. 86400 IN   SRV     20 0 5222  votredomaine.tld.
_xmpp-server._tcp.tondomaine. 86400 IN   SRV     20 0 5269 votredomaine.tld.

C'est facilement réalisable si vous hébergez votre propre serveur DNS, avec pourquoi pas BIND. Mais aussi chez votre hébergeur probablement, faites la demande.
Chez Gandi, c'est tout a fait possible.

Si vous n'avez pas la possibilité de mettre en place un enregistrement SRV, il est possible de contourner le problème en modifiant dans toutes les configurations "votredomaine.tld" par, ça n'est qu'un exemple, "im.votredomaine.tld", puis de faire pointer ce nom vers votre serveur. Évidemment les adresses Jabber seront alors de la forme "utilisateur@im.votredomaine.tld".
Voilà pour les modifications essentielles à réaliser.

Nous allons maintenant créer les utilisateurs de base, avec la commande "ejabberdctl" utilisé ainsi "ejabberdctl option utilisateur serveur motdepasse" :

ejabberdctl register adminjabber votredomaine.tld XXXXX

La commande ci-dessus crée (grâce à l'option "register") l'utilisateur "adminjabber" du domaine "votredomaine.tld" avec le mot de passe "XXXXX".

Pour supprimer un utilisateur :

ejabberdctl unregister utilisateur serveur

Ejabberdctl permet de nombreuses manipulations :

  • status "get ejabberd status"
  • stop "stop ejabberd"
  • restart " restart ejabberd"
  • reopen-log "reopen log file"
  • register user server password "register a user"
  • unregister user server "unregister a user"
  • backup file "store a database backup to file"
  • restore file "restore a database backup from file"
  • install-fallback file "install a database fallback from file"
  • dump file "dump a database to a text file"
  • load file "restore a database from a text file"
  • import-file file "import user data from jabberd 1.4 spool file"
  • import-dir dir "import user data from jabberd 1.4 spool directory"
  • delete-expired-messages "delete expired offline messages from database"
  • delete-old-messages n "delete offline messages older than n days from database"
  • vhost host ... "execute host-specific commands"
  • incoming-s2s-number "print number of incoming s2s connections on the node"
  • outgoing-s2s-number "print number of outgoing s2s connections on the node"
  • user-resources user server "print user's connected resources"
  • connected-users-number "print a number of established sessions"
  • connected-users "list all established sessions"

Mais nombre des possibilités offertes pas "ejabberdctl" sont réalisables dans l'interface web d'administration.


L'interface web est très pratique et permet d'administrer les utilisateurs et le serveurs sans avoir la main sur la machine hébergeant celui-ci. Connectez vous sur "http://votreserveur:5280/admin", puis indiquez le nom d'un compte administrateur, de la forme "nom@votredomaine.tld", ainsi que le mot de passe associé.

Vous disposez ensuite d'un interface très simple d'emploi permettant de réaliser la majorité des tâches usuelles, surveillance du serveur, consultation des statistiques, ajouts/suppressions/modifications d'utilisateurs, etc...

capture-ejabberd-web.png

Utilisation

Avec un client Jabber standard, comme Gajim, que je vous recommande chaudement.

Il suffit de se connecter via le nom de domaine renseigné dans la configuration, en choisissant de créer ou non l'utilisateur désiré, en fonction de votre choix concernant l'enregistrement des nouveaux utilisateurs.

capture-ejabberd-gajim.png

Tout fonctionne exactement comme avec un serveur Jabber classique, la messagerie instantanée est pleinement fonctionnelle, vous pouvez communiquer avec les utilisateurs aillant un compte sur votre serveur tout comme avec les utilisateurs du monde entier, quel que soit le nom de domaine (Pensez à ouvrir le port TCP 5269 pour autoriser les connexions entrantes "s2s").

Pour découvrir plus avant les possibilités de Jabber et du protocole XMPP, consultez le très bon site Jabberfr.org


Pour allez plus loin

Utilisation d'une base de donnée MySQL

Comme dit plus haut, eJabberd ne supporte pas pleinement MySQL, ainsi il est recommandé de réfléchir à deux fois avant de transférer un grand nombre de comptes vers MySQL. Par contre, si votre installation de eJabberd est fraiche, la mise en place immédiate d'une connexion avec MySQL ne pose pas de gros problèmes. Notez également que la base "mnesia" utilisée par défaut est performante, et qu'elle fait très bien l'affaire pour un serveur de taille réduite.

Il est nécessaire d'utiliser un driver pour faire communiquer ejabberd avec une base MySQL. Pour l'installer il vous faut utiliser la commande suivante :

svn co https://svn.process-one.net/ejabberd-modules/mysql trunk mysql

Si vous n'avez pas installé SubVersion :

sudo apt-get install subversion

Il faut ensuite récupérer les sources d'ejabberd, les décompresser, puis copier ou directement importer avec svn comme dans les lignes ci dessous, les fichiers du driver dans les sources. Compilez puis déplacer les fichiers mysql*.beam vers "/usr/lib/ejabberd/ebin/" :

tar -xzvf ejabberd-2.0.3.tar.gz
cd ejabberd-2.0.3
svn co https://svn.process-one.net/ejabberd-modules/mysql trunk mysql
cd mysql/mysql/trunk/
./build.sh
cp ebin/*.beam /usr/lib/ejabberd/ebin/

Ensuite il nous reste à créer une base de donnée sur notre serveur MySQL, puis à utiliser le script disponible dans les sources (dans /cheminvers/sources/ejabberd/odbc/mysql.sql) pour créer les tables adéquates dans cette base.

Une fois la base en place, on réalise un backup des comptes déjà présents dans la base "mnesia" utilisé par défaut à l'installation, dans l'idéal juste le compte administrateur :

ejabberdctl backup mnesiadata

Et on indique dans le fichier de configuration de ejabberd d'utiliser MySQL :

{odbc_server, {mysql, "<host>", "<base>", "<user>", "<password>"}}.
{auth_method, odbc}.

La première ligne indique comment se connecter au serveur MySQL, la seconde indique d'utiliser l'authentification "odbc". N'oubliez pas de commenter la ligne {auth_method, internal}. pour ne plus utiliser "mnesia"

Et on redémarre le serveur :

sudo /etc/init.d/ejabberd restart

Pour en finir, il faut commencer à peupler la base MySQL avec au moins l'administrateur. Pour cela on restaure le backup réalisé juste avant :

ejabberdctl restore mnesiadata

Et voilà, eJabberd utilise MySQL, et le compte administrateur est actif pour commencer à administrer le serveur.

Notez que ce "restore mnesiadata" n'a pas voulu peupler ma base MySQL. J'ai du créer les comptes avec "eabberd register nom serveur motdepasse" pour les voir arriver dans mes tables MySQL...


Passerelles vers d'autres protocoles
  • MSN

Pour mettre en place une passerelle MSN, il existe le projet PyMSNt, écrit en python comme son nom le laisse entendre. Pour l'installer :

sudo apt-get install pymsnt

La configuration de PyMSNt se fait via le fichier "/etc/pymsnt.conf.xml". Les paramètres suivants sont importants :

<!-- The JabberID of the transport -->
<jid>msn.votredomaine.tld</jid>
<!-- The public IP or DNS name of the machine the transport is running on -->
<!-- This is needed for file transfer!! -->
<host>msn.votredomaine.tld</host>

<!-- The IP address of the main Jabber server to connect to -->
<mainServer>127.0.0.1</mainServer>
<!-- The TCP port to connect to the Jabber server on (this is the default for Jabberd2) -->
<port>5557</port>
<!-- The authentication token to use when connecting to the Jabber server -->
<secret>XXXXX</secret>

Une fois la passerelle fonctionnelle, vous pourrez allez peaufiner la configuration.

Ensuite allons dans le fichier de configuration de eJabberd pour y modifier les lignes sous "MSN Transport" de la façon suivante :

% MSN Transport
 {5557, ejabberd_service, [{ip, {127, 0, 0, 1}},
                           {access, all},
                           {host, "msn.votredomaine.tld", [{password, "XXXXX"}]}]},

Attention à bien chosir le même port TCP dans les deux fichiers, le port par défaut dans le fichier de configuration de PyMSNt n'étant pas identique à celui par défaut de eJabberd. Le mot de passe "XXXXX" doit évidemment être similaire dans les deux fichiers.

Il suffit maintenant de redémarrer les deux serveurs :

sudo /etc/init.d/ejabberd restart
sudo /etc/init.d/pymsnt restart

Et votre passerelle MSN sera visible avec Gajim si vous faites "Découvrir les services" dans le menu "Actions".


Archivages des conférences

Pour activer l'archivage des conférences, allons modifier dans le fichiers de configuration la ligne :

% {mod_muc_log, },

A remplacer par :

{mod_muc_log, [{allow_room_log, true},
              {access_log, muc},
              {outdir, "/var/www/muclogs"},
              {dirtype, plain},
              {timezone, local},
              {top_link, {"http://www.votredomaine.tld", "Logs des conferences"}},
              {cssfile, false}]},

On trouvera alors les logs dans le répertoire "/var/www/muclogs/". Il nous faut le créer et lui donner les droits adéquates (cette configuration implique la présence d'un serveur http sur la machine):

sudo mkdir /var/www/muclogs
sudo chown ejabberd:ejabberd /var/www/muclogs
sudo chmod 755 /var/www/muclogs

Et voilà, les logs sont visibles via "http://votreserveur.tld/muclogs/".


Migration de la base de données

Ejabberd est particulièrement sensible au changement du nom de la machine qui héberge le service. Si ce nom change, il y a fort à parier que votre serveur ne fonctionnera plus du tout. Ce problème est très pénible en cas de migration du service sur une nouvelle machine.

Une solution existe. Il s'agit de travailler directement sur la base de données Mnesia de Ejabberd, et d'y changer le nom de la machine. Voir cette page en anglais, ou la traduction libre ci-dessous.

Il est important de connaitre le nom des hôtes, l'ancien et l'actuel, avant de commencer la procédure. Notez également que cette procédure est valable pour les versions de Ejabberd 2.1.0 ou supérieures. Pour les versions plus anciennes, voir cette page de la documentation de Ejabberd.

  • Pour commencer, il faut définir quelques variables :
OLDNODE=ejabberd@oldmachine
NEWNODE=ejabberd@newmachine
OLDFILE=/tmp/old.backup
NEWFILE=/tmp/new.backup
  • Démarrer Ejabberd en forcant l'utilisation de l'ancien nom
ejabberdctl --node $OLDNODE start
  • Réalisez un backup
ejabberdctl --node $OLDNODE backup $OLDFILE
  • Arrêtez le service
ejabberdctl --node $OLDNODE stop
  • Assurez vous de supprimer les fichiers du spool de la base Mnesia
mkdir /var/lib/ejabberd/oldfiles
mv /var/lib/ejabberd/*.* /var/lib/ejabberd/oldfiles/
  • Démarrez Ejabber. Pas besoin de spécifier le nom d'hôte cette fois
ejabberdctl start
  • Convertissez le backup avec le nom du nouvelle hôte
ejabberdctl mnesia_change_nodename $OLDNODE $NEWNODE $OLDFILE $NEWFILE
  • Installez le backup en tant que fallback
ejabberdctl install_fallback $NEWFILE
  • Arrêtez ejabberd:
ejabberdctl stop

Des messages d'erreurs peuvent apparaitre, il n'y a pas d'inquiétude à avoir.

Mnesia(ejabberd@newmachine):
** ERROR ** (ignoring core)
** FATAL ** A fallback is installed and Mnesia must be restarted.
Forcing shutdown after mnesia_down from ejabberd@newmachine...
  • Finalement vous pouvez redémarrer Ejabberd
ejabberdctl start
  • Vérifier que les informations sont toutes présentes (comptes, rosters, etc). Une fois terminé, pensez à supprimer les fichiers de backup présents dans les répertoires publics.
  • Dernière modification le : 23 mai 2010 à 13:56