Matrix ist ein neues Kommunikationssystem, allerdings nicht mit dem Anspruch, das nächste coole, hippe Ding zu werden, sondern Matrix setzt von Anfang an auf Integration und will Brücken zu anderen Systemen bauen. Die Kommunikation im Internet hat sich leider zu einer zerklüfteten Inselwelt entwickelt, in der jede Gruppe mit ihrem eigenen System arbeitet und inkompatibel zur Außenwelt ist. Da der Umzug von einem Netzwerk in ein anderes umständlich ist und viele Netzwerke ihre speziellen Vorteile haben, will Matrix die Nutzer eben dort nicht wegholen, sondern dort erreichen. Jeder darf das System nutzen, das ihm gefällt – egal ob XMPP, IRC, Telegram, Hangouts oder Facebook – und Matrix kommuniziert mit ihnen. Ein Ansatz, der mir wahnsinnig gut gefällt!

Wer sich Matrix erst einmal nur ansehen will, kann den Webclient Riot benutzen und einen öffentlichen Raum wie #matrix:matrix.org oder #linux:matrix.org besuchen. Wem es dann gefällt, der kann sich einen eigenen Zugang einrichten, am besten auf einem der alternativen Server aus dem Hello-Matrix-Verzeichnis, damit im Netzwerk nicht ein riesiger Klumpen bei matrix.org entsteht.

An Matrix ist aber auch das gute, dass sich jeder leicht seinen eigenen Server einrichten kann, so dass alle Daten in der eigenen Hand liegen. Eine Anleitung findet sich unter anderem in Kuketz' Blog, in der Dokumentation von Matrix-Synapse und hier auf dieser Seite.

Gründe für Matrix

Bisher verwende ich für fast alle Kurzkommunikation mit anderen Menschen Whatsapp und Jabber/XMPP, aber mit beiden Systemen habe ich Probleme, für die ich keine Lösung finde. Wichtig ist mir dabei, dass ich unterwegs am Handy, daheim am Laptop oder manchmal auch spontan an einem anderen Rechner (z. B. am Arbeitsplatz) lesen oder schreiben kann.

Mit Matrix habe ich jetzt eine Lösung gefunden, die meinen Wünschen am besten gerecht wird. Mit dem Server Synapse konnte ich relativ schnell und einfach einen eigenen Home-Server einrichten, der mich unabhängig vom Wohlwollen anderer macht. Man kann sich auch mehrere Profile erstellen oder unterschiedliche Server nutzen, um ggf. Arbeit und privates zu trennen. Zur Nutzung von Matrix gibt es über F-Driod die App Riot fürs Handy und am Laptop nutze ich Riot als Webclient, was mir den Vorteil bietet, dass ich von überall darauf zugreifen kann.

Für die Teilnahme an Matrix ist auch keine Telefonnummer oder eine E-Mailadresse notwendig. Man kann solche Merkmale mit seinem Konto verknüpfen und in einem Verzeichnis eintragen, aber man muss es nicht tun.

Bisher (Mai 2018) ist die Verschlüsselung von Matrix noch in Entwicklung, aber bisher benutze ich sie ohne gravierende Probleme – einfach in den Raumeinstellungen aktivieren. Für Matrix findet jede Kommunikation in einem Raum statt, in dem man sich selbst und beliebig viele andere Personen befinden können; man kann auch allein in einem Raum bleiben und damit Notizen zwischen Geräten austauschen oder unterschiedliche Räume mit der gleichen Person zu verschiedenen Themen betreiben.

Über Matrix kann man Bilder, Videos und Dateien versenden. Diese Medien werden nicht über einen zusätzlichen Upload-Server übertragen, sondern über den Home-Server ausgetauscht, womit die Bilder vom Handy auch am Laptop im Verlauf zu sehen sind. Die Synchronisation über den Home-Server hat auch den Vorteil, dass Riot die gelesenen Nachrichten vom Handy am Laptop nicht wieder anbietet.

