Synapse mit Docker

Aus Synology Wiki
Wechseln zu: Navigation, Suche

Matrix / Synapse ist ein dezentraler Messenger-Server, für den es für alle gängigen Plattformen Client-Programme gibt . Er unterstützt neben Ende-zu-Ende verschlüsselten Chat auch Voice-over-IP und steht unter der GPL-kompatiblen Apache-Lizenz. Nachrichten werden über die Servergrenzen hinaus nach dem einfachen Schema @Kontakt:matrix.domain.eu versendet.

Hier zeige ich euch wie Ihr es mittels Docker auf eure DiskStation installiert.

Voraussetzungen

  • Docker >= 18.09.0 (Empfohlen ist ganz klar immer die letzte/neuste Version!)
  • PostgreSQL >= 13 (ich zeige euch hier wie ihr eueren eigenen PostgreSQL-Server via Docker aufsetzt)
  • eure DS sollte ca. 1GB freien RAM haben! (ca. 350mb für Synapse, ca. 550mb für PostgreSQL)
(es geht zwar ohne PostgreSQL und mit SQLite ... aber aus Performance-Gründen ist die PostgreSQL-Variante vorzuziehen)
  • etwas Linux Kenntnisse, wie man sich auf der Shell bewegt, sich per SSH und als root auf seiner DS anmeldet und Linux Syntax verstehen bzw. anwenden können ist sehr von Vorteil!

Per root auf seiner DS anmelden

Erklärung sollte nicht nötig sein. Wer hier scheitert sollte besser aufhören! Alles weitere geschieht als root!

Eigene Docker-Netzwerke anlegen

(Optional, ich will aber nicht das jeder Docker Container jeden anderen im Netzwerk erreichen kann, sondern nur die Container, die sich auch erreichen sollen!)

docker network create synapse-net
docker network create postgres-net

Gemeinsamen Ordner für Synapse und PostgreSQL anlegen

Neuen Ordner für synapse, postgres und pgadmin über die DSM-Oberfläche anlegen, am besten in einem speziell für Docker angelegten eigenen Gemeinsamen Ordner (bei mir /volume1/docker). Da Docker-Container bei "schlechter Führung" eh größtenteils mit root-Rechten auf Dateiebene arbeiten bringt das keinen wirklichen Schutz vor Dateiübergreifenden Rechten, ich fühle mich aber besser dabei ;-) Hier meine später genutzten Pfade:

/volume1/docker/synapse
/volume1/docker/postgres
/volume1/docker/pgadmin

Docker-Container für Postgres anlegen/erstellen

docker container run -d --restart=always \
    --name=postgres \
    --network postgres-net \
    -v /volume1/docker/postgres:/var/lib/postgresql/data \
    -e POSTGRES_PASSWORD='STRONG_POSTGRES_ROOT_PASSWORD' \
    postgres:13.1-alpine

Dateirechte für PGadmin4 abändern

pgadmin läuft unter dem Benutzer pgadmin mit der UID=5050 und der GID=5050. Deshalb muss der Ordner, der als Volume gemappt wird angepasst werden.

>>> Seit euch hier unbedingt des Pfades sicher! Falscher Pfad kann hier irreparablen Schaden an eurer NAS hervorrufen!!! Verwendet am besten Doppel-<TAB> zur Autovervollständigung des Pfades <<<:

chown -R 5050:5050 /volume1/docker/pgadmin
chmod -R 0700 /volume1/docker/pgadmin

Docker-Container für PGadmin4 anlegen

Weboberfläche, um damit die PostgreSQL-DB zu administrieren

docker container run -d --restart=always \
    --name=pgadmin \
    --network postgres-net \
    -e PGADMIN_DEFAULT_EMAIL='postgresadmin@yourdomain.synology.me' \
    -e PGADMIN_DEFAULT_PASSWORD='STRONG_POSTGRESADMIN_PASSWORD' \
    -e 'PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True' \
    -p 8180:80 \
    -v /volume1/docker/pgadmin:/var/lib/pgadmin \
    dpage/pgadmin4:latest

Reverse-Proxy-Einträge für PGadmin4 und Synapse bzw. Matrix über die DSM-Oberfläche erstellen

Systemsteuerung / Anwendungsportal / Reverse-Proxy / Erstellen
Beschreibung: pgAdmin4
Quelle:
Protokoll: HTTPS
Hostname: pgadmin.yourdomain.synology.me
Port: 443
Ziel:
Protokoll: HTTP
Hostname: <IP-Adresse eurer NAS>
Port: 8180

Bei Benutzerdefinierter Header einmal auf das Drop-Down und auf WebSocket klicken

OK
Systemsteuerung / Anwendungsportal / Reverse-Proxy / Erstellen
Beschreibung: Synapse
Quelle:
Protokoll: HTTPS
Hostname: matrix.yourdomain.synology.me
Port: 443
Ziel:
Protokoll: HTTP
Hostname: <IP-Adresse eurer NAS>
Port: 8008

Bei Benutzerdefinierter Header einmal auf das Drop-Down und auf WebSocket klicken

