PFI/PFI-Connect en Standalone MLLP

Objectif

L’objectif de cet article est de déployer la DevBox-Santé PFI et son client DevBox-Santé PFI-Connect sur un réseau privé docker et utiliser le protocole MLLP pour la communication entre les deux. La force dans ce déploiement est que les ommunication entre la PFI et son/ses client(s) sont protégés par ce réseau privé virtuel Docker et donc invisible de l’extérieur.

Contexte

Lors d’un précédent article nous nous étions intéressés à l’installation de la DevBox-Santé PFI, à la configuration d’une intermédiation file (partage de fichier sur un volume docker) et avons testé avec le client que nous connaissons la DevBox-Santé PFI-Connect (Lien vers l’article).

Aujourd’hui, nous nous intéressons à la configuration MLLP de l’intermédiation entre la PFI et sont client PFI_Connect .

Voici le schéma général de ce qui sera installé :


!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define PFI_COLOR #2f78cc
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800
left to right direction


component "Logiciel Intégrateur (DPI)" as dpi

card "Réseau Docker PFI" as docker DEVBOX_COLOR{
    [DevBox-Santé PFI-connect] as dbx_pfic PFI_COLOR
    component "Container DevBox-Santé PFI" as pfi PFI_COLOR {
         [DevBox-Santé DMP] as pfi_dmp DMP_COLOR
         [DevBox-Santé MSSanté] as pfi_mss MSS_COLOR
    }
    database "MongoDB" as pfi_db 
    component "Clamav (antivirus)" as antivir 
    component "Back-Office Web" as bo PFI_COLOR
}

cloud "**DMP**" as DMP
cloud "**BAL MSSanté**" as OperateurMSS

pfi --> antivir
bo -> pfi_db
pfi --> pfi_db 

dpi --> dbx_pfic : Http REST

dbx_pfic <--> pfi : HL7 / mllp
pfi_dmp <--> DMP : Http SOAP
pfi_mss <--> OperateurMSS : Envoi/Réception MSSanté (SMTP/IMAP en mTLS)

Si on fait un focus sur l’intermédiation mllp :


!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define PFI_COLOR #2f78cc
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
left to right direction

card "Réseau Docker PFI" as docker DEVBOX_COLOR{
    [DevBox-Santé PFI-connect] as dbx_pfic PFI_COLOR
    component "Container DevBox-Santé PFI" as pfi PFI_COLOR {
         [DevBox-Santé DMP] as pfi_dmp DMP_COLOR
         [DevBox-Santé MSSanté] as pfi_mss MSS_COLOR
    }
}

dbx_pfic --> pfi : mllp://pfi:5453
pfi --> dbx_pfic : mllp://pfi:5454

Une connexion bi-directionnelle entre la PFI et son client est en réalité en MLLP deux connexions client/server dans les deux sens entre le serveur et le client.

Dans le diagramme ci-dessus :

  • le serveur PFI écoute sur le port 5453
  • et le client PFI-Connect écoute sur le port 5454.

Finalement, PFI-Connect se connecte sur le port 5453 pour envoyer des messages HL7 (MDM/ORU) à la PFI, en retour la PFI se connecte sur le port 5454 de PFI-Connect pour envoyer des messages HL7(ZAM/MDM). Les ACK HL7 se font en réponse sur la connexion du message d’origine envoyé.

Exemple, envoi d’un MDM de TRANSMISSION de document à destination du DMP ou de la MSSanté, une fois traité la PFI envoi un ZAM (accusé métier du MDM reçu par la PFI) à destination de son client :

!theme aws-orange
!define PFI_COLOR #2f78cc
hide footbox 
autonumber

participant "DevBox-Santé PFI-connect" as dbx_pfic PFI_COLOR
participant "Container DevBox-Santé PFI" as pfi PFI_COLOR 

dbx_pfic -> pfi : connect TCP/5453

