Docker – Matrix Synapse Homeserver, Federation, Nginx Reverse Proxy und TURN-Server Einrichtung mit docker-compose
Neulich habe ich einen Matrix-Homeserver für den Freundeskreis eingerichtet. Ich überlegte, ob ich Federation brauche, und entschied mich schließlich dafür. Dazu musste ich auch einen TURN-Server einrichten, damit die Anrufe für alle ordnung funktionieren, da bei NAT-geschützten Verbindungen der Anschluss in der Regel nicht richtig zustande kommt. Den Container habe ich auf einem Hetzner Cloud VPS unter Debian 10 gestartet.
Du benötigst einen laufenden Docker-Service. Falls dieser noch nicht installiert ist, kannst du ihn einfach über https://get.docker.com/ installieren. Ich empfehle, ein Git-Repository zu erstellen, in das du die docker-compose- und nginx-Konfigurationsdateien pushen kannst.
Falls docker compose noch nicht installiert ist, installiere es entsprechend der jeweiligen Distribution. (Bei Ubuntu: apt install docker-compose)
Bei Debian 10 lade die neueste Version herunter (die du hier findest: https://github.com/docker/compose/releases):
curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
Für den Nginx-Reverse-Proxy benötigst du ein SSL-Zertifikat. Im Folgenden verwenden wir das Let’s Encrypt-Zertifikat mit certbot. Falls certbot noch nicht installiert ist, installiere es aus dem Repository:
apt install certbot
Registriere dann deine Domain:
certbot certonly --standalone
Notiere dir den Speicherort des SSL-Zertifikats oder verwende die statische Adresse (ich werde im Folgenden diese verwenden), die wie folgt lauten sollte:
/etc/letsencrypt/archive/matrix.deinedomain.hu/
Erstelle die nginx-Konfigurationsdatei, die als Reverse Proxy für den Matrix Synapse-Server und die Federation fungieren wird:
root@server:# vim /root/docker-config/nginx/conf.d/matrix.deinedomain.hu.conf
server {
listen 80;
server_name matrix.deinedomain.hu;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen 8448 ssl;
server_name matrix.deinedomain.hu;
access_log /var/log/nginx/matrix.deinedomain.hu.access.log;
error_log /var/log/nginx/matrix.deinedomain.hu.error.log;
# falls du die letsencrypt-soft-links verwendest und die ssl-zertifikate neu generiert hast, ist es ratsam, den docker-service neu zu starten, da er die links mit grosser wahrscheinlichkeit nicht richtig sehen wird
ssl on;
ssl_certificate /etc/nginx/ssl/matrix.deinedomain.hu/fullchain1.pem;
ssl_certificate_key /etc/nginx/ssl/matrix.deinedomain.hu/privkey1.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
resolver 1.1.1.1 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location ~* ^(\/_matrix|\/_synapse\/client) {
proxy_pass http://synapse:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
client_max_body_size 50M;
}
}
Erstelle eine docker-compose.yaml-Datei mit deinem bevorzugten Editor, füge Folgendes ein und bearbeite es nach deinen Anforderungen:
version: '2' services: web: image: nginx restart: unless-stopped container_name: nginx ports: - "80:80" - "443:443" - "8448:8448" volumes: - /root/docker-config/nginx/conf.d/:/etc/nginx/conf.d/ - /etc/letsencrypt/archive/matrix.deinedomain.hu/:/etc/nginx/ssl/matrix.zoliben.com links: - synapse synapse: image: matrixdotorg/synapse restart: unless-stopped volumes: - /data/matrix:/data
Die Konfigurations- und sonstigen Dateien von Matrix (unter anderem auch die hochgeladenen Bilder) speichere ich im Beispiel im Ordner /data/matrix.
Erstelle die Konfigurationsdateien:
docker run -it --rm -v /data/matrix:/data -e SYNAPSE_SERVER_NAME=matrix.deinedomain.hu -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate
Danach muss noch die Federation in der Konfigurationsdatei eingerichtet werden: /data/matrix/homeserver.yaml
Suche den Abschnitt „listeners:“ und entferne die Kommentare vor dem Teil zum Port 8448, damit es ungefähr so aussieht (da wir einen Reverse Proxy verwenden, ist TLS auf Anwendungsebene nicht erforderlich):
listeners:
# TLS-enabled listener: for when matrix traffic is sent directly to synapse.
#
# Disabled by default. To enable it, uncomment the following. (Note that you
# will also need to give Synapse a TLS key and certificate: see the TLS section
# below.)
#
- port: 8448
type: http
tls: false
resources:
- names: [client, federation]
# Unsecure HTTP listener: for when matrix traffic passes through a reverse proxy
# that unwraps TLS.
#
# If you plan to use a reverse proxy, please see
# https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md.
#
- port: 8008
tls: false
type: http
x_forwarded: true
resources:
- names: [client, federation]
compress: false