OK

Ich nehme hier matrix als Name, da ja der Dienst so heißt und Synapse nur der Name der Anwendung ist, welche den Dienst bereit stellt. Ist Geschmacksache.

Per Weboberfläche mit PGadmin4 eine neue Datenbank für Synapse erstellen

URL: https://pgadmin.yourdomain.synology.me Benutzer: postgresadmin@yourdomain.synology.me Passwort: STRONG_POSTGRESADMIN_PASSWORD

Als erstes natürlich euren Server hinzufügen:

Rechtsklick auf Servers / Create / Server...
Name: DiskStation

Connection:
Host: postgres
Port: 5432
Username: postgres (siehe 4.)
Passwort: STRONG_POSTGRES_ROOT_PASSWORD (siehe 4.)

SAVE

Danach einen Datenbank-Benutzer anlegen:

Rechtsklick auf Login/Group-Roles / Create / Login/Group-Role...
Name: synapse

Definition:
Passwort: STRONG_SYNAPSE_POSTGRES_PASSWORD

Privileges:
Can login? Yes

SAVE

Danach eine Postgres-Datenbank anlegen:

Rechtsklick auf Databases / Create / Database...
Database: synapse
Owner: synapse

Definition:
Encoding: UTF8
Template: postgres (oder template0)
Tablespace: pg_default
Collation: C
Character type: C
Connection limit: -1

SAVE

Du kannst pgAdmin4 nun schließen!

homeserver.yaml generieren lassen

docker run -it --rm \
    --name=synapse \
    --network synapse-net \
    -v /volume1/docker/synapse:/data \
    -e SYNAPSE_SERVER_NAME=matrix.yourdomain.synology.me \
    -e SYNAPSE_REPORT_STATS=yes \
    -e TZ='Europe/Berlin' \
    -e UID=1024 \
    -e GID=100 \
    -p 8008:8008 \
    -p 8448:8448 \
    matrixdotorg/synapse:latest generate

SYNAPSE_SERVER_NAME: Dabei natürlich die eigene Domain eintragen (hier bei mir der Reverse-Proxy-Eintrag der später auch als URL dienen soll). Ein Reverse-Proxy ist meiner Meinung nach zwingend erforderlich, da ihr euch sonst mit SSL rumschlagen müsst, wovon ich nur abraten kann, da es ein erheblichen Mehraufwand in der Konfiguration bedeutet.

UID und GID: 1024 ist der admin-Account euerer DS und 100 die USERS-Gruppe. In diesem Schritt (generiere homeserver.yaml) lasse ich es so, da man dann schön über die DSM-Oberfläche die homeserver.yaml bearbeiten kann! Später wird dies aus Sicherheitsgründen geändert!

Log-Config für Synapse erstellen bzw. überprüfen

Ich bin mir gerade nicht mehr sicher ob ich die selbst erstellt habe oder ob diese im Schritt Starten des Synapse-Docker-Containers automatisch erstellt wird. Ihr könnt diesen Schritt ja erstmal überspringen und schauen was passiert. Falls der Synapse Log meckert dann einfach diese Datei nachträglich erstellen!

Per DSM-Oberfläche eine Datei /volume1/docker/synapse/matrix.yourdomain.synology.me.log.config anlegen (falls nicht schon vorhanden) mit folgendem Inhalt:

version: 1

formatters:
  precise:
   format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'

handlers:
  console:
    class: logging.StreamHandler
    formatter: precise
    level: INFO

loggers:
    synapse.storage.SQL:
        # beware: increasing this to DEBUG will make synapse log sensitive
        # information such as access tokens.
        level: INFO

root:
    level: INFO
    handlers: [console]

disable_existing_loggers: false

homeserver.yaml anpassen / bearbeiten