dbx_pfic -> pfi : MDM
pfi -> dbx_pfic : ACK
pfi -> pfi : traite le message pour envoi DMP/MSSanté
pfi -> dbx_pfic : connect TCP/5454
pfi -> dbx_pfic : ZAM
dbx_pfic -> pfi : ACK

Ce qui donne dans la console du back-office 4 Messages :

Envoi MDM

Configuration

Pour réaliser ce scénario il faut composer avec deux DevBox-Santé (PFI et PFI-Connect) (extrait du docker-compose.yml) sur un même réseau:

name: devboxsante-pfi-connect-example

networks:
  pfi_network:

services:
  pfi:
    image: devboxsante/devboxsante-pfi-server:${DEVBOX_PFI_VERSION:-dev}
    container_name: pfi-server
    networks:
      - pfi_network
    volumes:
      - ${DEVBOX_VOLUME_ROOT:-}/dbx/pfi/server/config:/config  # contient la config springframework (application.yml)

  devbox-sante:
     image: devboxsante/devboxsante-all:${DEVBOX_VERSION:-dev}
     container_name: pfi-connect-dbx-all
     ports:
       - "8080:8080"
     environment:
       DEVBOX_PFI_CONNECT_MLLP_HOSTNAME: pfi
       DEVBOX_PFI_CONNECT_MLLP_PORT: 5453
       DEVBOX_PFI_CONNECT_MLLP_LOCAL_PORT: 5454
     networks:
       - pfi_network

On pourra noter qu’il n’y a pas d’exposition des ports mllp des containers vers l’extérieur.

Configuration de PFI-Connect

La configuration par défaut de l’image devboxsante-all contenant pfi-connect (/6.x/installation/docker/configuration/#pfi-connect) contient la configuration suivante :

devbox-sante: 
  pfi:
   client:
      connectors:
        default-mllp:
            protocol: mllp
            hostname: ${DEVBOX_PFI_CONNECT_MLLP_HOSTNAME:62.240.227.103}
            port: ${DEVBOX_PFI_CONNECT_MLLP_PORT:5453}
            mllpLocalPort: ${DEVBOX_PFI_CONNECT_MLLP_LOCAL_PORT:10112}

il suffit donc de lancer la devboxsante-all avec ces variables d’environnement bien renseigné, comme dans notre docker-compose.yml :

name: devboxsante-pfi-connect-example
services:
  devbox-sante:
     image: devboxsante/devboxsante-all:${DEVBOX_VERSION:-dev}
     container_name: pfi-connect-dbx-all
     environment:
       DEVBOX_PFI_CONNECT_MLLP_HOSTNAME: pfi
       DEVBOX_PFI_CONNECT_MLLP_PORT: 5453
       DEVBOX_PFI_CONNECT_MLLP_LOCAL_PORT: 5454

À Noter le DEVBOX_PFI_CONNECT_MLLP_HOSTNAME est valorisé à pfi comme le nom du service docker pfi dans le docker-compose.yml. Les deux autres variables d’environnement sont les ports local d’écoute et le port distant de la PFI.

Configuration de la PFI

Le service pfi est défini dans le docker-compose.yml de la manière suivante :

  pfi:
    image: devboxsante/devboxsante-pfi-server:${DEVBOX_PFI_VERSION:-dev}
    container_name: pfi-server
    networks:
      - pfi_network
    volumes:
      - ${DEVBOX_VOLUME_ROOT:-}/dbx/pfi/server/config:/config  # contient la config springframework (application.yml)  

La configuration de l’intermédiation mettant en œuvre MLLP va se trouver dans le volume config dans le fichier application.yml

Dans notre cas, l’intermédiation contient la configuration du protocol suivante :

devbox-sante:
  pfi:
    intermediations:
        test-mllp:
            connector:
                protocol: mllp
                hostname: devbox-sante
                port: 5454
                mllpLocalPort: 5453

Le serveur écoute sur le port 5453 et le client est accessible sur le port 5454.