🛠 Refonte de la stack Matrix sans-nuage

J’ai postĂ© ça : https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5338

Voici mes notes d’installation :

Prérequis

ParamĂštres DNS

  • Port HTTP : 80, en TCP
  • Port HTTPS : 443, en TCP et UDP
  • Port de la fĂ©dĂ©ration : 8448, en TCP et UDP
Type HĂŽte Cible
A matrix Adresse IPv4 du serveur
AAA matrix Adresse IPv6 du serveur
CNAME element matrix.domaine.com
CNAME ntfy matrix.domaine.com

Applications

sudo apt update
sudo apt install pipx
pipx ensurepath
sudo apt install git
sudo apt install just
sudo apt install python3
sudo apt install pwgen
sudo pipx install --include-deps ansible

Ansible

Normalement, le playbook se fait sur un autre systĂšme puis est exĂ©cutĂ© sur la machine distante. Moi, je ne suis pas douĂ©, j’ai tout fait sur une seule machine.

Récupérez le playbook

Depuis le dossier de l’utilisateur (/home/utilisateur), ça crĂ©era un dossier matrix-docker-ansible-deploy depuis lequel il faudra exĂ©cuter toutes les commandes

git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git

Créer le dossier du serveur

Depuis le dossier matrix-docker-ansible-deploy. Il faut modifier le nom de domaine avec celui qui sera utilisé.

mkdir -p inventory/host_vars/matrix.domaine.com

CrĂ©er le fichier de configuration d’exemple, vars.yml

cp examples/vars.yml inventory/host_vars/matrix.domaine.com/vars.yml

