Matrix/Element Chat Server

Wir haben jetzt einen chat server für das Matrix protokoll. Toll ist daran dass es dezentralisiert ist und aber im gegensatz zu XMPP und co saubere end-to-end verschlüsselung mit einem brauchbaren signatur modell für mehrere geräte pro user unsterstützt.

Für desktop/mobile gibt es hier den Element client. Die dazugehörige web-app haben wir auch auf https://riot.it-syndik.at/ laufen wem das lieber ist.

Die Home Server URL für clients ist https://matrix.it-syndik.at, die user IDs haben dann aber die schön kurtze it-syndik.at domain, so wie zb. @fritz-gruber:it-syndik.at.

Registrierung is für alle mit *@it-syndikat.org email addresse offen. Registrieren kann man sich direkt über den web-client (register tab) oder direkt in den desktop/mobile apps.

Wer ne *@it-syndikat.org mail addresse oder einfach nur nen matrix account braucht will bitte bei @dxld melden.

TODO:

  • IRC bridge für #itsyndikat?, Done.
  • TURN server für VoIP calls
  • Aktuell hat er nur so 512M RAM und sqlite db, mal schauen wie viele user das aushaltet. Hat jetzt 1.5G wenn man #matrix:matrix.org joined sauft der synapse sofort wie sau.
  • Media repo aufräumen wenn der platz ausgeht, siehe Synapse Media Admin API: Delete local media by date or size
  • Von SQLite auf Postgres DB migrieren. Da gibts ein script synapse_port_db
  • DB backup machen/automatisieren
  • doku, doku, doku
  • Libera.chat bridge Done.

Doku

Deployment, updates unso

  • Synapse läuft auf in der matrix.parabox.it-syndikat.org VM. Auto-update läuft via unattended-upgrades mit auto-reboot und dem Debian packet aus bullseye-backports.
  • Aktuell laufende Synapse version checken: curl https://matrix.it-syndik.at/_synapse/admin/v1/server_version
  • Riot/Element-web liegt auch in der matrix VM in /var/www/riot/. Das muss noch manuell geupgraded werden via update.sh (link zu post unten) in dem ordner. Das lädt den tarball von Github runter, verifiziert die gpg signatur, packts aus und biegt den /var/www/riot/riot-live symlink um wenn alles gut is.

Matrix HTTP dschungel

  • Der synapse server hocht auf synapse.it-syndik.at:8448 (aka matrix.parabox.it-syndik.at) und zwar auf seiner nativen IPv6 addr und mit port forwarding auch auf unserer public IPv4 addr. TLS terminiert hier in der matrix VM.
  • Der yxorp horcht als TLS-SNI tcp reverse proxy auf den diversen matrix domains, nur mit IPv4, und leitet das an die matrix VM über v4 weiter. Auf der v6 seite ist die matix VM direkt im DNS eingetragen. TLS wird hier also auch rein in der matrix VM terminiert. Der trick ist hier auf in der v4 listen direktive proxy_protocol zu aktivieren aber auf v6 nicht.
  • Unter https://it-syndik.at/.well-known/matrix/client werden clients dazu angehalten doch bitte mit https://matrix.it-syndik.at:443 zu reden wenn sie it-syndikat.at haben wollen.
  • Unter https://it-syndik.at/.well-known/matrix/server werden andere matrix server (federation) ganz nett gefragt doch bitte direkt mit synapse.it-syndik.at:8448 zu reden. Das dass ein anderes TLS cert is als unter matrix.it-syndik.at is wurscht weil die server nicht mit dem client endpoint reden.
4 Likes

So riot/element-web gibts jetzt auch: https://riot.it-syndik.at/

Cool! Und wo trifft man sich? :slight_smile:

Ich hab jetzt mal den #lobby:it-syndik.at public room gemacht mit der intention den dann zum #itsyndikat IRC channel zu bridgen. Da muss aber noch ein OP ein OPt-in machen :slight_smile:

Ist der Matrix Server denn föderiert? Ich versuch dem Raum zu joinen…

Das Element sagt: "

