PoC - Yunohost - Remplacé Metronome par Prosody
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 moduleexternal_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