PoC - Yunohost - Remplacé Metronome par Prosody

Comment j'ai remplacer Metronome par Prosody sur mon installation de Yunohost

J'utilise Yunohost 11.1 et c'est une solution vraiment pratique pour avoir un serveur à la maison avec quelques services pour mes proches. Depuis quelques temps je suis ennuyer par Metronome le serveur XMPP choisi, notamment car il implémante pas ou partiellement certaine extensions du protocole, et celui-ci ayant fait des progrès particulier dans le cadre de l'utilisation de mobile c'est dans se cadre que on rencontre les limitations. Notamment car certain de mes proches utilisent des téléphonne de la marque à la pomme.

Après avoir passer quelques semaines à paufiner le metronome afin d'en tiré le maximum, je fini par me dire que le choix de passer à Prosody devrais me permettre de résoudre les quelques problèmes qu'il me reste, sans perdre en fonctionalité par rapport au serveur embarquer.

Facile a dire, et en théorie facile aussi étant donné que Metronome est un fork de Prosody. Le chemin devrait être une route paisible ... Et ben vous vous en douter, si j'écrit cette article c'est que ce n'est pas le cas.

Attention Je le précise tout de suite, le travail n'est pas fini. Mais actuellement il fonctionne et je suis intéressé a pouvoir avoir des retour d'expériances afin d'améliorer la situation, il y aura donc à la fin de l'article une section avec ce qu'il reste a terminer ainsi que des liens vers des gens qui vont plus loins quand j'en aurait trouvé

Merci de suivre ces étapes que si vous les comprenez, vu le stade ou je me trouve il manque peut-être des informations.

Au commencement

Installation prosody

La première étape est d'installer Prosody, mais la version de Debian est la version 0.11 et quitte a changer pour plus moderne j'ai donc installer la version 0.12 qui se trouve dans les backports.

Cette décision ne m'a pas simplifier la modification sur certains aspects.

Je crée donc un fichier backport.list dans /etc/apt/sources.list.d/

deb http://deb.debian.org/debian bullseye-backports main contrib non-free
deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free

Du coup on peut faire l'installation après avoir mis à jour les dépots.

apt update
apt install prosody -t bullseye-backports

modules communautaire

Comme cela va être nécéssaire j'ai cloner le dépots des modules communautaire dans mon dossier opt

cd /opt
hg clone https://hg.prosody.im/prosody-modules/

La configuration

alors Prosody dans sa version 0.12 a entamé un gros travail de simplification et unification de la configuration, il faut donc bien lire la documentation des modules et se méfié des informations que l'on trouve sur internet parfois indiqué pour une ancienne version.

Les certificats SSL

Ici déjà le processus de simplification prend tout son sens, pas besoin de modifier un fichier pour indiqué quel fichiers de certificats et de clés sont a utilisé. Il faut placer des fichier .crt et .key dans le dossier certs de la configuration.

J'ai donc réaliser les étapes suivante, si votre domaine est foo.bar et donc a répété pour chaqu'un de vos domaine pour le quel vous utilisez le serveur XMPP

cd /etc/prosody/certs/
ln -s /etc/yunohost/certs/foo.bar/crt.pem foo.bar.crt
ln -s /etc/yunohost/certs/foo.bar/key.pem foo.barkey

les modules

Voici la liste des modules que j'ai activé. Pour rappel pour activé un module il doit apparaitre dans la liste si dessous qui se trouve dans le fichir /etc/prosody/prosody.cfg.lua mais égallement le module doit se trouver dans le dossier de prosody, pour les modules complémentaire j'ai fait un lien symbolique depuis le dépot cloner au dessus grace aux commandes suivante

cd  /usr/lib/prosody/modules/.
ln -s /opt/prosody-modules/<dossier module>/<fichier module>

Donc la liste des modules que j'ai activé est :