In den Räumen kann man eine URL-Vorschau aktivieren, so dass im Verlauf eine Info zur Webseite eingeblendet wird. Diese wird vom Home-Server generiert und damit nicht die IP-Adresse des Clients geleakt. Die Vorschau wird auch für alle URLs in einer Nachricht gezeigt und wenn sie stört, kann man sie ausblenden.

Für Textnachrichten unterstützt Matrix eine Formatierung mit Markdown, was in Gesprächen über Programmausgaben oder Dateieinträge richtig von Vorteil ist, bis dahin dass an dem Fenster für Blockcode ein Symbol zum Kopieren hängt. Ebenfalls gibt es eine Unterstützung bei der Eingabe von Emojis.

Eine Nachricht kann man auch im Nachhinein löschen (bearbeiten ist geplant) und mit der notwendigen Berechtigung sogar die Nachrichten anderer, um größere Runden entsprechend zu moderieren. Für öffentliche Räume kann der Verlauf über die Webseite view.matrix eingesehen werden. Weiterhin kann man mit Riot über Räume auch Telefonate und Videokonferenzen führen oder den Bildschirm übertragen.

Server einrichten

Synapse unter Debian einrichten

Von Debian wird Synapse erst ab dem Release Buster angeboten, aber das Matrix-Projekt bietet selbst ein Repository an, in dem aktuelle Versionen auch für ältere Debian-Releases verfügbar sind. Damit ist die Installation und die Aktualisierung gewohnt einfach.

% curl https://matrix.org/packages/debian/repo-key.asc |sudo apt-key add -
% echo "deb https://matrix.org/packages/debian/ stretch main" |sudo tee -a /etc/apt/sources.list
% sudo apt update
% sudo apt install matrix-synapse python-lxml python-netaddr

Die Pakete python-lxml und python-netaddr sind für Vorschau von URLs notwendig. Bei Matrix geschieht der Abruf der URL-Vorschau auf dem Server, was gegenüber Whatsapp den Vorteil hat, dass die Adresse des Nutzers nicht durch Versenden von Links erspäht werden kann – die Serveradresse ist durch die Federation eh bekannt. Allerdings bestehen mit der URL-Vorschau andere Sicherheitsfragen wie in der Dokumentation von Synapse erwähnt ist.

web_client: False
public_baseurl: https://alea.gnuu.de/
listeners:
  -
    port: 8448
    tls: false
     bind_address: ['::']
     type: http
     x_forwarded: false
     resources:
      - names: [federation]
        compress: false
  -
    port: 8008
    tls: false
     bind_address: ['::1']
     type: http
     x_forwarded: true
     resources:
      - names: [client]
        compress: false

url_preview_enabled: True
url_preview_ip_range_blacklist:
  - '127.0.0.0/8'
  - '10.0.0.0/8'
  - '172.16.0.0/12'
  - '192.168.0.0/16'
  - 'fe80::/10'

Wer bereits einen Postgres-Server zur Verfügung hat, sollte von Beginn an einsetzen, um sich die Arbeit der Migration zu ersparen, denn mit dem Postgres-Server läuft es bei mir besser.

Nach dem Beitritt zum Raum #matrix:matrix.org hatte ich mit der Version 0.29 Probleme mit dem Speicherverbrauch von Synapse, da Synapse über 5GB RSS genutzt hat. Dies kann ein Bug in der Version 0.29 sein und hörte mit dem Austritt aus dem Raum auch wieder auf. Dennoch habe ich die Konfiguration des Dienstes dazu angepasst (mit 0.2 habe ich ca. 2GB RSS):

% sudo systemctl edit matrix-synapse.service
[Service]
# https://github.com/matrix-org/synapse#help-synapse-eats-all-my-ram
Environment="SYNAPSE_CACHE_FACTOR=0.2"
MemoryMax=80%

In der Konfiguration des Dienstes kann man auch noch den Namen angeben, der von journal verwendet werden soll, damit journalctl -t synapse (statt python) funktioniert:

[Service]
SyslogIdentifier=synapse

In Synapse selbst kann man auch noch die Protokollierung an journal anpassen, indem man das Paket python-systemd installiert und in /etc/matrix-synapse/log.yaml folgende Anpassungen vornimmt:

