Aller au contenu

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/health ne 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.