matrixdotorg/synapse

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
also doch du hast den docker ordner als volume nach /data gemappt?
das ist auch der fehler, denn dein docker ordner wird leer sein und somit wird /media_store fehlen. somit kommt auch der fehler.
nimm das volume weg und es wird gehen.
mappe den /data ordner erst rein wenn er einmal sauber die ordner und configs erstellt hat.
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
ok alles klar, aber wo legt es dann die Ordner an? dachte immer es ist nötig einen Volume/Ordner anzugeben?!
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
jetzt motzt er natürlich wegen dem fehlenden YAML, aber wo soll ichs hin geben wenn kein Volume angegeben ist?

Config file '/data/homeserver.yaml' does not exist.
 

Holodan

Benutzer
Mitglied seit
24. Nov 2018
Beiträge
13
Punkte für Reaktionen
0
Punkte
1
Können @seger85 , @3x3cut0r oder @ChiliApple vielleicht noch mal auf ihre mittlerweile funktionierenden Docker Container eingehen? Interessant wäre es vor allem, wie das Mapping des Volumes (bei mir fehlt auch die homeserver.yaml) und die Verbindung zu PostgreSQL hinbekommen wurden.

Trotz Beliebtheit von Matrix findet sich im Netz wenig zu Synology Docker Configs.
 

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
Ok ich beschreibe "kurz" XDD wie ich es gemacht habe. (Alles mit root auf Konsole, nicht als admin)
Voraussetzung: ihr habt eine Domain (hier synology.me) und ein SSL-Zertifikat (am besten Wildcard) für den Reverse-Proxy-Eintrag
Code:
sudo su

Ich verwende Postgres als Datenbank und nicht die SQLite3!. Ist etwas Mehraufwand, aber aus Performancegründen auf jeden Fall Wert!

1. Eigene Netwerke anlegen (Optional, will aber nicht das jeder Docker Container jeden anderen im Netzwerk erreichen kann, sondern nur die Container, die sich auch erreichen sollen!)
Code:
docker network create synapse-net
docker network create postgres-net


2. 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 ;-)
Code:
/volume1/docker/synapse
/volume1/docker/postgres
/volume1/docker/pgadmin


3. Docker-Container für Postgres anlegen:
Code:
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


4. Docker-Container für PGadmin4 anlegen um damit die Postgres-DB zu administrieren:
Code:
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 \
    -v /volume1/docker/pgadmin/certs:/certs \
    dpage/pgadmin4:latest


5. Reverse-Proxy-Einträge für PGadmin4 und Synapse bzw. Matrix über die DSM-Oberfläche erstellen:
Code:
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

Code:
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 geschmackssache.


6. Per Weboberfläche mit pgadmin 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:
Code:
Rechtsklick auf Servers / Create / Server...
Name: DiskStation

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

SAVE

Dannach einen Datenbank-Benutzer anlegen:
Code:
Rechtsklick auf Login/Group-Roles / Create / Login/Group-Role...
Name: synapse

Definition:
Passwort: STRONG_SYNAPSE_POSTGRES_PASSWORD

Privileges:
Can login? Yes

SAVE

Dannach eine Postgres-Datenbank anlegen:
Code:
Rechtsklick auf Databases / Create / Database...
Database: synapse
Owner: synapse

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

SAVE

Du kannst pgAdmin4 nun schließen!


7. generiere homeserver.yaml:
Code:
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!


8. 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 11. 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:
Code:
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


9. /volume1/docker/synapse/homeserver.yaml 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)
Code:
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


10. Abändern der Dateirechte:
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 Autoverfollständigung des Pfades <<<:
Code:
chown -R 991:991 /volume1/docker/synapse


11. Starten des Synapse-Docker-Containers:
Code:
docker container run -d --restart=always \
    --name=synapse \
    --network synapse-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 postgres-net synapse
docker network connect redis-net synapse

12. Anpassen der Reverse-Proxy Config eurer NAS ... ihr fandes es bis hierher schwierig? Dann kommt zum Abschluss nochmal ein etwas schwierigeres Ding. 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:
Code:
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ändlisch 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:
Code:
/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:
Code:
nginx -s reload

FERTIG
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
Hallo,

bei mir laufen beide Docker, der Synapse leider nur mit der sqllight, ich bekomme keine Verbindung hin zu postgres.
mit pgAdmin kann ich ganz normal auf die postgres mit dem synapse User zugreifen, aber vom Synapse Docker nicht.
sobald ich etwas an der YAML in der Richtung mache, startet Sie nicht mehr.