modules_enabled = {

    -- Generally required
        "disco"; -- Service discovery
        "roster"; -- Allow users to have a roster. Recommended ;)
        "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
        "tls"; -- Add support for secure TLS on c2s/s2s connections

    -- Not essential, but recommended
        "blocklist"; -- Allow users to block communications with other users
        "bookmarks"; -- Synchronise the list of open rooms between clients
        "carbons"; -- Keep multiple online clients in sync
        "dialback"; -- Support for verifying remote servers using DNS
        "limits"; -- Enable bandwidth limiting for XMPP connections
        "pep"; -- Allow users to store public and private data in their account
        "private"; -- Legacy account storage mechanism (XEP-0049)
        "smacks"; -- Stream management and resumption (XEP-0198)
        "vcard4"; -- User profiles (stored in PEP)
        "vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard

    -- Nice to have
        "csi_simple"; -- Simple but effective traffic optimizations for mobile devices
        "invites"; -- Create and manage invites
        "invites_adhoc"; -- Allow admins/users to create invitations via their client
        "invites_register"; -- Allows invited users to create accounts
        "ping"; -- Replies to XMPP pings with pongs
        "register"; -- Allow users to register on this server using a client and change passwords
        "time"; -- Let others know the time here on this server
        "uptime"; -- Report how long server has been running
        "version"; -- Replies to server version requests
        "mam"; -- Store recent messages to allow multi-device synchronization
        "external_services"; -- Provide external STUN/TURN service for e.g. audio/video calls

    -- Admin interfaces
        "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
        "admin_shell"; -- Allow secure administration via 'prosodyctl shell'

    -- HTTP modules
        --"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
        --"http_openmetrics"; -- for exposing metrics to stats collectors
        "websocket"; -- XMPP over WebSockets

     --Other specific functionality
        "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
        --"announce"; -- Send announcement to all online users
        --"groups"; -- Shared roster support
        --"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
        "mimicking"; -- Prevent address spoofing
        --"motd"; -- Send a message to users when they log in
        "proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
        "s2s_bidi"; -- Bi-directional server-to-server (XEP-0288)
        "server_contact_info"; -- Publish contact information for this service
        --"tombstones"; -- Prevent registration of deleted accounts
        --"watchregistrations"; -- Alert admins of registrations
        --"welcome"; -- Welcome users who register accounts

        "extdisco"; --discover external service
        "cloud_notify";
        "cloud_notify_encrypted";
        "cloud_notify_priority_tag";
}

Quelques petite configurations globale

Voici quelques autres configurations global pour améliorer la compatibilité

-- On autorise uniquement les connexions avec TLS1.2 ou plus
ssl = {
  protocol = "tlsv1_2+";
}
-- On indique les ports pour les connexions avec TLS direct
c2s_direct_tls_ports = 5223
s2s_direct_tls_ports = 5270

-- Quelques limites pour le bien du serveur
limits = {
    c2s = {
        rate = "10kb/s";
    };
    s2sin = {
        rate = "30kb/s";
    };
}

LDAP & VirtualHost

Je vous met ici l'intégrale de mon fichier conf.d/foo.bar.cfg.lua

Il faut noter la configuration du LDAP la déclaration du module http-upload (attention nouveau nom du module dans cette version). Le bloc pour la déclaration SSL a disparu.

On reviendra sur http-upload dans un chapitre plus loin, mais la partie VirtualHost est déjà configurer ici.

VirtualHost "foo.bar"
  enable = true

authentication = "ldap"
ldap_base = "ou=users,dc=yunohost,dc=org"
ldap_server = { "127.0.0.1" }
--ldap_filter = "(&(mail=*@foo.bar)(permission=cn=xmpp.main,ou=permission,dc=yunohost,dc=org))"

  }

  -- Discovery items
  disco_items = {
    { "muc.foo.bar" },
    { "pubsub.foo.bar" },
    { "jabber.foo.bar" },
    { "vjud.foo.bar" },
    { "xmpp-upload.foo.bar" },
  };

  contact_info = {
    abuse = { "mailto:abuse@foo.bar", "xmpp:admin@foo.bar" };
    admin = { "mailto:root@foo.bar", "xmpp:admin@foo.bar" };
  };

