Installer la DevBox-Santé PFI
L’objectif de cet article est de démontrer une installation de la DevBox-Santé PFI et valider cette installation en utilisant un autre composant le client DevBox-Santé PFI-Connect.
Voici le schéma final 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 "DevBox-Santé for DPI" as devbox DEVBOX_COLOR {
[DevBox-Santé PFI-connect] as dbx_pfic PFI_COLOR
[DevBox-Santé DMP (consult)] as dbx_dmp DMP_COLOR
[DevBox-Santé INS] as dbx_ins INS_COLOR
}
card "Réseau Docker PFI" as docker DEVBOX_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
dpi --> dbx_dmp : Http REST
dbx_pfic <--> pfi : hl7 MDM/ORU
dbx_dmp <--> DMP : http consult
pfi_dmp <--> DMP : Http SOAP
pfi_mss <--> OperateurMSS : Envoi/Réception MSSanté (SMTP/IMAP en mTLS)
DevBox-Santé PFI
On va tout d’abord s’intéresser au grand carré bleu, la PFI qui contient 4 composants :
- Une base de données
Mongo - Un antivirus
clamav - Le serveur
devbox-sante-pfiqui contient l’orchestration des messages HL7 reçus et émis et qui permet l’accès au DMP ainsi qu’aux différents opérateurs MS-Santé - L’application web de
Back-Officepermettant le suivi du serveur pfi.
Installation avec Docker-Compose
Il suffit donc de composer 4 images docker sur un même réseau privé pfi_network :
name: devboxsante-pfi-file-default
networks:
- pfi_network
services:
clamav:
image: clamav/clamav:1.5.1
container_name: pfi-clamav
networks:
- pfi_network
mongodb:
image: mongo:8
container_name: pfi-mongodb
networks:
- pfi_network
volumes:
- C:/dbx/pfi/mongodb:/data/db # contient les fichiers de la base pour sauvegarde
pfi:
image: devboxsante/devboxsante-pfi-server:dev
container_name: pfi-server
networks:
- pfi_network
volumes:
- C:/dbx/pfi/server/config:/config # contient la config springframework (application.yml)
- C:/dbx/pfi/shared:/shared # volume partagé avec pfi-connect de la devbox-sante
environment:
JAVA_OPTS: "-Xms1024M -Xmx1536M"
MONGO_DB_URI: "mongodb://mongodb:27017/pfi"
DEVBOX_LM_CLIENT: ${DEVBOX_LM_CLIENT}
DEVBOX_LM_TOKEN: ${DEVBOX_LM_TOKEN}
...
back-office:
image: devboxsante/devboxsante-pfi-backoffice:dev
container_name: pfi-backoffice
depends_on:
- mongodb
ports:
- "8282:8282"
networks:
- pfi_network
environment:
MONGO_DB_URI: "mongodb://mongodb:27017/pfi"
Pour les deux premiers containers, c’est relativement standard.
- Un container
clamavsur une version récente - et un container
mongodbpour lequel on spécifie un volume pour faciliter les sauvegardes.
Arrêtons nous sur le quatrième container le back-office:
back-office:
...
container_name: pfi-backoffice
ports:
- "8282:8282"
networks:
- pfi_network
environment:
MONGO_DB_URI: "mongodb://mongodb:27017/pfi"
Ici, nous exposons le port 8282 pour que les administrateurs puissent y accéder, et une variable d’environnement pour l’accès à la base de données mongo sur le réseau interne docker.
Et finalement le plus important le troisième pfi-server :
pfi:
container_name: pfi-server
...
volumes:
- C:/dbx/pfi/server/config:/config # contient la config springframework (application.yml)
- C:/dbx/pfi/shared:/shared # volume partagé avec pfi-connect de la devbox-sante
Outre les variables d’environnements, nous spécifions deux volumes.
- Le premier
/configpour pouvoir externaliser la configuration de la pfi. - Le deuxième
/sharedqui va nous permettre plus tard de partager les fichiers hl7 dans le cas où on utilise le protocolfiledans une intermediation avec le client de la PFI. Ce qui sera le cas dans notre démonstration.
Configuration de pfi-server
Dans le volume /config préalablement défini, nous allons déposer le fichier application.yml de configuration Spring-boot (c’est à dire en local C:\dbx\pfi\server\config) :
Voici le contenu du fichier application.yml :
# permet de définir le niveau de trace des différents composants de la pfi
logging:
level:
fr.devboxsante: info
org.apache.cxf.services: debug
org.apache.hc.client5.http: info
# Les profils nécessaires pour le bon fonctionnement de la PFI
spring.profiles:
active:
- pfi
- lm
- dmp
- mss
- antivirus
- vague1
# le profil suivant va permettre de configurer l'intermédiation à mettre en place
- intermediation-file
devbox-sante:
pfi:
tasks:
# surcharge du cron afin de ne pas le déclencher trop fréquemment pour nos tests
cron: ${DEVBOX_PFI_TASKS_CRON:0 0 */1 * * *}
# désactivation des validator pour accélérer les tests, à remettre en production.
dmp:
cda.validator.enable: false
core.validator.enable: false
core.idNational.check: false
Une fois la PFI configurée, il faut rajouter une intermédiation.
Pour cette démonstration, nous allons nous intéresser à un partage de fichier hl7 entre la pfi et un client (pfi-connect).
Nous rajoutons un fichier application-intermediation-file.yml dans le volume de /config (remarque : intermediation-file correspond au dernier profil dans le fichier application.yml).
devbox-sante:
pfi:
intermediations:
file-default:
systemeSource:
nom: DevBox-Sante PFI
version: 1
structureSanteSource:
idNational: DEVBOX_PFI_STRUCTURE_SANTE_SOURCE_ID_NATIONAL
nom: DEVBOX_PFI_STRUCTURE_SANTE_SOURCE_NOM
systemeDestinataire:
nom: DEVBOX_PFI_SYSTEME_DESTINATAIRE_NOM
structureSanteDestinataire:
idNational: DEVBOX_PFI_STRUCTURE_SANTE_DESTINAIRE_ID_NATIONAL
nom: DEVBOX_PFI_STRUCTURE_SANTE_DESTINAIRE_NOM
connector:
protocol: file
rootPath: ${DEVBOX_PFI_FILE_ROOT_PATH:/shared/files} # dans le volume /shared un répertoire /files
out:
dmp:
active: true
authP12InBase64: MIIcmwIBAzCC... TOFILL ...CSqGSIb3DQEHn==
authP12Password: TOFILL
signP12InBase64: MIIcmwIBAzCC... TOFILL ...CSqGSIb3DQEHn==
signP12Password: TOFILL
soumissionContentType: "04" # Exemple Hospitalisation de jour
mss:
operatorName: MOTCO2 # exemple d'opérateur , liste complète : https://mss-demo.devbox-sante.fr/mssante/v2/operators
userName: TOFILL
p12InBase64: MIIcZgIBAzCCH... TOFILL ...CwGCSqGSIb3DQEHAaCC==
p12Password: TOFILL
Ce qui donne au final le montage \config entre le système hôte et le container suivant :

