Matrix ist ein Open-Source-Standard (Protokoll) für VoIP, Instant Messaging und Videoanrufe, also Echtzeitkommunikation. Es bietet End-to-End-Verschlüsselung zusammen mit Unterstützung für Brücken zu verschiedenen anderen Messaging-Alternativen wie Slack, IRC, Telegram oder jedem anderen XMPP-Client. Es funktioniert auch mit Verbindungen mit geringer Bandbreite.
In diesem Tutorial zeige ich Ihnen, wie Sie Matrix Homeserver Synapse mithilfe von Docker-Containern installieren.
Was ist ein Matrix-Homeserver?
Matrix an sich ist nur eine Spezifikation und es gibt viele Implementierungen des Matrix-Protokolls, die öffentlich verfügbar sind.
Homeserver sind im Grunde alle auf einem Server bereitgestellten Implementierungen, auf die Sie über jeden Matrix-Client wie Element zugreifen können.
Die Frage, die sich stellen kann, ist, warum private Homeserver einrichten, wenn einige bereits öffentlich verfügbar sind?
Nun, für den Anfang können Sie Ihren privaten Homeserver mit Ihren Freunden, Ihrer Familie oder Ihren Kollegen teilen und ihn als Ihr tägliches Kommunikationsmedium verwenden. Sofern Sie sich nicht mit einem Benutzer von einem anderen Homeserver unterhalten, sind alle Daten auf Ihrem Server sicher und geschützt.
Dies gibt Ihnen die Kontrolle über jeden Aspekt, den öffentliche Homeserver nicht bieten können.
Bereitstellung der Synapse Matrix-Homserver-Implementierung mit Docker-Containern
In diesem Tutorial verwende ich Synapse, eine beliebte Matrix-Homeserver-Implementierung. Synapse wurde in Python geschrieben und vom Kernteam von Matrix entwickelt.
Wir vom Linux Handbook bevorzugen Docker gegenüber der nativen Bereitstellung, daher behandeln die folgenden Abschnitte die Synapse-Bereitstellung, die mit Docker durchgeführt wird.
Voraussetzung
- Ein Linux-System/Server. Wir empfehlen die Verwendung von Linode für die schnelle Bereitstellung eines Linux-Servers in der Cloud.
- Eine funktionierende Domain und Zugriff auf ihre DNS-Einträge (es sei denn, Sie möchten sie auf localhost einrichten)
- Du solltest sowohl docker als auch docker-compose installiert haben. Sie können unserer Anleitung zur Installation von Docker und Docker Compose auf CentOS folgen.
- Ich glaube, Sie kennen sich mit den wichtigsten Linux-Befehlen aus und haben keine Angst davor, das Terminal zum Bearbeiten von Konfigurationsdateien zu verwenden.
- Grundlegende Docker-Kenntnisse werden Ihnen helfen, aber Sie können dem Tutorial auch ohne Docker folgen.
Schritt 1:Reverse-Proxy einrichten
Bevor Sie sich mit Synapse die Hände schmutzig machen, müssen Sie zuerst Ihren Reverse-Proxy-Container und seinen begleitenden Let's Encrypt-Container für TLS-Zertifikate einrichten (Sie wollen https, vertrauen Sie mir).
Konfigurieren des Reverse-Proxy-Containers
In einer Produktionsumgebung verwenden Sie docker run ...
nicht verwenden Sie docker-compose
. Lassen Sie uns also den jwilder/nginx-proxy
konfigurieren als Reverse-Proxy.
Erstellen Sie ein Verzeichnis namens reverse-proxy und wechseln Sie in dieses neu erstellte Verzeichnis:
mkdir reverse-proxy && cd reverse-proxy
Öffnen Sie nun Ihren bevorzugten Texteditor und erstellen Sie eine Datei mit dem Namen docker-compose.yml
, und fügen Sie den folgenden Inhalt hinzu:
version: "3.3"
services:
proxy:
image: "jwilder/nginx-proxy"
container_name: "proxy"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/tmp/docker.sock:ro"
networks: ["server"]
restart: "always"
ports:
- "80:80"
- "443:443"
Hier definieren Sie also zuerst Ihren Dienst mit dem Namen proxy
. Die wichtigsten Merkmale, die Sie beachten sollten, sind:
- Die Volumes certs, vhost und html werden zwischen
jwilder/nginx-proxy
geteilt undjrcs/letsencrypt-nginx-proxy-companion
Behälter. - Der Docker-Socket ist schreibgeschützt unter
/tmp/docker.sock
gemountet . - Es verwendet ein anderes Netzwerk als das Standard-Bridge-Netzwerk.
- Die Ports 80 und 443 sind gebunden, für http bzw. https.
Letsencrypt-nginx-proxy-companion konfigurieren
Fügen Sie am Ende derselben Compose-Datei Folgendes hinzu
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion"
container_name: "letsencrypt"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "proxy"
networks: ["server"]
restart: "always"
depends_on: ["proxy"]
Hier haben Sie einen anderen Dienst namens letsencrypt definiert. Lassen Sie uns auch diese durchgehen:
- Alle Volumes des vorherigen Dienstes sind auch hier an den gleichen Stellen gemountet.
- Der Docker-Socket ist schreibgeschützt an
/var/run/docker.sock
gebunden . - Die Umgebungsvariable
NGINX_PROXY_CONTAINER
auf den Containernamen des Reverse-Proxy-Containers gesetzt, in unserem Fall „proxy“. - Es nutzt dasselbe "Server"-Netzwerk.
Fügen Sie am Ende dieser beiden Dienstbeschreibungen die Volume-Definitionen und die Netzwerkdefinition hinzu, wie unten:
networks:
server:
external: true
volumes:
certs:
vhost:
html:
Zwei wichtige Dinge, die hier zu beachten sind:
- Sie werden eine separate Compose-Datei für Synapse verwenden. Auf diese Weise haben Sie eine modulare Bereitstellung und können einen Dienst einfach herunterfahren, ohne andere zu beeinträchtigen, indem Sie den Reverse-Proxy und den Companion mithilfe einer anderen YAML-Datei bereitstellen.
- Das Netzwerk ist extern. Das dient dazu, Probleme mit anderen Containern zu vermeiden, die nicht dasselbe Netzwerk teilen, weil
docker-compose
benennt seine Volumes und Netzwerke, wenn es automatisch erstellt wird. Das bringt uns also zum Aufbau des Netzwerks. Verwenden Sie den Befehldocker network create server
um das Netzwerk zu erstellen.
Nachdem alles fertig ist, speichern Sie die Datei und beenden Sie den Editor.
Jetzt ist es an der Zeit, Ihren Reverse-Proxy-Server zu starten.
docker-compose up -d
Schritt 2:Synapse einrichten
Jetzt ist es an der Zeit, dass Sie sich endlich auf das Gute konzentrieren. Die Bereitstellung von Synapse ist also wirklich ein zweistufiger Prozess.
Zuerst brauchen Sie es, um eine Konfiguration zu generieren, als Nächstes räumen Sie die Konfiguration auf und stellen unseren Homeserver bereit.
Beginnen wir damit, die Compose-Datei zu erhalten.
Konfiguration generieren
Erstellen Sie ein separates Verzeichnis mit dem Namen "synapse" und wechseln Sie dorthin.
mkdir synapse && cd synapse
Erstellen Sie eine Datei namens docker-compose.yml
und öffne es, du kennst die Übung, oder?
Stellen Sie sicher, dass Sie die richtigen Werte für sub.domain.com
verwenden in der yml-Datei hier:
version: "3.3"
services:
synapse:
image: "matrixdotorg/synapse:latest"
container_name: "synapse"
volumes:
- "./data:/data"
environment:
VIRTUAL_HOST: "sub.domain.com"
VIRTUAL_PORT: 8008
LETSENCRYPT_HOST: "sub.domain.com"
SYNAPSE_SERVER_NAME: "sub.domain.com"
SYNAPSE_REPORT_STATS: "yes"
networks: ["server"]
networks:
server:
external: true
Dies ist, wie es aussieht, eine Standard-Compose-Datei, aber einige herausragende Optionen werden unten erklärt:
- Sie verwenden einen Bind-Mount anstelle eines Volumes, weil die Konfigurationsdatei dort generiert wird und Sie sie bearbeiten müssen. Sie können sicherlich Volumes verwenden, aber dann müssen Sie die Datei bearbeiten, die sich in
/var/lib/docker/volumes/<name>/_data
befindet . - Die Umgebungsvariablen
VIRTUAL_HOST
&LETSENCRYPT_HOST
sind für die letsencrypt- und Reverse-Proxy-Container, die die erforderlichen Konfigurationsänderungen zusammen mit den Zertifikaten generieren, ohne dass Sie manuell eingreifen müssen. - Stellen Sie sicher, dass
SYNAPSE_SERVER_NAME
verweist auf den FQDN Ihres Synapse-Servers (zusammen mit der Subdomain). - Legen Sie
VIRUAL_PORT
fest auf 8008. Der Synapse-Container stellt den HTTP-Port 8008 bereit, damit seine Clients damit kommunizieren können. - Stellen Sie schließlich sicher, dass dieser Container dasselbe Netzwerk wie der Reverse-Proxy-Container verwendet, da die Container sonst nicht kommunizieren können, was wiederum den gesamten Prozess unterbricht.
Bestätigen Sie, dass Sie die IP des Servers zum A-Eintrag Ihres DNS hinzugefügt haben und ein CNAME-Eintrag auf die genaue Subdomain verweist.
Erstellen Sie data
Verzeichnis und führen Sie den folgenden Befehl aus
docker-compose run --rm synapse generate
Dadurch wird die Konfigurationsdatei in ./data mit dem Namen „homeserver.yaml“ generiert.
Synapse konfigurieren
Es gibt viele konfigurierbare Optionen in der homeserver.yaml
-Datei, die nicht Gegenstand dieses Tutorials sind. Ich schlage vor, dass Sie die Kommentare in dieser Datei durchgehen und hier lesen.
Stellen Sie vorerst nur die folgenden Änderungen sicher:
- Der
server_name
Variable wird auf die Subdomain Ihrer Wahl gesetzt, wie in der UmgebungsvariableSYNAPSE_SERVER_NAME
festgelegt . - TLS ist auf „false“ gesetzt. Sie verwenden einen Reverse-Proxy, sodass TLS über Ihren Webserver abgewickelt wird. Lass den Hafen in Ruhe.
- Stellen Sie sicher, dass
enable_registration
auf true gesetzt ist, damit Sie sich anmelden und Ihren Homeserver nutzen können.
Speichern Sie die Datei und beenden Sie sie.
Stellen Sie den Synapse Matrix Homeserver bereit
Jetzt, da alles an seinem Platz ist, können Sie Synapse mit einem so einfachen Befehl wie
startendocker-compose up -d
Jetzt ist Ihr Homeserver einsatzbereit. Wenn Sie die Subdomain in einem Webbrowser besuchen, sollten Sie eine Nachricht wie diese sehen:
PostgreSQL für die Datenbank verwenden [optional]
Standardmäßig verwendet synapse SQLite für seine Datenbank. Nun, das ist gut zum Testen und für den gelegentlichen Gebrauch, aber für einen wichtigeren Anwendungsfall empfehle ich die Verwendung von PostgreSQL.
PostgreSQL zur Synapse-Compose-Datei hinzufügen
Wechseln Sie in das Synapse-Verzeichnis, falls Sie sich noch nicht darin befinden, und öffnen Sie docker-compose.yml
. Fügen Sie dieser Compose-Datei die folgenden Zeilen hinzu.
postgresql:
image: postgres:latest
restart: always
environment:
POSTGRES_PASSWORD: somepassword
POSTGRES_USER: synapse
POSTGRES_DB: synapse
POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
volumes:
- "postgresdata:/var/lib/postgresql/"
networks: ["server"]
Der POSTGRES_INITDB_ARGS
Variable ist sehr notwendig. Es legt die Sortierung, den ctype und die Kodierung fest, die für die Postgres-Datenbank verwendet werden. Diese sind absolut notwendig, damit die Synapse funktioniert. Fügen Sie das Volume zum Volumes-Abschnitt hinzu:
volumes:
postgresdata:
Synapse konfigurieren
Jetzt müssen Sie Synapse über die postgresql-Datenbank informieren. Dazu bearbeiten Sie die alte homeserver.yaml
Datei. Öffnen Sie diese Datei und finden Sie die folgenden Zeilen heraus:
database:
name: sqlite3
args:
database: /path/to/homeserver.db
Entfernen Sie diese, da wir sie nicht mehr benötigen. Fügen Sie stattdessen Folgendes hinzu:
database:
name: psycopg2
args:
user: synapse
password: somepassword
host: postgresql
database: synapse
cp_min: 5
cp_max: 10
Der Name der Datenbank ist psycopg2, was ein PostgreSQL-Adapter für Python ist.
Schauen Sie genau hin, Sie werden die Ähnlichkeiten zwischen dieser und den Umgebungsvariablen erkennen, die Sie für den postgresql-Container eingerichtet haben.
Was den Host betrifft, verwenden Sie docker-compose
und ein benutzerdefiniertes Netzwerk, kann Synapse den Dienstnamen automatisch auflösen. Darüber brauchen Sie sich keine Sorgen zu machen.
Speichern Sie die Datei und beenden Sie sie.
Bereitstellen
Nun, was bleibt wirklich zu tun? Stellen Sie es bereit.
docker-compose up -d
Testen Sie die Synapse-Matrix-Homeserver-Bereitstellung
Ihr Homeserver ist bereit. Testen wir es. Matrix ist nur ein Protokoll, Synapse ist nur eine Implementierung. Sie benötigen einen Matrix-Client, um ihn wie ein Messaging-Tool verwenden zu können.
Hier ist eine Liste verschiedener verfügbarer Matrix-Clients. Element ist wahrscheinlich einer der beliebtesten Matrix-Clients, die Sie verwenden können.
Wenn Sie den Matrix-Client installiert haben, führen Sie ihn aus. Erstellen Sie hier ein Konto.
Füllen Sie auf der Registrierungsseite alle Details aus und geben Sie auf dem Homeserver die Subdomain ein, die Sie zuvor verwendet haben. Klicken Sie auf Registrieren.
Jetzt haben Sie eine perfekt funktionierende Synapse-Bereitstellung, die Sie mit Ihrer Familie oder Ihren Freunden verwenden können, ohne sich Gedanken darüber machen zu müssen, wo Ihre Daten gespeichert sind oder ähnliches.
Föderation in Synapse mit Docker einrichten [optional]
Föderation ist im Grunde die Fähigkeit, mit Benutzern auf einem anderen Homeserver zu kommunizieren.
Wenn Ihre Benutzer-ID beispielsweise @coolguy:coolserver.me ist, können Sie jemanden wie @Greatme:awesome.us in einen Raum auf Ihrem Homeserver einladen.
Ebenso können Sie auch Räumen beitreten, die auf anderen Homeservern gehostet werden.
Wenn Sie Synapse bereits ausführen, müssen Sie die Container nicht stoppen. Sie müssen nur Änderungen an Ihrem NGINX-Proxy-Container vornehmen. Dies besteht aus nicht mehr als drei kurzen und einfachen Schritten.
Es gibt ein paar Möglichkeiten, Federation zum Laufen zu bringen, aber diejenige, die meiner Meinung nach extrem einfach zu befolgen ist und nur minimale Änderungen an Ihrem bestehenden Setup erfordert, heißt Portdelegierung.
Standardmäßig versucht jeder Matrixserver, einen anderen Matrixserver über Port 8443 zu erreichen. Der folgende Prozess weist die anderen Server grundsätzlich an, einen anderen Port zu verwenden. Da https bereits an Port 443 funktioniert, delegieren Sie einfach den Standard-Matrix-Kommunikationsport an 443.
Schritt 1:Erstellen Sie eine Konfigurationsdatei für unseren Reverse-Proxy
Rufen Sie das Nginx-Reverse-Proxy-Verzeichnis auf. Erstellen Sie eine Datei namens synapse-federation
. Fügen Sie dieser Datei den folgenden Text hinzu:
location /.well-known/matrix/server {
return 200 '{"m.server": "$VIRTUAL_HOST:443"}';
}
Ändern Sie $VIRTUAL_HOST
auf den entsprechenden Wert, der im Grunde die Domäne ist, auf der Ihre Matrixinstanz bereitgestellt wird (festgelegt gemäß der docker-compose-Datei von synapse).
Schritt 2:docker-compose.yml bearbeiten
Öffnen Sie Ihre docker-compose.yml
Datei und fügen Sie dem Volumes-Array einen weiteren Eintrag hinzu:
- ./synapse-federation:/etc/nginx/vhost.d/$VIRTUAL_HOST
Ändern Sie erneut $VIRTUAL_HOST
auf den entsprechenden Wert.
Schritt 3:Starten Sie den Proxy-Server neu
Jetzt müssen Sie den Proxy-Server neu starten.
docker-compose up -d proxy
Dadurch wird der Reverse-Proxy-Container neu erstellt. Sie müssen sich keine Sorgen machen, dass vorherige Konfigurationen verloren gehen, es sei denn, Sie haben nach der Bereitstellung etwas manuell geändert. Die Konfiguration ist dynamisch, also wird alles gut.
Änderungen testen
Sie können die Änderungen auf zwei Arten testen.
Versuchen Sie, einem Raum wie #servers:matrix.org
beizutreten . Führen Sie den folgenden Befehl aus, wenn Sie jq
haben installiert:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | jq -r '.FederationOK'
Oder verwenden Sie dieses Hack-y:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | awk '/FederationOK/ {print $2}'
Dies sollte "true" ausgeben. Und natürlich $VIRTUAL_HOST
ändern zu der Domain, die Ihre Synapse-Instanz bedient.
War es hilfreich?
Ich hoffe, das war für Sie genauso hilfreich wie die Erfahrung für mich. Wenn Sie weitere Artikel wie diesen wünschen, können Sie dies unten kommentieren. Wenn Sie auf ein Problem stoßen, hinterlassen Sie einen Kommentar und ich werde versuchen, Ihnen zu helfen.