#lobbyt:it-syndik.at existert nicht.

Dieser Raum existiert nicht. Bist du sicher dass du hier richtig bist? "

Typo: “lobby” ohne *t, also: #lobby:it-syndik.at

Aber du solltest es auch bei Explore rooms finden wenn den it-syndik.at server rein tust.

Hab grad bemerkt dass das upgrade von 1.21.2-1~bpo10+1 auf 1.23.0-1~bpo10+1 nicht automatisch passiert is. Turns out: man muss da im Unattended-Upgrade::Origins-Pattern den “Debian Backports” origin auskommentieren, sonst ignoriert unattended-upgrades zeug aus backports einfach.

diff --git a/apt/apt.conf.d/50unattended-upgrades b/apt/apt.conf.d/50unattended-upgrades
index 6abe00b..0c81626 100644
--- a/apt/apt.conf.d/50unattended-upgrades
+++ b/apt/apt.conf.d/50unattended-upgrades
@@ -38,7 +38,7 @@ Unattended-Upgrade::Origins-Pattern {
 //      "o=Debian,a=stable";
 //      "o=Debian,a=stable-updates";
 //      "o=Debian,a=proposed-updates";
-//      "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
+        "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
 };
 
 // Python regular expressions, matching packages to exclude from upgrading

Synapse 1.24.0 is heute im debian-backports gelandet. Mal schauen ob das update diesmal wirklich passiert.

Siehe: Debian Package Tracker

So kann man checken welche version grade läuft:

curl https://matrix.it-syndik.at/_synapse/admin/v1/server_version

Hab element-web gerade auch noch von 1.7.13 auf 1.7.15 geupgraded. In dem release hat sich der tarball name zu element-$v.tar.gz geändert und ich hab das update.sh angepasst.

Die 1.7.14 version haben wir gar übersprungen. Muss noch irgendwas aufsetzen das motzt wenn die version out of date is, oder einfach auch auto-update machen.


Element Web/Riot update script

/var/www/riot/update.sh:

#!/bin/sh

set -eu

IFS=

ver=$1; shift || { echo "Usage $0 NEW_VERSION"; exit 1; }

cd "$(dirname "$0")"

verlte() {
    [  "$1" = "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" ]
}

if verlte 1.7.15 $ver; then
	dir=element-v$ver
	tarball=$dir.tar.gz
else
	dir=riot-v$ver
	tarball=$dir.tar.gz
fi

wget -c https://github.com/vector-im/element-web/releases/download/v$ver/$tarball.asc
wget -c https://github.com/vector-im/element-web/releases/download/v$ver/$tarball

if ! gpgv --keyring ${PWD}/trustedkeys.kbx $tarball.asc $tarball; then
	echo
	echo Verifying tarball signature failed! Refusing to unpack.
	echo
	exit 1
fi

tar --one-top-level -xaf $tarball

ln -snf $dir riot-live.tmp
mv -T riot-live.tmp riot-live

echo
echo All good, update is live.

Das update ist jetzt immer noch nicht automatisch passiert. Diesmal hat die APT::Periodic:: config im apt.conf gefehlt. Das kann man entweder mit dpkg-reconfigure unattended-upgrades oder direkt über

/etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

einschalte. dpkg-reconfigure schreibt auch einfach in das file.

Zusätzlich ist mir dann noch eingefallen dass ja der synapse service nicht unbedingt restarted wird bei dem upgrade. Dabei kann warscheinlich needrestart helfen. Da bin ich drauf gestoßen dass das ding ne config option hat für “restart zeug einfach”: /etc/needrestart/needrestart.conf:

# Restart mode: (l)ist only, (i)nteractive or (a)utomatically.
#   
# ATTENTION: If needrestart is configured to run in interactive mode but is run
# non-interactive (i.e. unattended-upgrades) it will fallback to list only mode$
#
$nrconf{restart} = 'a';

Ich bin noch nicht sicher ob das den synapse dann wirklich neu startet wenn die maschiene nicht sowieso wegen nem kernel update rebootet. Sehen wir beim nächsten update :slight_smile:

