Application web de gestion de budget personnel développée avec Flask. Suivez vos dépenses, définissez des objectifs d'épargne et visualisez vos finances en temps réel avec des graphiques interactifs.
- À propos
- Fonctionnalités principales
- Technologies utilisées
- Architecture
- Structure du projet
- Déploiement Kubernetes
- Guide d'utilisation
Budgeomètre est une application web de gestion budgétaire qui permet de gérer efficacement vos finances personnelles. L'application utilise une architecture microservices déployée sur Kubernetes avec PostgreSQL pour stocker les catégories, transactions et objectifs d'épargne.
- Gestion des catégories : Créez et personnalisez vos catégories de dépenses avec des couleurs distinctives et des limites de budget mensuelles
- Suivi des transactions : Enregistrez facilement vos revenus et dépenses avec des descriptions détaillées
- Tableaux de bord interactifs : Visualisez vos statistiques financières avec des graphiques dynamiques
- Objectifs d'épargne : Définissez et suivez vos objectifs financiers avec des indicateurs de progression
- Archives mensuelles : Conservez un historique complet de vos finances et consultez vos données passées
- Filtrage et tri avancés : Recherchez et organisez vos transactions selon différents critères
- Interface responsive : Accédez à vos données depuis n'importe quel appareil
- Backend : Flask (Python)
- Base de données : PostgreSQL
- Frontend : HTML5, CSS3, JavaScript
- Visualisation : Graphiques interactifs (Chart.js ou équivalent)
- Orchestration : Kubernetes / Minikube
- Architecture : Microservices (Gateway, Service Écriture, Service Lecture)
Le projet Budgeomètre utilise une architecture microservices basée sur le pattern CQRS (Command Query Responsibility Segregation) qui sépare les opérations de lecture et d'écriture pour optimiser les performances et la scalabilité.
- L'utilisateur accède à l'interface via le Gateway (port 5000)
- Le Gateway affiche l'interface web (HTML/CSS/JS)
- Pour les opérations de lecture : Gateway → Service Lecture → PostgreSQL → Retour
- Pour les opérations d'écriture : Gateway → Service Écriture → PostgreSQL → Retour
- Tous les services communiquent sur le réseau budgeometre-network
La Gateway constitue le point d’entrée unique de l’application. Elle est responsable de la gestion de l’interface utilisateur, notamment le rendu des templates HTML, et joue un rôle central dans l’orchestration des requêtes en les redirigeant vers les services appropriés. Elle expose le port 5000 afin de permettre l’accès à l’application.
Ce service est dédié à la gestion de toutes les opérations d’écriture, incluant la création, la mise à jour et la suppression des données (CREATE, UPDATE, DELETE). Il traite les modifications liées aux catégories, aux transactions et aux objectifs, garantissant ainsi la cohérence des données métier. Il est accessible via le port 5001.
Optimisé pour les opérations de consultation (READ), ce service se concentre sur la lecture des données et la génération des statistiques ainsi que des tableaux de bord. Il prend également en charge la gestion des archives et de l’historique, offrant une vue analytique complète des données. Il expose le port 5002.
La base de données PostgreSQL assure le stockage persistant de l’ensemble des données de l’application. Elle est déployée sous forme de StatefulSet afin de garantir la persistance et la stabilité des données, même en cas de redémarrage des pods. Elle expose le port 5432.
Le projet Budgeomètre suit une architecture microservices organisée en plusieurs modules distincts. Le gateway gère l'interface utilisateur et orchestre les requêtes, le service écriture traite toutes les opérations de création, modification et suppression, tandis que le service lecture optimise les requêtes de consultation. Cette séparation permet une meilleure scalabilité et maintenabilité du code.
Budgeometre/
├── cleanup.sh
├── deploy.sh
├── docker-compose.yml
├── README.md
├── requirements.txt
│
├── database/
│ ├── init.sql
│ └── seed_data.sql
│
├── gateway/
│ ├── app.py
│ ├── config.py
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── routes/
│ │ ├── __init__.py
│ │ └── views.py
│ ├── static/
│ │ ├── css/
│ │ ├── js/
│ │ └── widget/
│ └── templates/
│ ├── base.html
│ ├── index.html
│ ├── add-expense.html
│ ├── archive-detail.html
│ ├── archives.html
│ ├── budget-dashboard.html
│ ├── categories.html
│ ├── detail-depense.html
│ ├── mes-depenses.html
│ ├── mes-objectifs.html
│ ├── modifier-categorie.html
│ └── modifier-transaction.html
│
├── services/
│ ├── ecriture/
│ │ ├── app.py
│ │ ├── routes.py
│ │ ├── seed_data.py
│ │ ├── Dockerfile
│ │ └── requirements.txt
│ └── lecture/
│ ├── app.py
│ ├── routes.py
│ ├── Dockerfile
│ └── requirements.txt
│
├── shared/
│ ├── config.py
│ ├── extensions.py
│ └── models/
│ ├── __init__.py
│ ├── archive.py
│ ├── categorie.py
│ ├── objectif.py
│ └── transaction.py
│
└── k8s/
├── README.md
├── namespace.yaml
├── configmap.yaml
├── secret.yaml
├── postgres-init-configmap.yaml
├── postgres-statefulset.yaml
├── postgres-deployment.yaml
├── postgres-service.yaml
├── postgres-pvc.yaml
├── ecriture-deployment.yaml
├── ecriture-service.yaml
├── lecture-deployment.yaml
├── lecture-service.yaml
├── gateway-deployment.yaml
├── gateway-service.yaml
├── ingress.yaml
├── hpa.yaml
└── network-policy.yaml
Déploiement Kubernetes (Le deuxième déploiement, avec helm, est disponible sur la branche kubernetes-helm)
Déploiement sur cluster Rancher
Une configuration spécifique pour le déploiement sur cluster Rancher est disponible sur la brancherancher. Cette branche contient :
- Scripts Python de déploiement automatisé (
cleanup.py,deploy-rancher.py,populate_db.py)- Configuration optimisée pour ressources limitées (10m CPU par pod)
- Images Docker Hub pré-buildées
- Namespace
u-grp5git checkout rancher
- Minikube installé
- Docker installé (Docker Desktop sur Windows)e
- kubectl installé et configuré
Si vous êtes sur Windows, assurez-vous que Docker Desktop est installé et lancé avant de lancer le script de déploiement.
Le script deploy.sh automatise l'ensemble du déploiement sur Kubernetes :
./deploy.shCe script effectue les opérations suivantes :
- Démarre Minikube avec le driver Docker
- Active les addons Ingress et metrics-server
- Configure Docker pour utiliser le daemon Minikube
- Build les images Docker des microservices :
- Gateway
- Service Écriture
- Service Lecture
- Déploie les ressources Kubernetes dans l'ordre :
- Namespace
budgeometre - ConfigMap et Secret
- PostgreSQL (StatefulSet)
- Services Écriture et Lecture
- Gateway
- Ingress
- HPA (Horizontal Pod Autoscaler)
- Network Policy
- Namespace
- Attend que tous les pods soient prêts
- Affiche le statut du déploiement
Option 1 : Port forwarding (recommandé pour Windows)
La méthode la plus simple sur Windows est d'utiliser le port forwarding kubectl :
# Forward le port 80 du gateway vers le port 8080 local
kubectl port-forward -n budgeometre service/gateway 8080:5000Ouvrez ensuite votre navigateur et accédez à : http://localhost:8080
Option 2 : Configuration DNS avec le fichier hosts et minikube tunnel
Sur Windows avec le driver Docker, l'IP de Minikube n'est pas directement accessible. Il faut utiliser minikube tunnel pour créer un pont réseau :
# 1- Activer l'addon Ingress si pas déjà fait
minikube addons enable ingress
# 2- Lancer minikube tunnel dans un terminal séparé (en administrateur)
minikube tunnel
Important : Laissez ce terminal ouvert tant que vous voulez accéder à l'application.
# 3- Ouvrir le fichier hosts en administrateur
notepad C:\Windows\System32\drivers\etc\hosts
# 4- Ajouter cette ligne à la fin (notez 127.0.0.1, pas l'IP de Minikube)
127.0.0.1 budgeometre.local# 5- Vider le cache DNS
ipconfig /flushdnsAccédez ensuite à : http://budgeometre.local

