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 ? ![]()
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
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.
