Hinweise zum Setup des Matrix Servers Synapse, der Webclients, Apps und des Identity- und Dimension-Servers.

Bei Matrix sind die User-IDs nach dem Schema "@user:beispiel.de" aufgebaut, der Homeserver an sich ist unter "matrix.beispiel.de" erreichbar. Diese Werte "beispiel.de" und "matrix.beispiel.de" durch die eigenen Werte in den Anleitungen weiter unten ersetzen.

Synapse#

Matrix Synapse bei Hostsharing installieren#

https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren

Matrix Synapse mit Docker und Ansible installieren#

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

Matrix Synapse auf Ubuntu Server 20.04 manuell installieren#

Kurz gefasst enthält die Anleitung folgende Punkte

  • Debian-Pakete von matrix.org
  • Postgres
  • .well-known unter beispiel.de, Matrix-Server gehostet als matrix.beispiel.de
  • Apache als Reverse Proxy

1. Ubuntu-Pakete von Matrix-Machern

Quelle: https://github.com/matrix-org/synapse/blob/master/INSTALL.md#debianubuntu

Bei der Installation wird der "server name" abgefragt, hier "beispiel.de" angeben, der Teil der Account-Namen wird.

sudo apt install -y lsb-release wget apt-transport-https
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/matrix-org.list
sudo apt update
sudo apt install matrix-synapse-py3

2. Postgres 12 aus Ubuntu-Paketen installieren

sudo apt install postgresql

3. Postgres in Synapse konfigurieren

Quelle: https://github.com/matrix-org/synapse/blob/master/docs/postgres.md

Postgres Nutzer anlegen

sudo su - postgres
createuser --pwprompt synapse_user

Datenbank initial mit psql anlegen, wichtig wg. Zeichensatz:

psql

CREATE DATABASE synapse
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
 OWNER synapse_user;

In der homeserver.yaml mit vorher vergebenem Passwort konfigurieren:

database:
    name: psycopg2
    args:
        user: synapse_user
        password: <pass>
        database: synapse
        host: localhost
        cp_min: 5
        cp_max: 10

Synapse neu starten um Konfiguration zu übernehmen

sudo systemctl restart matrix-synapse

4. Reverse-Proxy für Synapse konfigurieren

Quelle: https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md

Apache-VHost für matrix.beispiel.de unter /etc/apache2/sites-available/matrix.beispiel.de.conf anlegen

Die Zertifikatsconfig ist nur angedeutet, hier via präferierter Methode SSL-Zertifikate (LetsEncrypt) angeben.

<VirtualHost *:443>
        SSLEngine on
        ServerName matrix.beispiel.de;

        AllowEncodedSlashes NoDecode
        ProxyPass /_matrix http://127.0.0.1:8008/_matrix nocanon
        ProxyPassReverse /_matrix http://127.0.0.1:8008/_matrix
        
        SSLCertificateFile ...
	SSLCertificateKeyFile ...
</VirtualHost>

Sowohl "AllowEncodedSlashes NoDecode" als auch "nocanon" sind zwingend notwendig.

Dann den VHost aktivieren:

sudo a2enmod proxy_http
sudo a2ensite matrix.beispiel.de.conf
sudo systemctl reload apache2

Der Server sollte dann schon unter https://matrix.beispiel.de/_matrix/static/ erreichbar sein

5. Synapse-Föderations-Konfiguration

Quelle: https://github.com/matrix-org/synapse/blob/master/docs/federate.md

Unter beispiel.de im Verzeichnis .well-known/matrix folgende Dateien "server" und "client" anlegen:

.well-known/matrix/server:

{
    "m.server": "matrix.beispiel.de:443"
}

.well-known/matrix/client:

{
  "m.homeserver": {
    "base_url": "https://matrix.beispiel.de"
  }
}

Außerdem via .htaccess noch folgende Header setzen, damit die Dateien in Riot-Web ankommen:

Header set Access-Control-Allow-Origin "*"
Header set Content-Type "application/json"

Jetzt kann das Setup mit dem Federation Tester geprüft werden, dort beispiel.de eingeben:

https://federationtester.matrix.org

Element Webclient#

Element Web ist eine statische html/js-Anwendung, daher keine Anforderungen außer einem Webserver (apache, nginx, ...):

Identity-Server#

Wird nicht benötigt und soll mittelfristig komplett aus dem Matrix-Universum verschwinden. Daher richten wir den nicht ein.

Integration-Server Dimension#

Push-Server für iOS und Android#

Worker-Setup#

Da Synapse als Python-Programm wegen des Python Global Interpreter Locks (GIL) auf eine CPU beschränkt ist, empfiehlt es sich, für größere Installationen ein Worker-Setup einzurichten. Dies ist grundsätzlich unter https://github.com/matrix-org/synapse/blob/develop/docs/workers.md beschrieben. Als ersten Schritt empfiehlt es sich, die Federation-Teile auszulagern. Dazu ist der federation_sender-Worker und ein generic_worker für die Federation-Requests (/_matrix/federation/*) notwendig.

Zur Kommunikation zwischen Hauptprozess und Worker-Prozessen wird Redis mit pub/sub channels verwendet.

Die Architektur sieht dann wie folgt aus:

workers.png

Main<->Worker-Kommunikation im Hauptprozess ermöglichen:

listeners:
  - port: 32993
    bind_address: '127.0.0.1'
    type: http
    resources:
     - names: [replication]
     
# redis pub/sub main -> worker
redis:
    enabled: true
    port: 32992

## Worker ##
worker_app: synapse.app.homeserver
daemonize: true

# disable federation sending here, use worker for it
send_federation: false

generic_worker für die Federation-Requests, der auf Port 32902 lauscht:

worker_app: synapse.app.generic_worker
worker_name: federation_reader

worker_replication_host: 127.0.0.1
worker_replication_http_port: 32993

worker_listeners:
    - type: http
      port: 32902
      bind_address: '127.0.0.1'
      resources:
          - names: 
            - client
            - federation
    - type: metrics
      port: 32981
      bind_address: '127.0.0.1'

Die notwendigen Einstellungen im Apache-Reverse-Proxy dazu sind:

	# Federation Reader
	ProxyPass "/_matrix/federation/v1/send/" "http://127.0.0.1:32902/_matrix/federation/v1/send/" nocanon
	ProxyPass "/_matrix/federation/v1/event/" "http://127.0.0.1:32902/_matrix/federation/v1/event/" nocanon
	ProxyPass "/_matrix/federation/v1/state/" "http://127.0.0.1:32902/_matrix/federation/v1/state/" nocanon
	ProxyPass "/_matrix/federation/v1/state_ids/" "http://127.0.0.1:32902/_matrix/federation/v1/state_ids/" nocanon
	ProxyPass "/_matrix/federation/v1/backfill/" "http://127.0.0.1:32902/_matrix/federation/v1/backfill/" nocanon
	ProxyPass "/_matrix/federation/v1/get_missing_events/" "http://127.0.0.1:32902/_matrix/federation/v1/get_missing_events/" nocanon
	ProxyPass "/_matrix/federation/v1/publicRooms" "http://127.0.0.1:32902/_matrix/federation/v1/publicRooms" nocanon
	ProxyPass "/_matrix/federation/v1/query/" "http://127.0.0.1:32902/_matrix/federation/v1/query/" nocanon
	ProxyPass "/_matrix/federation/v1/make_join/" "http://127.0.0.1:32902/_matrix/federation/v1/make_join/" nocanon
	ProxyPass "/_matrix/federation/v1/make_leave/" "http://127.0.0.1:32902/_matrix/federation/v1/make_leave/" nocanon
	ProxyPass "/_matrix/federation/v1/send_join/" "http://127.0.0.1:32902/_matrix/federation/v1/send_join/" nocanon
	ProxyPass "/_matrix/federation/v2/send_join/" "http://127.0.0.1:32902/_matrix/federation/v2/send_join/" nocanon
	ProxyPass "/_matrix/federation/v1/send_leave/" "http://127.0.0.1:32902/_matrix/federation/v1/send_leave/" nocanon
	ProxyPass "/_matrix/federation/v2/send_leave/" "http://127.0.0.1:32902/_matrix/federation/v2/send_leave/" nocanon
	ProxyPass "/_matrix/federation/v1/invite/" "http://127.0.0.1:32902/_matrix/federation/v1/invite/" nocanon
	ProxyPass "/_matrix/federation/v2/invite/" "http://127.0.0.1:32902/_matrix/federation/v2/invite/" nocanon
	ProxyPass "/_matrix/federation/v1/query_auth/" "http://127.0.0.1:32902/_matrix/federation/v1/query_auth/" nocanon
	ProxyPass "/_matrix/federation/v1/event_auth/" "http://127.0.0.1:32902/_matrix/federation/v1/event_auth/" nocanon
	ProxyPass "/_matrix/federation/v1/exchange_third_party_invite/" "http://127.0.0.1:32902/_matrix/federation/v1/exchange_third_party_invite/" nocanon
	ProxyPass "/_matrix/federation/v1/user/devices/" "http://127.0.0.1:32902/_matrix/federation/v1/user/devices/" nocanon
	ProxyPass "/_matrix/federation/v1/get_groups_publicised" "http://127.0.0.1:32902/_matrix/federation/v1/get_groups_publicised" nocanon
	ProxyPass "/_matrix/key/v2/query" "http://127.0.0.1:32902/_matrix/key/v2/query" nocanon

Der federation_sender schickt nur Requests raus, daher benötigt nur seine eigene Worker-Konfiguration:

worker_app: synapse.app.federation_sender

# The replication listener on the synapse to talk to.
worker_replication_host: 127.0.0.1
worker_replication_http_port: 32993

worker_listeners:
    - type: metrics
      port: 32980
      bind_address: '127.0.0.1'

Die Worker entweder per init-System der Wahl starten, für systemd sind Konfigurationen hier verfügbar: https://github.com/matrix-org/synapse/tree/develop/docs/systemd-with-workers

Monitoring#

Einen Überblick über größere Installationen und Details, wofür CPU-Zeit verbraucht wird, ist mit dem Prometheus/Grafana-basierten Monitoring möglich:

https://github.com/matrix-org/synapse/tree/develop/contrib/grafana

Dabei sind für den Hauptprozess und die einzelnen Worker die CPU-Auslastung interessant, um herauszufinden, ob der Hauptprozess oder einer der Worker am CPU-Limit ist:

metrics-cpu.png

Im Normalzustand sollte die Event Send Time im 100ms-Bereich sein:

metrics-send-time.png

Falls die CPU-Auslastung hoch ist, kann man mit den Block-Metriken herausfinden, welcher Teil von Synapse die CPU verbrät:

metrics-block-usage.png

Um die Cache-Größe der Synapse-internen Caches einzuschätzen, die Cache-Eviction-Rate beachten. Wenn hier viel evicted wird, dann allgemein den Cache-Faktor hochsetzen:

metrics-cache-eviction.png

Dabei benötigt ein Cache-Faktor von 4 maximal ungefähr 3GB RAM. Werte zwischen 2 (max 1,5GB RAM) und 10 (max 7,5GB RAM) haben sich bei synod.im bewährt.