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 :

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.