Ich erwähne hier nur die wichtigsten Einträge. Wer mehr erfahren will schaut sich die docs an (https://github.com/matrix-org/synapse/blob/develop/docs/sample_config.yaml)

server_name: "matrix.yourdomain.synology.me"

pid_file: /data/homeserver.pid

public_baseurl: https://matrix.yourdomain.synology.me

listeners:
  - port: 8008
    bind_addresses:
      - '::'
      - '0.0.0.0'
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false     

database:
  name: psycopg2
  args:
    user: synapse
    password: 'STRONG_SYNAPSE_POSTGRES_PASSWORD'
    database: synapse
    host: postgres
    cp_min: 5
    cp_max: 10  

log_config: "/data/matrix.yourdomain.synology.me.log.config"

media_store_path: "/data/media_store"

# wichtig, das ihr das auch in eurem Reverse Proxy einstellt!
max_upload_size: 64M

url_preview_accept_language:
   - de-DE

# wenn ihr das nicht wollt, dann nach dem registrieren eures eigenen Benutzers wieder auf false setzen!
enable_registration: true

# das registration_shared_secret wird bei euch generiert und sieht anders aus!
registration_shared_secret: "ai&RwSrf!-g+dfj#34-H,6pnsfxhHzCp)-MaA_Emvssw,g3,A,E,TV,&"

# Optional! Nur falls ihr bridges nutzt, dann die jeweiligen configs hier angeben!
app_service_config_files:
  - "/data/mautrix-whatsapp/registration.yaml"

# form_secret wird auch generiert und sieht bei euch anders aus!
form_secret: "nex-7m&XhsSSTBp0XtRqrofZu50yPJsd=qIyeb,!HRTSO9@_g*1fdsg"

trusted_key_servers:
  - server_name: "matrix.org"

suppress_key_server_warning: true

Dateirechte für Synapse abändern

Den Docker Container mit admin oder root Dateirechten laufen zu lassen wäre höchst Sicherheitskritisch. Deshalb lasse ich ihn mit abgeänderten Dateirechten laufen. Dazu müssen wir aber auch die Dateirechte der vorhandenen Dateien (wie z.B. der homeserver.yaml) ändern.

>>> Seit euch hier unbedingt des Pfades sicher! Falscher Pfad kann hier irreparablen Schaden an eurer NAS hervorrufen!!! Verwendet am besten Doppel-<TAB> zur Autovervollständigung des Pfades <<<:

chown -R 991:991 /volume1/docker/synapse

Starten des Synapse-Docker-Containers

docker container run -d --restart=always \
    --name=synapse \
    --network postgres-net \
    -v /volume1/docker/synapse:/data \
    -e SYNAPSE_WORKER=synapse.app.homeserver \
    -e TZ='Europe/Berlin' \
    -e UID=991 \
    -e GID=991 \
    -p 8008:8008 \
    -p 8448:8448 \
    matrixdotorg/synapse:latest

docker network connect synapse-net synapse

Anpassen der Reverse-Proxy Config eurer NAS

Jetzt wird es etwas tricky ... das Anpassen der Reverse-Proxy Configuration, die nach jeder Änderung an den Reverse-Proxy-Einträgen über die DSM-Oberfläche nötig wird, da die Config hier jedesmal durch Synology überschrieben wird!

Ladet euch mein Skript von meinem Github und speichert es an einem beliebigen Ort in eure DiskStation (bei mir /volume1/backup): https://github.com/3x3cut0r/synology/blob/master/updateReverseProxyEntryForSynapse.sh Anschließend ändert ihr noch Zeile 29-32 an eure Gegebenheiten ab!

Erstellt euch eine neue Aufgabe über die DSM:

Systemsteuerung / Aufgabenplaner / Erstellen / Ausgelöste Aufgabe / Benutzerdefiniertes Script

Vorgang: Synapse Reverse Proxy
Benutzer: root
Aktiviert? nein

Aufgabeneinstellungen:
Benutzerdefiniertes Script
/volume1/backup/updateReverseProxyEntryForSynapse.sh

Dieses Script dann händisch einmalig ausführen nachdem ihr etwas an den Reverse-Proxy-Einträgen verändert habt.

Wer dem Script nicht vertraut kann die Einträge auch händisch mit nano oder vi auf Konsole durchführen. Der Pfad der Config-Datei ist:

/etc/nginx/app.d/server.ReverseProxy.conf

Was ihr abändert bzw. einfügen müsst ist (hier rot markiert):

 ...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name matrix.yourdomain.synology.me;

ssl_certificate /usr/syno/etc/certificate/ReverseProxy/550d899f-67b3-477b-a6c0-73223ae747c1/fullchain.pem;

ssl_certificate_key /usr/syno/etc/certificate/ReverseProxy/550d899f-67b3-477b-a6c0-73223ae747c1/privkey.pem;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload" always;

location / {

proxy_connect_timeout 600;

proxy_read_timeout 600;

proxy_send_timeout 600;

proxy_intercept_errors off;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection $connection_upgrade;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass http://192.168.178.254:8008;
client_max_body_size 64M;
}
location ~* ^(\/_matrix|\/_synapse\/client) {
proxy_pass http://192.168.178.254:8008;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_intercept_errors off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 64M;
}

location /.well-known/matrix/client {
return 200 '{"m.homeserver": {"base_url": "https://matrix.yourdomain.synology.me:443"}}';
add_header Content-Type application/json;
add_header Access-Control-Allow-Origin *;
}

location /.well-known/matrix/server {
return 200 '{"m.server": "matrix.yourdomain.synology.me:443"}';
add_header Content-Type application/json;
add_header Access-Control-Allow-Origin *;
}

location /_matrix/maubot {
proxy_pass http://192.168.178.254:29316;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $remote_addr;
}

error_page 403 404 500 502 503 504 @error_page;

location @error_page { root /usr/syno/share/nginx; rewrite (.*) /error.html break; allow all; }

}

...

Anschließend nginx einmal reloaden:

nginx -s reload

FERTIG!

Nun könnt ihr euch z.B. mit Element (https://element.io/) und einem Client an eurem eigenen Matrix/Synapse-Server registrieren bzw. anmelden!

3x3cut0r 10:18 Uhr, 19. Jan. 2021 (CEST)