L'API Produits gère les informations relatives aux produits et permet leur création, modification, et suppression. Elle est conçue pour interagir avec les API Clients et Commandes pour obtenir ou transmettre des informations produit et utilise RabbitMQ pour une communication asynchrone entre services.
- Python 3.9+
- Docker et Docker Compose installés
- RabbitMQ en cours d'exécution avec le réseau Docker partagé
backend(se référer à la documentation) - MongoDB comme base de données, avec un fichier d'initialisation
init.jspour créer un utilisateur et une base de données spécifique (products_db) - Fichier
.envcorrectement configuré avec les variables suivantes :
MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=adminpassword
MONGO_DB=products_db
MONGO_USER=products
MONGO_PASSWORD=apiProducts
MONGO_HOST=db
MONGO_PORT=27017
API_HOST=0.0.0.0
API_PORT=8001
RABBITMQ_HOST=rabbitmq
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest
git clone https://github.com/Cortexico/MSPR-API-Produits.gitdocker network create backendIl est recommandé d'utiliser un environnement virtuel pour isoler les dépendances.
-
Sur Windows : Création de l'environnement virtuel:
python -m venv venv
Lancement de l'environnement virtuel:
venv\Scripts\activate
-
Sur macOS/Linux :
Création de l'environnement virtuel:
python3 -m venv venv
Lancement de l'environnement virtuel:
source venv\Scripts\activate
pip install -r requirements.txtdocker-compose up --builddocker-compose down -vLancer le serveur MongoDB avec le fichier d'initialisation init.js pour créer l'utilisateur et configurer la base de données products_db :
mongo --port 27017 < mongo-init/init.jsuvicorn app.main:app --host ${API_HOST} --port ${API_PORT}-
GET /products : Récupère la liste des produits.
- Réponse : JSON array contenant les informations de chaque produit.
-
POST /products : Crée un nouveau produit.
- Corps : JSON contenant
name,description,price, etstock. - Réponse : Confirmation de création avec les détails du produit ajouté.
- Corps : JSON contenant
-
GET /products/{id} : Récupère les détails d’un produit spécifique.
- Paramètre :
iddu produit. - Réponse : Détails du produit en JSON.
- Paramètre :
-
PUT /products/{id} : Met à jour les informations d’un produit.
- Corps : JSON avec les champs à mettre à jour.
- Réponse : Détails mis à jour du produit.
-
DELETE /products/{id} : Supprime un produit.
- Paramètre :
iddu produit. - Réponse : Confirmation de suppression.
- Paramètre :
L'API utilise RabbitMQ pour publier et consommer des messages relatifs aux produits.
- Publisher : Envoie des notifications lors de la création ou modification de produits.
- Consumer : Reçoit des messages des autres API (Clients et Commandes) pour vérifier les informations pertinentes.
- Sécurité : Assurez-vous que le fichier
.envcontient des identifiants forts pour les bases de données et RabbitMQ. - Mode debug : Utilisez
uvicornen mode--reloadpour un développement plus rapide en local. - Surveillance MongoDB : Utilisez MongoDB Compass ou un autre client MongoDB pour surveiller la base de données
products_db.
L'intégration continue et le déploiement continu (CI/CD) sont configurés via GitHub Actions pour automatiser les tests, les vérifications de code et le déploiement de l’API Produits. Cette configuration permet de garantir la qualité du code et de faciliter les déploiements.
Le fichier de workflow GitHub Actions .github/workflows/ci.yml définit les étapes principales du pipeline CI/CD :
- Déclencheur : Le workflow est configuré pour s'exécuter sur chaque
pushoupull requestvers la branche principale et pour toute nouvelle branche. - Environnements de test : Le fichier
ci.ymlinstalle les dépendances nécessaires, configure les variables d'environnement, et utilise une base de données de test MongoDB pour valider les fonctionnalités.
-
Configurer l'environnement :
- Le workflow utilise une image de conteneur pour configurer l’environnement Python et MongoDB.
- Installe les dépendances listées dans
requirements.txtet configure MongoDB en utilisant les variables d’environnement définies dans le fichier.env.
-
Lancer les tests unitaires :
- Les tests unitaires sont exécutés via
pytestpour valider le fonctionnement de chaque endpoint de l’API. - Les tests se trouvent dans le répertoire
tests/, comprenant :test_create_product.py: Vérifie la création d'un produit.test_delete_product.py: Vérifie la suppression d'un produit.test_get_product.pyettest_get_products.py: Valident les opérations de récupération de produits.test_update_product.py: Vérifie la mise à jour d'un produit.
- Les tests unitaires sont exécutés via
-
Vérifications de code :
- Le workflow utilise
flake8pour analyser la qualité et le formatage du code. - Tout échec de style ou de format déclenchera un échec de pipeline, ce qui permet de garantir un code propre et cohérent.
- Le workflow utilise
-
Build et Déploiement (optionnel) :
- Si nécessaire, le pipeline peut être étendu pour inclure une étape de build et de déploiement.
- Le déploiement peut être automatisé pour une infrastructure de production en ajoutant des étapes spécifiques au déploiement.
Le workflow CI/CD configure les variables d'environnement nécessaires pour les tests. Les valeurs par défaut peuvent être modifiées dans le fichier .env ou directement dans la configuration GitHub Actions si des valeurs spécifiques sont requises pour l’environnement de test.
- Les fichiers
.envsont essentiels pour le fonctionnement des APIs. - Ils contiennent les variables d'environnement nécessaires à la configuration des bases de données et des services externes.
- Assurez-vous que ces fichiers sont placés à la racine de chaque projet.
- L'utilisation de Docker Compose est recommandée pour faciliter le déploiement des services dépendants comme les bases de données et RabbitMQ.
- Les commandes
docker-compose up --buildetdocker-compose down -vpermettent de gérer facilement les conteneurs.
-
Les fichiers
requirements.txtlistent toutes les dépendances Python nécessaires. -
Après avoir activé l'environnement virtuel, installez les dépendances avec :
pip install -r requirements.txt
-
Ports Occupés :
- Si un port est déjà utilisé, modifiez la variable
API_PORTdans le fichier.envet ajustez les ports exposés dans ledocker-compose.yml.
- Si un port est déjà utilisé, modifiez la variable
-
Problèmes de Connexion aux Bases de Données :
- Vérifiez que les services de base de données sont en cours d'exécution.
- Assurez-vous que les variables d'environnement correspondent aux configurations de vos services.
-
Erreurs lors de l'Activation de l'Environnement Virtuel :
- Assurez-vous que vous utilisez la bonne version de Python.
- Vérifiez les permissions du dossier
venv.
- Chaque API est fournie avec une documentation interactive accessible via
/docs. - Utilisez cet outil pour tester les endpoints et comprendre les modèles de données.
-
Variables Sensibles :
- Ne partagez pas vos fichiers
.envou toute information sensible. - Pour un environnement de production, utilisez des gestionnaires de secrets sécurisés.
- Ne partagez pas vos fichiers
-
Mises à Jour :
- Gardez vos dépendances à jour en vérifiant régulièrement le fichier
requirements.txt.
- Gardez vos dépendances à jour en vérifiant régulièrement le fichier
-
Gestion de la sécurité avec MongoDB :
- MongoDB nécessite une configuration de sécurité renforcée. Utilisez des réseaux privés ou des pare-feu pour restreindre les accès uniquement aux instances de l’API Produits.
- Le fichier
.envdoit être protégé pour que les informations de connexion de MongoDB ne soient jamais exposées. Un gestionnaire de secrets comme HashiCorp Vault ou AWS Secrets Manager est recommandé.
-
Configuration de MongoDB :
- MongoDB doit être configuré avec des utilisateurs et des rôles limités. Par exemple, l’utilisateur
productsavec des permissionsreadWriteest suffisant pour l’API Produits. - Activez le chiffrement des données pour MongoDB en transit (TLS) et au repos si disponible sur l’hébergement.
- MongoDB doit être configuré avec des utilisateurs et des rôles limités. Par exemple, l’utilisateur
-
Scalabilité :
- MongoDB peut être configuré en mode cluster pour améliorer la disponibilité et la scalabilité. Hébergez MongoDB sur une infrastructure de cloud compatible, comme MongoDB Atlas, pour des solutions de gestion de cluster simplifiées.
- Utilisez des conteneurs Docker pour l’API afin de faciliter la scalabilité et l'isolation des ressources.
-
Surveillance et gestion des erreurs :
- Intégrez des outils de surveillance pour garder un œil sur les performances et les requêtes vers MongoDB, notamment pour éviter les surcharges.
- Configurez la journalisation des événements critiques pour analyser les erreurs ou les anomalies dans le comportement de l’API Produits.
Ce projet contient également les fichiers nécessaires pour déployer l'API Produits et sa base de données MongoDB dans un cluster Kubernetes.
Les ressources créées sont :
- Deployment pour l'API Produits (
api-products) - Service de type
NodePortpour exposer l'API (api-products) - StatefulSet pour la base MongoDB (
mongo-products) avec stockage persistant - Service de type
Headless(mongo-products) pour MongoDB
Appliquer les ressources Kubernetes :
kubectl apply -f api-produits.yaml
kubectl apply -f mongo-products-sts.yaml