Heuzef - Les notes excentriques d'un bidouilleur.
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

před 1 rokem
před 1 rokem
před 1 rokem
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 1 rokem
před 8 měsíci
před 1 rokem
před 8 měsíci
před 1 rokem
před 8 měsíci
před 8 měsíci
před 1 rokem
před 8 měsíci
před 1 rokem
před 8 měsíci
před 1 rokem
před 1 rokem
před 8 měsíci
před 1 rokem
před 1 rokem
před 1 rokem
před 8 měsíci
před 1 rokem
před 1 rokem
před 8 měsíci
před 1 rokem
před 8 měsíci
před 1 rokem
před 1 rokem
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
před 8 měsíci
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. Title: Mettre en service sa propre instance de Matrix avec Bridges
  2. Category: Informatique
  3. Tags: autohébergement, web, social, docker, tchat, communication
  4. Date: 2024-04-08
  5. Status: published
  6. Pour ceux qui ne connaissent pas Matrix, je le présente succinctement ainsi : c'est un outil messagerie moderne, qui est supérieure techniquement à toutes les autres solutions équivalentes (Instagram, WhatsApp, Messenger, Signal, WeChat, Telegram, Discord, etc ...).
  7. Mais ce n'est pas tout, en plus d'être très sécurisé, c'est aussi une solution libre, éthique et décentralisée et en constante évolution grâce à une large communauté très impliquée dans cette solution de messagerie ultime en auto-hébergement.
  8. Il n'y a donc absolument aucun argument en faveur des autres plateformes (même pour Signal et RocketChat oui oui) et dans un monde idéal l'humanité entière utiliserais Matrix comme solution unique de communication.
  9. J'ajoute que tout bon dirigeant d'entreprise qui utilise une solution de tchat en interne devrait déployer Matrix pour sa société, tout autre choix sera finalement moins pertinent, voir dangereux. Le monopôle de Microsoft avec Teams n'est d'ailleurs pas un frein, car il est tout à fait possible d'intégrer des solutions de Visio comme [Jitsi](https://meet.jit.si) dans l'instance Matrix. Et une fois que nous avons goûté à l'outil, nous sommes rapidement convaincus.
  10. ![Messenger FR](../../assets/messenger_fr.png)
  11. Maintenant que les présentations sont faites, je vais expliquer dans cette note comment déployer simplement une instance avec Docker et surtout avec des Bridges.
  12. Je précise que cette note est co-rédigée avec [Lucas Assier](https://www.linkedin.com/in/lucasassier), qui à également une expérience intéréssente avec Matrix de son côté !
  13. Avant de débuter l'aventure, [commencez par créer un compte Matrix](https://app.element.io/#/register). Réserver votre identifiant et profitez-en pour tester Matrix sur les serveurs d'Élement.
  14. # Qui utilise Matrix en 2024 ? 🗣
  15. Quasiment personne, comme beaucoup d'outils libre, pas de gros marketing derrière. Même [Signal](https://www.signal.org), qui met pourtant les moyens, peine à concurrencer ses concurrents qui sont pourtant pas terribles, alors autant dire que Matrix n'est pas prêt de percer, mais patience, car contrairement aux autres, Matrix est pérenne dans le temps et sera là encore bien après eux (l'e-mail, xmpp et irc en témoignent).
  16. Finalement, les seuls qui ont un intérêt à déployer Matrix, sont les entreprises, associations et organisations qui souhaitent disposer d'un outil de communication en interne. Pour les autres, on y retrouvera majoritairement des Geek qui ont la chance d'avoir les ressources et le temps pour maintenir cet outil.
  17. # Les Bridges ! 🏗
  18. En plus de pouvoir [choisir n'importe quel client](https://matrix.org/ecosystem/clients/) (ce qui est déjà génial), Matrix a une fonction vraiment top : **Les bridges** !
  19. Elle vous promet de récupérer vos messages des autres plateformes dans votre instance Matrix !
  20. [<i class="fa fa-link"></i> matrix.org/ecosystem/bridges](https://matrix.org/ecosystem/bridges)
  21. Il faut comprendre que les Bridges sont additionnels et heureusement, car il y a baleine sous gravillon, explication dans le chapitre suivant.
  22. # Le piège des Bridges 🚧
  23. Après plusieurs mois d'utilisation des Bridges, je vais être honnête, c'est un calvaire et la maintenance est chronophage au possible. Les Bridges sont essentiellement des prototypes et plus nous en ajoutons plus c'est le chaos : la maintenance n'en devient que plus lourde.
  24. Chaque Bridge à son lot de galère, c'est sans fin, **il faut donc être déterminé à y consacrer beaucoup de temps !**
  25. Autrement, la meilleure alternative que je connaisse est [Element-ONE](https://ems.element.io/element-one), payant et avec seulement trois Bridges, mais c'est un début 😉
  26. # Déploiement basique avec Docker 🐳
  27. Si vous êtes à l'aise avec Docker, alors la configuration suivante vous permettra de mettre en place votre instance Matrix. Pour les plus barbus, vous pouvez aussi [jouer avec Ansible](https://github.com/spantaleev/matrix-docker-ansible-deploy) 🤓
  28. La configuration générale ici est donc d'installer le moteur Synapse avec sa DB Postgres. Avec seulement ceci, vous pourrez bénéficier d'une instance Matrix qui tourne très bien.
  29. Pour tout le reste, ce sont les Bridges, que vous pouvez simplement commenter pour ne pas les déployer dans un premier temps, (ou jamais ? 😤)
  30. ## Docker compose file
  31. ```yaml
  32. version: '3'
  33. services:
  34. # Synapse
  35. synapse:
  36. image: matrixdotorg/synapse:latest
  37. container_name: matrix-synapse
  38. hostname: matrix-synapse
  39. restart: unless-stopped
  40. environment:
  41. - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
  42. volumes:
  43. - /home/matrix/Synapse:/data
  44. - /home/matrix/bridges:/bridges
  45. - /tmp/test:/var/log
  46. depends_on:
  47. - matrix-db
  48. ports:
  49. - 8448:8448/tcp
  50. - 8008:8008/tcp
  51. matrix-db:
  52. image: postgres
  53. container_name: matrix-db
  54. hostname: matrix-db
  55. restart: unless-stopped
  56. environment:
  57. - POSTGRES_USER=synapse
  58. - POSTGRES_PASSWORD=**********
  59. - POSTGRESQL_PASSWORD=**********
  60. - POSTGRES_DB=matrix
  61. - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
  62. volumes:
  63. - /home/matrix/Postgres:/var/lib/postgresql/data
  64. # BRIDGES CONTAINERS ##########
  65. # Signal bridge
  66. mautrix-signal:
  67. image: dock.mau.dev/mautrix/signal
  68. container_name: mautrix-signal
  69. hostname: mautrix-signal
  70. restart: unless-stopped
  71. volumes:
  72. - /home/matrix/bridges/signal/signald:/signald
  73. - /home/matrix/bridges/signal/data:/data
  74. ports:
  75. - 29328:29328/tcp
  76. depends_on:
  77. - synapse
  78. - signald
  79. - signal-db
  80. signald:
  81. image: docker.io/signald/signald
  82. container_name: signald
  83. hostname: signald
  84. restart: unless-stopped
  85. volumes:
  86. - /home/matrix/bridges/signal/signald:/signald
  87. signal-db:
  88. image: postgres
  89. container_name: signal-db
  90. hostname: signal-db
  91. restart: unless-stopped
  92. environment:
  93. - POSTGRES_USER=mautrixsignal
  94. - POSTGRES_DATABASE=mautrixsignal
  95. - POSTGRES_PASSWORD=**********
  96. volumes:
  97. - /home/matrix/bridges/signal/Postgres:/var/lib/postgresql/data
  98. # Discord bridge
  99. mautrix-discord:
  100. image: dock.mau.dev/mautrix/discord
  101. container_name: mautrix-discord
  102. hostname: mautrix-discord
  103. restart: unless-stopped
  104. volumes:
  105. - /home/matrix/bridges/discord/data:/data
  106. ports:
  107. - 29334:29334/tcp
  108. depends_on:
  109. - synapse
  110. # Whatsapp bridge
  111. mautrix-whatsapp:
  112. image: dock.mau.dev/mautrix/whatsapp
  113. container_name: mautrix-whatsapp
  114. hostname: mautrix-whatsapp
  115. restart: unless-stopped
  116. volumes:
  117. - /home/bridges/whatsapp/data:/data
  118. ports:
  119. - 29318:29318/tcp
  120. depends_on:
  121. - synapse
  122. # Facebook bridge
  123. mautrix-facebook:
  124. image: dock.mau.dev/mautrix/facebook
  125. container_name: mautrix-facebook
  126. hostname: mautrix-facebook
  127. restart: unless-stopped
  128. volumes:
  129. - /home/matrix/bridges/facebook/data:/data
  130. ports:
  131. - 29319:29319/tcp
  132. depends_on:
  133. - synapse
  134. # Instagram bridge
  135. mautrix-instagram:
  136. image: dock.mau.dev/mautrix/instagram
  137. container_name: mautrix-instragram
  138. hostname: mautrix-instagram
  139. restart: unless-stopped
  140. volumes:
  141. - /home/matrix/bridges/instagram/data:/data
  142. ports:
  143. - 29330:29330/tcp
  144. depends_on:
  145. - synapse
  146. # Telegram bridge
  147. mautrix-telegram:
  148. image: dock.mau.dev/mautrix/telegram
  149. container_name: mautrix-telegram
  150. hostname: mautrix-telegram
  151. restart: unless-stopped
  152. volumes:
  153. - /home/matrix/bridges/telegram/data:/data
  154. ports:
  155. - 29317:29317/tcp
  156. depends_on:
  157. - synapse
  158. # Slack bridge
  159. mautrix-slack:
  160. image: dock.mau.dev/mautrix/slack
  161. container_name: mautrix-slack
  162. hostname: mautrix-slack
  163. restart: unless-stopped
  164. volumes:
  165. - /home/matrix/bridges/slack/data:/data
  166. ports:
  167. - 29335:29335/tcp
  168. depends_on:
  169. - synapse
  170. # Wechat bridge
  171. matrix-wechat:
  172. image: lxduo/matrix-wechat
  173. container_name: matrix-wechat
  174. hostname: matrix-wechat
  175. restart: unless-stopped
  176. volumes:
  177. - /home/heuzef/matrix/bridges/wechat/data:/data
  178. ports:
  179. - 17778:17778/tcp
  180. depends_on:
  181. - synapse
  182. # Wechat agent
  183. agent-wechat:
  184. image: lxduo/matrix-wechat-docker
  185. container_name: agent-wechat
  186. hostname: agent-wechat
  187. restart: unless-stopped
  188. environment:
  189. - WECHAT_HOST=wss://matrix-wechat/_wechat/
  190. - WECHAT_SECRET=00000000000
  191. volumes:
  192. - /home/heuzef/matrix/bridges/wechat/hongli/:/home/user/matrix-wechat-agent
  193. depends_on:
  194. - matrix-wechat
  195. ```
  196. ## Configuration de Synapse
  197. Générer le fichier de config Synapse :
  198. ```
  199. docker run -it --rm -v /home/matrix/Synapse/:/data -e SYNAPSE_SERVER_NAME=matrix.domain.tld -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate
  200. ```
  201. Ce fichier de configuration sera généré dans **/home/matrix/Synapse/homeserver.yaml**, plutôt simple à comprendre, voici quelques paramètres à modifier selon vos besoins :
  202. ```yaml
  203. max_upload_size: 100M
  204. enable_registration: true
  205. enable_registration_without_verification: true
  206. app_service_config_files:
  207. - /bridges/discord/data/registration.yaml
  208. - /bridges/facebook/data/registration.yaml
  209. - /bridges/instagram/data/registration.yaml
  210. - /bridges/signal/data/registration.yaml
  211. - /bridges/slack/data/registration.yaml
  212. - /bridges/telegram/data/registration.yaml
  213. - /bridges/wechat/data/registration.yaml
  214. - /bridges/whatsapp/data/registration.yaml
  215. ```
  216. Chaque fichier de configuration des bridges est similaire, les paramètres récurrents à modifier sont les suivants :
  217. ```yaml
  218. homeserver:
  219. address: https://matrix.domain.tld
  220. domain: matrix.domain.tld
  221. address: http://<hostname>:<port>
  222. hostname: 0.0.0.0
  223. port: <port>
  224. database:
  225. type: sqlite3
  226. uri: <bridge>-db.sqlite
  227. permissions:
  228. "*": relay
  229. "matrix.domain.tld": user
  230. "@votre-pseudo:matrix.domain.tld": admin
  231. ```
  232. Maintenant, vous pouvez démarrer toute la tambouille : ``docker compose -f /home/matrix/docker-compose.yml up``
  233. Le premier lancement prend du temps, les fichiers de configuration et de **registration.yaml** doivent être générés par Synapse (n'anticipez pas leur création), confirmant que tout fonctionne correctement, ensuite, vous pouvez éditer les paramètres.
  234. Vous aurez probablement une erreur de permission sur ces fichiers au lancement, ajustez simplement cela ainsi :
  235. ```bash
  236. sudo chmod 644 /home/matrix/bridges/*/data/registration.yaml
  237. ```
  238. ## Visioconférence
  239. Si vous souhaitez utiliser la visioconférence, notez bien que cette dernière ne fonctionnera qu'en local sur votre réseau interne. Pour aller plus loin et profiter pleinement des fonctionnalités de la visioconférence, il vous faudra mettre en service un serveur TURN : [Configuring a Turn Server - Synapse](https://matrix-org.github.io/synapse/latest/turn-howto.html)
  240. # Mon retour d'expérience sur les différents Bridges 📢
  241. Vous remarquerez que la plupart des Bridges sont déployées via [MAUTRIX](https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegram&ref=infos.zogg.fr). Ce n'est pas pour rien, car la plus grande panoplie est éditée par eux et ce sont aussi bien souvent les bridges les plus stables.
  242. Pour rappel [la liste des Bridges est diffusée sur le site officiel de Matrix](https://matrix.org/ecosystem/bridges/).
  243. De façon générale, la logique d'ajout d'un bridge est toujours la même :
  244. 1. Exécution du bridge
  245. 2. Depuis votre client Matrix préféré, rechercher le bot du bridge pour commencer une discussion avec lui
  246. 3. Dans le canal de discussion avec le bot taper ``help`` pour afficher les actions possibles
  247. ## Signal
  248. Le Bridge de Signal est un peu lourd à mettre en place, car il réclame une DB à part (ce que je vous conseille vivement de faire pour les performances).
  249. 1. Inviter @signalbot
  250. 2. Enregistrez votre téléphone ``register +33000000000``
  251. 3. Récupérer un jeton captcha sur le site dédié de signal
  252. - https://signalcaptchas.org/registration/generate.html
  253. - Récupérer le token situé juste après le **signalcaptcha://signal-recaptcha-v2.**
  254. 4. Valider le code SMS
  255. 5. Définir son nom : ``set-profile-name VOTRE-NOM``
  256. ## Discord
  257. Pour Discord, la première initialisation ne permet que de jongler avec les messageries privées, vous aurez ensuite besoin de jouer avec les commandes du bridges pour rejoindre les différents canaux (plus communément appelées "Serveurs Discord" par les Moldus) via leur identifiant unique.
  258. Ensuite, c'est le gros dawa, si vous invitez une guilde assez grosse, vous allez vous retrouver avec autant de notification d'invitation à accepter que de catégories ! Bon une fois que c'est validé, vous êtes tranquille, mais faite très attention aux journaux qui vont être générés sur votre serveur, ça va très rapidement remplir l'espace disque s'il y a de l'activité sur vos canaux Discord !
  259. 1. Inviter @discordbot
  260. 2. Sur l'application mobile : *paramètres de l'app > "Scanner le QR code"*
  261. 3. Envoyer la commande au bot : ``login-qr``
  262. 4. La commande ``guilds status`` permet d'afficher les différents "Serveurs Discord"
  263. ## WhatsApp
  264. Alors WhatsApp, pour faire simple, dispose d'une sécurité très désagréable qui consiste à déconnecter tous vos accès tiers après une semaine, super ...
  265. Cela concerne donc également votre Bridge qu'il vous faudra reconnecter avec un QRCode toute les semaines. Donc nous sommes bien forcé de conserver l'application officiel sur notre tel uniquement pour ça ... voila voila ... 👌
  266. 1. Inviter @whatsappbot
  267. 2. Sur l'application mobile : *paramètres de l'app > "Scanner le QR QR"*
  268. 3. Envoyer la commande au bot : ``login``
  269. ## Facebook et Instagram
  270. Dans le même type de flood absurde que Discord, vous allez recevoir une notification d'invitation à accepter pour chaque personne ... J'espère pour vous que vous êtes un asocial avec peu d'amis sur ces plateformes, sinon vous aller user votre souris à accepter des centaines d'invitations une par une.
  271. Un conseil, tester bien vos volumes docker, le redémarrage du Bridge à tendance à tout remettre à zéro, histoire de vous pousser au suicide une bonne fois pour toutes 😖
  272. ## Telegram
  273. Un peu plus long à mettre en place, le bot étant encore en prototype au moment de mon test, mais ensuite, cela fonctionne correctement.
  274. Sur la configuration, il est nécessaire d'ajouter une clef d'API récupérable sur : https://my.telegram.org/apps
  275. ```yalm
  276. App api_id: 00000000
  277. App api_hash: 00000000000000000000000000000000
  278. ```
  279. 1. Inviter @telegrambot
  280. 2. Sur l'application mobile : *paramètres de l'app > "Scanner le code QR"*
  281. 3. Envoyer la commande au bot : ``login-qr``
  282. ## WeChat
  283. La palme d'or de la torture revient à nos amis Chinois avec leur outil abominable.
  284. Créé par un nerd Chinois répondant au nom de [lxduo](https://github.com/duo/matrix-wechat-docker), ce dernier (probablement considéré par un terroriste par le gouvernement chinois), a eu la patience de mettre au monde un Bridge capable de s'accoupler avec cette horreur de WeChat.
  285. Ce qui donne naissance à une terrible usine à Gaz qui vous servira d'hôte, qui vous faudra accompagner d'autant d'usines à gaz supplémentaire que vous souhaitez ajouter de compte WeChat ... Le gros délire en termes de consommation de ressource 😭.
  286. Bon dans mon cas [je n'ai même pas réussi à le faire tomber en marche](https://github.com/duo/matrix-wechat-docker/issues/2) et à vrai dire, j'ai sûrement été banni de l'outil par le gouvernement car impossible de me créer un compte, j'ai donc renoncé.
  287. Je prévois un voyage en Chine en 2024, je vais en profiter pour me créer un compte en catimini avec un numéro sur place, je ferais peut-être un article à ce sujet un jour si c'est croustillant.
  288. 1. Inviter @wechatbot
  289. 2. Sur l'application mobile : *paramètres de l'app > "Scanner le code QR"*
  290. 3. Envoyer la commande au bot : ``login`` pour tenter de détecter l'agent WeChat
  291. ## SMS
  292. En bonus, j'ai tenté l'utilisation de [SmsMatrix](https://f-droid.org/en/packages/eu.droogers.smsmatrix/), une application Android qui peut fonctionner avec un Bridge, j'ai fait fonctionner le machin ainsi :
  293. S'authentifier sur le compte **@smsbot:matrix.domain.tld** et inviter son compte utilisateur pour créer un canal de discussion.
  294. Après autorisation, installer SmsMatrix sur votre téléphone :
  295. ```
  296. Bot Username : smsbot
  297. Bot Password : **********
  298. Homeserver url : https://matrix.domain.tld
  299. Your username @<USER>:matrix.com
  300. Devicename : <NOM-DU-TEL>
  301. ```
  302. Il suffit ensuite de recevoir un SMS pour initialiser une conversation.
  303. # Conclusion 🗒
  304. - Matrix, c'est le top du top de la messagerie. Tant sur l'aspect technique qu'éthique.
  305. - Peu de personne connaissent et n'utilisent ça dans le monde pro et encore moins ailleurs.
  306. - La configuration d'un serveur TURN supplémentaire est nécessaire si vous souhaitez profiter de la Visioconférence.
  307. - La configuration des Bridges est très chronophage et instable.
  308. C'est tout pour moi 😉 je vous relais maintenant les notes de mon ami [Lucas Assier](https://www.linkedin.com/in/lucasassier), qui souhaite également partager son expérience avec Matrix.
  309. Sans aller aussi loin que moi sur la quantité de Bridge testés, il a cependant abordé le Double Puppetting, très intéressant pour profiter pleinement des Bridges.
  310. ----
  311. L'article ci-dessous, rédigé par [Lucas Assier](https://www.linkedin.com/in/lucasassier), date de Septembre 2023.
  312. ----
  313. # Pourquoi Matrix
  314. À cela plusieurs raisons et cas d'usages :
  315. - En premier, les communications sont chiffrées, dans la mesure du possible, par design, ce qui permet de discuter avec des amis de sujets sensibles sans avoir à se soucier de voir nos communications et pièces jointes sur un CDN random (N'est-ce pas Discord ?).
  316. - En second, le système de fédération : un utilisateur d'un serveur peut communiquer sur un serveur différent de manière transparente. J'ai pu voir cela l'an dernier sur l'instance de visioconférence de la Fosdem qui n'est autre qu'une instance Matrix avec un plugin jitsi
  317. - Le système de bridges : Le protocole de serveur Matrix a été pensé pour inclure un système de "passerelles" permettant de lier un service quelconque a Matrix. C'est notamment ce système qui m'a poussé à passer le pas et à déployer ma propre instance Matrix.
  318. # Terminologie
  319. ## Provider
  320. Matrix, c'est un peu comme le système de mails, il faut un fournisseur ou **provider** pour pouvoir communiquer. Pour cela, un **homeserver** va leur donner un compte, exemple :
  321. ![Matrix Exemple 1](../../assets/matrix_exemple_1.png)
  322. ## Homeserver
  323. Un **homeserver** est un serveur Matrix (Synapse, Conduit, etc ...).
  324. Il est lié a un seul domaine qui n'est pas voué a changer.
  325. Les comptes générés via les **homeserver** sont en deux parties comme suit :
  326. `@user@homeserver.tld`
  327. Pour reprendre l'exemple ci-dessus, cela donnerait :
  328. ![Matrix Exemple 2](../../assets/matrix_exemple_2.png)
  329. ## AppService
  330. C'est ce que l'on peut comparer à un bot standard.
  331. Les AppServices doivent être enregistrés dans la configuration du serveur, il n'est pas possible de les enregistrer à la volée.
  332. ## Bridges
  333. Un bridge est un système permettant de connecter un groupement Matrix à une autre plateforme, par exemple, Slack ou encore Signal.
  334. Les bridges fonctionnent de deux manières :
  335. 1. Dans Matrix, les utilisateurs des autres plateformes sont vus en tant que "*ghost*".
  336. 2. Dans l'autre plateforme, les comptes utilisateurs de Matrix sont appelés des "*puppets*".
  337. Exemple :
  338. ![Matrix Exemple 3](../../assets/matrix_exemple_3.png)
  339. Les spécifications Matrix sont complexe mais entièrement documentées [ici](https://spec.matrix.org/latest/).
  340. # Choisir son serveur
  341. Aujourd'hui, Matrix possède plusieurs implémentations serveurs plus ou moins aboutis.
  342. Il y en a trois qui en ont retenu mon attention :
  343. 1. **Synapse** - la référence originale en python. C'est le seul projet de serveur marqué comme stable.
  344. 2. **Conduit** - une implémentation en *RUST* du protocole serveur de Matrix mais avec une empreinte mémoire plus faible.
  345. 3. **Dendrite** - la même volonté que Conduit, mais en *GO*. Certaines fonctions sont manquantes, la priorité étant l'implémentation des fonctions pour les instances single user.
  346. # Monter son homeserver
  347. ## Préparations
  348. Pour des raisons pratiques, nous allons assumer que le serveur retenu est Synapse (car officiel et implémente l'intégralité des fonctionnalités).
  349. En premier lieu, il faut réfléchir à un nom de domaine, c'est très important car il est
  350. impossible de le changer une fois le serveur installé.
  351. Ensuite, il y a plusieurs manières d'installer un serveur Synapse :
  352. 1. Via un package manager
  353. 2. Via Ansible
  354. 3. Via Docker
  355. Ici, nous verrons via Docker.
  356. ## La stack technique de la démo
  357. ### Un reverse-proxy
  358. Initialement, le projet est déployé dans une colocation de homelabs derrière un seul et même port.
  359. Par conséquent, nous passons par Caddy afin de faire le routage en reverse-proxy.
  360. Cela, peut-être contraignant, mais il est quand même nécessaire d'en avoir un avec Synapse, notamment quand on va vouloir faire de la délégation.
  361. ### Une instance Docker
  362. Pour héberger le serveur ainsi que les bridges, le serveur et les bridges seront en deux stacks Docker-compose séparés.
  363. ## Déployer le serveur Synapse
  364. ```yaml
  365. version: '3'
  366. services:
  367. synapse:
  368. container_name: synapse
  369. image: docker.io/matrixdotorg/synapse:latest
  370. restart: unless-stopped
  371. environment:
  372. - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
  373. volumes:
  374. - synapse-data:/data
  375. depends_on:
  376. - synapse-db
  377. ports:
  378. - 8448:8448/tcp # Federation Traffic
  379. - 8008:8008/tcp # Client Traffic
  380. networks:
  381. - default
  382. - bridgenet
  383. synapse-db:
  384. container_name: synapse-pgsql
  385. image: docker.io/postgres:12-alpine
  386. environment:
  387. - POSTGRES_USER=synapse
  388.             - POSTGRES_PASSWORD=changeme!
  389.             - POSTGRES_DB=synapse
  390.             - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
  391.         volumes:
  392.             - synapse-pgsql:/var/lib/postgresql/data
  393.         volumes:
  394.             synapse-data: {}
  395.             synapse-pgsql: {}
  396.         networks:
  397.             bridgenet:
  398.                 name: synapse_bridges
  399.                 external: true
  400. ```
  401. > À noter, nous avons un réseau Docker dédié a l'intercommunication entre Synapse et les Bridges installés comme suit :
  402. >
  403. > `docker network create synapse_bridges`
  404. En premier lieu, il faudra lancer Synapse pour lui dire de générer la configuration :
  405. `docker-compose run --rm -e SYNAPSE_SERVER_NAME=matrix.kestrel.ovh -e
  406. SYNAPSE_REPORT_STATS=no synapse generate`
  407. En suivant, il faudra éditer la configuration `homeserver.yaml` dans le volume synapse-data.
  408. Il sera important de regarder les options de configuration, notamment la configuration de la connexion à la base Postgres, le nom du serveur (*server name*), que les serveurs de clés de confiance ainsi que l'option pour autoriser la création de comptes ou non.
  409. Une fois cela fait, nous pouvons démarrer la stack via `docker compose up`.
  410. > On pourrait faire en background mais comme nous en sommes à la phase de lancement initiale, je préfère laisser en premier plan afin de voir si l'application lance des erreurs ou non.
  411. ## Configurer le reverse proxy et setup une délégation
  412. Par délégation, nous sous-entendons relayer le trafic Matrix a une entité dans un sous-domaine ou ailleurs.
  413. Ici, mon server name est `kestrel.ovh`, pour autant, le trafic est délégués vers `matrix.kestrel.ovh` via la configuration suivante :
  414. ```json
  415. kestrel.ovh {
  416.        header /.well-known/matrix/* Content-Type application/json
  417.        header /.well-known/matrix/* Access-Control-Allow-Origin *
  418.        respond /.well-known/matrix/server `{"m.server":
  419. "matrix.kestrel.ovh:443"}`
  420.        respond /.well-known/matrix/client `{"m.homeserver":
  421. {"base_url":"https://matrix.kestrel.ovh"}}`
  422. }
  423. matrix.kestrel.ovh {
  424.        reverse_proxy /_matrix/* 192.168.1.102:8008
  425.        reverse_proxy /_synapse/client/* 192.168.1.102:8008
  426. }
  427. ```
  428. Il existe [une documentation](https://matrix-org.github.io/synapse/latest/reverse_proxy.html) sur la configuration de divers reverse-proxy pour Matrix, avec ou sans délégation.
  429. Pour tester si la configuration est correcte, on peut utiliser [le testeur de fédération](https://federationtester.matrix.org) et voir si le trafic de fédération est OK.
  430. ## Créer des comptes
  431. Pour créer des comptes, il est possible de passer via une interface cliente Matrix tel que [Element](https://app.element.io/#/register).
  432. Pour les serveurs qui n'acceptent pas la création de comptes, il est possible de le faire via le conteneur Synapse via la commande suivante :
  433. `docker exec -it synapse register_new_matrix_user http://localhost:8008 -c
  434. /data/homeserver.yaml`
  435. Synapse demandera quelques questions puis créera les comptes.
  436. Personnellement, j'ai opté pour un compte admin dont je ne me sers uniquement pour l'administration du serveur ainsi qu'un utilisateur standard pour mon usage quotidien.
  437. À ce stade, nous avons une instance Matrix fonctionnelle, avec un compte. Nous pouvons donc nous pencher sur l'ajout de Bridges !
  438. # Ajouter un Bridge
  439. > Le déploiement d'un Bridge peut être long et fastidieux, par conséquent, nous ne verrons que pour le Bridge Mautrix-signald
  440. ## Docker Compose 2: Electric Boogaloo
  441. ```yaml
  442. version: "3.7"
  443. services:
  444. mautrix-signal:
  445. container_name: mautrix-signal
  446. image: dock.mau.dev/mautrix/signal
  447. restart: unless-stopped
  448. volumes:
  449. - mautrix-signal-data:/data
  450. - mautrix-signal-signald:/signald
  451. depends_on:
  452. - signald
  453. networks:
  454. - default
  455. - bridgenet # Communication w/ Synapse
  456. signald:
  457. container_name: signald
  458. image: docker.io/signald/signald
  459. restart: unless-stopped
  460. volumes:
  461. - mautrix-signal-signald:/signald
  462. mau-signal-db:
  463. container_name: mau-signal-db
  464. image: postgres:13-alpine
  465. restart: unless-stopped
  466. environment:
  467. POSTGRES_USER: mautrixsignal
  468. POSTGRES_DATABASE: mautrixsignal
  469. POSTGRES_PASSWORD: changeme!
  470. volumes:
  471. - mautrix-signal-db:/var/lib/postgresql/data
  472. volumes:
  473. mautrix-signal-data: {}
  474. mautrix-signal-signald: {}
  475. mautrix-signal-db: {}
  476. networks:
  477. bridgenet:
  478. name: synapse_bridges
  479. external: true
  480. ```
  481. Ici, pas énormément de choses à dire, on lance la DB, puis signald (en vérifiant que cela ne crash pas). Ensuite, on lance le Bridge qui crée un fichier de configuration.
  482. Il faudra remplir le fichier avec les informations comme :
  483. * L'adresse du serveur Synapse
  484. * L'adresse du conteneur du bridge (Pour que Synapse relaie nos messages)
  485. * Désactiver le manhole
  486. * Régler les permissions
  487. * Connecter la base postgres
  488. ## Enregistrer une AppService dans Synapse
  489. Une fois cela fait, on relance le conteneur. Si tout est correct, celui-ci va générer un fichier `appservice.yaml`
  490. Il faudra le copier dans le volume du conteneur synapse et le référencer comme suit dans la configuration `homeserver.yaml`
  491. ```yaml
  492. # NB: Il est pas necessaire de faire de sous-dossiers appservices mais c'est
  493. plus sympa.
  494. app_service_config_files:
  495.     - /data/appservices/mau-signal.yaml
  496.     - /data/appservices/mau-instagram.yaml
  497.     - /data/appservices/mau-slack.yaml
  498. ```
  499. Une fois ceci fait, relancer Synapse ainsi que le Bridge. Si tout fonctionne, le doit être joignable via message privé à l'adresse **@signalbot:homeserver.tld**
  500. ## Se connecter à Signal
  501. Pour se connecter à Signal, il faudra ouvrir un canal avec le bot, puis choisir une des deux options possibles :
  502. `**link** [device name] - Link the bridge as a secondary device`
  503. `**register** <phone> - Sign into Signal as the primary device`
  504. Malheureusement, j'ai eu une erreur quand j'ai voulu "register"" donc je suis passé via "link", le bot fournit un QR Code permettant de s'authentifier.
  505. Une fois l'authentification effectuée, vous recevrez tout un tas d'invitations de messages privés et de canaux.
  506. Ceux-ci sont gérés via le bot et font le lien avec toutes les conversations présentes sur Signal.
  507. Par exemple, ici, un canal avec des amis :
  508. ![Matrix Exemple 4](../../assets/matrix_exemple_4.png)
  509. > À noter, le bot est présent dans chaque room afin de faire le lien. Il est possible de lui parler directement via `!signal` ou via MP.
  510. > En gris, tous les utilisateurs ayant le tag `(signal)` sont des "**ghosts**" contrôlés par le bot.
  511. > Il est bon de noter aussi que nous ne sommes pas administrateur du canal mais que les admins du groupe Signal le sont par extension sur ce canal Matrix.
  512. ## Le Double Puppetting
  513. Sur la capture d'écran précédente, nous avons pu voir que je possède deux comptes, un compte Matrix et un compte Signal.
  514. On pourrait dire que l'on s'en fiche dans certains cas mais cela pose problème lorsque les gens veulent me mentionner.
  515. Exemple ici :
  516. ![Matrix Exemple 5](../../assets/matrix_exemple_5.png)
  517. Ici on me mentionne pour un événement. Problème, le Bridge mentionne mon compte Signal et non moi-même.
  518. Pour palier à cela, les développeurs ont ajouté une fonction permettant de remplacer le compte de la plateforme en question (Ici, *Lucas(Signal)* ) par mon propre compte Matrix.
  519. Pour ce faire, il est possible de passer par deux manières de faire :
  520. * A la main via des "access tokens (à coup de `curl` puis via des MP aux différents bots de Bridge).
  521. * Automatiquement via [ce plugin](https://github.com/devture/matrix-synapse-shared-secret-auth). Pour des raisons évidentes, nous allons passer par le plugin.
  522. ### Installer le module Shared Secret Authenticator
  523. Pour installer le module, il faudra cloner depuis le dépôt GIT, le fichier python, puis l'ajouter aux volumes du conteneur synapse.
  524. Cloner le dépôt : `git clone https://github.com/devture/matrix-synapse-shared-secret-auth`
  525. Puis l'ajouter en tant que volume :
  526. ```yaml
  527. [...]
  528. volumes:
  529. - synapse-data:/data
  530. - /opt/matrix-synapse-shared-secret-auth/shared_secret_authenticator.py:/usr/local/lib/python3.11/site-packages/shared_secret_authenticator.py
  531. ```
  532. Générer un secret : `pwgen -s 128 1`
  533. Puis, dans le fichier `homeserver.yaml`, saisir les informations recensées dans le GIT croisées avec [la documentation de Mautrix](https://docs.mau.fi/bridges/general/double-puppeting.html).
  534. ```yaml
  535. modules:
  536. - module: shared_secret_authenticator.SharedSecretAuthProvider
  537. config:
  538. shared_secret: "YOUR_SHARED_SECRET_GOES_HERE"
  539. m_login_password_support_enabled: true
  540. com_devture_shared_secret_auth_support_enabled: false
  541. ```
  542. Une fois cela fait et le conteneur Synapse relancé, dans la configuration du Bridge Signal, remplacer :
  543. ```yaml
  544. double_puppet_server_map:
  545. example.com: https://example.com
  546. login_shared_secret_map:
  547. example.com:
  548. ```
  549. ```yaml
  550. double_puppet_server_map:
  551. kestrel.ovh: http://synapse:8008
  552. login_shared_secret_map:
  553. kestrel.ovh: YOUR_SHARED_SECRET_GOES_HERE
  554. ```
  555. Ceci fait, relancer le conteneur Signal.
  556. Si cela fonctionne correctement, le compte en trop doit disparaître et les mentions envers ce compte sont maintenant redirigées vers l'utilisateur Matrix correct.
  557. ![Matrix Exemple 6](../../assets/matrix_exemple_6.png)