Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 818 minIntermédiaire

Cas SLAM corrigé : mettre en production une application web

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • suivre toute la mise en service d'une application web ;
  • relier chaque document produit à une étape et à une preuve ;
  • adapter la démarche à un hébergement PaaS.

3 exercices corrigés

Ce chapitre déroule de bout en bout la mise à disposition d'une application web interne : Prêt'Matos, l'application de prêt de matériel de Sorbier Logistique, écrite en Node.js et React avec une base MySQL, hébergée dans une machine virtuelle du labo. Chaque étape renvoie au chapitre qui en donne la méthode et montre ce qui a été produit : commandes, documents, résultats. C'est le type de réalisation que tu peux présenter à l'E5 si tu as participé à la mise en service d'une application, en stage ou en atelier.

Le contexte

La logistique de Sorbier prête aux salariés 24 matériels : des ordinateurs portables, un vidéoprojecteur, des casques et des webcams. Jusqu'ici, les demandes arrivent par courriel à Nadia Faure, la responsable logistique, et un intérimaire les note dans un tableur. Il part à la fin du mois : l'application doit être en service avant.

ÉlémentPrêt'Matos
ÉquipeNadia Faure (MOA, propriétaire du service) ; Lina et Yanis, alternants SLAM (développement) ; Moussa Diallo (hébergement) ; Chloé Lambert (support) ; Antoine Mercier (responsable SI, autorité de changement)
ApplicationAPI Node.js 24 avec Express 5, interface React 19, base MySQL 8.4 ; code dans le dépôt sorbier-logistique/pretmatos ; images construites par GitHub Actions
HébergementVM srv-pretmatos (VM 130, Debian 13, 192.168.21.130, VLAN 21 APPLIS), quatre conteneurs derrière un reverse proxy Caddy
RecetteVM srv-recette (192.168.21.186), même fichier Compose, données fictives, faux serveur de courriel
Utilisateurs14 salariés ; deux référents, Julie et Karim

La fiche service complète est au chapitre 1, l'architecture, les dépendances et la matrice des flux au chapitre 2.

Le planning

QuandÉtapeLivrable
J−25Fiche service validée par Nadia, architecture et matrice des flux validées par AntoineFiche service, dossier d'architecture
J−20 à J−12Préparation de srv-pretmatos et des prérequis ; demande de changement saisieListe des prérequis remplie, demande de changement
J−14 (lundi)Annonce aux salariésCourriel de Nadia
J−13Tests d'intégration sur srv-recetteRésultats I-01 à I-12
J−12 à J−10Recette, deux toursCahier de recette exécuté, fiches d'anomalies
J−7Rapport de test et procès-verbalRapport, PV avec une réserve
J−5Formation des référents et de la logistiqueGuide utilisateur, guide logistique
J−4Réunion go/no-goDécision écrite
J−3 (vendredi)Briefing du support, rappel aux salariés, gel du tableur à 17 hArticles de base de connaissances, courriel de rappel
J−2 (samedi)Mise en productionJournal de mise en production
J (lundi)Mise en service, démonstrationFiche réflexe, courriel d'ouverture
J à J+11Support renforcéTickets, points quotidiens
J+18Enquête de satisfactionRésultats
J+30Bilan et passage en exploitationBilan de mise en service

Préparer l'hébergement

Moussa crée srv-pretmatos en clonant le modèle Debian 13 de l'hyperviseur, avec cloud-init pour l'adresse et la clé SSH (modèles, clones et cloud-init), puis installe Docker Engine et Compose (installer Docker). Chloé enregistre le serveur et l'alias du service dans le DNS de l'annuaire, depuis un contrôleur de domaine :

powershell
Add-DnsServerResourceRecordA -ZoneName "ad.sorbier.example" -Name "srv-pretmatos" `
    -IPv4Address "192.168.21.130"
Add-DnsServerResourceRecordCName -ZoneName "ad.sorbier.example" -Name "pretmatos" `
    -HostNameAlias "srv-pretmatos.ad.sorbier.example"

Les utilisateurs taperont le nom du service, pretmatos, et non celui du serveur : le jour où l'application change de machine, seul l'alias change.

