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ément | Prêt'Matos |
|---|---|
| Équipe | Nadia 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) |
| Application | API 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ébergement | VM srv-pretmatos (VM 130, Debian 13, 192.168.21.130, VLAN 21 APPLIS), quatre conteneurs derrière un reverse proxy Caddy |
| Recette | VM srv-recette (192.168.21.186), même fichier Compose, données fictives, faux serveur de courriel |
| Utilisateurs | 14 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 | Étape | Livrable |
|---|---|---|
| J−25 | Fiche service validée par Nadia, architecture et matrice des flux validées par Antoine | Fiche service, dossier d'architecture |
| J−20 à J−12 | Préparation de srv-pretmatos et des prérequis ; demande de changement saisie | Liste des prérequis remplie, demande de changement |
| J−14 (lundi) | Annonce aux salariés | Courriel de Nadia |
| J−13 | Tests d'intégration sur srv-recette | Résultats I-01 à I-12 |
| J−12 à J−10 | Recette, deux tours | Cahier de recette exécuté, fiches d'anomalies |
| J−7 | Rapport de test et procès-verbal | Rapport, PV avec une réserve |
| J−5 | Formation des référents et de la logistique | Guide utilisateur, guide logistique |
| J−4 | Réunion go/no-go | Décision écrite |
| J−3 (vendredi) | Briefing du support, rappel aux salariés, gel du tableur à 17 h | Articles de base de connaissances, courriel de rappel |
| J−2 (samedi) | Mise en production | Journal de mise en production |
| J (lundi) | Mise en service, démonstration | Fiche réflexe, courriel d'ouverture |
| J à J+11 | Support renforcé | Tickets, points quotidiens |
| J+18 | Enquête de satisfaction | Résultats |
| J+30 | Bilan et passage en exploitation | Bilan 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 :
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 :
/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) :
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 | Échec | Cause | Correction |
|---|---|---|---|
| I-06 | Une connexion sur deux échoue, avec « service d'authentification injoignable » dans le journal de l'API | Le 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ées | Règle F3 étendue à l'alias SRV_DC, qui contient les deux contrôleurs ; test refait dix fois de suite |
| I-11 | Page inaccessible depuis le VPN des commerciaux, alors que la règle F2 est en place | Le serveur OpenVPN ne poussait que la route 192.168.10.0/24 : les portables envoyaient vers 192.168.21.130 par leur connexion Internet | 192.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 :
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 :
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 :
sudo docker compose run --rm -v /srv/pretmatos/import:/import:ro api \
npm run import -- --essai /import
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 :
./tests-fumee.sh https://pretmatos.ad.sorbier.example
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 :
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 »
- Se connecter : ton identifiant et ton mot de passe Windows.
- Réserver : Nouvelle réservation, le type de matériel, tes dates (15 jours au plus), Réserver.
- Retrouver ou annuler : Mes réservations.
- 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 :
| Sujet | VM dans le labo | PaaS |
|---|---|---|
| Hébergement | VM, Docker, mises à jour du système : à ta charge | Géré par la plateforme ; tu choisis la taille et le nombre d'instances |
| Base de données | Conteneur MySQL, sauvegardé par ton script | Base gérée en option, sauvegardée par la plateforme ; garde quand même un export régulier chez toi |
| Exposition | Réseau interne, filtré par pfSense | Sur Internet : chaque faille est exposée au monde entier |
| Connexion des salariés | LDAPS vers l'annuaire interne | L'annuaire interne n'est pas joignable : connexion par un fournisseur d'identité en ligne (OpenID Connect), avec double authentification |
| Courriels | Relais interne srv-intranet | Un service d'envoi de courriels authentifié |
| Recette | srv-recette | Une seconde application sur la plateforme, avec ses propres variables et sa propre base |
| Déploiement | Script ou pipeline vers la VM | Un git push ou une image poussée déclenche le déploiement ; retour à la version précédente en un clic |
| Contrat et RGPD | Données dans la salle serveur de Sorbier | La plateforme est un sous-traitant au sens du RGPD (les sous-traitants) : contrat, lieu d'hébergement, sécurité à vérifier |
| Coût | Matériel et temps d'administration | Abonnement 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 :
| Preuve | Indicateur de l'E5 |
|---|---|
| Liste des tests d'intégration avec leurs résultats ; cahier de recette exécuté ; fiches d'anomalies | Des 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 recette | Un rapport de test est produit |
| Fiche réflexe, guide utilisateur, articles de base de connaissances | Un support d'information est disponible |
| Plan d'accompagnement, annonce, support de la démonstration | Les 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 satisfaction | Le 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.
- Quel principe du chapitre 3 a été respecté, et lequel a été pris en défaut ?
- Quel test d'intégration ajouter pour la prochaine fois ?
Voir la réponseMasquer la réponse de l'exercice 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.
- Ajouter aux tests d'intégration un cas « ouvrir
http://…redirige vershttps://…», 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.
- Peut-on revenir à l'instantané
avant-1-0-0? Pourquoi ? - Que proposes-tu ?
Voir la réponseMasquer la réponse de l'exercice 2
- 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.
- 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
- 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.
- 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.
- 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.
- 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é ?