Komponenter
Dette dokument dækker følgende komponent på NSP:
EHMI Sundhedsadresseringsservice (EAS)
Komponenten omfatter tre services:
EAS:
Servicen skal ikke kunne nås direkte. Ingress foregår istedet via. EAS-Ingress-Nginx service.
Servicen udstilles på port 8080.
Egress fra servicen foregår via. EAS-Egress-Nginx mod EHMI mTLS beskyttede services. Keycloak og EER.
Egress mod interne services på NSP foregår via. almindelig httpclient fra Javakoden. Personinformation, Sikrede, SORES.
Type: HAPI FHIR Plain Server (REST service)
Filnavn: eas.war
Url: Skal kun kunne tilgås igennem EAS-Ingress-Nginx.
Status-url: <serverurl>/eas/status
- Alarm-url: <serverurl>/eas/alarm
- Image: registry.nspop.dk/components/eas
EAS-Ingress-Nginx:
Denne service udstilles som indgangen til EAS komponenten.
Servicen udstilles på port 8080.
- Type: Nginx (TLS Terminering)
- Url: <serverurl>/eas/
- Image: registry.nspop.dk/components/eas-nginx
EAS-Egress-Nginx:
Denne service skal ikke udstilles direkte, men skal istedet kunne kaldes internt fra EAS.
Servicen udstilles på port 8080.
Denne service kaldes kun af EAS for udadgående kald mod HHv. EER og Keycloak. Interne services på NSP kaldes direkte fra EAS Java-applikationen.
- Type: Nginx (Udadgående mTLS)
- Url: Skal kun kunne tilgås internt fra EAS servicen.
- Image: registry.nspop.dk/components/eas-nginx
Konfiguration
EAS
EAS har sin egen konfiguration i "application.properties", og har desuden fire integrationer, som hver især har sin egen property-fil med konfiguration:
| Integration | Property-fil |
|---|---|
| EER | eer.properties |
| PersonInformation | personinformation.properties |
| SikredeInformation | sikrede.properties |
| SORES | sores.properties |
Bemærk, at alle tidsenheder i konfigurationsfilerne følger ISO-8601. F.eks. anvendes PT30S som værdi for HTTP Connect timeout.
Dette kan tolkes som værende "Period of Time of 30 Seconds"
Indholdet af de enkelte property-filer findes beskrevet herunder:
EAS (application.properties)
| Property | Beskrivelse | Påkrævet | Default værdi |
|---|---|---|---|
| dk.sds.nsp.audit.DevelopmentAuditProvider.enabled | Hvorvidt audit information logges på stdout som et JSON objekt | Nej | false |
| dk.nsp.eas.audit.component | Komponentnavn til audit-logging | Nej | EAS |
| dk.nsp.eas.auth.aud | Påkrævet audience I JWT Token. (Note skal også konfigureres i jtph.properties for accesshandler) | Ja | https://eas.ehmi.dk |
| dk.nsp.eas.auth.acr | Påkrævet acr I JWT Token. (Note skal også konfigureres i jtph.properties for accesshandler) | Ja | urn:dk:healthcare:loa:3 |
| dk.nsp.eas.auth.scopes | Påkrævede scopes I JWT Token. | Ja | EAS,system/Organization.rs |
EER (eer.properties)
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
| eer.api.url | URL til EER service | Ja | http://eas-egress-nginx:8080/ehmi-eer/fhir/
| |
| eer.api.connectTimeout | HTTP connect timeout mod EER - ISO-8601 format | Ja | PT30S | PT30S |
| eer.api.socketTimeout | HTTP Socket (Read) timeout mod EER - ISO-8601 format | Ja | PT30S | PT30S |
| eer.api.alarm.stale | Hvor lang tid der skal gå inden sidste fejlede request mod EER ikke længere er aktuelt. F.eks. hvis værdien er PT5M så vil der 5 minutter efter det fejlede kald, ikke længere være en aktiv alarm. ISO-8601 format | Ja | PT5M | PT5M |
| oauth2.client.id | OAuth client id | Ja | eas | eas |
| oauth2.client.secret | OAuth client secret - Kan undlades ved auth via. Klientcertifikater. Afhænger af Authentication Server. | Nej | ||
| oauth2.token.uri | URL til Keycloak OAuth endpoint | Ja | http://eas-egress-nginx:8080/ehmi-auth/auth/realms/ehmi/protocol/openid-connect/token | http://eas-egress-nginx:8080/ehmi-auth/auth/realms/ehmi/protocol/openid-connect/token |
| oauth2.scopes | Scopes som anmodes om fra Keycloak i den token der udstedes til EAS for kald mod EER | Ja | EER,system/Organization.rs
| EER,system/Organization.rs
|
| oauth2.connectTimeout | HTTP connect timeout mod Keycloak - ISO-8601 format | Ja | PT30S | PT30S |
| oauth2.readTimeout | Read timeout mod Keycloak - ISO-8601 format | Ja | PT30S | PT30S |
| oauth2.alarm.stale | Hvor lang tid der skal gå inden sidste fejlede request mod Keycloak ikke længere er aktuelt. F.eks. hvis værdien er PT5M så vil der 5 minutter efter det fejlede kald, ikke længere være en aktiv alarm. ISO-8601 format | Ja | PT5M | PT5M |
PersonInformation (personinformation.properties)
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
| personinformation.api.url | URL til PersonInformation service | Ja | http://test1.ekstern-test.nspop.dk:8080/stamdata-personinformation/v1 | |
| personinformation.api.connectTimeout | HTTP connect timeout - ISO-8601 format | Ja | PT30S | PT30S |
| personinformation.api.requestTimeout | Totalt HTTP Request timeout - ISO-8601 format | Ja | PT30S | PT30S |
| personinformation.api.alarm.stale | Hvor lang tid der skal gå inden sidste fejlede request mod Personinformation ikke længere er aktuelt. F.eks. hvis værdien er PT5M så vil der 5 minutter efter det fejlede kald, ikke længere være en aktiv alarm. ISO-8601 format | Ja | PT5M | PT5M |
SikredeInformation (sikrede.properties)
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
| sikrede.api.url | URL til SikredeInformation service | Ja | http://test1.ekstern-test.nspop.dk:8080/stamdata-sikredeinformation/2025/07/17 | |
| sikrede.api.connectTimeout | HTTP connect timeout - ISO-8601 format | Ja | PT30S | PT30S |
| sikrede.api.requestTimeout | Totalt HTTP Request timeout - ISO-8601 format | Ja | PT30S | PT30S |
| sikrede.api.alarm.stale | Hvor lang tid der skal gå inden sidste fejlede request mod Sikrede ikke længere er aktuelt. F.eks. hvis værdien er PT5M så vil der 5 minutter efter det fejlede kald, ikke længere være en aktiv alarm. ISO-8601 format | Ja | PT5M | PT5M |
SORES (sores.properties)
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
| sores.api.url | URL til SORES service | Ja | http://test1.ekstern-test.nspop.dk:8080/sores | |
| sores.api.connectTimeout | HTTP connect timeout - ISO-8601 format | Ja | PT30S | PT30S |
| sores.api.requestTimeout | Totalt HTTP Request timeout - ISO-8601 format | Ja | PT30S | PT30S |
| sores.api.alarm.stale | Hvor lang tid der skal gå inden sidste fejlede request mod SORES ikke længere er aktuelt. F.eks. hvis værdien er PT5M så vil der 5 minutter efter det fejlede kald, ikke længere være en aktiv alarm. ISO-8601 format | Ja | PT5M | PT5M |
NSP Accesshandler
EAS anvender NSP Accesshandler til at autentificere JTP-H JWT Tokens.
Det betyder, at jtph.properties skal konfigureres hvilket er nærmere beskrevet her NSP Access Handler - Driftvejledning#jtph.properties
Bemærk at hele certifikatkæden skal fremgå af certifikatet.
EAS-Ingress-Nginx
Servicen lytter på port 8080 og forwarder requests til http://eas:8080
Ud fra hostname lyttes der på følgende path: /eas/fhir
Alle andre paths vil resultere i en 404.
TLS Terminering
Nedenstående tabel viser hvorhenne i containeren certifikater skal mountes ind, samt hvilken funktion certifikaterne har.
Bemærk: ved ændring af certifikater skal servicen genstartes.
| Fil | Beskrivelse | Påkrævet |
|---|---|---|
/etc/ssl/server.crt | TLS servercertifikat for EAS | Ja |
/etc/ssl/server.key | Privatnøgle for servercertifikat for EAS | Ja |
/etc/ssl/ehmi-ca.pem | Rodcertifikatbundle for udstedende certifikatmyndighed(er) | Ja |
Hostname (eas-host.conf)
Nedenstående tabel beskriver indholdet af eas-host.conf. Konfigurationsfilen indeholder server_name til brug for nginx. Det er påkrævet for, at nginx håndterer request korrekt.
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
server_name | Hostnavn for EAS servicen. Bemærk ingen protokol. | Ja | eas.local localhost | test1.ekstern-test.nspop.dk |
Ingress konfiguration (ingress-nginx.conf)
Denne fil indeholder Nginx konfigurationen for TLS-termineringen.
Der er som udgangspunkt ikke noget der skal konfigureres heri, den skal blot mountes ind under stien:
/etc/nginx/nginx.conf
Hvilket også fremgår af docker-compose setuppet.
EAS-Egress-Nginx
Servicen lytter på port 8080
mTLS
Nedenstående tabel viser hvorhenne i containeren certifikater skal mountes ind, samt hvilken funktion certifikaterne har.
Bemærk: ved ændring af certifikater skal servicen genstartes.
| Fil | Beskrivelse | Påkrævet |
|---|---|---|
/etc/ssl/ehmi-auth/client.crt | Klientcertifikat til kommunikation mod EHMI Keycloak - Bemærk SKAL indeholde hele certifikatkæden | Ja |
/etc/ssl/ehmi-auth/client.key | Privatnøgle for klientcertifikat til kommunikation mod EHMI Keycloak | Ja |
/etc/ssl/ehmi-eer/client.crt | Klientcertifikat til kommunikation mod EHMI EER service - Bemærk SKAL indeholde hele certifikatkæden | Ja |
/etc/ssl/ehmi-eer/client.key | Privatnøgle for klientcertifikat til kommunikation mod EHMI EER service | Ja |
/etc/ssl/certs/ca-certificates.crt | Rodcertifikatbundle for udstedende certifikatmyndighed(er). Hvis ikke angivet, anvendes standard OS CA Bundle. | Nej |
Endpoints (ehmi-endpoints.conf)
Nedenstående tabel beskriver de variabler der bliver sat for Nginx i filen ehmi-endpoints.conf.
De er nødvendige for at nginx kan forward request fra EAS mod den rigtige service.
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
$ehmi_auth_host | Hostnavn for EHMI Keycloak. Bemærk ingen protokol. | Ja | keycloak-test.nspop.dk | keycloak-test.nspop.dk |
$ehmi_eer_host | Hostnavn for EHMI EER Service. Bemærk ingen protokol. | Ja | dk-ehmi-eer-service.t1.hosting.kitkube.dk | dk-ehmi-eer-service.t1.hosting.kitkube.dk |
Auth Resolver (ehmi-auth-resolver.conf)
Nedenstående tabel beskriver indholdet af ehmi-auth-resolver.conf. Konfigurationsfilen indeholder resolver til brug for Nginx.
Årsagen hertil er, at automatisk tildelt DNS ikke nødvendigvis kan resolve services internt på NSP eller på SDN.
NB: dokumentation for resolver findes her: https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
resolver | DNS Server for at kunne resolve ehmi_auth_host | Ja | 127.0.0.11 valid=30s; | 127.0.0.11 valid=30s; |
EER Resolver (ehmi-eer-resolver.conf)
Nedenstående tabel beskriver indholdet af ehmi-eer-resolver.conf. Konfigurationsfilen indeholder resolver til brug for Nginx.
Årsagen hertil er, at automatisk tildelt DNS ikke nødvendigvis kan resolve services internt på NSP eller på SDN.
NB: dokumentation for resolver findes her: https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
| Property | Beskrivelse | Påkrævet | Default værdi | Eksempel |
|---|---|---|---|---|
resolver | DNS Server for at kunne resolve ehmi_eer_host | Ja | 127.0.0.11 valid=30s; | 127.0.0.11 valid=30s; |
Egress konfiguration (egress-nginx.conf)
Denne fil indeholder Nginx konfigurationen for at etablere udadgående mTLS forbindelser mod hhv.
Der er som udgangspunkt ikke noget der skal konfigureres heri, den skal blot mountes ind under stien:
/etc/nginx/nginx.conf
Hvilket også fremgår af docker-compose setuppet.
Overvågning
EAS udstiller både status og alarm snitflader, som findes beskrevet under "Komponenter".
Fortolkning af overvågningssiderne
Overvågningssiderne returnerer enten:
- HTTP 200, hvis servicen i øjeblikket kører fint.
- HTTP 500, hvis der er opstået en fejl der kræver indgriben.
Status-snitflade
Statussnitfladen returnerer et JSON objekt som indeholder følgende værdier:
| Rod | Niveau 1 | Niveau 2 | Beskrivelse |
|---|---|---|---|
| status | |||
| version | |||
| builtDate | |||
| integrations | eer | sores | keycloak | sikrede | personinformation | lastSuccess | Tidsstempel for sidste succesfulde http kald mod integrationen. Fremgår kun hvis der er udført minimum ét succesfuldt kald. |
| lastSuccessCode | Statuskode for sidste successfulde http kald mod integrationen. Fremgår kun hvis der er udført minimum ét succesfuldt kald. | ||
| lastError | Tidsstempel for sidste fejlede http kald mod integrationen. Fremgår kun hvis der er udført minimum ét fejlet kald. | ||
| lastErrorCode | Statuskode for sidste fejlede http kald mod integrationen. Fremgår kun hvis der er udført minimum ét fejlet kald. | ||
| alarm | Om der er en aktiv alarm. Se nærmere under Alarm-snitfladen for hvornår noget er en alarm. |
Bemærk, at såfremt nogle integrationer markeres som alarm, returnerer snitfladen stadig HTTP 200. EAS er stateless, så transiente fejl mod integrationerne skal ikke påvirke muligheden for at kunne kalde servicen.
Alarm-snitflade
Alarmsnitfladen returnerer én tekstlinje pr. aktive alarm. som indikerer mod hvilken integration der er opstået en fejl.
Logikken for hvornår der er en alarm er:
- Hvis seneste HTTP Kald mod en integration er en fejl, men ikke ældre end en konfigurérbar periode, vil integrationen blive markeret som fejl.
Det er muligt at konfigurere perioden for hvor gammel en fejl må være, før den ikke længere fremgår som fejl, pr. integration.
Som standard er perioden for alle integrationer 5 minutter.
Auditlogning
Hvert servicekald medfører en ny indgang i auditloggen, som kan være udfyldt med følgende information, afhængig af konteksten:
| Komponent | Kontekst | Nøgle | Information |
|---|---|---|---|
| EAS | GetReceivingOrganizationByPatientId | patient-id message-type | ID på borgeren Beskedtype |
| EAS | GetReceivingOrganizationByGPId | general-practitioner-id message-type | Ydernummer Beskedtype |
| EAS | GetReceivingOrganizationBySORId | sor-id message-type | SOR-kode Beskedtype |
| EAS | GetListOfGpByPostalCode | postal-code | Postnummer |
Baggrundsjobs
EAS er tilstandsløs, og har ingen baggrundsjobs.