Leider musste ich feststellen, dass die Anleitungen, die mir die Suchmaschine meines Vertrauens ausgespuckt haben, um für Matrix mit Element-Web und Synapse-Admin unter Verwendung von Apache als Reverse Proxy eine Dockerumgebung einzurichten, entweder nicht funktionieren (veraltet / fehlerhaft), oder der ein oder andere Hinweis fehlt, um das Projekt auch mit weniger tiefgreifendem Wissen erfolgreich realisieren zu können. Mit einiger Unterstützung konnte ich nun eine funktionierende Installation umsetzen und stelle hier meine Dokumentation als Tutorial zur Verfügung,
Wenn man sich exakt an alle Schritte und Konfigurationen hält, sollte das bei jedem auf einem Debian-basierten Server, auf dem Apache läuft, ebenfalls zu einer funktionierenden Umgebung führen. Sollte es trotz des extrem kleinschrittigen Vorgehens Fragen oder Probleme geben, dürft ihr euch selbstverständlich gerne bei mir melden. Meine Kontaktmöglichkeiten findet ihr oben rechts auf dieser Webseite.
Voraussetzungen
- folgende (Sub)Domains zeigen auf den Server:
- mydomain.de
- matrix.mydomain.de
- synapseadmin.mydomain.de
- element.mydomain.de
- Apache-Webserver ist installiert und eingerichtet.
- VirtualHost für den Ordner /var/www/public_html ist angelegt und aktiviert.
- folgender Apache-Module sind aktiviert:
- Module anzeigen
rewrite
headers
proxy
proxy_http
connect
proxy_wstunnel
ssl
proxy_fcgi
setenvif
expires
deflate
mod_php
- Module anzeigen
- Docker und Docker-Compose sind installiert und eingerichtet.
Installation und Konfiguration
Apache-Webserver
- Portliste für Apache anpassen:
nano /etc/apache2/ports.conf
- Code einblenden
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
Listen 8448
- Code einblenden
- VirtualHost mit der Apache-Reverse-Proxy-Config für Synapse erstellen:
nano /etc/apache2/sites-available/matrix.mydomain.de.conf
- folgenden Inhalt in die Datei kopieren:
- Code einblenden
<VirtualHost *:80>
ServerAdmin admin@mydomain.de
ServerName matrix.mydomain.de
Redirect Permanent / https://matrix.mydomain.de/
</VirtualHost>
<VirtualHost *:443>
ServerAdmin admin@mydomain.de
ServerName matrix.mydomain.de
Protocols h2 h2c http/1.1
DocumentRoot /var/www/public_html
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^\/.well-known/matrix/client /var/www/public_html/well-known/matrix/client [QSA,L]
RewriteRule ^\/.well-known/matrix/server /var/www/public_html/well-known/matrix/server [QSA,L]
</IfModule>
includeSubDomains; preload"
Header always set Referrer-Policy "same-origin"
SSLEngine on
SSLProtocol -all +TLSv1.2
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-HA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
AllowEncodedSlashes NoDecode
RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:8008/ nocanon
ProxyPassReverse / http://127.0.0.1:8008/
ProxyPass /_synapse/client http://127.0.0.1:8008/_synapse/client nocanon
ProxyPassReverse /_synapse/client http://127.0.0.1:8008/_synapse/client
# wird von Certbot eingetragen
SSLCertificateFile /etc/letsencrypt/live/matrix.mydomain.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/matrix.mydomain.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
# Ende des Eintrags durch Certbot
</VirtualHost>
<VirtualHost *:8448>
SSLEngine on
ServerName matrix.mydomain.de
RequestHeader set X-Forwarded-Proto "https"ProxyPreserveHost on
AllowEncodedSlashes NoDecode
ProxyPass / http://127.0.0.1:8008/ nocanon
ProxyPassReverse / http://127.0.0.1:8008/
# wird von Certbot eingetragen
SSLCertificateFile /etc/letsencrypt/live/matrix.mydomain.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/matrix.mydomain.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
# Ende des Eintrags durch Certbot
</VirtualHost>
- mydomain.de an allen Stellen durch die eigene Domain ersetzen.
- Den Abschnitt zwischen #von certbot eingetragen und # Ende des Eintrags durch Certbot weglassen, wenn Let's Encrypt mit Certbot verwendet wird.
- Code einblenden
- VirtualHost mit der Apache-Reverse-Proxy-Config für Synapse-Admin erstellen:
nano /etc/apache2/sites-available/synapseadmin.mydomain.de.conf
- folgenden Inhalt in die Datei kopieren:
- Code einblenden
<VirtualHost *:80>
ServerAdmin admin@mydomain.de
ServerName synapseadmin.mydomain.de
Redirect Permanent / https://synapseadmin.mydomain.de/
RewriteEngine on
RewriteCond %{SERVER_NAME} =element.mydomain.de
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerAdmin admin@mydomain.de
ServerName synapseadmin.mydomain.de
Protocols h2 h2c http/1.1
DocumentRoot /var/www/public_html
# auskommentiert bei Reverse-Proxy, da sonst 2 HSTS Header übermittelt werden
#Header add Strict-Transport-Security "max-age=31536000"
#Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
Header always set Referrer-Policy "same-origin"
#Header always set Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *;"
SSLEngine on
SSLProtocol -all +TLSv1.2SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM- SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-HA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
ProxyPreserveHost On
# For files proxy
RequestHeader set X-Forwarded-Proto "https"
#RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
AllowEncodedSlashes NoDecode
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
# von Certbot eingetragen
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/synapseadmin.mydomain.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/synapseadmin.mydomain.de/privkey.pem
# Ende des Eintrags durch Certbot
</VirtualHost>
- mydomain.de an allen Stellen durch die eigene Domain ersetzen.
- Den Abschnitt zwischen #von certbot eingetragen und # Ende des Eintrags durch Certbot weglassen, wenn Let's Encrypt mit Certbot verwendet wird.
- Code einblenden
- VirtualHost mit der Apache-Reverse-Proxy-Config für Synapse-Admin erstellen:
nano /etc/apache2/sites-available/element.mydomain.de.conf
- folgenden Inhalt in die Datei kopieren:
- Code einblenden
<VirtualHost *:80>
ServerAdmin admin@mydomain.de
ServerName element.mydomain.de
Redirect Permanent / https://element.mydomain.de/
RewriteEngine on
RewriteCond %{SERVER_NAME} =element.mydomain.de
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerAdmin admin@mydomain.de
ServerName element.mydomain.de
Protocols h2 h2c http/1.1
DocumentRoot /var/www/public_html
# auskommentiert bei Reverse-Proxy, da sonst 2 HSTS Header übermittelt werden
#Header add Strict-Transport-Security "max-age=31536000"
#Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
Header always set Referrer-Policy "same-origin"
#Header always set Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *;"
SSLEngine on
SSLProtocol -all +TLSv1.2SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM- SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-HA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
ProxyPreserveHost On
# For files proxy
RequestHeader set X-Forwarded-Proto "https"
#RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
AllowEncodedSlashes NoDecode
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
# von Certbot eingetragen
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/element.mydomain.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/element.mydomain.de/privkey.pem
# Ende des Eintrags durch Certbot
</VirtualHost>
- mydomain.de an allen Stellen durch die eigene Domain ersetzen.
- Den Abschnitt zwischen #von certbot eingetragen und # Ende des Eintrags durch Certbot weglassen, wenn Let's Encrypt mit Certbot verwendet wird.
- Code einblenden
- Die Virual-Host-Configs aktivieren:
a2ensite matrix.mydomain.de.conf
a2ensite synapseadmin.mydomain.de.conf
a2ensite element.mydomain.de.conf
- Apache neu starten:
systemctl restart apache2
Let's Encrypt
- Let's Encrypt-Zertifikate erstellen:
certbot
- für matrix.mydomain.de
- für element.mydomain.de
- für synapseadmin.mydomain.de
Matrix-Docker-Umgebung
- Docker-Verzeichnis erstellen:
mkdir /opt/matrix
- Unterverzeichnis für Matrix-Synapse erstellen:
mkdir /opt/matrix/data
- Unterverzeichnis für Medien erstellen:
mkdir /opt/matrix/data/media_store
- Unterverzeichnis für die Postgres-Datenbank erstellen:
mkdir /opt/matrix/postgres_db
- Unterverzeichnis für Redis erstellen:
mkdir /opt/matrix/redis
- Unterverzeichnis für Config-Dateien erstellen:
mkdir /opt/matrix/config
- Postgres-Konfiguration erstellen:
nano /opt/matrix/config/postgres.env
folgenden Inhalt in die Datei kopieren:- Code einblenden
POSTGRES_PASSWORD=mein_Passwort
POSTGRES_USER=synapse
POSTGRES_DB=synapse
POSTGRES_INITDB_ARGS=--lc-collate C --lc-ctype C --encoding UTF8
- Code einblenden
- Konfiguration für Matrix-Synapse erstellen:
- Befehl anzeigen
docker run -it --rm \
--mount type=bind,src=/opt/matrix/data,dst=/data \
-e SYNAPSE_SERVER_NAME=mydomain.de \
-e SYNAPSE_REPORT_STATS=yes \
matrixdotorg/synapse:latest generate
- Befehl anzeigen
- Datenbank-Konfiguration in der erstellten homeserver.yaml anpassen:
nano /opt/matrix/data/homeserver.yaml
- Code einblenden
server_name: "mydomain.de"
pid_file: /data/homeserver.pid
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
resources:
- names: [client, federation]
compress: false
#database:
#name: sqlite3
#args:
# database: /data/homeserver.db
database:
name: psycopg2
args:
user: synapse
password: mein_Passwort
database: synapse
host: matrix_db
cp_min: 5
cp_max: 10
log_config: "/data/mydomain.de.log.config"
media_store_path: /data/media_store
registration_shared_secret:
"sC8*enZFhQfVC8R5e9tSmpoW;RJE@xv@Eqdxa@,7mA;OBun1dt"
report_stats: true
macaroon_secret_key: "3h4*42i*qKt3Fx;pEH=_v;;rZVo9Sk5MLzgMlNj.I&pjOtpy#a"
form_secret: "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. ~b9-iy.-i,uI5"
signing_key_path: "/data/mydomain.de.signing.key"
trusted_key_servers:
- server_name: "matrix.org"
- Den Abschnitt database: für sqlite3 komplett auskommentieren (# davor setzen) oder löschen.
- Neuen Abschnitt database: für Postgres einfügen.
- Passwort für die Postgres-Datenbank aus der postgres.env eintragen (mein_Passwort ersetzen).
- Code einblenden
- Unterverzeichnis für die Element-Konfiguration erstellen:
mkdir /opt/matrix/config
- Element-Konfiguration erstellen:
nano /opt/matrix/config/element-config.json
folgenden Inhalt in die Datei kopieren:- Code einblenden
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.mydomain.de",
"server_name": "matrix.mydomain.de"
},
"m.identity_server": {
"base_url": "https://vector.im"
}
},
"disable_custom_urls": false,
"disable_guests": false,
"disable_login_language_selector": false,
"disable_3pid_login": false,
"brand": "Element",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"integrations_widgets_urls": [
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api"
],
"default_country_code": "DE",
"show_labs_settings": false,
"features": {},
"default_federate": true,
"default_theme": "light",
"room_directory": {
"servers": ["matrix.org"]
},
"enable_presence_by_hs_url": {
"https://matrix.org": false,
"https://matrix-client.matrix.org": false
},
"setting_defaults": {
"breadcrumbs": true
},
"jitsi": {
"preferred_domain": "meet.element.io"
},
"element_call": {"url": "https://call.element.io",
"participant_limit": 8,
"brand": "Element Call"
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?
key=fU3vlMsMn4Jb6dnEIFsx"
}
- Code einblenden
- docker-compose.yml erstellen:
nano /opt/matrix/docker-compose.yml
folgenden Inhalt in die Datei kopieren:- Code einblenden
services:
postgres:
image: postgres:latest
container_name: matrix_db
restart: unless-stopped
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres']
env_file:
- ./config/postgres.env
volumes:
- ./postgres_db:/var/lib/postgresql/data
networks:
- internal_network
redis:
image: redis:latest
container_name: matrix_redis
restart: unless-stopped
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
volumes:
- ./redis:/data
networks:
- internal_network
synapse:
image: matrixdotorg/synapse:latest
container_name: matrix_synapse
restart: unless-stopped
environment:
SYNAPSE_CONFIG_DIR: "/data"
SYNAPSE_CONFIG_PATH: "/data/homeserver.yaml"UID: "1000"
GID: "1000"
TZ: "Europe/Berlin"
ports:
- "127.0.0.1:8008:8008"
networks:
- internal_network
- external_network
volumes:
- ./data:/data
element:
image: vectorim/element-web:latest
container_name: matrix_element
restart: unless-stopped
volumes:
- ./config/element-config.json:/app/config.json:ro
ports:
- "127.0.0.1:8180:80"
networks:
- internal_network
- external_network
networks:
external_network:
name: matrix_external_network
external: true
internal_network:
name: matrix_internal_network
internal: true
- Code einblenden
- ID des angemeldeten sudo-Users auslesen:
id benutzername
- Verzeichnis-(Besitz-)Rechte anpassen:
chown -R ID:ID /opt/matrix/config
ID durch die ID des Benutzers ersetzen, z.B.chown -R 1000:1000 /opt/matrix/config
chown -R ID:ID /opt/matrix/data
ID durch die ID des Benutzers ersetzen, z.B.chown -R 1000:1000 /opt/matrix/data
chown -R 70:ID /opt/matrix/postgres_db
ID durch die ID des Benutzers ersetzen, z.B.chown -R 70:1000 /opt/matrix/postgres_db
chown -R 999:ID /opt/matrix/redis
ID durch die ID des Benutzers ersetzen, z.B.chown -R 999:1000 /opt/matrix/redis
- (Besitz-)Rechte anpassen:
chown ID:ID /opt/matrix/docker-compose.yml
ID durch die ID des Benutzers ersetzen, z.B.chown -R 1000:1000 /opt/matrix/docker-compose.yml
- well-known einrichten:
- Verzeichnis erstellen:
mkdir /var/www/public_html/well-known
- Unterverzeichnis erstellen:
mkdir /var/www/public_html/well-known/matrix
- Datei anlegen:
nano /var/www/public_html/well-known/matrix/server
mit folgendem Inhalt:- Code einblenden
{
"m.server": "matrix.mydomain.de:443"
}
- Code einblenden
- Datei anlegen:
nano /var/www/public_html/well-known/matrix/client
mit folgendem Inhalt:- Code einblenden
{
"m.homeserver": {
"base_url": "https://matrix.mydomain.de/"
}
}
- Code einblenden
- Verzeichnis erstellen:
- Ins Matrix-Verzeichnis wechseln:
cd /opt/matrix
- Docker-Umgebung starten:
docker-compose up -d
- Benutzer erstellen:
- In den Synapse-Docker wechseln:
docker exec -it matrix_synapse bash
- Admin erstellen:
register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --admin
Benutzername: admin
Passwort: mein_Passwort - Normalen Benutzer erstellen:
register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml
Benutzername: mein_benutzername
Passwort: mein_Passwort
Frage nach Admin-Account mit no beantworten
- Admin erstellen:
- Den Synapse-Docker verlassen:
exit
- In den Synapse-Docker wechseln:
Updaten
- Ins Docker-Verzeichnis wechsen:
cd /opt/matrix
- Alle Docker-Container herunterfahren:
docker-compose down
- Sicherung des Docker-Verzeichnisses erstellen:
cp -ar /opt/matrix /opt/matrixbackup
- Alle Docker-Container updaten:
docker-compose pull
- Alle Docker starten:
docker-compose up -d
- Wenn alles funktioniert, Backup des Docker-Verzeichnisses löschen:
rm -r /opt/matrixbackup
Anmeldung und Nutzung
Element Web
- Aufruf: https://element.mydomain.de
- Als Heimserver muss eingetragen sein / werden:
matrix.mydomain.de
- Anmeldung mit
mein_benutzername
undmein_Passwort
Synapse-Admin
- Aufruf: https://synapseadmin.mydomain.de
- Als Heimserver muss eingetragen sein / werden:
matrix.mydomain.de
- Anmeldung mit
admin
undmein_Passwort