Diese Anleitung beschreibt, wie die komplette lokale Entwicklungsumgebung für den PGK-Proxy aufgesetzt wird: der docker-compose-Stack (Synapse, Element, HAPI FHIR, Keycloak, Traefik, Squid) inklusive Zertifikatserstellung, das Bauen des Keycloak-Providers, der Start des Proxy-Prozesses und die Föderations-Partnerumgebung.
Die Einrichtung wurde auf Windows 11 und macOS getestet. Es wird eine Docker-Runtime mit docker-compose benötigt (z. B. Rancher Desktop). Dem Docker-Orchestrator müssen mindestens 4 GB RAM zuordenbar sein.
Für den Build von Proxy und Keycloak-Provider ist ein Java-Toolchain 21 erforderlich.
Lokale Hostnamen verwenden die Wildcard-Domain *.traefik.me, die über den öffentlichen DNS auf
127.0.0.1 aufgelöst wird. Das umgeht den .localhost-Sonderfall (RFC 6761), bei dem
serverseitige Föderation immer auf das eigene Loopback-Interface zeigen würde, und erspart
/etc/hosts-Einträge auf dem Host.
-
mkcert installieren
- Windows:
winget install FiloSottile.mkcert(als Administrator) - macOS:
brew install mkcert
- Windows:
-
Lokale Root-CA anlegen:
mkcert -install -
Zertifikat für die App erstellen – es muss alle Client- UND Föderations-Partner-Hostnamen abdecken, damit beide Server und IDPs über HTTPS/8448 erreichbar sind:
mkcert --cert-file certs/app.traefik.me.crt -key-file certs/app.traefik.me.key \ idp.traefik.me matrix.traefik.me element.traefik.me \ idp-partner.traefik.me partner.traefik.me element-partner.traefik.me
-
Zertifikat für die Spring-App (localhost):
mkcert --cert-file src/main/resources/certs/localhost.crt -key-file src/main/resources/certs/localhost.key localhost
-
Root-CA in das
./certs-Verzeichnis kopieren: mitmkcert -CAROOTdas CA-Verzeichnis ermitteln und darausrootCA.pemnach./certskopieren.
Wenn das Verzeichnis ./certs so aussieht, kann es weitergehen:
certs
- .gitkeep
- app.traefik.me.crt
- app.traefik.me.key
- rootCA.pem
Beachten Sie den Hinweis von mkcert, dass Firefox ohne weitere Konfiguration nicht unterstützt wird.
Die PGK-Realm registriert einen Keycloak-Provider, der das Provider Directory mit dem IDP
synchron hält (siehe Administrationshandbuch). Er
liegt im Gradle-Subprojekt keycloak-provider. Das JAR muss vor dem Start von Keycloak gebaut
werden:
./gradlew :keycloak-provider:keycloakProviderJarDas resultierende keycloak-provider/build/keycloak/pgk-idp-event-listener.jar wird von
docker-compose.yml in das Verzeichnis /opt/keycloak/providers von Keycloak eingehängt.
Mit vorhandenen Zertifikaten, gebautem Keycloak-Provider-JAR und laufender Docker-Runtime aus dem Repository-Root:
docker-compose up -dDer Stack richtet alle Abhängigkeiten ein und konfiguriert sie automatisch:
- matrix / matrix-partner – Synapse-Server
matrix.traefik.meundpartner.traefik.meinklusive Init-Container (Signing-Key-Erzeugung, CA-Bundle, Dateirechte). - pgk-fhir – HAPI-FHIR-Server (R4) mit Postgres (
pgk-db) und Lucene-Index, inklusive Init-Container, die die SearchParameters ausconfig/pgk-fhir/searchparams/hochladen. - keycloak / keycloak-partner – IDP-Instanzen mit den Realms
pgkbzw.pgk-partner. - traefik – HTTP(S)- und Föderations-Routing (Ports 80, 443, 8448).
- egress-proxy – Squid-Proxy, über den der Primärserver seine ausgehende Föderation leitet.
- element / element-partner – Element-Web-Clients.
Die pgk-proxy-Persistenz (Rolle pgk + Datenbank, siehe config/pgk-db/init/01-pgk-db.sql) wird
beim ersten Start eines leeren Volumes pgk-db-data initialisiert. Wenn Sie von einem Stack
aufgerüstet haben, der älter als das Einladungsrechte-Feature ist, muss das Volume einmal
verworfen werden, damit Rolle und Datenbank angelegt werden:
docker-compose down
docker volume rm "$(docker volume ls -q | grep pgk-db-data)"
docker-compose up -dAnalog gilt das für die Keycloak-Datenbank bei Änderungen an config/keycloak/realm-export.json
(siehe Administrationshandbuch).
| URL | Zweck |
|---|---|
| https://element.traefik.me | Vorkonfigurierter Element-Client („Continue with PGK Keycloak“ zum Anmelden) |
| https://matrix.traefik.me | Matrix-Server-URL (für andere Matrix-Clients) |
| https://idp.traefik.me | Keycloak-Admin (Realm pgk), Login admin / admin |
Der Compose-Stack betreibt zusätzlich einen zweiten, isolierten Matrix-Server
(partner.traefik.me) mit eigenem Synapse, Postgres, Element-Client und Keycloak-IDP
(idp-partner.traefik.me, Realm pgk-partner), damit die Matrix-Föderation Ende-zu-Ende
getestet werden kann. Dieser Server ist NICHT durch einen PGK-Proxy abgesichert, sodass
auch Szenarien getestet werden können, in denen ein nicht-zugelassener Server in das
Netzwerk einzudringen versucht:
| URL | Zweck |
|---|---|
| https://element-partner.traefik.me | Element-Client für den Partnerserver |
| https://partner.traefik.me | Partner-Matrix-URL |
| https://idp-partner.traefik.me | Partner-Keycloak-Admin (admin/admin) |
Die Föderation zwischen den beiden Servern läuft über Port 8448 durch Traefik
(Host(matrix.traefik.me) / Host(partner.traefik.me)); beide Synapse-Container betreiben einen
eigenen Föderations-Listener auf 8448. Eingehende Föderations-Einladungen an
matrix.traefik.me werden vom pgk-proxy abgefangen (/_matrix/federation/v2/invite → Proxy),
der vor der Weiterleitung an Synapse die Föderations-Whitelist prüft. Die Legacy-Route
/_matrix/federation/v1/invite ist deaktiviert und antwortet immer mit 403.
Föderations-Auflösung der Peers: Da
*.traefik.meüber den öffentlichen DNS auf127.0.0.1zeigt, erreichen sich die Peers nie über den öffentlichen Eintrag. Der Primärserver (matrix) schickt seine ausgehende Föderation über denegress-proxy(squid, sieheHTTPS_PROXYindocker-compose.yml), derpartner.traefik.meauf das Host-Gateway pinnt (extra_hosts: partner.traefik.me:host-gateway). Der Partner (matrix-partner) löstmatrix.traefik.meüber die Docker-Netzwerk-Aliase im gemeinsamenpartner-net-Netzwerk zum Traefik-Container auf. In beide Richtungen kommt der Traffic am Traefik-Entrypointfederation(Port 8448) an, der ihn an den jeweiligen Peer-Synapse weiterleitet.
Es sind keine /etc/hosts-Einträge auf dem Host erforderlich: *.traefik.me ist ein öffentlicher
Wildcard-DNS-Eintrag, der auf 127.0.0.1 aufgelöst wird.
- Zertifikate neu erzeugen (siehe oben) und
docker-compose up -dausführen. - In den PGK-Realms der IDPs
idp.traefik.meundidp-partner.traefik.meUser anlegen, falls nicht schon geschehen. - In Element auf
element.traefik.me(matrix.traefik.me) und aufelement-partner.traefik.me(partner.traefik.me) anmelden. - Von matrix.traefik.me einen Raum erstellen und über die vollständige MXID
@<mxid>:partner.traefik.meeinladen. Die Einladung geht anpartner.traefik.me:8448/_matrix/federation/v2/invite. - Mit MXIDs des Users am Homeserver
@<mxid>:matrix.traefik.me(aus demmxid-Attribut des IDP) zurück einladen, um zu beobachten, wie der Proxy eingehende Föderation anmatrix.traefik.meabfängt.
Um zu bestätigen, dass der Proxy (und nicht Synapse) die Einladung verarbeitet hat, während einer
Einladung in die pgk-proxy-Logs schauen: Der InvitationController protokolliert/verarbeitet die
Föderationsanfrage vor der Weiterleitung an Synapse.
Die Anwendung wird mit Gradle gebaut und mit dem Profil local gestartet, damit sie die
Ressourcen in der Docker-Umgebung erreicht:
./gradlew bootRun --args='--spring.profiles.active=local'Alternativ die IDE-Run-Konfiguration .run/pgk-proxy.run.xml verwenden. Details zu den
Konfigurationswerten (FHIR-URL, Synapse-URL, IDP-Webhook-Secret usw.) finden sich in
src/main/resources/application.yml und application-local.yml.