Code:
database:
  name: psycopg2
  args:
    user: synapse_user
    password: secretpassword
    database: synapse
    host: localhost
    cp_min: 5
    cp_max: 10

egal ob IP, localhost, postgres, mit oder ohne Port Angabe.

Vielleicht hat noch jemand Ideen?
Danke
 

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
Hallo ChiliApple
also die sqlite zeile muss beim verwenden von postgres natürlich auskommentiert sein, aber ich gehe davon aus das ist hier nicht der fehler.

Der Fehler liegt am host. Du kannst im synapse docker container natürlich nicht sagen, dass deine postgres-db auf localhost liegt. hier musst du den docker-container-namen oder IP deines postgres-db eintragen.

Gruß
 
Zuletzt bearbeitet:

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
Danke für deine Antwort!

die Zeilen sind auskommentiert, funkt weder mit IP noch mit dem Postgres Container Namen.
Stimmt, localhost ist natürlich irrsinnig
 

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
Beide Container müssen dem gleichen Netzwerk zugeordnet sein. (siehe 11. meiner Anleitung ganz unten)

was sagt denn der log wenn du es mit postgres machst?
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
das hab ich auch schon probiert, im Moment ist die Zuordnung so (lt. Bild)

docker network connect postgres-net synapse funkt
docker network connect redis-net synapse (redis net?( haut mir den Container jedesmal zusammen, wird dann nicht mehr gefunden und redis Net kennt er nicht)


1609609428107.png

ich probier sie noch mal im selben NW und sehe ins LOG ( war irgend was von nicht konfiguriert was ich mich erinnern kann) ich poste dann
 

Anhänge

  • 1609609432706.png
    1609609432706.png
    42,6 KB · Aufrufe: 9

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
Ja die beiden Container können sich ja nicht sehen wenn sie nicht im gleichen Netzwerk hängen. Und das ist bei dir der Fall!
Verbinde synapse noch mit postgres-net und dann gehts!
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
das hat ich ja schon, genügt es die synapse zum postgres hinzu zufügen oder muss der auch aus dem synapse weg?
 

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
ein container kann in mehreren netzwerken gleichzeitig sein. das stellt kein problem dar.

das redis-net ist quatsch. das war ein copy&paste fehler von mir. das habe ich weil ich synapse noch mit redis verbunden hab und mit workern herumexperimentiert habe. das braucht man nicht.
 

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
Also beide container sind im postgres-net?
und in der config steht nun nicht localhost, sondern wie der postgres-container heißt?

das log ist leider zu kurz um da was herauszulesen. man bräuchte alles ab dem containerstart bis zu dem fehler.
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
Beide Container im postgres-net
im YAML einmal mit postgres(ist der containername) und einmal mit der IP probiert, o.E:

Bildschirmfoto 2021-01-02 um 19.05.22.png
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
ich hab nachdem ich den ganzen Tag schon davor sitz, die YAML zum Schluss dann soweit original belassen, da der Container damit läuft, deshalb die Fehlermeldung "supress_key_server" ...

im PG ADmin ist auch kein Verbindungsversuch zu erkennen
 

3x3cut0r

Benutzer
Mitglied seit
21. Mai 2011
Beiträge
507
Punkte für Reaktionen
15
Punkte
44
Hmm schwierig da jetz noch groß zu helfen ohne die Umgebung einmal anzuschauen.
Der DB-User, die DB selbst sind aber wie beschrieben angelegt worden?
Das Passwort in der YAML wurde auch in Hochkommata 'passwort' gesetzt?

Sonst fällt mir gerade nichts mehr ein bzw kann keinen Fehler mehr erkennen ohne wie gesagt selbst drauf zu schauen ...

wie hast du die IP des containers denn ermittelt?
 

ChiliApple

Benutzer
Mitglied seit
04. Dez 2013
Beiträge
240
Punkte für Reaktionen
7
Punkte
24
DB User und DB wurde so angelegt und ist auch mit anderen Clients erreichbar.

Passwort hab ich mit Hochkommata '' ohne und mit "" probiert, in der YAML steht es ja eigentlich ohne funktioniert aber weder so noch so.
ich habe die IP der Diskstation probiert (damit kann ich auch mit anderen Clients drauf zugreifen) und ich habe die IP über "docker inspect" probiert, auch beides ohne Erfolg

Danke auf alle Fälle für diene Hilfe!
 
Zuletzt bearbeitet:


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat