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
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:
FERTIG