- Auf Gerät
- Port
- 8448
- LXC
- Hostname
Inhaltsverzeichnis
Was ist das?
Matrix ist eine Kommunikationswerkzeug mit Unterstützung für Federation und Ende-zu-Ende-Verschlüsselung.
Matrix
Wir betreiben einen eigenen https://matrix.org-Homeserver.
Zudem bieten wir den web-basierten Client element (ehemals 'riot') für lokale Nutzer an.
Die Anmeldung am matrix-Homeserver ist nur mit den persönlichen LDAP-Zugangsdaten möglich. Eine offene Registrierung anderer Nutzer bieten wir nicht an. Die hackspace-Nutzer können aber natürlich trotzdem uneingeschränkt mit den Nutzern anderer matrix-Homeserver kommunizieren. Nutzer anderer Homeserver können auch "unseren" Räumen beitreten, sofern dies beim Anlegen des Raums nicht verboten wurde.
- Matrix-Domain
- hack-hro.de
- URL unseres Web-Clients
- VM für Matrix (synapse)
quassel.ditto
- VM für Element-Web-Client
hosting.ditto
Schnittstellen nach außen
- Web-Client
- Matrix-API
Installation
Matrix-Synapse
Debian-Pakete installieren:
apt install matrix-synapse matrix-synapse-ldap3
- Bei der Erstinstallation (auf Debian Buster) haben wir die buster-backports-Pakete verwendet. Ab Debian Bullseye dürften die normalen stable-Pakete die richtige Wahl sein.
Domain-Namen auswählen: in unserem Fall ist es hack-hro.de, auf dass die Nutzernamen dem Format unserer Email-Adressen nachempfunden sind
Datenbank anlegen: in unserem Fall auf database.ditto
Nun müssen wir einige synapse-Einstellungen anpassen. Diese übertragen wir aus der /etc/matrix-synapse/homeserver.yml in eine neue Datei (z.B. /etc/matrix-synapse/conf.d/hack-hro.yml.
Doku zu Federation-Einstellungen: https://github.com/matrix-org/synapse/blob/master/docs/federate.md
DNS / Zertifikat / apache2
DNS-Eintrag für quassel.hack-hro.de anlegen (als CNAME auf ditto.nodes.hack-hro.de)
die Domain des Web-Clients (quassel.hack-hro.de) in dehydrated eintragen (/etc/dehydrated/domains.txt)
letsencrypt-Zertifikat erstellen: dehydrated --cron
apache2-Site-Konfiguration auf web.ditto anlegen
element
die Installation des Web-Clients (im Wesentlichen: das Release-Archiv herunterladen) ist dokumentiert: https://github.com/vector-im/element-web#getting-started
unser Vorgehen:
mkdir -p /var/www/element cd /var/www/element version=v1.7.8 curl -L -s https://github.com/vector-im/element-web/releases/download/$version/riot-$version.tar.gz | tar xz ln -s riot-$version current
wir separieren unsere Konfigurationsanpassungen:
cd /var/www/element mkdir local-overrides cp current/config.sample.json local-overrides/config.json
nun die Datei latest/config.json unseren Bedürfnissen anpassen (z.B. das piwik-Tracking von matrix.org abschalten)
wir haben die https://klax.systemausfall.org/config.json als Inspiration verwendet
ein kleines Makefile zur erleichterten Aktualisierung anlegen:
LOCAL_OVERRIDES_DIR = local-overrides LOCAL_OVERRIDES := $(shell cd "$(LOCAL_OVERRIDES_DIR)" && find -type f | sed 's|^\./||') CURRENT_SYMLINK = current DOWNLOAD_BASE_URL = https://github.com PROJECT_URL_PATH = vector-im/element-web LATEST_VERSION := $(shell curl -sSL --fail "$(DOWNLOAD_BASE_URL)/$(PROJECT_URL_PATH)/releases/latest" | grep '<a href="/$(PROJECT_URL_PATH)/releases/download/v[0-9.]\+/riot-v[0-9.]\+.tar.gz"' | cut -f 2 -d '"' | sed 's|^.*/riot-v||; s|\.tar\.gz$$||') WANTED_VERSION ?= $(LATEST_VERSION) INSTALLED_VERSION := $(shell cat "$(CURRENT_SYMLINK)/version") ARCHIVE_DOWNLOAD_URL := $(DOWNLOAD_BASE_URL)/$(PROJECT_URL_PATH)/releases/download/v$(WANTED_VERSION)/riot-v$(WANTED_VERSION).tar.gz VERSION_DIR := riot-v$(WANTED_VERSION) .PHONY: help help: @echo "Targets:" @echo " upgrade" @echo " upgrade WANTED_VERSION=$(LATEST_VERSION)" @echo @echo "Installed version: $(INSTALLED_VERSION)" @echo "Latest version: $(LATEST_VERSION)" @echo .PHONY: upgrade upgrade: $(VERSION_DIR) for fname in $(LOCAL_OVERRIDES); do ln -sfn "../$(LOCAL_OVERRIDES_DIR)/$$fname" "$(VERSION_DIR)/$$fname"; done ln -sfn "$(VERSION_DIR)" "$(CURRENT_SYMLINK)" $(VERSION_DIR): curl -sSL --fail "$(ARCHIVE_DOWNLOAD_URL)" | tar xz --owner=root --group=root
mit make upgrade die lokalen Anpassungen auf das element-Verzeichnis anwenden
- spätere Aktualisierungen werden ebenso durchgeführt
LDAP-Anmeldung
Leider braucht das Python-Modul zur LDAP-Authentifikation (matrix-synapse-ldap3) ein paar kleine Anpassungen:
--- ldap_auth_provider.py.orig.0.1.4 2021-12-12 02:05:42.777230320 +0100 +++ ldap_auth_provider.py 2021-12-12 02:53:22.928401477 +0100 @@ -55,8 +55,8 @@ class LDAPMode(object): - SIMPLE = "simple", - SEARCH = "search", + SIMPLE = "simple" + SEARCH = "search" LIST = (SIMPLE, SEARCH) @@ -367,7 +367,7 @@ ldap_config.enabled = config.get("enabled", False) - ldap_config.mode = LDAPMode.SIMPLE + ldap_config.mode = config.get("mode", LDAPMode.SIMPLE) # verify config sanity _require_keys(config, [ @@ -381,15 +381,9 @@ ldap_config.base = config["base"] ldap_config.attributes = config["attributes"] - if "bind_dn" in config: - ldap_config.mode = LDAPMode.SEARCH - _require_keys(config, [ - "bind_dn", - "bind_password", - ]) - - ldap_config.bind_dn = config["bind_dn"] - ldap_config.bind_password = config["bind_password"] + if ldap_config.mode == LDAPMode.SEARCH: + ldap_config.bind_dn = config.get("bind_dn", None) + ldap_config.bind_password = config.get("bind_password", None) ldap_config.filter = config.get("filter", None) # verify attribute lookup @@ -487,12 +481,13 @@ if an error occured """ + authentication = ldap3.ANONYMOUS if bind_dn is None else LDAP_AUTH_SIMPLE try: # bind with the the local user's ldap credentials conn = await threads.deferToThread( ldap3.Connection, server, bind_dn, password, - authentication=LDAP_AUTH_SIMPLE, + authentication=authentication, read_only=True, ) logger.debug(
Übliche Aufgaben
Raum / Community erstellen
Alle matrix-Accounts, die zu unserem Homeserver gehören, können Räume und Communities anlegen. Externen Accounts ist dies nicht gestattet.
In den Raumeinstellungen (beim Anlegen oder später anzupassen) bezieht sich das Wort Gäste auf Nutzer, deren Account zu einem externen Homeserver gehört (z.B. @foo:systemausfall.org). Typischerweise sollten Gäste in Räumen erlaubt sein, da manche hackspace-Mitglieder separate matrix-Accounts nutzen. Die Offenheit eines Raums (nur auf Einladung) ist davon unabhängig.
Jede Ressource (Räume, Communities) sollte mindestens zwei aktive Admins (eher mehr) haben, damit wir die Kontrolle über die Ressource nicht irgendwann verlieren.
Weitere Admins zu einer Community hinzufügen
Leider ist die Ernennung weiterer Admins für Communities derzeit (2020) nicht via element möglich (siehe #5240).
Daher verwenden wir unser eigenes kleines Admin-Skript auf *quassel*:
/root/bin/matrix-helpers community admin add --community COMMUNITY --username USERNAME
Web-Client (element) aktualisieren
Wir aktualisieren den Web-Client gelegentlich manuell.
Auf hosting.ditto folgendes ausführen:
# element-Version pruefen make -C /var/www/element # element aktualisieren make -C /var/www/element upgrade
Ein Wechsel zurück auf eine ältere Version kann durch Änderung des Symlinks latest in dem obigen Verzeichnis erfolgen.
Aktualisierungen des Web-Clients sind nicht disruptiv für Nutzer. Sie können also bedenkenlos vorgenommen werden.