Muckl als Web- und [matrix]-server einrichten

Muckls Verbindung zum Internet

Mein Mini-PC heißt muckl, läuft unter Debian stable und soll als Server für Webseiten und Matrix messaging dienen. muckl hat eine Kabelverbindung zu einem Router (alte FRITZ!Box) und muss mit dynamischem DNS (DDNS) zurechtkommen. Im internen Netz hat muckl eine statische IPv4 Adresse und für IPv6 einen EUI-64. Für die Einrichtung des DDNS auf dem Router bin ich nach der Anleitung von Nocksoft vorgegangen und habe dynv6.com als Anbieter gewählt. muckl ist jetzt unter mismuckl.v6.rocks zu erreichen und hat gültige A und AAAA DNS records. Zusätzlich habe ich erst einmal “www” als CNAME record bei dynv6 eingetragen, da eine bestehende Webseite auch unter www.mismuckl.v6.rocks gezeigt werden soll. Ich will die DNS Auflösung lokal mit dig oder nslookup verfolgen. Dazu habe ich die DNS-rebind-protection für die beiden Namen von muckl auf der FRITZ!Box angepasst. Außerdem sind die ports für http und https zur Weitergabe von IPv4 bzw. Weiterleitung von IPv6 an muckl eingerichtet.

Als Server braucht muckl Schutz! Dazu habe ich ufw als Firewall und fail2ban nach der Anleitung von Carsten Rieger installiert. Das hat noch nichts mit Matrix-Synapse zu tun, sondern dient nur zur Absicherung des zu installierenden Webservers. Eine einfache Anleitung für ufw findet sich bei DigitalOcean. Jetzt sind nur noch die ports 80 für http, 443 für https und 22 für ssh (secure shell) offen. Bei Letzterem habe ich den Zugriff auf das lokale Netzwerk beschränkt (sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp). fail2ban wollte am Anfang nicht laufen und brauchte zwei Nachbesserungen der Konfiguration, die sich aber im Internet leicht finden ließen (sshd_backend = systemd, allowipv6 = auto).

Muckl als Webserver

Jetzt braucht es nginx als Webserver und acme.sh für die Zertifikate von Let's Encrypt. nginx ist schnell installiert (sudo apt install nginx). Die Webseite und die Konfiguration für nginx bestehen bereits und ziehen nur zu Muckl um. Muckls Domäne ist relativ einfach zu zertifizieren, da der DNS Anbieter dynv6.com direkt von acme.sh unterstützt wird. Ein neuer Benutzer, acmeuser wird angelegt, der nginx neu starten darf und sich acme.sh in sein home Verzeichnis installiert.

sudo adduser acmeuser --gecos "" --disabled-password sudo usermod -aG www-data acmeuser sudo visudo /etc/sudoers.d/acmeuser acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service sudo su - acmeuser curl https://get.acme.sh | sh exit

Zum Holen der Zertifikate muss acmeuser neu gestartet werden. Darum machen wir erstmal weitere Vorbereitungen, Anlegen von Verzeichnissen mit Berechtigungen, Installation und Auswahl des Anbieters der Zertifikate.

sudo mkdir -p /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs sudo chmod -R 770 /etc/letsencrypt sudo chown -R www-data:www-data /etc/letsencrypt sudo apt install socat sudo su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"

Jetzt können die Zertifikate geholt werden. Dazu braucht acmeuser das Access Token von dynv6 für mismuckl.v6.rocks. Zur Not kann man das bei dynv6.com nachlesen unter “my zones -> mismuckl…->instructions” steht etwas von "password". Die Zertifikate werden für mismuckl und seine DNS CNAMES, z.B. www geholt, daher die Wildcard in *.mismuckl.v6.rocks.

sudo su - acmeuser export DYNV6_TOKEN="<dynv6 access token>" acme.sh --issue --dns dns_dynv6 -d mismuckl.v6.rocks -d *.mismuckl.v6.rocks --server letsencrypt --keylength 4096 --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service" acme.sh --issue --dns dns_dynv6 -d mismuckl.v6.rocks -d *.mismuckl.v6.rocks --keylength ec-384 --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service" ls -l /etc/letsencrypt/rsa-certs ls -l /etc/letsencrypt/ecc-certs crontab -l exit

Die beiden langen Befehle werden mit “success” quittiert. Dann guckt acmeuser, ob die Zertifikate wirklich da sind, und überprüft, dass die Zertifikate auch erneuert werden. Die Zertifikate von Let's Encrypt sind zur Zeit 90 Tage gültig und sollen nach 60 Tagen erneuert werden. Letzteres wird immer kurz vor Mitternacht überprüft, wie crontab zeigt.

Die nginx Konfiguration ist sehr einfach gehalten und besteht hier nur aus zwei Dateien.

/etc/nginx/nginx.conf<
criegerde bezieht sich auf die Anleitung von Carsten Rieger.

user www-data; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; multi_accept on; use epoll; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; types_hash_max_size 2048; # server_tokens off; server_names_hash_bucket_size 64; # server_name_in_redirect off; # stuff from criegerde set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For; real_ip_recursive on; include /etc/nginx/mime.types; default_type application/octet-stream; # more from criegerde send_timeout 3600; tcp_nodelay on; open_file_cache max=500 inactive=10m; open_file_cache_errors on; keepalive_timeout 65; reset_timedout_connection on; resolver 176.9.93.198 176.9.1.117 valid=30s; resolver_timeout 5s; ## # SSL Settings ## # Mozilla intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ecdh_curve X25519:prime256v1:secp384r1; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; ssl_prefer_server_ciphers off; ## # Logging Settings ## log_format criegerde escape=json '{' '"time_local":"$time_local",' '"remote_addr":"$remote_addr",' '"remote_user":"$remote_user",' '"request":"$request",' '"status": "$status",' '"body_bytes_sent":"$body_bytes_sent",' '"request_time":"$request_time",' '"http_referrer":"$http_referer",' '"http_user_agent":"$http_user_agent"' '}'; access_log /var/log/nginx/access.log criegerde; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }


/etc/nginx/sites-enabled/mismuckl.v6.rocks

/etc/nginx sites-enabled enthält symbolic links auf Dateien in sites-available.

## # web server only, first try with https # # Somebody called the server directly server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name mismuckl.v6.rocks; ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem; ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem; return 301 $scheme://www.mismuckl.v6.rocks$request_uri; } # If somebody calls the default https://www.<server> server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.mismuckl.v6.rocks; ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem; ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem; ssl_session_cache shared:le_nginx_SSL:10m; ssl_session_timeout 1440m; ssl_session_tickets off; index index.html index.htm; location / { root /var/www/html/prod; try_files $uri $uri/ =404; } location /demo { root /var/www/html; } } server { listen 80 default_server; listen [::]:80 default_server; return 301 https://$host$request_uri; }

Muckl als Matrix Synapse Server

Zuerst ist hier ein “matrix” als weiterer DNS CNAME bei dynv6.com einzurichten, damit Muckl auch auf matrix.mismuckl.v6.rocks hört. Dann habe ich wieder die Anleitung von Carsten Rieger befolgt, ziemlich strikt diesmal. Nach Einbinden des Repositoriums von matrix.org wird matrix-synapse installiert (sudo apt install -y matrix-synapse-py3) und die Datenbank PostgreSQL (sudo apt install -y postgresql python3-psycopg2). Die nächsten Schritte waren: servername.yaml an matrix.mismuckl.v6.rocks und meine Email Adresse anzupassen, die postgres Datenbank zu erstellen und homeserver.yaml auf die gerade erstellte Datenbank umzustellen. Leider wollte matrix-synapse nicht starten und hinterließ "... Database has incorrect ctype of 'de_DE.UTF-8'. Should be 'C'" in der log-Datei. Ich habe die Datenbank gelöscht und danach neu erstellt:

sudo su - postgres psql DROP DATABASE matrixdb; CREATE DATABASE matrixdb ENCODING 'UTF8' LOCALE='C' template=template0 OWNER matrix; \q

Jetzt startet der matrix-synapse.service klaglos. Um ihn anzusprechen, brauchen wir noch nginx. Dafür können wir die Datei aus der Anleitung gleich mit den richtigen Zertifikaten verwenden:

/etc/nginx/sites-enabled/matrix.mismuckl.v6.rocks-V1
Dies ist die erste Version der Konfiguration.

server { listen 443 ssl; listen [::]:443 ssl; server_name matrix.mismuckl.v6.rocks; # Wir nutzen zu Beginn sogenannte "self-signed-certificates' # um bei Let's Encrypt TLS-Zertifikate anfragen zu können: # nicht nötig, haben wir schon ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem; ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem; ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem; ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1.3 TLSv1.2; ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384'; ssl_ecdh_curve X448:secp521r1:secp384r1; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload;" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Robots-Tag none always; add_header X-Download-Options noopen always; add_header X-Permitted-Cross-Domain-Policies none always; add_header Referrer-Policy no-referrer always; add_header X-Frame-Options "SAMEORIGIN" always; fastcgi_hide_header X-Powered-By; access_log off; error_log off; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; location /_matrix { proxy_pass http://127.0.0.1:8008; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 50M; } location /.well-known/matrix/server { return 200 '{"m.server": "matrix.mismuckl.v6.rocks:443"}'; add_header Content-Type application/json; } location /.well-known/matrix/client { return 200 '{"m.homeserver": {"base_url": "https://matrix.mismuckl.v6.rocks"}}'; add_header Content-Type application/json; add_header "Access-Control-Allow-Origin" *; } }

Jetzt zeigt https://matrix.mismuckl.v6.rocks/_matrix/static/ “It works! Synapse is running”. Die Tests für das “Federation-Feature” von Matrix waren positiv. Im nächsten Test wird mit “register_new_matrix_user -c /etc/matrix-synapse/conf.d/server_name.yaml http://localhost:8008” wird temporär ein neuer Benutzer angelegt (mamuckl, P0sswort). Der konnte sich dann über app.element.io bei matrix.mismuckl.v6.rocks anmelden. Die in der Anleitung verlinkten Skripte von Jan Rehr haben sehr geholfen, Matrix kennenzulernen. Allerdings erforderten sie irgendeine Erweiterung der Kommandozeile und mussten an das reine bash von Muckls Debian umgearbeitet werden.

Ich habe dann mehrere Matrix Clients ausprobiert: Element, FluffyChat, Element-Desktop. Abgesehen davon, dass alle unterschiedlich aussahen, schienen sie sich auch unterschiedlich zu verhalten. Am Erstellen eines Benutzerprofils bin ich gescheitert. Einmal habe ich versucht, das Passwort für einen Testbenutzer zu ändern, der danach keinen Zugriff mehr hatte. Es schien irgendetwas zu fehlen.


Muckl nimmt MAS

Eigentlich war bisher alles ganz gut gegangen. Mit Namen festgelegte Benutzer können Matrix benutzen. Damit die selbständig ihr Benutzerprofil verwalten können, soll Muckl nun den Matrix Authentication Service (MAS) erhalten. element-hq.github.io bietet eine sehr gute Anleitung zur Installation von MAS. Dem Setup ist einfach zu folgen, wobei die Konfiguration von SSO-Anbietern ausgelassen wurde. Besonders hilfreich waren auf der Kommandozeile die Befehle “mas-cli config check” und “mas-cli doctor”. Hier werden nur hier die für Muckl spezifischen Punkte aufgeführt. Ich hatte MAS noch gemäß dem alten, experimentellen MSC3861 installiert. Das ließ sich sehr einfach nach obiger Anleitung umstellen. Muckl brauchte zuerst als neuen DNS CNAME, auth, damit MAS unter auth.mismuckl.v6.rocks zu erreichen war. matrix-helper wurde als neuer Benutzer angelegt (sudo adduser matrix-helper --gecos "" --disabled-password --ingroup matrix-synapse --home /opt/matrix-authentication-service/ --no-create-home). In /opt/matrix-authentication-service wurde das MAS “binary” installiert. Es folgt eine Reihe neuer und geänderter Konfigurationsdateien.

Die schon bestehende server_name.yaml Datei von Synapse muss um den "matrix_authentication_service:" Block ergänzt werden.

/etc/matrix-synapse/conf.d/server_name.yaml
Dies ist die endgültige Version der Konfiguration. Der RTC Teil wird hier noch nicht gebraucht.

# This file is autogenerated, and will be recreated on upgrade if it is deleted. # Any changes you make will be preserved. # The domain name of the server, with optional explicit port. # This is used by remote servers to connect to this server, # e.g. matrix.org, localhost:8080, etc. # This is also the last part of your UserID. # server_name: matrix.mismuckl.v6.rocks public_baseurl: https://matrix.mismuckl.v6.rocks max_upload_size: 50M url_preview_enabled: true url_preview_ip_range_blacklist: - '127.0.0.0/8' - '10.0.0.0/8' - '172.16.0.0/12' - '192.168.0.0/16' - '100.64.0.0/10' - '192.0.0.0/24' - '169.254.0.0/16' - '192.88.99.0/24' - '198.18.0.0/15' - '192.0.2.0/24' - '198.51.100.0/24' - '203.0.113.0/24' - '224.0.0.0/4' - '::1/128' - 'fe80::/10' - 'fc00::/7' - '2001:db8::/32' - 'ff00::/8' - 'fec0::/10' enable_registration: false registration_shared_secret: "first 32 random alphanumeric letters" enable_metrics: false report_stats: false include_content: false smtp_host: x.y.z smtp_port: 587 smtp_user: "my email adress" smtp_pass: "and password" require_transport_security: true #turn_uris: ["turn:coturn.ihredomain.de:443?transport=udp", "turn:coturn.ihredomain.de:443?transport=tcp"] #turn_shared_secret: "IhrGeheimerSchlüssel" matrix_authentication_service: enabled: true endpoint: http://localhost:8080/ secret: "second 32 random alphanumeric letters" # Alternatively, using a file: #secret_file: /path/to/secret.txt # for RTC (real time communication) # enable delayed events, so we quit calls that are interrupted somehow max_event_delay_duration: 12h


Bei der config.yaml Datei für MAS gab es Schwierigkeiten mit der direkten Email Konfiguration. Der benutzte externe SMTP Server wollte die Emails nicht akzeptieren. Daher verschickt jetzt der matrix-helper Benutzer die Emails mit “msmtp”. MAS braucht Emails zur Bestätigung neu eingegebener Email-Adressen der Benutzer.

/opt/matrix-authentication-service/config.yaml
Dies ist die endgültige Version der Konfiguration.

database: #uri: postgresql:// # Separate parameters host: localhost port: 5432 username: mas_user password: <secret word> database: mas max_connections: 10 min_connections: 0 connect_timeout: 30 idle_timeout: 600 max_lifetime: 1800 email: from: '"The almighty auth service" <mismuckl@online.de>' reply_to: '"No reply" <no-reply@mismuckl.v6.rocks>' # Default transport: don't send any emails # transport: blackhole # Send emails using SMTP #transport: smtp #mode: plain | tls | starttls #hostname: localhost #port: 587 #username: username #password: password # Send emails by calling a local sendmail binary transport: sendmail command: /usr/bin/msmtp secrets: ..... lots of keys and encryptions ..... passwords: enabled: true schemes: - version: 1 algorithm: bcrypt unicode_normalization: true - version: 2 algorithm: argon2id minimum_complexity: 3 matrix: kind: synapse # homeserver: localhost:8008 homeserver: matrix.mismuckl.v6.rocks secret: <second 32 random alphanumeric letters> endpoint: http://localhost:8008/ http: public_base: https://auth.mismuckl.v6.rocks/ listeners: - name: web resources: - name: discovery - name: human - name: oauth - name: compat - name: graphql # MAS doesn't need to serve the assets anymore #- name: assets binds: # Bind on a local port - host: localhost port: 8080 # OR bind on a Unix domain socket #- socket: /var/run/mas.sock # OR bind on a systemd socket #- fd: 0 # kind: tcp # or unix # Optional: use the PROXY protocol #proxy_protocol: true trusted_proxies: - 192.168.0.0/16 - 172.16.0.0/12 - 10.0.0.0/10 - 127.0.0.1/8 - fd00::/8 - ::1/128


auth.mismuckl.v6.rocks soll auch hinter nginx als Reverse Proxy und braucht deshalb eine eigene Konfigurationsdatei.

/etc/nginx/sites-enabled/auth.mismuckl.v6.rocks
Dies ist die endgültige Version der Konfiguration.

server { listen 443 ssl; listen [::]:443 ssl; server_name auth.mismuckl.v6.rocks; include includes/matrix-mismuckl.inc; location / { proxy_http_version 1.1; proxy_pass http://localhost:8080; # OR via the Unix domain socket #proxy_pass http://unix:/var/run/mas.sock; # Forward the client IP address proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # or, using the PROXY protocol #proxy_protocol on; } # Make nginx serve the assets directly location /assets/ { root /opt/matrix-authentication-service/share/; # Serve pre-compressed assets gzip_static on; # Cache assets for a year expires 365d; } }


Die gemeinsamen Anteile der nginx-Konfiguration für MAS und Synapse sind in der folgenden include-Datei enthalten.

/etc/nginx/includes/matrix-mismuckl.inc
Dies ist die endgültige Version der Konfiguration.

ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem; ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem; ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem; ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1.3 TLSv1.2; ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384'; ssl_ecdh_curve X448:secp521r1:secp384r1; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload;" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Robots-Tag none always; add_header X-Download-Options noopen always; add_header X-Permitted-Cross-Domain-Policies none always; add_header Referrer-Policy no-referrer always; add_header X-Frame-Options "SAMEORIGIN" always; add_header Content-Security-Policy "frame-ancestors 'self'"; fastcgi_hide_header X-Powered-By; access_log off; error_log off; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s;


Bei der Konfiguration von nginx für matrix.mismuckl.v6.rocks waren nur die Abschnitte “location /.well-known/matrix/*” zu beachten. Diese Abschnitte sendet nginx direkt in JSON-Format, ohne dass extra Dateien angelegt wurden. Der server Block konnte unverändert übernommen werden, da der Domänenname von Muckl gleich dem DNS-Eintrag war. Der client Block musste um auth für MAS ergänzt werden.

/etc/nginx/sites-enabled/matrix.mismuckl.v6.rocks-V2
Dies ist die zweite Version der Konfiguration.

server { listen 443 ssl; listen [::]:443 ssl; server_name matrix.mismuckl.v6.rocks; include includes/matrix-mismuckl.inc; # Forward to the auth service location ~ ^/_matrix/client/(.*)/(login|logout|refresh) { proxy_http_version 1.1; proxy_pass http://localhost:8080; # OR via the Unix domain socket #proxy_pass http://unix:/var/run/mas.sock; # Forward the client IP address proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # or, using the PROXY protocol #proxy_protocol on; } # Forward to Synapse # as per https://element-hq.github.io/synapse/latest/reverse_proxy.html#nginx location /_matrix { proxy_pass http://localhost: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; } location /.well-known/matrix/server { return 200 '{"m.server": "matrix.mismuckl.v6.rocks:443"}'; add_header Content-Type application/json; } location /.well-known/matrix/client { # matrix-authentication-service wishes this change as # our synapse does not handle well-known # return 200 '{"m.homeserver": {"base_url": "https://matrix.mismuckl.v6.rocks"}}'; return 200 '{"m.homeserver": {"base_url": "https://matrix.mismuckl.v6.rocks"}, "org.matrix.msc2965.authentication": {"issuer": "https://auth.mismuckl.v6.rocks/", "account": "https://auth.mismuckl.v6.rocks/account/"}}'; add_header Content-Type application/json; add_header "Access-Control-Allow-Origin" *; } }

/etc/systemd/system/matrix-mas.service
Dies ist die endgültige Version der Konfiguration.

# assumes original setup in /opt/matrix-authentication-service/ and user (matrix-helper) # for environmwnt use one of debug, info, warn, error [Unit] Description=MAS (Matrix OIDC Auth) After=network.target After=postgresql.service [Service] ExecReload=/bin/kill -HUP $MAINPID Environment="RUST_LOG=info" User=matrix-helper Group=nogroup WorkingDirectory=/opt/matrix-authentication-service ExecStart=/opt/matrix-authentication-service/mas-cli server Restart=on-failure SyslogIdentifier=matrix-mas [Install] WantedBy=multi-user.target