Note : Cette méthode nécessite de laisser
minikube tunnelactif en arrière-plan. Si vous préférez une solution sans tunnel, utilisez l'Option 1 (port-forwarding) qui est plus simple et tout aussi efficace.
Option 3 : Accès direct via minikube service (alternative)
minikube service gateway -n budgeometreCette commande ouvre automatiquement votre navigateur avec l'URL correcte.
Pour faciliter les tests et la démonstration, un script Python permet d'injecter automatiquement 6 mois de données réalistes dans la base PostgreSQL.
Contenu injecté :
- 9 catégories (Alimentation, Transport, Loisirs, Logement, Santé, Shopping, Abonnements, Salaire, Autre)
- Transactions mensuelles variées (revenus, dépenses fixes et variables)
- 3 objectifs d'épargne avec progression
- Archives mensuelles pour chaque mois
Exécuter le script :
# 1. Identifier le pod du service écriture
kubectl get pods -n budgeometre | grep ecriture
# 2. Exécuter le script de seed
kubectl exec -it <nom-du-pod-ecriture> -n budgeometre -- python seed_data.pyLe script affiche sa progression et confirme la création de chaque élément :
Rafraîchissez ensuite l'application dans votre navigateur pour voir les données.
# Voir les pods
kubectl get pods -n budgeometre
# Voir les services
kubectl get services -n budgeometre
# Voir l'ingress
kubectl get ingress -n budgeometre
# Voir les logs d'un pod
kubectl logs <nom-du-pod> -n budgeometrePour supprimer l'application de Kubernetes :
./cleanup.shOu manuellement :
kubectl delete namespace budgeometre
minikube stopRenseigner le nom, la description et la couleur puis appuyer sur +.
On peut rajouter une limite de budget mensuel en cochant la case Définir une limite de budget mensuel. Si la limite dépasse notre revenu, le message suivant apparaît:
Supprimez la catégorie en sélectionnant sur la corbeille.
Celle-ci doit être absente de la liste des catégories après coup.
Modifiez la en sélectionnant le crayon.
Les statistiques des dépenses sont visibles depuis budget dashboard.
Pour accéder aux statistiques individuelles des catégories, survolez la catégorie sur le graphe:
Vous aurez alors accès aux statistiques pour cette catégories.
Pour ajouter une dépense ou un revenu, se rendre sur la page d'accueil et cliquer sur le bouton Ajouter une transaction :
Pour ajouter un revenu, cliquez sur l'onglet Revenu, renseignez les informations requises, puis cliquez sur Enregistrer :
Pour ajouter une dépense, cliquez sur l'onglet Dépense, renseignez les informations requises (montant, catégorie, date, description), puis cliquez sur Enregistrer :
La page d'accueil affiche automatiquement toutes les transactions des 3 derniers mois dans un tableau récapitulatif :