------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.

---Set up a MUC (multi-user chat) room server
Component "muc.foo.bar" "muc"
  name = "foo.bar Chatrooms"

  modules_enabled = {
    "muc_limits";
    "muc_log";
    "muc_mam";
    "muc_log_http";
    "vcard_muc";
  }

  muc_event_rate = 0.5
  muc_burst_factor = 10
  room_default_config = {
    logging = true,
    persistent = true
  };

---Set up a PubSub server
Component "pubsub.foo.bar" "pubsub"
  name = "foo.bar Publish/Subscribe"

---Set up a HTTP Upload service
Component "xmpp-upload.foo.bar" "http_file_share"
  name = "foo.bar Sharing Service"
  http_file_share_size_limit = 100*1024*1024 -- 100 MiB

---Set up a VJUD service
Component "vjud.foo.bar" "vjud"
  vjud_disco_name = "foo.bar User Directory"

J'ai du retiré le filtre LDAP car certain utilisateurs ne peuvent plus se connecter si je remet le filtre qi aparait dans les VirtualHost de Metronome, il faut que je vérifie si quelques chose a changer dans le format. A noter que le module LDAP est très différent car il a été réecrit pour être intégré au code du coeur de prosody et nous sommes passé du module ldap2 a ldap

TURN & ExtDisco

Il y a un nouveau module qui se nomme turn_external malheureusement quand je l'utilise j'ai un tracebac lors de l'établissement de la connexion. ... j'ai donc garder mon ancienne config telquel pour le moment. J'ai donc remis la configuration via external_service, comme on faisait dans les versions précédente.

http-upload

La aussi le module communautaire a été remplacé par un nouveau module http_file_share dans un but d'unification et de simplification. Mais dans le contexte de yunohost on aimerais bien utiliser le reverse proxy afin de pouvoir profiter des aventages, car par défaut le module utilise le serveur http de prosody.

Dans le but d'avoir une configuration équivalante au module sous metronome, j'ai modifier le fichier prosody.cfg.lua afin d'y ajouter les option suivante

http_ports = 5290
    http_paths = {
    file_share = "/upload/";
}

Il me reste a trouver ou sont stocker les fichier et comment le mettre dans le dossier ou ngnix va les chercher pour répondre aux requete GET sans passer par prosody. Dans l'attente j'ai ouvert le port 5281 correspondant au serveur web de prosody avec SSL, afin qu'il se charge tout seul de cette fonction.

Quand cela sera fait il faudra ajouté la mention suivante dans la définition du composant dans le VirtualHost

  http_file_share_base_url = "https://xmpp-upload.foo.bar:443"

Le Firewall

Il ne faut pas oublier d'ouvrir les port nécéssaire au fonctionnement des nouveaux modules de prosody, les connexions direct-tls et le http-upload pour le moment.

yunohost firewall allow TCP 5223
yunohost firewall allow TCP 5270
yunohost firewall allow TCP 5281

Les service

Maintenant que tout est bien configurer il faut éteindre le Metronome, le désactivé pour pas qu'il se relance et lancer prosody

systemctl stop metronome
systemctl disable metronome
systemctl restart prosody

ToDo

Actuellement j'aimerais finir :

  • Remettre un filtre LDAP
  • Remettre le http-upload via ngnix, pour permettre l'optimisation et évité d'ouvrir un port pour cela. -utiliser le module turn_external a la plalce du module external_service

A lire ailleurs

Cela va venir

La suite

Merci de me faire vos retours pour peut-être arriver a un tuto complet et des utilisateurs qui puissent profiter de se protocole quelques soit leur platforme