Heute möchte ich euch zeigen, wie man den Matrix Referenz Server „synapse“ unter CentOS 7 installiert und verwaltet.
Doch was ist Matrix? Um es kurz und knapp zu halten: Es ist ein dezentraler Chat. So kann man es ganz kurz sagen, ausführliche Informationen zu Matrix findet ihr hier:
https://matrix.org/blog/home.html#about
Vorbereitungen unter CentOS 7
Für die aktuellste Synapse Version (0.99.3) benötigt ihr ein Python 3.x. Ob das installiert ist, könnt ihr wie folgt raus finden:
python -V
Unter CentOS 7 solltet ihr folgende Ausgabe bekommen:
[user@vsp ~]$ python -V
Python 2.7.5
Das reicht für die neuesten Version von Synapse nicht. Um nun eine Python 3.x Version zu installieren, bedienen wir uns der Software Collection:
sudo yum install centos-release-scl
sudo yum install rh-python36
Damit habt ihr Python 3.6 installiert. Um diese Version nun auch nutzen zu können, braucht ihr den folgenden Befehl:
scl enable rh-python36 bash
python -V
Hier sollte nun „3.6.3“ als Ausgabe erscheinen. Damit habt die Basis für Synapse fast schon erledigt. Es fehlen aber noch einige Abhängigkeiten:
# Development Tools installieren
sudo yum groupinstall -y "Development tools"
# Weitere Voraussetzungen
sudo yum -y install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel redhat-rpm-config python-virtualenv libffi-devel openssl-devel libxml2-dev
Damit dürften alle Abhängigkeiten installiert sein. Sollte euch während der nun folgenden Installation noch ein Paket fehlen, lasst es mich in den Kommentaren wissen, damit ich die Zeile oben anpassen kann.
Installation von Synapse
Um den Synapse Server sicher und effizient zu betreiben, sind neben den bereits oben genannten Paket noch eine Datenbank notwendig. Da ich persönlich bereits eine Mastodon Instanz betreibe, hat sich für mich PostgreSQL angeboten. Daher müsst ihr noch PostgreSQL installieren:
PostgreSQL installieren
Da die mitgelieferte Version von CentOS schon recht alt ist, empfiehlt es sich, dass offizielle PostgreSQL Repository zu installieren:
wget https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum localinstall pgdg-redhat-repo-latest.noarch.rpm
sudo yum install postgresql11 postgresql11-server
sudo /usr/pgsql-11/bin/postgresql-11-setup initdb
sudo systemctl enable postgresql-11
sudo systemctl start postgresql-11
Damit habt ihr PostgreSQL in der Version 11 installiert und gestartet. Um nun eure Datenbank abzusichern, empfiehlt es sich, von IDENT auf md5 umzustellen. Weiterhin braucht ihr einen Synapse User, eine Datenbank für Synapse und natürlich auch hier ein Kennwort. Das lässt sich mit den folgenden Befehlen erreichen:
sudo su - postgres
psql
postgres=# ALTER USER postgres WITH PASSWORD '<Euer Passwort>';
postgres=# CREATE USER "synapse" CREATEDB;
postgres=# ALTER USER "synapse" WITH PASSWORD '<Passwort für Synapse>';
postgres=# CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse;
postgres=# GRANT ALL PRIVILEGES ON DATABASE "synapse" to synapse;
postgres=# \q
Damit habt ihr nun für den Nutzer postgres und den Nutzer synapse ein Passwort angelegt. Nun müsst ihr noch die Authentifizierung umstellen. Dazu bearbeitet ihr als root-User die Datei /var/lib/pgsql/11/data/pg_hba.conf:
sudo vim /var/lib/pgsql/11/data/pg_hba.conf
## Auszug! ##
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
## Ende Auszug ##
systemctl restart postgresql-11
Damit habt ihr von ident auf md5 umgestellt. Testen könnt ihr das nun wie folgt:
psql -U postgres
Passwort für Benutzer postgres: <Euer postgres Passwort>
postgres=#
Benutzer für Synapse erstellen
Da der Synapse Server nicht als root-Nutzer laufen sollte, erstellt ihr euch jetzt einen Nutzer, der den Server verwalten soll. Ein Standard Nutzer sollte hier reichen. Anschließend werdet ihr zum Nutzer:
sudo useradd synapse
sudo su - synapse
Als Nutzer synapse legt ihr euch nun erstmal eine Virtuelle Python Umgebung an, um dort den Server zu installieren:
[synapse@vsp ~]$ scl enable rh-python36 bash
[synapse@vsp ~]$ virtualenv synapse
[synapse@vsp ~]$ source synapse/bin/activate
(synapse)[synapse@vsp ~]$
Damit habt ihr euch unter /home/synapse/synapse eine virtuelle Python Umgebung eingerichtet, die mit Python 3.6.3 läuft. Nun kommen wir zur Installation von Synapse:
(synapse)[synapse@vsp ~]$ pip install --upgrade pip
(synapse)[synapse@vsp ~]$ pip install --upgrade setuptools
(synapse)[synapse@vsp ~]$ pip install matrix-synapse[all]
Damit ist Synapse installiert! Sollte es hier zu Fehlern kommen, könnt ihr mich gerne anschreiben oder den Fehler googlen – Python kann recht „komplex“ werden, so dass ich nicht alle Fehler hier abbilden kann (btw: Die meisten Installationsanleitungen geben keine Tipps zur Fehlerbehebung)
Nun kommen wir zur Konfiguration von Synapse. Immer noch in der virtuellen Python Umgebung von oben führt ihr nun folgendes im /home/synapse aus:
(synapse)[synapse@vsp ~]$ python -m synapse.app.homeserver --server-name matrix.example.com --config-path homeserver.yaml --generate-config --report-stats=yes
Damit erzeugt ihr eine Datei mit dem Namen „homerserver.yaml“, die vorkonfiguriert für die URL matrix.example.com ist. Hier sollte eure Server Name dann stehen 😉
Mit dieser nun erzeugten Datei habt ihr eine Basis Konfiguration, allerdings fehlen euch da noch ein paar Optimierungen:
vim homeserver.yaml
Folgende Werte anpassen (vorausgesetzt, ihr nutzt Let’s Encrypt):
tls_certificate_path: "/home/synapse/matrix.example.com.tls_chain.pem"
tls_private_key_path: "/home/synapse/matrix.example.com.tls.key"
no_tls: false
tls_fingerprints: []
server_name: "matrix.example.com"
pid_file: /home/synapse/homeserver.pid
listeners:
-
port: 8448
bind_addresses:
- '::'
type: http
tls: true
x_forwarded: false
resources:
- names: [federation]
compress: false
-
port: 8008
tls: false
bind_addresses: ['::1','127.0.0.1']
type: http
x_forwarded: true
resources:
- names: [client, webclient]
compress: true
database:
name: psycopg2
args:
user: synapse
password: <Datenbank Passwort>
database: synapse
host: localhost
cp_min: 5
cp_max: 10
url_preview_enabled: True
url_preview_ip_range_blacklist:
- '127.0.0.0/8'
enable_registration: False
Das sind aus meiner Sicht die wichtigsten Einstellungen. Wollt ihr die Registrierung erlauben, so setzte „enable_registration“ auf „True“.
Let’s Encrypt Zertifikat erzeugen
Ich persönlich mache das über einen Apache Pseudo VHost, der einfach eine leere Seite liefert, aber die Challenge für Let’s Encrypt bereitstellen kann. Das kann dann in der Apache Konfiguration so aussehen:
<VirtualHost *:80>
ServerAdmin <Deine E-Mail>
ServerName matrix.example.com
#RewriteEngine On
#RewriteCond %{HTTPS} off
#RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
#<VirtualHost *:443>
# ServerAdmin <Deine E-Mail>
# ServerName matrix.example.com
# DirectoryIndex index.php index.htm index.html
# DocumentRoot /var/www/matrix.example.com/httpdocs
# <Directory /var/www/matrix.example.com/httpdocs>
# Options Indexes FollowSymLinks
# AllowOverride All
# Order Allow,Deny
# Allow from All
# </Directory>
# <Location /_matrix>
# ProxyPass http://127.0.0.1:8008/_matrix nocanon
# ProxyPassReverse http://127.0.0.1:8008/_matrix
# </Location>
# CustomLog /var/log/httpd/matrix.example.com_access_log combined
# ErrorLog /var/log/httpd/matrix.example.com_error_log
# ServerSignature Off
# <IfModule mod_ssl.c>
# SSLEngine on
# SSLCompression Off
# Header add Strict-Transport-Security "max-age=15552000"
# SSLProtocol All -SSLv2 -SSLv3
# SSLHonorCipherOrder On
# SSLCipherSuite 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA'
# SSLCertificateKeyFile /etc/letsencrypt/live/matrix.example.com/privkey.pem
# SSLCertificateFile /etc/letsencrypt/live/matrix.example.com/cert.pem
# SSLCertificateChainFile /etc/letsencrypt/live/matrix.example.com/chain.pem
# SSLVerifyDepth 2048
# SSLVerifyClient none
# </IfModule>
# </VirtualHost>
Mit dieser Konfiguration habt ihr im SSL Teile (<VirtualHost *:443>) schon die fertige Matrix Konfiguration liegen, die nach der Erstellung des Zertifikats einkommentiert werden muss (sprich die „#“ entfernen). Ein systemctl reload httpd nicht vergessen!
Nun das Verzeichnis /var/www/matrix.example.com/httpdocs anlegen, eine dummy HTML Datei hinterlegen (oder ein fancy Matrix CSS Skript) und das Zertifikat holen:
sudo mkdir /var/www/matrix.example.com/httpdocs
sudo touch /var/www/matrix.example.com/httpdocs/index.htm
sudo chown -R root:apache /var/www/matrix.example.com/httpdocs
certbot-auto certonly --webroot --webroot-path /var/www/matrix.example.com/httpdocs -d matrix.example.com
cp /etc/letsencrypt/live/matrix.myifn.de/fullchain.pem /home/synapse/matrix.example.com.tls_chain.pem
cp /etc/letsencrypt/live/matrix.myifn.de/privkey.pem tls_private_key_path: "/home/synapse/matrix.example.com.tls.key"
chown synapse:synapse /home/synapse/matrix.example.com*
Damit man diesen Schritt, das Holen bzw. Aktualisieren des Zertifikats, nicht immer manuell machen muss, lohnt sich ein Cronjob:
vim /usr/local/bin/matrixcert.sh
## Inhalt ##
#!/bin/bash
certbot-auto renew --quiet
cp /etc/letsencrypt/live/matrix.myifn.de/fullchain.pem /home/synapse/matrix.example.com.tls_chain.pem
cp /etc/letsencrypt/live/matrix.myifn.de/privkey.pem tls_private_key_path: "/home/synapse/matrix.example.com.tls.key"
chown synapse:synapse /home/synapse/matrix.example.com*
## Cronjob ##
crontab -e
00 00 * * * /usr/bin/bash /usr/local/bin/matrixcert.sh > /dev/null 2>&1
Starten von synapse via systemd
Nun noch folgende Service Unit unter /etc/systemd/system/matrix-synapse.service anlegen:
[Unit]
Description=Synapse Matrix homeserver
[Service]
Type=simple
Restart=on-abort
User=synapse
Group=synapse
WorkingDirectory=/home/synapse
ExecStart=/home/synapse/bin/python -m synapse.app.homeserver --config-path=/home/synapse/homeserver.yaml
# adjust the cache factor if necessary
# Environment=SYNAPSE_CACHE_FACTOR=2.0
[Install]
WantedBy=multi-user.target
Und noch folgende Befehle:
sudo systemctl enable matrix-synapse
sudo systemctl start matrix-synapse
Danach läuft euer Synapse Home Server!
Admin User anlegen
Einfach die folgende Schritte befolgen:
sudo su - synapse
[synapse@vsp ~]$ scl enable rh-python36 bash
[synapse@vsp ~]$ source synapse/bin/activate
[synapse@vsp ~]$ register_new_matrix_user -c homeserver.yaml https://localhost:8448
New user localpart [user]: <Dein Admin Nutzer ohne @>
Password: <Dein Passwort>
Confirm password: <Dein Passwort wiederholen>
Make admin [no]: yes
Sending registration request...
Success.
Kommentar verfassen