Configuration¶
Profils¶
Le backend lit application.yml puis, en production, la surcouche application-prod.yml
activée par SPRING_PROFILES_ACTIVE=prod dans le docker-compose. En production :
- le port est 8090 ;
- Swagger et la documentation OpenAPI sont désactivés ;
- l'endpoint
/actuator/healthne renvoie que l'état global, sans détail ; - les logs sont écrits dans des fichiers sous
~/.cause/logs/.
Régler l'application¶
Tout se règle par des variables : le moteur de transcription, la température du modèle, la durée d'une session, la remontée des évaluations. Vous les posez dans un fichier qui vous appartient.
Votre fichier de réglages¶
Ce fichier est ~/.cause/.env.backend.overrides. L'installation le crée, avec son mode d'emploi
écrit dedans, et ne l'écrase jamais : ni une mise à jour, ni une réparation, ni un nouveau disque
de livraison n'effacent ce que vous y avez mis.
Trois gestes. D'abord, ouvrir le fichier :
nano ~/.cause/.env.backend.overrides
Ensuite, écrire un réglage par ligne : le nom, le signe égal, la valeur, sans espace autour du signe égal et sans guillemets.
ASR_DICTATED_PROVIDER=whisper
OLLAMA_TEMPERATURE=0.2
Enfin, redémarrer le backend, qui lit ce fichier à son démarrage :
cd ~/.cause && docker compose up -d backend
Tant que vous n'avez pas redémarré le backend, rien ne change. Pour vérifier qu'un réglage est bien arrivé dans le conteneur, demandez-lui :
cd ~/.cause && docker compose exec backend printenv ASR_DICTATED_PROVIDER
Une ligne qui commence par un dièse est ignorée : c'est ainsi qu'on met un réglage de côté sans
l'oublier. Pour retirer un réglage, effacez sa ligne ou mettez un dièse devant, puis redémarrez.
Attention, une ligne NOM= sans rien après ne revient pas au défaut : elle impose une valeur
vide, ce qui n'est pas la même chose.
Aucun nom n'est interdit dans ce fichier. Toutes les variables des tableaux ci-dessous s'y
écrivent, y compris GLOSSARY_ et SEGMENT_EDITING_, que l'autre chemin ne sait pas transmettre.
Ce que ce fichier ne change pas¶
Le docker-compose fixe lui-même le câblage entre les services, et ces valeurs-là passent avant
les vôtres : SPRING_PROFILES_ACTIVE, WHISPER_URL, MEDICAL_RECORD_WHISPER_ENDPOINT,
OLLAMA_URL, OLLAMA_MODEL et ENRICHMENT_ENABLED. Le modèle de langue et la version
applicative se changent ailleurs, dans ~/.cause/.env, voir Relancer le
script.
L'autre chemin : l'environnement de la machine¶
Le script d'installation copie dans .env.backend chaque variable de votre environnement dont le
nom commence par un préfixe connu : SPRING_, SERVER_, MANAGEMENT_, LOGGING_, SPRINGDOC_,
AUTH_, HTTP_CLIENT_, TASK_, WHISPER_, ASR_, MEDICAL_RECORD_, TRANSCRIPTION_,
REPORT_, LLM_, OLLAMA_, AIRLLM_, OPENAI_, SMOOTHING_, ENRICHMENT_, REMONTEE_,
TRAINING_CORPUS_.
C'est le chemin des machines de développement et de l'intégration continue, où l'environnement
est déjà la source de vérité. Sur un serveur, il demande de modifier /etc/environment puis de
relancer le script : préférez le fichier de réglages, qui tient en trois gestes et ne dépend de
personne.
Les fichiers d'environnement d'un serveur livré¶
Sur un serveur livré, quatre fichiers d'environnement cohabitent et ne servent pas à la même
chose, tous dans ~/.cause/.
| Fichier | Ce qu'il porte | Qui l'écrit |
|---|---|---|
.env |
La version applicative (CAUSE_VERSION), celle des deux moteurs (CAUSE_MOTEURS), le modèle actif (OLLAMA_MODEL), CAUSE_HOME. C'est ce que docker compose lit pour savoir quelles images servir. |
Le disque de livraison. Le script n'y réécrit que CAUSE_HOME. |
.env.backend.overrides |
Vos réglages. | Vous, et personne d'autre : le script n'y écrit jamais rien. |
.env.backend |
Ce que nous avons généré : les variables reprises de l'environnement de la machine, et les réponses que le script vous a demandées (les clés du stockage). | Le script, qui le régénère à chaque passage en y reprenant ses propres réponses. N'y écrivez rien. |
.env.ghcr |
Le jeton qui donne le droit de lire les images privées dans le registre. | Vous, au renouvellement du jeton, voir Le jeton du registre. |
Changer de version ou de modèle se fait dans le premier, régler l'application dans le deuxième.
La règle de partage est simple : .env.backend porte ce que nous avons généré, à l'installation
ou à la gravure ; .env.backend.overrides porte ce que vous décidez d'y mettre à la main
ensuite. Les deux portent des secrets possibles, donc aucune sauvegarde ne les emporte, et
.env.ghcr, partagé avec l'éditeur, est maintenu en 600.
Sur une machine de développement, ces fichiers sont dans le dépôt, à côté du compose qui les lit : chacun vit toujours auprès du compose qui fait foi.
Variables principales¶
Modèles¶
| Variable | Défaut | Effet |
|---|---|---|
OLLAMA_MODEL |
gemma4:12b |
Modèle téléchargé par Ollama au démarrage et utilisé pour les rapports. |
OLLAMA_TEMPERATURE |
0.1 |
Température de génération. Les autres réglages Ollama sont fixes. |
LLM_PROVIDER |
ollama |
ollama, openai pour un service compatible OpenAI, ou airllm. |
OPENAI_BASE_URL, OPENAI_API_KEY, OPENAI_MODEL |
Groq, vide, llama-3.3-70b-versatile |
Fournisseur distant si LLM_PROVIDER=openai. Les données quittent alors le serveur. |
WHISPER_MODEL |
large-v3 |
Modèle de transcription, lu par le conteneur Whisper. |
ASR_LIVE_PROVIDER |
whisper |
Moteur de transcription de la piste enregistrée au chevet du patient. |
ASR_DICTATED_PROVIDER |
whisper |
Moteur de transcription de la dictée du médecin, donc aussi des actes sans piste live. Reposer les deux variables à whisper et redémarrer ramène le comportement d'avant un second moteur, sans reconstruire d'image. Un moteur nommé mais absent de l'installation n'empêche pas le serveur de démarrer : il met en échec les portions de cette seule piste. |
ASR_QWEN_URL |
vide | Route du moteur Qwen3-ASR, à poser dans le même geste que ASR_DICTATED_PROVIDER=qwen : http://qwen-asr:8998/v1/audio/transcriptions. Vide, le moteur est servi mais se déclare indisponible, et seules les portions de la piste qui le nomme échouent. Le service tourne derrière le profil docker qwen, qui ne démarre pas avec les autres. |
REPORT_GENERATION_WORKERS |
1 |
Générations simultanées. Ne dépasser 1 qu'avec un moteur qui le supporte. |
TRAINING_CORPUS_ENABLED |
true |
Constitution du corpus d'entraînement : valider un rapport fige le couple audio et transcription de sa piste dans ~/.cause/corpus-entrainement/. Ce corpus contient de la voix de patients, que l'on ne peut pas dé-identifier. Mettre à false chez un établissement qui n'a pas consenti à cette réutilisation. Voir Données et sauvegarde. |
Enregistrement et rapports¶
| Variable | Défaut | Effet |
|---|---|---|
MEDICAL_RECORD_VISIBILITY_LOCK_TIMEOUT |
PT30M |
Durée du verrou de visibilité posé par un enregistrement. Balayage toutes les 60 s. |
REPORT_GENERATION_MAX_WAIT_TIME_SECONDS |
600 |
Attente maximale de la transcription des segments avant de mettre le rapport en erreur. |
TRANSCRIPTION_THRESHOLD_MIN_LENGTH, TRANSCRIPTION_THRESHOLD_MIN_WORD_COUNT |
100, 20 |
En dessous, le rapport est un template vide au lieu d'une génération. |
MEDICAL_RECORD_RECORDING_FLOW_GOLDEN_RULES_CONSULTATION_THRESHOLD |
3 |
Les règles d'or s'affichent tant que le médecin a moins de N consultations. |
SEGMENT_EDITING_ENABLED |
false |
Autorise l'édition manuelle du texte d'une portion de transcription. |
Stockage et purges¶
| Variable | Défaut | Effet |
|---|---|---|
MEDICAL_RECORD_STORAGE_CLEANUP_AFTER_HOURS |
24 |
Âge des fichiers audio orphelins supprimés. |
MEDICAL_RECORD_STORAGE_CLEANUP_CHECK_INTERVAL |
3600000 |
Cadence des purges, en millisecondes. |
MEDICAL_RECORD_STORAGE_STALE_WAITING_HOURS |
48 |
Suppression des consultations créées mais jamais démarrées. |
MEDICAL_RECORD_STORAGE_MAX_FILE_SIZE |
500 Mo | Taille maximale d'un envoi audio, alignée avec nginx. |
Glossaire et apprentissage¶
| Variable | Défaut | Effet |
|---|---|---|
GLOSSARY_ENABLED |
true |
Injection du glossaire médical dans le prompt. |
GLOSSARY_MAX_ENTRIES, GLOSSARY_MIN_CONFIDENCE |
5, 0.6 |
Nombre et seuil des entrées injectées. |
ASR_HARVEST_ENABLED |
true |
Apprentissage des corrections faites par les médecins sur les rapports validés. |
ASR_HARVEST_THRESHOLD |
3 |
Nombre de consultations où une même correction doit apparaître avant d'être retenue. |
ASR_HARVEST_CRON |
toutes les heures | Cadence du moissonnage. |
ENRICHMENT_ENABLED |
false |
Ancien pipeline d'enrichissement lexical, remplacé par le glossaire. |
Remontée des évaluations¶
Active par défaut. Elle envoie une fois par mois vers un stockage compatible S3 ce que la machine produit d'évaluations : relevés de baseline, mesures de charge, corpus dé-identifié et ses audios. Voir Données et sauvegarde pour ce qui part et ce qui est retiré avant de partir.
| Variable | Défaut | Effet |
|---|---|---|
REMONTEE_ENABLED |
true |
Active la construction de la file et les envois. À false, rien n'est tenté et rien n'est journalisé. |
REMONTEE_BUCKET |
kauze |
Seau de l'éditeur, commun à toutes les installations. Vous n'avez pas à le changer. |
REMONTEE_ENDPOINT |
https://s3.gra.io.cloud.ovh.net/ |
Racine du stockage de l'éditeur. Les objets sont adressés en chemin, <racine>/<seau>/<clé>. |
REMONTEE_REGION |
gra |
Région de signature du stockage de l'éditeur. |
REMONTEE_ACCESS_KEY_ID, REMONTEE_SECRET_KEY |
vides | Clés d'accès au stockage de l'éditeur. Ce sont des secrets : aucune valeur dans le dépôt, et le script d'installation vous les demande, puis les reprend à chaque passage dans le .env.backend qu'il génère. |
REMONTEE_INSTALLATION |
vide | Premier segment des clés d'objet : c'est lui qui sépare votre établissement des autres dans le seau commun. Le script d'installation y met le numéro de licence de la machine, lu dans ~/.cause/licence.lic, et vous demande un nom si la licence n'est pas encore émise. Sans nom de personne ni de service. |
REMONTEE_DIR |
~/.cause/remontee |
File d'attente sur disque et registre des envois réussis. |
REMONTEE_CRON |
le 1er du mois à 2 h 30 | Construction de la file. |
REMONTEE_RETRY_CRON |
toutes les cinq minutes | Reprise des envois en attente, jusqu'au succès. |
REMONTEE_BATCH |
50 |
Objets au plus par passage de reprise, pour ne pas tenir le lien de l'établissement. |
REMONTEE_MAX_FILE_BYTES |
1 Go | Au-delà, un fichier n'entre pas dans la file. |
REMONTEE_SOURCE_BASELINE |
~/.cause/baseline-diagnostic |
Dossier lu pour la catégorie baseline. |
REMONTEE_SOURCE_CHARGE |
~/.cause/mesure-charge |
Dossier lu pour la catégorie charge. Déposez-y les relevés du harnais de charge pour qu'ils remontent. |
REMONTEE_SOURCE_CORPUS |
~/.cause/corpus-entrainement |
Dossier lu pour la catégorie corpus. |
Une machine sans ses clés n'est pas en erreur : la file se remplit, un seul avertissement est inscrit au journal, et les envois partiront dès que les clés seront posées. Le script d'installation vous les demande, les garde dans son propre fichier et rappelle à la fin de son passage ce qui manque encore. Vous n'avez donc normalement rien à faire : relancer le script les redemande tant qu'elles manquent.
Pour les changer sans relancer le script, écrivez-les dans votre fichier de réglages, une par
ligne, sous la forme NOM=valeur, puis docker compose up -d backend : ce fichier est lu en
dernier, donc il l'emporte. Voir Votre fichier de réglages. Jamais
dans .env.backend, que le script réécrit à chaque fois.
Sécurité¶
| Variable | Défaut | Effet |
|---|---|---|
AUTH_JWT_SECRET |
à poser | Secret de signature des jetons. Propre à chaque installation. |
AUTH_TOKEN_EXPIRATION_HOURS |
24 |
Durée de validité d'une session. |
SPRINGDOC_ENABLED |
false en prod |
Active Swagger. Ces pages sont publiques quand elles sont activées. |
Fixez AUTH_JWT_SECRET dès l'installation, à une valeur longue, aléatoire et propre à
l'établissement : c'est elle qui signe les sessions, et deux serveurs qui la partagent acceptent
les jetons l'un de l'autre.
L'inscription publique reste ouverte : toute personne qui joint le serveur peut se créer un compte infirmier ou médecin. Seul le rôle ADMIN est refusé à l'inscription. Sur un réseau partagé, limitez l'accès au serveur au niveau du réseau.
Hôte et script¶
| Variable | Défaut | Effet |
|---|---|---|
CAUSE_HOME |
~/.cause |
Racine des données, figée dans .env par le script. |
CAUSE_VERSION |
la version livrée | Étiquette des images du backend et du frontend, tirées du registre. C'est la ligne que change une mise à jour applicative. |
CAUSE_MOTEURS |
la version du disque | Étiquette des images de Whisper et d'Ollama, que le disque apporte et que rien ne tire d'un registre. Elle ne change qu'avec un nouveau disque. |
CAUSE_NO_HOTSPOT |
non défini | Passe l'installation du hotspot Wi-Fi. |
CAUSE_WIFI_IFACE |
détection | Force l'interface Wi-Fi du hotspot. |
CAUSE_HOTSPOT_COUPE_MA_SESSION |
non défini | Lève le refus de reprendre l'interface qui porte la route par défaut ou la session SSH en cours. À n'utiliser que devant la machine : voir Hotspot Wi-Fi. |
VITE_ERUDA |
false |
Console de débogage mobile embarquée dans le frontend au build. |
Licence machine¶
Rien à configurer : la vérification de licence et les fichiers d'identité qu'elle lit sont écrits dans le programme, hors d'atteinte de toute variable. Voir La licence machine.