Jetzt haben wir auf jeden fall mal synapse 1.24.0.

3 posts were split to a new topic: Matrix/Synapse Server: Upgrade Log

Ich hab heute endlich mal den TURN server fürs VoIP konfiguriert. Der hat jetzt eine eigene public IP und läuft unter turn.it-syndikat.org.

Leider funktioniert das ganze noch nicht so wie es soll. Authentifizierung der TURN requests scheint zu funktionieren aber verbindungen zwischen zwei clients hinter normalem NAT wollen einfach nicht funktionieren. Das ganze ist leider ziemlich schwierig zu debuggen, weils keine gute test software gibt die ich finden kann. Hrmpf.

Kleines update von der reverse proxy front: Turns out nginx macht bei proxy_pass keine TLS validation per default. Hab das mal eingeschaltet. Das ist jetzt nicht unbedingt kritisch weils ja eh nur durchs hypervisor netzwerk geht aber sein muss das trozdem nicht.

commit 350095a548f7c2f510ccb9fbf279a2c736cf8374 (HEAD -> master)
Author: root <root@yxorp.parabox.it-syndikat.org>
Date:   Mon Apr 5 17:01:01 2021 +0200

    Enable ssl verification for synapse client API

diff --git a/nginx/sites-available/it-syndik.at b/nginx/sites-available/it-syndik.at
index 2603972..f1ee1c3 100644
--- a/nginx/sites-available/it-syndik.at
+++ b/nginx/sites-available/it-syndik.at
@@ -69,7 +69,12 @@ server {
 
     location / {
         proxy_pass         https://[2a01:4f8:a0:6171:0:ff:fe00:1b]:8448;
+        proxy_ssl_name     synapse.it-syndik.at;
+        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
+        proxy_ssl_verify_depth 3;
+        proxy_ssl_verify   on; # This isn't the default!!! --DXLD
         proxy_set_header   X-Forwarded-For  $remote_addr;
+        proxy_set_header   X-Forwarded-Proto $scheme;
         proxy_max_temp_file_size 0;
     }
 

Update: die TLS terminierung ist jetzt ala TLS-SNI reverse proxy für yxorp implementiert. Die matrix VM macht jetzt alle certs selber und yxorp macht nur auf v4 TLS-SNI proxy.

Update (lang verspätet): Seit der parabox apokalypse zickt der matrix server für manche user (mich) rum, verwende (und maintane) den deswegen nicht mehr weil der beschluss gefasst wurde den nicht neu zu deployen um das zu fixen.

Aktueller maintainer? Macht noch wer updates? Not sure. Probably not.

Von synapse auf conduit zu migrieren wäre sicher auch angesichts der feindlichen Übernahme durch New Vector nicht schlecht. Das große Problem dabei sind immer lokale user-accounts, aber wenn die eh broken sind, ists egal.

Checkliste:

  • lokale room aliases entfernen
  • lokale user aus allen rooms leaven (z.B. einfach user löschen/disablen)
  • server signing key wegsichern
  • conduit konfigurieren (appservices, signing key)
  • synapse ausschalten
  • conduit einschalten
  • room aliases wiederherstellen
  • user erstellen

Also das is jetzt schon etwas überspitzt, die haben das ding ja auch zum großteil entwickelt. Mir passt das zwar auch nicht so recht aber die alternativen implementierungen machen halt dann evtl. wieder probleme.

Ich würde derweil noch bei deren impls. bleiben und switchen if/when das matrix protokoll mal einen stabilen zustand erreicht. Also: nachdem sie IETF MLS implementiert haben oder so ;)

ja ich mach auf dem ding updates. du warst auch schon mal daneben wo ich das teil geupdated han

Einmal ist ~keinmal~ nicht maintainen :) Wenn mans keinem sagt kann man dann nicht erwarten dass es wer wisse. Ich hab auch upgrades (fast)immer im meta geloggt solltest dir abschauen.

Server migration tools sind seit Jahren in Arbeit und es gibt immer noch nix annähernd brauchbares, wenn wir Server neu aufsetzen wollen, dann bitte nur einmal.