soutenance/content/20_cahier_des_charges.md

367 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\newpage
# Cahier des charges
Dans le cadre d'une **formation, dans l'école DataScientest**, il a été
demandé à des équipes composées de 3 à 5 personnes de travailler sur un
**projet défini, cadré** et suivant un certain nombre de contraintes dont nous
allons parler ici.
Le cahier des charges a été la première réflexion sur le projet.
## Contexte
Commençons par le contexte du projet avec l'ensemble des intervenants et des
contraintes attenantes.
### Dans le cadre d'une formation
**[Datascientest]{#datascientest}** est une **école de formation** créée en
2017, située sur Paris et proposant **plus de 18 formations différentes**,
dont *Administrateur Système DevOps*.
Plusieurs formats de formation existent parmi **Bootcamp**, continu et en
alternance. **Ce projet est un exercice de fin de formation** proposé à tous
les élèves de la « cohorte » (équivalent d'une classe).
Plusieurs élèves se regroupent autour d'un projet auquel ils ont un **intérêt
commun**.
### L'équipe DevU42 {#devu42}
Le **groupe DevU42** s'est formé le **17 octobre 2024**. Il est composé de
**quatre étudiants** participant à la formation **Administrateur Système
DevOps** de lorganisme de formation [DataScientest](#datascientest).
Ses membres sont, par ordre alphabétique (prénom) :
* **Eliel MONCADA**
* **Hrubech HOMBESSA**
* **Julien SABIOLS**
* Olivier DOSSMANN
Ils interviennent sur le projet en qualité d**Administrateur Système DevOps**.
L'équipe a été supervisée et suivie par [**Jérémie Tarot** sous la
dénomination de **« Mentor »**]{#mentor}. Et ainsi en sera-t-il dans le
présent document.
### Organisation d'équipe
Pour s'organiser, l'équipe s'est doté de plusieurs outils et suivi quelques méthodologies.
#### Rapports hiérarchiques
Léquipe s'articule autour de membres ayant le **même degré de
responsabilités** et d'objectifs. Leur périmètre et leur champ d'action est
similaire qu'il s'agisse de déterminer les tickets à prendre en charge, les
axes de travail à rajouter au projet ou bien de nouveaux objectifs.
En cas de désaccord sur un sujet, une décision est prise à la majorité
votante, avec pour ultime recours lavis du [Mentor](#mentor).
#### Moyens de communication
La géolocalisation des membres de l'**équipe étant éparse**, plusieurs moyens
de communication **en ligne** ont été nécessaires, parmi :
* Canaux de **discussions sur [Slack](https://slack.com/intl/fr-fr/)** fournis
initialement par [Datascientest](#datascientest) :
* canal du projet - **sep24_bootcamp_devops** : favorise l'échange
entre [DevU42](#devu42) et le [Mentor](#mentor),
* canal d'équipe - **devu42** : pour les **discussions techniques**,
les choix décisifs et de la bonne humeur !
* Un nom de domaine, **devu42.fr**,
* Une boîte courriel, **<team@devu42.fr>** partagée pour la **gestion des
services**,
* [**Groupe DevU42 sur Gitlab**](https://gitlab.com/devu42/), un outil intégré
avec gestion d'équipe, gestion de projet, gestion de tickets, gestion de
tableau de bord (kanban), gestion de dépôts, gestion de paquets, etc.
* Un [**wiki**, DevU42 sur
Gitlab](https://gitlab.com/devu42/projet/-/wikis/home) (fourni par Gitlab)
permettant de rassembler les **connaissances de l'équipe** en un seul endroit,
* [**Framapad**](https://framapad.org/abc/fr/), un éditeur de **texte
collaboratif** pour les divers travaux de rédaction.
### Contraintes initiales
Deux principales contraintes initiales avaient été imposées dans le cadre de
la formation&nbsp;:
* le **budget**,
* le **temps**.
#### Budget
Le budget alloué au projet est de **150€ mensuel** pour couvrir l'intégralité
des frais issus de l'utilisation de **services Amazon** (AWS).
C'est une limite configurée par [Datascientest](#datascientest) sur l'espace
Amazon qu'ils nous partagent.
#### Temps
Le temps alloué pour réaliser ce projet avant un premier lancement officiel
est fixé à **7 semaines**.
Au terme des 7 semaines, un support visuel de présentation du projet pour son
lancement est attendu (Cf. [Section du présent chapitre sur les
Livrables](#livrables)).
Après livraison, lamélioration du projet est possible, bien qu'un dossier
professionnel, un dossier de projet (ci-présent) et un support de présentation
est demandé à chacun des [membres de l'équipe DevU42](#devu42).
## Le projet
Le point de départ du projet est un dépôt de version contenant une application
à mettre en ligne. Justification du projet, l'application elle-même, ambitions
et objectifs sont des points à soulever.
### Justification du projet
L'école de formation [DataScientest](#datascientest) s'évertue à proposer une
**situation proche de la réalité** afin que l'équipe nouvellement formée
puisse **apprendre par la pratique**.
On imagine facilement le cadre&nbsp;:
> Une entreprise ayant une application de gestion dutilisateur souhaite
> déployer et faire évoluer son service en favorisant les bonnes pratiques
> suivies dans la culture DevOps.
De la même manière, l'entreprise pourrait rencontrer de nombreux
**problèmes**&nbsp;:
* **Reprise dactivité** lente, coûteuse et avec pertes dinformations,
* Service instable, **disponibilité** non garantie, **vulnérabilité** du
service,
* Capacité limitée pour encaisser des **augmentations** ponctuelles de la
**charge** et du **trafic**,
* Absence de **supervision** et faible capacité à prévoir les problèmes,
* Manque de contrôle sur la **qualité du code**&nbsp;; procédures de
développement pouvant être améliorées par l'**automatisation**,
* Perte de temps et erreurs humaines liées aux actions manuelles,
* Manque de **portabilité de l'application** d'un système à l'autre,
* Lenteurs dimplémentation de **nouvelles fonctionnalités** avec
interruptions de service.
Pour bien saisir l'état des lieux de ladite application, regardons de plus
près.
### Application existante
L'**application FastAPI-Træfik** est fournie avec les éléments principaux
suivants&nbsp;:
* Backend utilisant le framework **FastAPI** (en Python),
* Frontend statique (en **React**, **Vite.js** et **Chakra UI**)&nbsp;:
Interface de gestion et d'enregistrement dutilisateurs utilisant l'API du
backend,
* Base de données **postgreSQL**,
* et **Traefik** (Proxy inverse).
Tout ceci est déposé dans un **dépôt de version** avec de la **documentation**
en fichier *Markdown* (*.md) bruts.
De simples fichiers **Docker** et **docker-compose.yml** permettent aux
développeurs de **lancer l'application localement**.
**Une procédure manuelle existe** pour expliquer comment mettre l'application
en production sur une machine serveur dédiée.
Mais **le projet voit plus loin**.
### Ambitions
En dehors des objectifs à atteindre, le projet vise à&nbsp;:
* répondre aux problématiques de lentreprise sur l'application existante par
**la méthode DevOps**,
* répondre aux attentes de lexamen en matière de compétences attendues
(méthode d'**apprentissage par la pratique**),
* démontrer un **savoir-faire technique** sur les sujets principaux du DevOps,
notamment vis à vis du Cloud **en utilisant AWS** (Amazon Web Services),
* appliquer une méthode de travail qui optimise lefficacité de la production
des livrables.
C'est de ces **ambitions** que naîssent plusieurs objectifs spécifiques.
### Objectifs
D'après moi, ce projet à plusieurs objectifs&nbsp;:
* balayer l'ensemble des **sujets liés à la culture DevOps et ses méthodes**,
* porter, puis **déployer** une application **sur le cloud**,
* préparer une **architecture complète** pour accueillir une à plusieurs
applications,
* respecter un **budget** et des **limites de temps**,
* **déployer en continu** un projet en passant par une phase de test, de
pré-production puis de production,
* penser à la **gestion de la donnée**,
* **superviser** un système déployé en production avec des tableaux de bord
efficaces,
* rendre un système **résilient** en prenant en compte les augmentations ET
les diminution de **charges** et par une **haute disponibilité**,
* **automatiser** la plupart des actions afin de **limiter les erreurs
humaines**,
* procéder, de manière automatique, à des vérifications sur **la sécurité**
des éléments produits et déployés,
* favoriser une **collaboration** plus fluide entre les équipes de
développements et les équipes d'opérations,
* et obtenir des **alertes** en cas de défaillance d'un ou plusieurs éléments
du système.
Ce sont des **objectifs plutôt ambitieux pour un temps aussi court**. Un
travail d'équipe et une organisation de cette dernière sont totalement
primordiaux.
## Planification
C'est par le [mentor](#mentor) que nous avons reçu le plan d'action pour les 7
semaines de travail à venir et une liste de livrables attendus. Nous avons
adapté ce plan d'action pour nous correspondre.
### Étapes de travail
Commençons par le détail de chaque étape. Pour les 7 semaines à venir.
#### Semaine 1&nbsp;: Cadrage
Sous le signe de l'**encadrement**, cette première semaine est dite « douce »&nbsp;:
* **réunion** de prise de contact, présentation et cadrage,
* introduction de chaque membre du projet,
* **découverte** de l'application,
* **analyse** du sujet,
* évaluation du contexte, des objectifs et du **périmètre** du projet,
* et **rédaction** du premier jet du présent **cahier des charges**.
Il faut ce temps pour découvrir de quoi il retourne.
#### Semaine 2&nbsp;: Planification
Vient ensuite une **phase d'organisation** avec&nbsp;:
* définition du contexte, des objectifs et du périmètre du projet,
* **organisation** des exigences,
* **identification des composants** d'architecture,
* choix de **solutions à implémenter**,
* et **définition de l'architecture** et les **spécifications** du système
cible.
Ce qui amène à **compléter le cahier des charges**.
Nous prévoyons aussi&nbsp;:
* une **configuration de Gitlab**, des principaux dépôts, des branches, etc.,
* de s'organiser en équipe&nbsp;: définir des **méthodologies** à suivre.
#### Semaine 3&nbsp;: Automatisation de la chaine dintégration et de livraison
Une fois les outils principaux mis en place, il s'agit d'**automatiser**
plusieurs parties&nbsp;:
* automatisation des **tests pour le backend et le frontend**,
* création d'**image Docker pour le backend**,
* création d'**image Docker pour le frontend**,
* automatisation des images Docker et de leur **publication sur des
registres d'images**,
* création de **chart Helm pour le backend**,
* création de **chart Helm pour le frontend**,
* automatisation de la création des chart Helm et de leur **publication sur
des registres d'images**,
* et **automatisation de la création de l'infrastructure** (même si elle n'est
pas encore clairement définie).
L'**adoption d'un workflow Git** pour la gestion des branches est la bienvenue.
#### Semaine 4&nbsp;: Conception de linfrastructure
Vient ensuite la création de la **couche basse de l'infrastructure**&nbsp;:
* **création d'un schéma** de la couche basse de l'infrastructure,
* description de cette infrastructure via des modules adaptés et en adoptant
l'**Infrastructure as Code (IaC)**,
* premiers **choix de solutions** pour le **stockage**, les **sauvegardes**,
la **supervision** et l'**environnement d'accueil** de l'application,
* activation des **certificats** Let's Encrypt,
* liaison avec le **nom de domaine**,
* et **mise à l'échelle automatique**.
Une semaine n'est pas suffisante pour traiter tous les sujets. En revanche
cela permet de les aborder et d'échanger sur ces derniers.
#### Semaine 5&nbsp;: Gestion des données
Possiblement en parallèle du [sujet de la semaine 6 sur l'Observabilité et des
alertes](#semaine6), la gestion des données est importante et passe par&nbsp;:
* créer et configurer des **ressources de stockage de données**,
* mise en place de **politique d'authentification** et d'autorisation,
* **import des données**,
* et installer/configurer une solution de **sauvegarde** et de **restauration
de données**.
C'est un sujet bien à part. D'où la possibilité de la **faire en parallèle**
d'un autre.
#### Semaine 6&nbsp;: Observabilité et alertes {#semaine6}
Quant à la semaine 6, nous avons **principalement la supervision** à
gérer&nbsp;:
* configuration du **système de supervision centralisé**,
* mise en place d'une **collecte** de surveillance **pertinente** pour
l'application,
* **choix des métriques** à utiliser pour la création de tableaux de bords,
* création des **tableaux de bords**,
* **définition des niveaux d'alertes** pour les métriques choisis,
* mise en place des **alertes**,
* et envoi des alertes sur **les canaux choisis**.
Ces éléments pourront être complétés et étendus une fois la solution
principale de supervision configurée.
#### Semaine 7&nbsp;: Présentation de la solution finale
Cette dernière semaine ciblera la **présentation et** le **lancement officiel
de l'application**. Il faudra donc&nbsp;:
* compléter les **documentations**,
* **mettre à jour les schémas** en fonction d'éventuels changements,
* préparer un **support visuel de présentation du projet**,
* veiller à ce que l'**application tourne sans accrocs** pour la présentation,
* et résoudre les derniers problèmes majeurs connus - s'ils existent.
C'est un **plan ambitieux** quand on considère que **les membres de l'équipe
proviennent d'horizons et de formations variées**.
### Livrables {#livrables}
Sont attendus les **livrables** suivants&nbsp;:
* un **cahier des charges**,
* une **présentation par diapositives** pour le lancement de l'application,
* une application **déployée en production**, sans bugs,
* un **système de supervision** de la production,
* une **gestion des données** avec un **système de sauvegarde**,
* un **schéma de la couche basse de l'infrastructure** utilisée dans le Cloud
pour la production,
* un **accès aux dépôts et scripts** permettant l'automatisation du
déploiement de l'application et de la génération des différents éléments
(images Docker, Chart Helm, registres, etc.),
* et un **fonctionnement en haute disponibilité** de l'application.
## Conclusion
Le projet **couvre beaucoup de situations** et **domaines** autour de
**l'automatisation** et la **mise en production**, dans le Cloud, d'une
application avec une **supervision** et une **mise à l'échelle** de cette
dernière.
En groupe, c'est un projet idéal pour suivre l'« **apprentissage par la
pratique** » proposé par [DataScientest](#datascientest) et couvrir un maximum
de compétences demandées pour le *Titre Professionnel d'Administrateur
Système* DevOps.