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-pfi qui 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-Office permettant 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 clamav sur une version récente
  • et un container mongodb pour 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 /config pour pouvoir externaliser la configuration de la pfi.
  • Le deuxième /shared qui va nous permettre plus tard de partager les fichiers hl7 dans le cas où on utilise le protocol file dans 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.yml pour 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é.