Le dossier du service sur le serveur :

text
/srv/pretmatos/
├── compose.yaml        # versionné dans le dépôt, identique en recette et en production
├── Caddyfile           # versionné : HTTPS, routage de /api vers l'API
├── .env                # VERSION=1.0.0 et les réglages propres à la production
├── certs/              # certificat du service émis par Sorbier-AC, sa clé privée (droits 600), racine de Sorbier-AC
├── secrets/            # mots de passe de la base et du compte svc-pretmatos (droits 600)
├── import/             # fichiers de reprise du tableur, supprimés après la bascule
└── tests-fumee.sh      # le script du chapitre 5

Le fichier .env de production ne contient que de la configuration ; les secrets sont des fichiers montés dans les conteneurs (les secrets dans Compose) :

text
VERSION=1.0.0
URL_PUBLIQUE=https://pretmatos.ad.sorbier.example
LDAP_URL=ldaps://ad.sorbier.example
LDAP_BIND_DN=svc-pretmatos@ad.sorbier.example
GROUPE_UTILISATEURS=GG-PretMatos-Utilisateurs
GROUPE_LOGISTIQUE=GG-PretMatos-Logistique
SMTP_HOST=192.168.21.10
SMTP_PORT=25
LOG_LEVEL=info

L'adresse de l'annuaire est le nom du domaine, ad.sorbier.example, que le DNS résout vers les deux contrôleurs : si l'un tombe, l'application utilise l'autre. Avec srv-ad seul, la redondance de l'annuaire ne servirait à rien (chapitre 2). Le conteneur api reçoit aussi la racine de Sorbier-AC, désignée par la variable NODE_EXTRA_CA_CERTS du fichier Compose : par défaut, Node.js n'utilise pas le magasin de certificats du système, et la connexion LDAPS échouerait sur un certificat inconnu.

Enfin, Moussa ajoute sur pfSense les règles des flux F1 à F4 et F6 à F9 de la matrice, chacune dans l'onglet de l'interface d'entrée de sa source (POSTES pour F1, OpenVPN pour F2, SERVEURS pour F7, APPLIS pour les autres), avec une description qui cite le numéro du flux ; F5 reste dans le VLAN 21 et F10 est déjà couvert par la règle du bastion (écrire les règles du pare-feu).

La recette

Les tests d'intégration I-01 à I-12 du chapitre 4 sont passés sur srv-recette, puis rejoués sur srv-pretmatos avant la bascule pour ceux qui dépendent de l'environnement (DNS, certificat, flux, annuaire, relais). Deux ont échoué la première fois :

TestÉchecCauseCorrection
I-06Une connexion sur deux échoue, avec « service d'authentification injoignable » dans le journal de l'APILe nom ad.sorbier.example se résout tour à tour vers les deux contrôleurs, mais la règle F3 ne visait que srv-ad : les requêtes vers srv-ad2 étaient bloquéesRègle F3 étendue à l'alias SRV_DC, qui contient les deux contrôleurs ; test refait dix fois de suite
I-11Page inaccessible depuis le VPN des commerciaux, alors que la règle F2 est en placeLe serveur OpenVPN ne poussait que la route 192.168.10.0/24 : les portables envoyaient vers 192.168.21.130 par leur connexion Internet192.168.21.0/24 ajouté aux réseaux locaux (IPv4 Local Network) du serveur OpenVPN, test refait depuis un portable reconnecté au VPN pour recevoir la nouvelle route