@@ -4,6 +4,8 @@
 formatters:
   precise:
    format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s- %(message)s'
+  journal_fmt:
+   format: '%(name)s: [%(request)s] %(message)s'

 filters:
   context:
@@ -16,12 +18,17 @@
     formatter: precise
     filename: /var/log/matrix-synapse/homeserver.log
     maxBytes: 104857600
-    backupCount: 10
+    backupCount: 6
     filters: [context]
   console:
     class: logging.StreamHandler
     formatter: precise
     level: WARN
+  journal:
+    class: systemd.journal.JournalHandler
+    formatter: journal_fmt
+    filters: [context]
+    SYSLOG_IDENTIFIER: synapse

 loggers:
     synapse:
@@ -32,4 +39,4 @@

 root:
     level: INFO
-    handlers: [file, console]
+    handlers: [file, journal]

Wenn alles durch ist, den Dienst (neu-)starten und dann sollte er auf den zwei Ports 8008 und 8448 lauschen.

% sudo systemctl restart matrix-synapse.service
% sudo ss -tlp |grep 8..8
LISTEN     0      0         :::8448        :::*         users:(("python",pid=24088,fd=9))
LISTEN     0      0        ::1:8008        :::*         users:(("python",pid=24088,fd=10))

Ob der Server für Clients erreichbar ist, kann man per netcat oder telnet prüfen (auch fürs System-Monitoring hilfreich):

% netcat -C localhost 8008 <<<$'GET /_matrix/client/versions HTTP/1.0\n'
HTTP/1.0 200 OK
Content-Length: 54
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
Server: Synapse/0.29.0
Cache-Control: no-cache, no-store, must-revalidate
Date: Sun, 20 May 2018 15:16:36 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Content-Type: application/json

{"versions": ["r0.0.1", "r0.1.0", "r0.2.0", "r0.3.0"]}

Im Log /var/log/matrix-synapse/homeserver.log sollte dann etwas in dieser Art stehen:

2018-05-20 17:12:18,831 - synapse.access.http.8008 - 95 - INFO - GET-65532- - - 8008 - Received request: GET /_matrix/client/versions
2018-05-20 17:12:18,832 - synapse.access.http.8008 - 129 - INFO - GET-65532- - - 8008 - {None} Processed request: 1ms (0ms, 0ms) (0ms/0ms/0) 54B 200 "GET /_matrix/client/versions HTTP/1.0" "None"

Ob der Server für andere Server erreichbar ist, also ob die Federation funktioniert, kann man über die Adresse https://matrix.org/federationtester/api/report?server_name=… mit dem entsprechenden Servernamen prüfen. In der Ausgabe sollte irgendwo "AllChecksOK": true erscheinen und am Ende sollte "ConnectionErrors": {} leer sein. Alternativ dazu gibt es noch den Fed-tester.

Nginx und Riot einrichten

Riot ist ein Webclient für Matrix, der vom Matrix-Team entwickelt wird. Man kann ihn direkt von riot.im aus nutzen oder man richtet sich eine eigene Instanz ein. Es gibt zwar ein Debian-Paket, aber dieses hängt vom Paket gconf ab und zieht auf einem Server einen Rattenschwanz an Paketen hinterher. Deshalb verwende ich das allgemeine Paket und entpacke es in /srv/www/riot.

In dem Verzeichnis liegt die Datei config.sample.json, welche nach config.json kopiert werden muss. Darin sollte bei default_hs_url die Adresse des eigenen Matrix-Servers eingetragen werden. Ich habe bei mir die Anmeldung von Gästen deaktiviert "disable_guests": true, bei den Raum-Servern meinen eigenen ergänzt und bei piwik den Schlüssel url durch X-url ersetzt, damit auch sicher kein Piwik angesprochen wird.

