# Backend - Serveur

## Serveur de base (NodeJS/Express)

Beaucoup de logique et de fichiers ont été déplacés vers le `"/backend"`  dossier pour faciliter leur exécution à distance, en particulier lorsqu'ils utilisent la gestion de fichiers locale ou démarrent des serveurs par exemple.

Le **Express** serveur agit comme point d'entrée pour gérer et garder les autres serveurs sous contrôle. Il peut se trouver dans le `backend/ExpressServer.mjs` fichier, qui contient sa logique de démarrage ainsi que ses [points de terminaison pour les requêtes](https://medomicslab.gitbook.io/medomics-docs/v1-fr/tutorials/medomics-a-distance/developpement/backend-serveur/points-de-terminaison-express-request).

## Contrôle CLI / sans interface

Dans le `cli` dossier, le `medomics-server.mjs` fichier permet l'utilisation du serveur Express dans des déploiements distants via la ligne de commande, que le client utilise pour démarrer et arrêter un backend distant. Il expose les commandes start, status, ensure, install et stop du serveur et aide à gérer l'état du processus backend.

| Commande | But principal                                                                   | Préconditions                                                                          | Actions internes                                                                                                                                                                           | Appels d'endpoint du backend                                                                                                                | État/Fichiers modifiés                                                   | Sortie en cas de succès                            | Comportement en cas d'échec/sortie                                                                                                  |
| -------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| start    | Lancer le processus enfant du backend Express et enregistrer l'état d'exécution | Le chemin d'entrée Express doit se résoudre et exister                                 | Résout le chemin du backend, écrit un état de démarrage provisoire, crée un processus enfant, suit stdout/stderr, attend le message IPC EXPRESS\_PORT, définit l'état en cours d'exécution | Aucun directement ; le backend enfant se lance lui-même                                                                                     | Écrit un fichier d'état et server-child.log sous le répertoire d'état    | Ligne JSON avec success true et expressPort        | Se termine avec un code non nul si le chemin est manquant, si l'enfant se termine prématurément ou si le démarrage dépasse le délai |
| status   | Interroger l'instantané du statut actuel du backend                             | Le fichier d'état doit exister et inclure expressPort                                  | Lit le fichier d'état, effectue un GET HTTP vers la route de statut du backend                                                                                                             | GET /status                                                                                                                                 | Aucune écriture en chemin normal                                         | JSON avec pid, expressPort, charge utile de statut | Se termine avec un code non nul si l'état est manquant ou si la requête de statut HTTP échoue                                       |
| ensure   | S'assurer idempotemment que les services sélectionnés sont actifs               | Le fichier d'état doit contenir expressPort ; les indicateurs indiquent quels services | Lit l'état, appelle conditionnellement les endpoints d'ensure des services                                                                                                                 | POST /ensure-go, POST /ensure-mongo, POST /ensure-jupyter                                                                                   | Pas de mises à jour directes du fichier d'état dans le CLI               | JSON avec un objet ensured par service sélectionné | Se termine avec un code non nul si l'état est manquant ou si un appel ensure lève une exception                                     |
| install  | Installer les exigences d'exécution manquantes via l'API backend                | Express doit être en cours d'exécution ou démarrable                                   | Démarre automatiquement si nécessaire, vérifie les exigences, installe conditionnellement Mongo/environnement Python/paquets Python en utilisant des heuristiques, revérifie les exigences | GET /check-requirements, POST /install-mongo, POST /install-bundled-python, POST /install-required-python-packages, GET /check-requirements | Peut mettre à jour l'état s'il démarre automatiquement d'abord           | Résumé JSON avec initial, actions, final           | Se termine avec un code non nul en cas d'échec de toute étape de vérification/installation                                          |
| stop     | Arrêter le processus backend enregistré dans le fichier d'état                  | Fichier d'état contenant pid                                                           | Vérifie si le pid est vivant, envoie SIGTERM, attend, escalade SIGKILL en cas de délai, supprime l'état obsolète                                                                           | Aucun                                                                                                                                       | Supprime le fichier d'état lorsque le processus s'arrête ou est obsolète | JSON succès avec résultat stopped ou forced        | Se termine avec un code non nul lorsqu'il n'y a pas d'état en cours ; peut rapporter forced false si le kill échoue                 |

## Modules utilitaires backend

Quelques fichiers auparavant frontend ont été déplacés vers le `backend/utils` dossier et modifiés pour exclure toute utilisation d'Electron.

* `server.mjs`: Précédemment *server.js* dans le frontend, est toujours utilisé pour exécuter et gérer le serveur GO, mais dispose aussi de l' `findAvailablePort()` helper.
* `serverInstallation.js`: Précédemment *installation.js* dans le frontend, utilisé pour vérifier les exigences du serveur (MongoDB et Python) et installer MongoDB.
* `serverPathUtils.js`: Remplacement pour `app.getPath()` et `app.setPath()` fonctions.
* `serverWorkspace.js`: Précédemment *workspace.js* dans le frontend, utilisé pour créer un espace de travail et ses dossiers.
* `mongoDBServer.js` *(NOUVEAU)*: Logique de détection/démarrage/arrêt/chemin de MongoDB utilisée par les endpoints du backend.
* `jupyterServer.js` *(NOUVEAU)*: Logique de détection/démarrage/arrêt de Jupyter utilisée par les endpoints du backend.
* `pythonEnv.js`: Aides pour la configuration/vérification de l'environnement Python pour les flux de travail gérés par le backend. Était auparavant dans le frontend, et a été ajusté pour ne plus utiliser les dépendances d'Electron.
* `medomics.server.dev.js`: Support d'entrée/assistant serveur backend en mode développement, une copie de `medomics.dev.js` pour utilisation dans les autres assistants backend.

## Intégration au service OS

Le `/service` le dossier contient des fichiers spécifiques au système d'exploitation pour exécuter le backend en tant que service, cela n'a pas encore été testé.
