Bonjour,
Les gens qui suivent l’actualité autour de Matrix ont peut être vu l’annonce, conduit, un serveur Matrix écrit en Rust, vient d’annoncer une version beta. Jusqu’à maintenant, le code du serveur n’était pas consideré comme suffisant pour se connecter à la fédération, mais ce n’est plus le cas.
Mon chef m’ayant dit « ça serait bien de proposer d’héberger des serveurs matrix », j’ai tenté de voir ce que ça donne, et j’ai fait une installation hier sur un domaine de test, et je pense que ça peut intéresser des gens ici.
L’infra du boulot pour Conduit
Mon travail consiste surtout à aider les projets libres sponsorisés pour mon employeur. Et il y a ~1 an, on a réussi à convaincre la hiérarchie de sortir des dollars US pour avoir accès à une infra moderne basé sur des conteneurs (en l’occurrence, Openshift Dedicated). Je fait d’habitude mes tests sur des VMs, mais la, je suis parti sur ça.
Les machines qui font tourner nos programmes sont des m5.xlarge de chez Amazon EC2, donc 4 CPU (visiblement, du Intel Xeon Platinum 8000, jusquà 3.1 Ghz), 16G de ram.
Comme Conduit est écrit en Rust et que les fonctionnalités dans les programmes Rust se font surtout à la compilation (pas de plugins ni rien que je sache), j’ai choisi de recompiler le binaire via tout le système de CI intégré d’Openshift. Sans rentrer dans les détails, je lance un conteneur Fedora, j’y installe Cargo (l’outil de compilation/gestion de paquet de Rust), je fait un clone du code, et je lance cargo build --release
. Ensuite, je copie le binaire ailleurs et je fait le ménage avant de déployer tout ça sur l’infra.
La gestion des certificats et d’un reverse proxy est prise en charge par l’infrastructure, donc je ne vais pas détailler ce point. Mais si j’avais du déployer sur une machine normale, j’aurais du rajouter un reverse proxy, qui reste assez classique, et qui est largement documenté.
Pour indiquer ou se trouve le serveur, j’ai du aussi rajouter une entrée SRV dans le DNS pour tout faire passer par le port 443, et j’ai du aussi m’y prendre à 3 fois, parce que j’avais pas les yeux en face des trous.
La compilation
Premier retour, ça prends 25 minutes de compiler tout ça de 0, et les graphiques d’usage des ressources me disent que ça monte jusqu’à 8G de ram (et 5 unités de consommations de CPU, cad un CPU virtuel dans le cas présent, donc un hyperthread sur la machine). Le système repart de 0 à chaque fois à dessein, mais je suppose qu’une compilation incrémentale sans tout effacer est beaucoup plus rapide.
Je me concentre sur la partie CPU/RAM car le réseau est rarement (pour moi) un facteur limitant, mais il faut sans doute compter 100 à 200M de téléchargement de code. Le binaire une fois compilé fait 30M, ce qui me parait beaucoup (je me souviens de distribution Linux avec X11 sur une dizaine de disquettes, donc 10 M), mais c’est largement acceptable pour un binaire quasiment statique.
Il faut sans doute aussi prévoir un peu d’espace disque pour la compilation. Je n’ai pas de chiffres, mais on peut compter quelques gigas à mon avis, sur la base de la compilation d’autres outils en Rust.
Pour les gens moins frileux que moi, je conseille de regarder l’image docker et/ou de pousser à faire des paquets pour une distribution.
La configuration
La configuration est simple. Il y a un fichier config.toml d’exemple, mais on peut aussi passer par une configuration via des variables d’environnement (ce qui a causé un bug intéressant à débuguer).
La configuration est simple, mais la doc est inexistante pour le moment. Il y a de la documentation sur le déploiement (via docker-compose), mais pas plus.
Il n’y a pas encore d’outil d’administration en ligne de commande. Donc pour créer un compte, il faut changer la configuration (ouvrir l’ouverture de compte), relancer le serveur, faire le compte via un client matrix, et rechanger la configuration (pour refermer l’ouverture de compte). C’est assez fastidieux.
La consommation de ressources
J’ai installé ça hier, et pour le moment, la consommation en CPU est proche de 0 (les graphs me parle de 10e-4 unités de CPU), et la consommation de ram tourne autour de 20M. L’outil en Go que j’utilise à coté pour la gestion des certificats prends 30M de ram, et la base de donnée est sur le disque (ça utilise sqlite par défaut, mais il y a d’autres backend disponible à la compilation), donc tout me prends moins de 100 M de ram.
Comme j’ai pas encore fait grand chose, les chiffres ne sont pas vraiment significatif. Je vais aller voir ce que ça donne en traînant dans des salons divers
À titre de comparaison, j’ai aussi une instance Synapse pour moi même sur une machine pas cher de Scaleway (1 CPU atom à 1.7G, 4G de ram). Je fais tourner une Fedora 34 dessus, j’utilise les paquets de la distribution et j’ai exactement 1 utilisateur, moi avec 2 clients.
Htop m’affiche les chiffres suivants pour la consommation mémoire:
- postgresql ~125M
- synapse ~233M
- apache ~22M
La base postgresql prends 1.3G sur le disque, après ~1 an d’utilisation à traîner sur ~5 ou 6 salons irc sans trafic énorme. Le répertoire avec les médias fait 618 M.
Au niveau du CPU, Synapse ne dépasse pas les 3% à vide, ce qui est acceptable.
Il est vrai qu’en comparant Conduit sur Sqlite avec Synapse sur Postgresql, je compare des pommes et des oranges. Mais dans la mesure ou Sqlite est la configuration par défaut de Conduit, et que la doc de Synapse dit « non à Sqlite, sauf pour des tests », je pense que la comparaison est valable.
Conclusion rapide
Pour le moment, Conduit me parait pas mal. Les points qui m’ont fait raler sur synapse sont sa consommation de ressources à mon sens excessive (par comparaison au serveur XMPP que j’ai sur le même serveur, c’était quand même x10) et sa documentation complète mais assez confuse à l’époque, notamment sur le fait d’avoir à la fois un fichier .well-known/matrix/server et les enregistrements SRV (alors que l’un ou l’autre suffisent), et le détail de l’option nocanon
dans Apache.
Il reste encore beaucoup à faire (documentation, outils d’admin, et sans doute divers fonctionnalités), et je suppose que vu la philosophie Rust vis à vis des backends et vu les backends, il faut sans doute faire une croix sur ses données quand on veut passer de sqlite
à sled
ou heed
(et aussi faire une croix sur d’éventuelles sauvegardes), mais la bêta reste encourageante, notamment pour les gens qui ne se vautrent pas dans le luxe au niveau de la ram (càd moi quand je sort une carte arm du placard par rapport à moi au boulot avec mon petit cluster à 106G de mémoire).