et pour \shared :

Exécution
Il reste maintenant plus qu’à lancer le fichier compose.yml ci dessus, avec la ligne de commande :
docker compose up -d
Et on obtient :

Et si on ouvre Docker Desktop on retrouve regroupés au sein d’un nouveau groupe (“stack”) nos 4 containers qui tournent :

Et on peut accéder à l’interface du Back-office sur le port 8282 (compte admin/admin à la première connexion):

Finalement, la pfi est prête et écoute tout événement fichier sur /shared/files :
2026-02-10T15:07:30.377Z INFO 7 --- [ main] f.d.pfi.launcher.PfiLauncherServerMain : Started PfiLauncherServerMain in 17.553 seconds (process running for 19.005)
2026-02-10T15:07:30.387Z INFO 7 --- [ main] f.d.pfi.launcher.PfiLauncherServerMain : launch Intermediations
2026-02-10T15:07:30.389Z INFO 7 --- [ main] f.d.p.server.PfiIntermediationProvider : createConnectorFor(file-default)
2026-02-10T15:07:30.392Z INFO 7 --- [ main] f.d.pfi.protocols.file.PfiFileConnector : [FILE]start()
2026-02-10T15:07:30.398Z INFO 7 --- [ main] f.d.pfi.protocols.file.PfiFileConnector : [FILE] Schedule du polling (toutes les 2 secondes) sur le chemin /shared/files
2026-02-10T15:07:30.399Z INFO 7 --- [ main] f.d.pfi.protocols.file.PfiFileConnector : [FILE] Schedule de l'archivage (cron : 0 0 0 * * *) sur le chemin /shared/files
2026-02-10T15:07:30.402Z INFO 7 --- [ main] f.d.pfi.protocols.file.PfiFileConnector : [FILE] register(fr.devboxsante.pfi.server.service.in.PfiHl7TracerWrapperReceiver)
2026-02-10T15:07:30.402Z INFO 7 --- [ main] f.d.pfi.protocols.file.PfiFileConnector : [FILE] register(fr.devboxsante.pfi.server.service.in.PfiHl7TracerWrapperReceiver)
DevBox-Santé PFI-Connect
La DevBox-Santé propose une PFI, mais également un connecteur REST permettant d’envoyer et de recevoir des messages provenant d’une PFI : DevBox-Santé PFI-Connect
Pour la mettre en œuvre, nous allons nous intéresser au petit carré bleu du diagramme de départ :
!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 "DevBox-Santé for DPI" as devbox DEVBOX_COLOR {
[DevBox-Santé PFI-connect] as dbx_pfic PFI_COLOR
[DevBox-Santé DMP (consult)] as dbx_dmp DMP_COLOR
[DevBox-Santé INS] as dbx_ins INS_COLOR
}
dpi --> dbx_pfic : Http REST
La DevBox-Santé PFI-Connect étant disponible dans la distribution all de la DevBox-Santé, il suffit de récupérer cette image docker.
Remarque : Vous pouvez consulter la documentation sur ces distribs par ici
Installation avec Docker-Compose
Il nous suffit donc de définir un nouveau fichier compose.yml en exposant les composants REST de la DevBox-santé sur le port 8080 (dans notre exemple).
name: devboxsante-pfi-connect-example
services:
devbox-sante:
image: devboxsante/devboxsante-all:dev
container_name: pfi-devboxsante-all
ports:
- "8080:8080"
environment:
DEVBOX_LM_ENV: DEV
DEVBOX_LM_CLIENT: ${DEVBOX_LM_CLIENT}
DEVBOX_LM_TOKEN: ${DEVBOX_LM_TOKEN}
volumes:
- C:/dbx/pfi/shared:/shared # volume partagé avec la pfi
...
Il s’agit ici de la DevBox-Santé distribution all pour laquelle on va utiliser principalement la configuration par défaut, car on ne s’intéresse qu’au module pfi-connect.
La seule particularité ici est donc le montage du volume /shared
En effet, la configuration par défaut de la Devbox-Santé pfi-connect contient un connecteur default-file pointant sur le répertoire /shared/file dans le volume /shared et qui correspond à la configuration de l’intermediation définie dans la pfi-server :
devbox-sante:
pfi:
client:
connectors:
...
default-file:
protocol: file
rootPath: ${DEVBOX_PFI_CONNECT_FILE_ROOT_PATH:/shared/files}
Le connecteur est donc bien configuré par défaut.
Exécution
Il reste maintenant plus qu’à lancer le fichier compose.yml ci dessus, avec la ligne de commande :
docker compose up -d
Et on obtient une nouvelle “stack” docker devboxsante-pfi-connect-example :

Remarque : Il aurait été tout à fait possible d’utiliser un seul fichier
compose.ymlpour lancer tous les containers dans une seule “stack” Docker.
Tester
Il ne reste plus qu’à tester avec les exemples Bruno à notre disposition : https://bitbucket.org/devbox-sante/dbx-examples-bruno/src/master/dbx/pfi-connect/
l’envoiDemande par exemple :

dont on retrouve la trace d’exécution dans le répertoire partagée :

ou encore dans la console d’administration :

Une nouvelle requête dans Bruno permet de récupérer l’Accusé Métier (ZAM) via PFIConnect : /pfi-connect/receptionAccuseMetiers

À la lecture de l’accusé Métier, nous apprenons que le document contenu dans le message existe déjà dans le DMP. Il ne peut pas être accepté.