Matrix nutzt zwei verschiedene Kommunikationswege: 8008 für Clients und 8448 für andere Server, so wie es auch bei XMPP der Fall ist. Da Matrix eine REST-Schnittstelle verwendet, kann man den Verkehr zum eigentlichen Matrix-Dienst durch einen Nginx leiten, so dass der Matrix-Dienst nicht als root laufen muss und man die Möglichkeiten Nginx nutzen kann: SSL-Zertifikate, HTTP/2.0, Einschränken der IP-Adressbereiche, HTTP-Authentifizierung und die Vermischung mit anderen Inhalten, denn Matrix nutzt nur das Verzeichnis /_matrix.

server {
    listen 443 http2 ssl;
    listen [::]:443 http2 ssl;

    root /srv/www/default;

    location /_matrix/ {
        access_log off;
        proxy_pass http://[::1]:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

    location /riot/ {
        access_log off;
        alias /srv/www/riot-web/;
    }
}

% sudo systemctl reload nginx.service

Als einfachere Funktionsprüfung kann man im Browser die Adresse /_matrix/client/versions seines Servers aufrufen und sollte eine Ausgabe ähnlich wie bei https://matrix.org/_matrix/client/versions erhalten.

Neuen Benutzer anlegen

Man kann es allen Nutzern erlauben, ein neues Konto über die Weboberfläche anzulegen, in dem man in der Serverkonfiguration homeserver.yaml die Option enable_registration: true setzt. Falls man jedoch nur einen geschlossenen Nutzerkreis haben will, kann man in der Serverkonfiguration bei registration_shared_secret: "<SECRET KEY>" eine geheime Zeichenkette (generiert mit pwgen -s 64 1) eintragen und dann mit dem Kommandozeilenprogramm register_new_matrix_user neue Benutzer anlegen:

% register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008
New user localpart [root]: user
Password:
Confirm password:
Make admin [no]:
Sending registration request...
Success.

Das Zurücksetzen des Passworts ist hier beschrieben.

Matrix mit Let's Encrypt

Es gibt noch eine Anleitung für Let's encrypt, die ich jedoch nicht genutzt habe.

TURN für Video- und Audioverbindungen einrichten

Für Video- und Audioverbindungen ist neben dem Matrix-Server noch ein TURN-Server notwendig, der zwischen Geräten vermittelt, die sich nicht direkt erreichen können; z. B. durch NAT. Direkt von Debian gibt es das Paket coturn.

Nach der Installation (apt install coturn) muss die Konfigurationsdatei /etc/turnserver.conf wie folgt angepasst werden (Entnommen aus der Doku von synapse):

lt-cred-mech
use-auth-secret
static-auth-secret=Geheimen Schlüssel mit `pwgen -s 64 1` erzeugen
realm=alea.gnuu.de
no-tcp-relay
# Matrix uses only TURN
no-stun
no-loopback-peers
no-multicast-peers
no-tlsv1
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
cert=/etc/letsencrypt/live/host/cert.pem
pkey=/etc/letsencrypt/live/host/privkey.pem

Den geheimen Schlüssel und die TURN-Verbindungen muss man noch in der homeserver.yaml eintragen und den Synapse-Server neustarten.

turn_uris:
  - "turn:alea.gnuu.de:3478?transport=udp"
  - "turn:alea.gnuu.de:3478?transport=tcp"

turn_shared_secret=Geheimer Schlüssel

Die Konfiguration für Systemd wird bei der Installation automatisch generiert, weshalb ich sie durch folgende ersetzt (systemctl edit --full coturn.service) habe. Damit läuft der Prozess auch nicht mehr als Benutzer root.

# https://github.com/coturn/coturn/blob/master/rpm/turnserver.service.fc

[Unit]
Description=coturn
Documentation=man:coturn(1) man:turnadmin(1) man:turnserver(1)
After=network.target

[Service]
User=turnserver
Group=turnserver
SupplementaryGroups=ssl-cert
PIDFile=/run/turnserver.pid
ExecStart=/usr/bin/turnserver -c /etc/turnserver.conf --pidfile /dev/null --log-file stdout
Restart=on-abort

LimitNOFILE=999999
LimitNPROC=60000
LimitRTPRIO=infinity
LimitRTTIME=7000000
CPUSchedulingPolicy=other
UMask=0007

[Install]
WantedBy=multi-user.target

Sicherheitshinweis: Trotz der Einstellungen für Verschlüsselung des TURN-Servers konnte ich mit Wireshark noch die Inhalte der Verbindung einsehen. Ich habe nichts gefunden, wie ich die TURN-Verbindung weiter absichern kann.

Source: laptop (Port: 59697)
Destination: alea.gnuu.de (Port: 3478)
Protocol: STUN
Info: Allocate Request UDP lifetime: 3600 user: 1527072691:@test:alea.gnuu.de realm: alea.gnuu.de with nonce

Source: laptop (Port: 59697)
Destination: alea.gnuu.de (Port: 3478)
Protocol: STUN
Info: CreatePermission Request XOR-PEER-ADDRESS: 192.168.178.21:48261 user: 1527072691:@test:alea.gnuu.de realm: alea.gnuu.de with nonce

Im Wireshark konnte ich aber auch beobachten, dass meine beiden Testgeräte direkt per IPv6 kommuniziert haben, ohne den Weg über den TURN-Server.

Wechsel der Datenbank zu Postgres

Ich habe irgendwann die Datenbank dann auf Postgres umgestellt, weil ich eh einen Server laufen hatten. Hier die Befehle zum Einrichten des Benutzers und der Datenbank. Dabei ist darauf zu achten, dass der Benutzername identisch mit dem Systembenutzer seien muss, unter dem auch der Dienst läuft, sonst funktioniert die passwortlose Anmeldung per Socket nicht; systemctl show -pUser matrix-synapse.service.

% sudo apt install python-psycopg2
% sudo -u postgres sh -c 'createuser matrix-synapse && psql' <<__EOF
CREATE DATABASE matrix
  ENCODING 'UTF8'
  LC_COLLATE='C'
  LC_CTYPE='C'
  template=template0
  OWNER "matrix-synapse";
__EOF

In der Konfiguration homeserver.yaml müssen noch die Einstellungen wie folgt geändert werden:

# Database configuration
database:
  # The database engine name
  name: psycopg2
  # Arguments to pass to the engine
  args:
    dbname: matrix
    user: matrix-synapse
    host: /run/postgresql
    port: 5433
    application_name: matrix-synapse

Den Port muss man angeben, wenn Postgres als Version 10 läuft, aber psycopg2 noch auch Version 9 eingestellt ist. Einfach mal schauen, wie der Socket-Name in /run/postgresql/ lautet.

Zusätzlich zu den Parametern für connect kann man noch Parameter für das Connection-Pooling angeben.

Bei Systemd sollte man dann noch angeben, dass der Server erst nach Postgres gestartet wird:

% sudo systemctl edit matrix-synapse.service
[Unit]
After=network-online.target postgresql.service

Für die Datenmigration von sqlite zu Postgres gibt es das Programm synapse_port_db. Dieses kann auch mehrfach ausgeführt werden, falls man den Dienst weiterlaufen lässt und eine Kopie der sqlite-Datenbank verwendet hat oder es zu Fehlern kam. Ich habe aber einfach für die gesamte Zeit den Dienst bei mir abgeschaltet.

% cd /tmp && sudo -u postgres synapse_port_db -v --curses \
  --sqlite-database /var/lib/matrix-synapse/homeserver.db \
  --postgres-config /etc/matrix-synapse/homeserver.yaml

Bei wem es zu einem Fehler Failed to insert: room_depth kommt, sollte mal nachsehen, ob der Fehler 3214 bereits gelöst ist oder ggf. den ALTER TABLE-Befehl von dort ausprobieren.

Räume aus der Datenbank kratzen

Ich habe bei mir einen kaputten Zustand des Synapse-Servers erreicht, so dass ich dem Raum #matrix:matrix.org nicht mehr beitreten konnte, ihn aber auch nicht aus Riot entfernen konnte. Es gibt im git das Programm nuke-room-from-db, mit dem man die Datenbank bereinigen kann.

Clients für Matrix

Riot

Desktop-Programme

Kommunikation mit anderen Netzwerken

IRC

Von matrix.org werden offiziell Verbindungen in verschiedene IRC-Netze angeboten. Um zum Beispiel in den IRC-Channel #firefox bei moznet einzutreten, betritt man den Matrix-Raum #mozilla_#firefox:matrix.org. Genaueres gibt's in der Anleitung zum IRC-Appservice.

mxmpp

% git clone 'https://github.com/anewusername/mxpp.git'
% cd mxpp
% git clone 'https://github.com/matrix-org/matrix-python-sdk.git'
% ln -s matrix-python-sdk/matrix_client .
% git clone 'https://github.com/yaml/pyyaml'
% ln -s pyyaml/lib3/yaml .
% sudo agi python3-sleekxmpp

https://gitlab.com/ecartman/sleekxmpp-omemo-plugin

Skype-Bridge

https://github.com/matrix-hacks/matrix-puppet-skype

https://github.com/matrix-hacks/matrix-puppet-facebook

matterbridge

https://github.com/42wim/matterbridge

XMPP-Bridge mit Prosody

https://gitlab.com/uhoreg/matrix-appservice-prosody

Dienste innerhalb von Matrix

t2bot.io

t2bot bietet mehrere öffentliche Bots und Bridges an, so dass man die Dienste nicht selbst einrichten und pflegen muss.

Ein Bot für Umfragen

Manchmal möchte man in Gruppen eine Umfrage durchführen. Dies lässt sich leicht mit dem poll-bot erreichen.

% git clone https://github.com/shawnanastasio/matrix-pollbot
% pip install matrix-bot-api

% register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008
New user localpart [root]: pollbot
Password:
Confirm password:
Make admin [no]:
Sending registration request...
Success.
% cd matrix-pollbot
% cp config.ini.example config.ini && emacs config.ini

% python3 pollbot.py

Den Bot kann man dann in den Raum einladen und mit !newpoll eine neue Umfrage starten (kleiner Tipp: Keine URLs verwenden, sonst wird immer wieder URL-Preview aktiv). Danach sendet man als Nachricht in den Raum die Frage und danach als einzelne Nachrichten die möglichen Antworten. Mit !startpoll schließt man dann die Erstellung ab. Jeder im Raum kann dann mit !info sich die Umfrage ansehen, mit !vote <number> darüber abstimmen und mit !endpoll wird die Umfrage beendet. Alle Befehle werden bei !pollhelp aufgelistet.

Gedanken zu Matrix

Wahl der Kennungen

Die Benutzernamen bei Matrix folgen dem Schema @user:domain, Raumnamen haben das Schema #raum:domain, für Gemeinschaften ist es +name:domain und interne IDs lauten !id:domain. Im Vergleich mit XMPP ist dies sehr gut, denn wenn irgendwo im WWW diese IDs auftauchen, gibt es genug Spammer die sie einfach als E-Mailadresse verwenden. Ich bekomme auch massenweise Spam für Message-IDs von Mailinglisten oder Usenet-Beiträgen, weil diese eben auch wie eine E-Mailadresse aufgebaut sind.

Anfangs fand ich die Form der Kennungen merkwürdig, aber mittlerweile begrüße ich die Abweichung vom bekannten Muster der E-Mails.

Referenzierung von Nachrichten

Da Nachrichten eine global eindeutige Kennung haben, lässt sich auch darauf verweisen; Beispiel. Da zum Beispiel der Webclient Riot auch ohne Anmeldung auf öffentliche Räume zugreifen kann, lässt sich damit angenehm auf Diskussion im Matrix-Netzwerk verweisen; Beispiel. Zu finden sind die Links unter anderem bei Riot, wenn man auf die drei Punkte rechts neben einer Nachricht klickt.

Technisches Design

Was mir bei Matrix von Anfang an gefallen hat, waren die Konzepte des Systems. Im Grunde ist Matrix sehr einfach: es gibt nur Benutzer, Räume und Nachrichten. Das hat zur Folge, dass ein direkter Chat mit einer Person für Matrix auch über einen Raum läuft. Genauso kann man Selbstgespräche in einem Raum mit nur einem Teilnehmer führen – ich nutze das, um Nachrichten zwischen Handy und Computer auszutauschen. Es wird also nicht zwischen Direktnachrichten und Gruppengesprächen unterschieden. Der Kern der Technologie ist schlicht und einfach gehalten, was immer ein großer Vorteil ist.

Matrix verwendet für Räume intern langen Kennungen und bietet für diese einen lesbaren Alias an. Somit kann ein Raum einerseits über mehrere Namen (z. B. mit und ohne Bindestrich) erreichbar sein und andererseits auch von einem zu einem anderen Server umziehen, weil sich einfach der Alias ändert.

Das Netzwerk ist auch ähnlich dem Usenet aufgebaut. Es gibt für einen Raum, eine Nachricht oder einen Benutzer eine Quelle (den Home-Server), die für die eindeutige Kennung sorgt, aber nicht als zentrale Instanz agiert. Jeder Server, der über einen seiner Benutzer an einem Raum beteiligt ist, pflegt die Nachrichten des Raums. Somit kann ein Knoten des Netzwerks ausfallen und alle anderen drumherum können weiterarbeiten. Im Gegensatz zum Usenet kooperieren die Server automatisch untereinander und es bedarf keiner händischen Pflege der Feeds.

Die Verknüpfung von Benutzerkennungen mit anderen Merkmalen wie Telefonnummer oder E-Mailadresse hat man in einen eigenen Dienst ausgelagert: identity servers. Dieses Verzeichnis kann also völlig getrennt von dem Kommunikationsnetzwerk aufgebaut und gepflegt werden, sprich man muss sich nicht dort registrieren, um Matrix nutzen zu können.

Bilder und Dateien sind mit Bestandteil des Protokolls, so dass es nicht wie bei XMPP die Probleme bei der Übertragung über einen zusätzlichen Server gibt und Bilder integrieren sich auch gut in Gruppengespräche. In der Nachricht steht zwar auch nur ein Verweis auf die Daten, aber der Abruf dieser läuft über die gleiche Schnittstelle.

"content": {
  "body": "IMG_20180330_120003.jpg",
  "info": {
    "mimetype": "image/jpeg",
    "thumbnail_info": {
      "mimetype": "image/jpeg",
      "h": 320,
      "w": 240,
      "size": 82143
    },
    "h": 1632,
    "thumbnail_url": "mxc://alea.gnuu.de/uCtPLuiKLlQPFwVmxfuCEovu",
    "w": 1224,
    "size": 908347,
    "orientation": 0
  },
  "msgtype": "m.image",
  "url": "mxc://alea.gnuu.de/IkyOoQUDtHlIhHBRBNGqDqJI"
},

Was ich auch wirklich gut finde, ist die Schnittstelle per Rest/JSON. JSON finde ich wesentlich handlicher als XML und Rest-Aufrufe kann man auch einfach von der Kommandozeile aus mit curl ausführen; eine kleine Einführung in die Matrix-Schnittstelle.

Ein kleines Beispiel für die Vorzüge von REST

Mit Synapse 0.29 gab es immer wieder Performance-Probleme mit großen Räumen wie #matrix:matrix.org. Da der Zugriff auf den Server über normale HTTP-Aufrufe erfolgt, kann man diese auch mit Nginx filtern und so Funktionen ausgleichen, die in der eigentlich Software nicht eingebaut sind; wie hier vorgeschlagen:

krombeI: I don't suppose it's possible to disable pagination for only certain rooms?

aidalgol: It is not possible via synapse. But I implemented it in nginx as follows (i know it't hacky but currently my only solution for accidential OOMing...)

location ~ /_matrix/client/r0/rooms/.*cURbafjkfsMDVwdRDQ.*matrix.org/messages {
    # set as text/plain to let this custom message be displayed (at least in js-sdk)
    default_type text/plain;
    return 429 "fetching history for #matrix:matrix.org leads to server OOM => it is currently disabled";
}

Programmierung von Matrix

Matrix-Implementation in Rust

https://www.ruma.io/ Matrix-Raum

Go

Sonstiges