La recette par Nadia, Julie et Karim a suivi le cahier de recette du chapitre 4 : deux tours, trois anomalies, une réserve mineure (A-05, le format des dates de l'export). Le rapport de test et le procès-verbal, signés à J−7, sont ceux du chapitre 4.

La mise en production

Le samedi matin, Moussa et Yanis déroulent le plan de déploiement du chapitre 3, en tenant le journal. D'abord l'instantané de la VM, depuis l'hyperviseur, qui servira de retour arrière :

bash
qm snapshot 130 avant-1-0-0 --description "Avant la mise en production de Prêt'Matos 1.0.0"

Puis le déploiement, sur srv-pretmatos :

bash
cd /srv/pretmatos
grep '^VERSION=' .env                     # VERSION=1.0.0, la version recettée
sudo docker compose config --quiet && echo valide
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps                    # bdd healthy, proxy, front et api running

La base est créée vide au premier démarrage, avec son schéma. Yanis lance ensuite la reprise du tableur, d'abord en mode essai, avec le script d'import versionné dans le dépôt. Le dossier import/ est monté en lecture seule dans un conteneur temporaire de l'API :

bash
sudo docker compose run --rm -v /srv/pretmatos/import:/import:ro api \
    npm run import -- --essai /import
text
Catalogue : 26 lignes lues, 2 doublons ignorés, 24 matériels à importer
Réservations à venir : 19 lignes lues, 2 dates passées ignorées, 17 à importer
Prêts en cours : 5 à importer
Mode essai : rien n'a été écrit dans la base.

Les chiffres sont ceux qu'on attendait (préparés et vérifiés deux fois en recette). Yanis relance la commande sans --essai, puis contrôle la base avec la requête du chapitre 5 : 24, 17 et 5. Lina lance les tests de fumée :

bash
./tests-fumee.sh https://pretmatos.ad.sorbier.example
text
OK  page d'accueil
OK  route de santé de l'API
KO  redirection HTTP vers HTTPS
OK  certificat valable 30 jours
Tests de fumée : 1 échec(s). Ne pas ouvrir le service.

Le port 80 n'était pas publié par le conteneur proxy : la ligne avait été retirée du fichier Compose de recette, où personne ne tapait l'adresse en HTTP. Lina corrige compose.yaml dans le dépôt, Moussa récupère le fichier et redémarre le seul proxy, puis les tests de fumée passent à 4 sur 4. Lina vérifie à la main la connexion avec un compte réel, la création et l'annulation d'une réservation de test, et un rappel de test reçu dans sa boîte. Nadia compare son planning de la semaine avec le tableur : identique. À 11 h 15, Antoine décide go : le service est conservé, l'ouverture aura lieu lundi.

Les fichiers de reprise sont supprimés du dossier import/ : ils contiennent des noms de salariés et n'ont plus d'utilité. Le tableur, lui, reste archivé en lecture seule sur srv-partages.

La sauvegarde et la supervision

La sauvegarde de la base est faite chaque nuit par mysqldump dans le conteneur bdd, puis copiée sur le partage NFS de srv-partages, monté sur /mnt/sauvegardes :

bash
sudo docker compose -f /srv/pretmatos/compose.yaml exec -T bdd \
    sh -c 'exec mysqldump --single-transaction -u root -p"$(cat /run/secrets/db_root_password)" pretmatos' \
    | gzip > "/mnt/sauvegardes/pretmatos-$(date +%F).sql.gz"

La commande est placée dans un script lancé chaque nuit par un minuteur systemd, et la restauration a été testée sur srv-recette avant la mise en production (sauvegarder une base MySQL). Côté supervision, Moussa a ajouté l'hôte dans Zabbix avec l'agent 2, un scénario web sur la page de connexion et la route de santé, et un élément sur la date d'expiration du certificat ; l'agent Wazuh envoie les journaux du serveur à srv-journaux (chapitre 7).

L'ouverture et l'accompagnement

Le plan d'accompagnement du chapitre 6 est déroulé :

  • J−14 : l'annonce de Nadia ;
  • J−5 : un atelier d'une heure pour Julie et Karim sur srv-recette, une heure pour Nadia sur les écrans de la logistique ;
  • J−3 (vendredi) : briefing de Chloé, quatre articles de base de connaissances, la catégorie « Prêt de matériel » dans GLPI ; le rappel aux salariés, avec la fiche réflexe en pièce jointe ; un favori « Prêt de matériel » déployé dans Edge par la stratégie de groupe des postes (la stratégie Edge des favoris gérés, ManagedFavorites) ;
  • J, 9 h : une démonstration de 10 minutes à la réunion d'équipe, puis Yanis passe à la logistique ;
  • J à J+11 : support renforcé, point quotidien à 9 h.

La fiche réflexe, une page affichée près de la logistique et envoyée à tous :

Prêt'Matos en 4 gestes — pretmatos.ad.sorbier.example, ou le favori « Prêt de matériel »

  1. Se connecter : ton identifiant et ton mot de passe Windows.
  2. Réserver : Nouvelle réservation, le type de matériel, tes dates (15 jours au plus), Réserver.
  3. Retrouver ou annuler : Mes réservations.
  4. Rendre : rapporte le matériel à la logistique avant la date de retour ; un rappel arrive la veille.

Un souci ? GLPI, catégorie « Prêt de matériel », ou demande à Julie ou à Karim.

Le suivi et le bilan

Les chiffres du premier mois sont ceux du chapitre 7 : 99,70 % de disponibilité sur la plage de service, 90,2 % des réservations faites par les salariés eux-mêmes, 22 tickets dont 11 la première semaine, une satisfaction de 83,3 %. Le support renforcé s'arrête comme prévu à J+11, la réserve A-05 levée (corrigée en version 1.0.1 à J+9, déployée cette fois par le script et le pipeline) ; le bilan à J+30 transfère le service à l'exploitation. La première demande d'évolution, prolonger un prêt, part au backlog : elle deviendra la version 1.5, avec sa propre recette (le cahier de recette de la prolongation).

Variante : héberger sur un PaaS

Une plateforme d'hébergement d'applications (PaaS, Platform as a Service) exécute l'application sans que tu administres de serveur : tu lui confies le code ou l'image, elle fournit l'HTTPS, le nom, la base de données gérée, les journaux et le redémarrage. Scalingo et Clever Cloud sont deux plateformes françaises, qui proposent un hébergement des données en France. Pour Prêt'Matos, la démarche reste la même ; ce qui change :

SujetVM dans le laboPaaS
HébergementVM, Docker, mises à jour du système : à ta chargeGéré par la plateforme ; tu choisis la taille et le nombre d'instances
Base de donnéesConteneur MySQL, sauvegardé par ton scriptBase gérée en option, sauvegardée par la plateforme ; garde quand même un export régulier chez toi
ExpositionRéseau interne, filtré par pfSenseSur Internet : chaque faille est exposée au monde entier
Connexion des salariésLDAPS vers l'annuaire interneL'annuaire interne n'est pas joignable : connexion par un fournisseur d'identité en ligne (OpenID Connect), avec double authentification
CourrielsRelais interne srv-intranetUn service d'envoi de courriels authentifié
Recettesrv-recetteUne seconde application sur la plateforme, avec ses propres variables et sa propre base
DéploiementScript ou pipeline vers la VMUn git push ou une image poussée déclenche le déploiement ; retour à la version précédente en un clic
Contrat et RGPDDonnées dans la salle serveur de SorbierLa plateforme est un sous-traitant au sens du RGPD (les sous-traitants) : contrat, lieu d'hébergement, sécurité à vérifier
CoûtMatériel et temps d'administrationAbonnement mensuel, selon la taille

Le choix dépend du besoin : une application interne réservée aux salariés, qui s'appuie sur l'annuaire, reste naturellement dans le réseau de l'entreprise ; une application ouverte à des clients ou à des partenaires extérieurs gagne à être hébergée sur une plateforme. Le cours Cloud compare les modèles d'hébergement, et le TP Déployer et héberger sur un VPS ou un PaaS te fait déployer une application Node.js de bout en bout.

Les preuves pour l'E5

Ce cas donne une réalisation complète pour la compétence « Mettre à disposition des utilisateurs un service informatique ». Les preuves à garder, et l'indicateur que chacune démontre :

PreuveIndicateur de l'E5
Liste des tests d'intégration avec leurs résultats ; cahier de recette exécuté ; fiches d'anomaliesDes tests pertinents d'intégration et d'acceptation sont rédigés et effectués ; les outils de test sont utilisés correctement
Rapport de test, procès-verbal de recetteUn rapport de test est produit
Fiche réflexe, guide utilisateur, articles de base de connaissancesUn support d'information est disponible
Plan d'accompagnement, annonce, support de la démonstrationLes modalités d'accompagnement sont définies
Plan de déploiement, journal de mise en production, tests de fumée, bilan avec les indicateurs et l'enquête de satisfactionLe service déployé est opérationnel et donne satisfaction à l'utilisateur

Dans ton portfolio, dis précisément ce qui était à toi : « j'ai écrit le cahier de recette et le script d'import, j'ai animé l'atelier des référents » vaut mieux que « nous avons déployé Prêt'Matos ». Le chapitre 10 montre comment la présenter.

Exercices

Exercice 1 sur 3 L'erreur de la recette Réussi À revoir

Le port 80 manquait en production parce qu'il avait été retiré du fichier Compose de recette.

  1. Quel principe du chapitre 3 a été respecté, et lequel a été pris en défaut ?
  2. Quel test d'intégration ajouter pour la prochaine fois ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. Le principe « même fichier Compose en recette et en production » a été respecté : c'est justement pour cela que l'erreur a été reproduite en production. Ce qui a manqué, c'est un test de la redirection dans la recette : personne ne tapait l'adresse en HTTP, donc personne ne l'a vu. Les tests de fumée l'ont détecté avant l'ouverture : c'est leur rôle.
  2. Ajouter aux tests d'intégration un cas « ouvrir http://… redirige vers https://… », et le garder dans les tests de fumée. Le bilan le note dans ses enseignements.

Tu avais trouvé ?

Exercice 2 sur 3 Un retour arrière le lundi à 10 h Réussi À revoir

Lundi à 10 h, deux heures après l'ouverture, une anomalie bloquante apparaît : la logistique ne peut plus enregistrer les sorties. Douze réservations ont été faites depuis 8 h.

  1. Peut-on revenir à l'instantané avant-1-0-0 ? Pourquoi ?
  2. Que proposes-tu ?
Voir la réponseMasquer la réponse de l'exercice 2
  1. Non, pas sans dégâts : l'instantané a été pris samedi avant le déploiement ; y revenir effacerait l'application, mais aussi les douze réservations saisies par les salariés. On a passé le point de non-retour.
  2. Contourner, puis corriger en avant. Contournement immédiat : la logistique note les sorties sur papier pendant quelques heures ; le support prévient Nadia. Correction : Lina et Yanis reproduisent l'anomalie en recette, corrigent, rejouent les cas R-04, R-06 et R-07, puis déploient une version 1.0.1 par le script, avec ses tests de fumée. Si la correction tardait, Antoine pourrait décider de rouvrir le tableur et de recopier les réservations : c'est le retour arrière « après le point de non-retour », coûteux, qu'on n'emploie qu'en dernier recours.

Tu avais trouvé ?

Exercice 3 sur 3 Passer au PaaS Réussi À revoir

La direction propose d'ouvrir Prêt'Matos aux chauffeurs sous-traitants, qui empruntent parfois des terminaux de scan, et d'héberger l'application sur une plateforme française. Liste quatre conséquences sur la mise à disposition.

Voir la réponseMasquer la réponse de l'exercice 3
  1. L'authentification : les sous-traitants n'ont pas de compte dans l'annuaire, et l'annuaire n'est pas joignable depuis la plateforme. Il faut un fournisseur d'identité en ligne ou des comptes propres à l'application, avec double authentification.
  2. La sécurité : l'application est exposée sur Internet. Tests de sécurité renforcés (droits, injections, en-têtes), mises à jour suivies de près, supervision de l'extérieur.
  3. Le RGPD : la plateforme devient sous-traitante (contrat, lieu d'hébergement), et le traitement concerne désormais des personnes extérieures à l'entreprise, à informer aussi.
  4. L'accompagnement : un nouveau public, qui ne vient pas à la réunion d'équipe ; une fiche réflexe et une aide adaptées, un canal de support pour des personnes qui n'ont pas accès à GLPI.

On peut ajouter la reprise de la base vers la base gérée, la nouvelle recette sur une application de test de la plateforme, et le coût de l'abonnement.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Cas SISR corrigé : mettre GLPI à disposition des utilisateursRevoir le sommaire du cours