Vous pouvez facilement organiser vos transactions à l'aide des outils de tri et de filtrage :

- Tri : Cliquez sur l'en-tête d'une colonne pour trier les données
- Filtrage : Utilisez la barre de recherche pour filtrer par mot-clé
Pour créer un nouvel objectif, renseignez les informations suivantes :
- Montant cible : Le montant que vous souhaitez atteindre
- Description : L'objectif de cette épargne
- Fréquence : Périodicité de contribution (mensuelle, hebdomadaire, etc.)
- Catégorie associée : La catégorie budgétaire liée à cet objectif
Cliquez ensuite sur le bouton Ajouter pour enregistrer votre objectif.
Tous vos objectifs d'épargne sont regroupés et suivis sur la page Mes Objectifs d'Épargne. Vous y trouverez pour chaque objectif :
L'objectif que vous venez de renseigner doit se retrouver sur la page Mes Objectifs d'épargne
Pour consulter l'historique de vos transactions au-delà des 3 derniers mois, utilisez la fonctionnalité Archives mensuelles :
Sélectionnez le mois que vous souhaitez archiver, puis cliquez sur le bouton Archiver :
Pour accéder aux informations détaillées d'un mois archivé, cliquez sur le bouton Voir les détails :
Pour masquer une archive, cliquer sur le bouton avec l’icône d’oeil barré :
Pour démasquer une archive, cliquer sur le bouton oeil.
Résultat :
Pour supprimer de manière permanente une archive et toutes ses données associées, cliquez sur l'icône de corbeille :
Attention : Cette action est irréversible. Elle supprime définitivement toutes les données du mois sélectionné de la base de données. Une confirmation vous sera demandée pour éviter toute suppression accidentelle.
Ce projet est sous licence MIT.
Télécom SudParis - FISA 2A
- TRIKI Wassim
- PRETI- -LEVY Ruben
- MARTIN Claire
- HAMIDI Issam
- BURET Amélie
- FERRAH Anas
Projet réalisé en 2025-2026