Le contenu du fichier correponds Ă  ce que j’ai proposĂ© plus haut (https://forum.arn-fai.net/t/topic/9867/32)

ParamÚtres de délégation

C’est le sujet sur lequel je patauge, je vous laisse lire la documentation : https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook.md

Modifier le date du journal des modifications

En haut du fichier vars.yml, il faut changer la date du journal des modifications pour montrer qu’il a bien Ă©tĂ© lu (https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/CHANGELOG.md).

matrix_playbook_migration_validated_version: v2026.05.24.0

Récupérez le fichier hÎte, hosts

cp examples/hosts inventory/hosts

Voici le contenu de mon fichier :

matrix.domaine.com ansible_host=ADRESSE-IP-DU-SERVEUR ansible_ssh_user=UTILISATEUR ansible_become=true ansible_become_user=root ansible_connection=local

Puisque le playbook est crĂ©e et exĂ©cutĂ© sur la mĂȘme machine, les paramĂštres suivants sont ajoutĂ©s. Un texte commentĂ© prĂ©cise ce sujet dans le fichier host d’exemple que vous avez copiĂ©.

ansible_become_user=root
ansible_connection=local

Lancer le playbook pour la premiĂšre fois

just update
ansible-playbook -i inventory/hosts setup.yml --tags=install-all,ensure-matrix-users-created,start --ask-become-pass

Puisque je lance la commande avec un utilisateur non root, en local, j’ajoute ask-become-pass Ă  la fin de la commande et j’entre le mot de passe de l’utilisateur pour exĂ©cuter le playbook avec sudo.

Mettre Ă  jour les services aprĂšs une modification de la configuration

S’il n’y a que des modifications de paramùtres :

just update
ansible-playbook -i inventory/hosts setup.yml --tags=install-all,start --ask-become-pass

Si des nouveaux composants sont ajoutés :

just update
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,ensure-matrix-users-created,start --ask-become-pass

Administration

Créer le premier compte

ansible-playbook -i inventory/hosts setup.yml --extra-vars='username=NOM-D-UTILISATEUR password=MOT-DE-PASSE admin=yes' --tags=register-user --ask-become-pass

Si l’utilisateur n’est pas administrateur, il faut îter le paramùtre admin=yes.

AccĂ©der Ă  l’interface d’administration avec le premier compte

https://matrix.domaine.com/ketesa/

Maintenance

LibĂ©rer de l’espace disque

Compresser les state_groups

L’opĂ©ration est rĂ©alisĂ©e automatiquement, en fonction de la configuration de vars.yml. Ces commandes dĂ©clenchent manuellement la compression.

sudo systemctl start matrix-synapse-auto-compressor
sudo journalctl -fu matrix-synapse-auto-compressor

Supprimer les conteneurs docker inutilisés

sudo docker system prune -a

@sepp Est-ce que tu peux publier ici l’étendue de ton avancement s’il te plait ? :grinning_face_with_smiling_eyes:

J’ai créé un rĂŽle Ansible qui installe deux serveurs Matrix en fĂ©dĂ©ration. Matrix-users et Matrix bridges. Les bridges sont installĂ©s sur Matrix Bridges. Les bases de donnĂ©e des 2 serveurs Matrix et des bridges (chaque bridges a sa propre base de donnĂ©es) sont sur une vm dĂ©diĂ©e.

Le tout se situe derriĂšre un proxy Caddy.Celui-ci permet de diriger les

- HTTPS / certificats TLS

  • reverse proxy vers Synapse, Element, Keycloak
  • headers X-Forwarded-* pour Keycloak
  • .well-known Matrix pour la fĂ©dĂ©ration

Voici le rĂŽle Ansible du stack matrix: GitHub - sepp67/ansible-role-matrix-stack

Ce rîle ne fait qu’installer les programmes (matrix-element et les DB).

Le paramĂ©trage du rĂ©seau( les IPs, les ports et les certificats SSL) est encadrĂ© par un autre rĂŽle : GitHub – sepp67/devops_staging_prod_infra

Explication. J’ai un rĂŽle staging-production qui se compose de deux reverse proxies Caddy. Il permet de dĂ©ployer un rĂŽle Ansible en local avec des certificats autosignĂ©s. Ensuite de dĂ©ployer ce mĂȘme rĂŽle en production (accessible sur internet.) Ça permet d’avoir un environnement test pour expĂ©rimenter les grands changements dans le rĂŽle.

Ce rĂŽle encadre tous mes sites et mes applications, mais je ferai une version qui dĂ©ploie que la stack Matrix pour ARN. C’est assez simple. Il y a une liste dans l’inventaire d’Ansible Ă  dĂ©cocher.

Pour ARN, on peut s’éviter de mettre en place un environnement staging. Pour tester les grandes actualisations, il faudra dĂ©ployer le stack Matrix en local, comme je fais chez moi.

Keycloak est installĂ© semi-manuellement avec un docker-compose. Je n’ai pas créé de rĂŽle pour ça parce que Keycloak devrait toujours ĂȘtre actualisĂ© manuellement. C’est plus sĂ»r.

Étape suivante, le dĂ©ployer et voir si mon rĂŽle s’installe sans embrouille

1 « J'aime »

Ce serait une bonne opportunité pour faire un ou des ateliers spécial INFRA.

Pour mettre en place ce projet, il faut plusieurs grandes actions:

Créer des VMs sur Proxmox.

Configurer le routage pour que la VM Caddy obtienne une IP fixe

Mettre en place la redirection pour que le nom de domaine pointe vers cette IP.

Ensuite, on crée les autres VMs et on déploie toute la stack.

Je viens d’aller voir le Github, sacrĂ© boulot !

J’ai plein de questions :

  • Tu t’es inspirĂ© du playbook ansible dont on parlait avant ?
  • Si on veut ajouter des bridges et des fonctions, il faut crĂ©er soi-mĂȘme les fichiers de configuration ?
  • Comment effectuer les mises Ă  jour ?
  • A quel point nous sommes dĂ©pendants de ton expertise ?
  • Tu as utilisĂ© Claude pour faire tout ça ? Si oui, dans quelle mesure ?
  • Est-ce qu’il est possible d’utiliser ce rĂŽle pour crĂ©er le serveur matrix CHATONS, qui est donc unique, sans bridges mais sans doute avec des outils de modĂ©ration ou autre ?

Ce qui m’embĂȘte, c’est que ta solution custom ne rĂšgle pas le problĂšme de base que l’on a actuellement avec les paquets Yunohost et leurs mises Ă  jour. L’intĂ©rĂȘt du gros playbook Ansible est qu’il est beaucoup utilisĂ© et bien maintenu.

Je vois que tu as encore prĂ©vu de crĂ©er toutes les fonctions que l’on souhaite dĂ©ployer, si tu es chaud, c’est fantastique.

  • existe-t-il une notion de fork/hĂ©ritage dans les rĂŽles ansible ? Genre on clonerait le repo du playbook bien connu et on ferait des modifs comme ça on pourrait rĂ©cupĂ©rer les modifs du dĂ©pĂŽt upstream ?

  • Quel est l’intĂ©rĂȘt de ta solution vs dĂ©ployer https://github.com/spantaleev/matrix-docker-ansible-deploy configurĂ© Ă  notre sauce sur deux serveurs ?

  • A savoir qu’il n’y aurait pas d’utilisateurs finaux qui auraient besoin de s’identifier sur le serveur des bridges, donc pourquoi y connecter keycloak ?

  • Pourquoi ne pas tout mettre sur une seule VM avec des docker dedans ? Le paquet yunohost Ă©tant multi-instance on doit au moins pouvoir mettre les deux synapse sur la mĂȘme machine https://github.com/YunoHost-Apps/synapse_ynh/blob/master/manifest.toml#L28 AprĂšs pour des affaires de droits on peut vouloir que certains admin aient accĂšs au serveur user et d’autres au serveur des bridges.

Réponses à Optogram

« Tu t’es inspirĂ© du playbook ansible dont on parlait avant ? »

Je m’en suis inspirĂ© dans l’esprit (sĂ©parer la stack Matrix du reste de l’infra, gĂ©rer les bridges de façon gĂ©nĂ©rique) mais pas dans le code. J’ai fait le choix d’écrire un rĂŽle « from scratch Â», plus petit et pensĂ© spĂ©cifiquement pour notre topologie Ă  deux homeservers (users / bridges) et en me fondant sur mon INFRA existante (Caddy, Vault, inventaires staging/prod).

« Si on veut ajouter des bridges et des fonctions, il faut crĂ©er soi-mĂȘme les fichiers de configuration ? »

Pour un bridge dĂ©jĂ  supportĂ© par l’image (whatsapp, telegram, signal aujourd’hui), non : il suffit d’ajouter une entrĂ©e dans la liste matrix_bridges (image, tag, ports, identifiants DB) et une entrĂ©e correspondante dans matrix_postgresql_databases. Le rĂŽle gĂ©nĂšre tout seul config.yaml, registration.yaml et docker-compose.yml Ă  partir d’un template gĂ©nĂ©rique, sans toucher au code du rĂŽle.

Par contre, pour la configuration « mĂ©tier Â» propre Ă  chaque bridge (connexion QR WhatsApp, API Telegram, liaison Signal), il faut effectivement fournir des paramĂštres spĂ©cifiques via extra_config .

« Comment effectuer les mises à jour ? »

Aujourd’hui, une mise Ă  jour se fait en changeant le tag d’image Github (tag: latest ou une version Ă©pinglĂ©e) dans les variables, puis en relançant le playbook — le rĂŽle est idempotent, donc il ne touche que ce qui a changĂ©. Il n’y a pas encore de mĂ©canisme de veille automatique sur les nouvelles versions. Grave Ă  mon infra staging-production on peut tester Ă  chaque fois en local une mise Ă  jour.

« À quel point sommes-nous dĂ©pendants de ton expertise ? »

Aujourd’hui : beaucoup, parce que le rĂŽle est jeune, peu documentĂ© au-delĂ  du README, et que je suis le seul contributeur. Mon objectif est justement d’écrire une documentation suffisante (structure des variables, procĂ©dure d’ajout de bridge, procĂ©dure de mise Ă  jour, restauration) pour qu’un autre admin puisse reprendre la main sans moi. Mais comme toute infra gĂ©rĂ©e en interne, tant que le projet a un seul mainteneur et zĂ©ro autre contributeur, il y a dĂ©pendance et donc risque de bus factor.

« Tu as utilisé Claude pour faire tout ça ? Si oui, dans quelle mesure ? »

Oui, j’ai utilisĂ© Claude comme assistant tout au long du dĂ©veloppement : conception de l’architecture (sĂ©paration rĂŽle/infra, gestion gĂ©nĂ©rique des bridges), Ă©criture des tĂąches Ansible et des templates Jinja, le debugage, et surtout la rĂ©daction du README ! Maintenir un readme, c’est l’enfer!

Dans la pratique, il a fallu que je lui prompte block par block: serveurs matrix, puis mise en palce de la fĂ©dĂ©ration, puis mise en place des bridges, etc. I part trĂšs vite dans des conceptions trop complexes qui n’amĂšnent Ă  rien. Donc, c’est bien moi l’architecte. Je pense, il Ă©crit, je relis, je teste et je debug ce qu’il a produit.

« Est-ce possible d’utiliser ce rĂŽle pour crĂ©er le serveur matrix CHATONS, unique, sans bridges, avec modĂ©ration ? »

Oui, c’est prĂ©vu : matrix_component peut utiliser uniquement postgres + synapse_users, sans jamais activer synapse_bridges/bridges. Le rĂŽle dĂ©ploierait un seul homeserver. Les outils de modĂ©ration (Draupnir est dans le roadmap « Planned Â») ne sont pas encore implĂ©mentĂ©s, mais l’architecture gĂ©nĂ©rique est faite pour accueillir ce genre de composant sans réécrire le rĂŽle.

**
La question des paquets Yunohost vs le rĂŽle custom :**

Le rÎle custom résout :

  • Le problĂšme de la fĂ©dĂ©ration Ă  deux homeservers avec bridges dĂ©diĂ©s. Ce que Yunohost ne gĂšre pas nativement.
  • La sĂ©paration des bases de donnĂ©es, ce qui les rend plus rĂ©sistantes Ă  un bourrage de logs
  • La facilitĂ© de tester et maintenir les bridges grĂące Ă  l’environnement staging-production

Mais il crée effectivement un nouveau repo ARN à maintenir, en plus des paquets Yunohost.

Réponses à GautGaut

« Existe-t-il une notion de fork/héritage dans les rÎles Ansible ? »

Techniquement, un rĂŽle Ansible n’a pas de mĂ©canisme de « classe mĂšre/fille Â» comme en programmation objet. Les options qui s’en rapprochent sont :

‱ Fork Git classique : cloner matrix-docker-ansible-deploy, faire nos modifs, et rĂ©guliĂšrement git merge upstream/main pour rĂ©cupĂ©rer les mises Ă  jour. Ça marche mais gĂ©nĂšre des conflits de merge Ă  chaque customisation profonde.

‱ include_role/import_role avec surcharge de variables : on peut consommer un rĂŽle upstream tel quel et ne surcharger que ses variables (defaults), sans toucher son code. C’est la mĂ©thode la plus « propre Â» mais elle suppose que le rĂŽle upstream expose tout ce dont on a besoin via des variables — sinon on est bloquĂ©.

‱ Collection Ansible avec rĂŽle « wrapper Â» : on Ă©crit un petit rĂŽle Ă  nous qui appelle le rĂŽle upstream en dependencies (meta/main.yml) et ajoute nos tĂąches par-dessus.

Dans tous les cas, plus on s’éloigne de la configuration standard du projet upstream, plus le fork devient coĂ»teux Ă  maintenir Ă  jour.

« Quel est l’intĂ©rĂȘt de ta solution vs matrix-docker-ansible-deploy configurĂ© Ă  notre sauce sur deux serveurs ? »

matrix-docker-ansible-deploy est nettement plus complet et mieux maintenu, c’est un vrai argument en sa faveur, je ne le conteste pas.

Mon rÎle a deux différences de conception :

1. Il sĂ©pare volontairement la stack Matrix de la gestion de l’infra (proxy, DNS, TLS, vault), alors que le projet upstream a tendance Ă  tout gĂ©rer lui-mĂȘme (y compris Traefik/nginx). Ce qui le rend hypercomplexe. Avec mon projet on peux testet et deployer facilement des nouvelles mises Ă  jour ou ajouts majeurs sans tout casser.

2. Il traite les bridges comme des entrĂ©es de liste totalement gĂ©nĂ©riques, sans code spĂ©cifique par bridge — ce qui correspond Ă  notre besoin d’ajouter simplement de nouveaux bridges sans toucher au rĂŽle.

Ceci dit, ces deux points pourraient sans doute ĂȘtre obtenus en configurant matrix-docker-ansible-deploy correctement (dĂ©sactiver ses rĂŽles proxy/DNS, utiliser ses group_vars). Mais on se retouve Ă  en crĂ©er un fork.

En résumé :

matrix-docker-ansible-deploy = plus robuste et mieux testé mais plus complexe à adapter à notre structure ;

solution maison = plus simple et sur-mesure cependant reposant sur moins de mainteneurs.

« Pourquoi connecter Keycloak au serveur des bridges s’il n’y a pas d’utilisateurs finaux dessus ? »

Bonne remarque ! Il n’y a pas de raison de le faire sur le homeserver bridges, seulement sur celui des utilisateurs (synapse_users). Je vais corriger ca merci de l’avoir soulevĂ©.

« Pourquoi ne pas tout mettre sur une seule VM avec des dockers dedans ? »

Deux raisons à la séparation en VMs distinctes :

1. Cloisonnement des droits d’admin, comme tu le notes : certains admins n’ont besoin d’accĂ©der qu’au serveur users, d’autres qu’au serveur bridges (qui manipule des identifiants tiers WhatsApp/Telegram/Signal, plus sensibles). SĂ©parer les VMs rend ce cloisonnement simple au niveau SSH/pare-feu, sans avoir Ă  gĂ©rer des permissions fines Ă  l’intĂ©rieur d’une seule machine.

2. Isolation en cas d’incident : un bridge qui plante, consomme beaucoup de ressources, mais n’affectera pas le homeserver des utilisateurs finaux si il est sur uen autre VM.

Techniquement, oui, on pourrait tout regrouper : multi-instance Yunohost pour Synapse, ou plusieurs projets docker-compose sur une seule VM Debian (c’est d’ailleurs dĂ©jĂ  ce qu’on fait entre Synapse Bridges et les bridges, qui cohabitent sur vm-matrix-bridges mais dans des projets Compose sĂ©parĂ©s pour Ă©viter que localhost d’un conteneur ne fuite vers un autre).

Mais mutualiser users + bridges sur une seule VM romprait le cloisonnement des droits que tu Ă©voques toi-mĂȘme comme utile. Le surcoĂ»t (une VM de plus) me semble raisonnable au regard du gain en isolation, mais c’est un arbitrage capacitĂ©/sĂ©curitĂ© qu’on peut discuter si les ressources Proxmox sont contraintes.

1 « J'aime »