Une plateforme de location de logements moderne intégrant la technologie blockchain Ethereum pour des transactions sécurisées et transparentes.
- Vue d'ensemble
- Architecture
- Technologies
- Équipe de Développement
- Backend Architecture
- Frontend Architecture
- Blockchain And AI Implementation
- Cloud & DevOps
Cette plateforme révolutionne le marché de la location immobilière en combinant :
- Interface moderne : React avec Material-UI
- Architecture microservices : Évolutivité et maintenabilité
- Blockchain Ethereum : Paiements sécurisés via smart contracts
- Communication temps réel : Chat intégré
- Géolocalisation : Cartographie interactive des propriétés
✅ Inscription et authentification sécurisée (JWT)
✅ Gestion complète des annonces immobilières
✅ Système de réservation avec calcul automatique des prix
✅ Paiements en cryptomonnaie (ETH) via MetaMask
✅ Escrow décentralisé pour la protection des transactions
✅ Chat temps réel propriétaire-locataire
✅ Système d'avis et de notations
✅ Notifications par email
┌─────────────────────────────────────────────────────────────┐
│ FRONTEND LAYER │
│Angular + TypeScript+ NgRx + Angular Material + Ethers.js │
└─────────────────────────────────────────────────────────────┘
↓ HTTPS
┌─────────────────────────────────────────────────────────────┐
│ API GATEWAY LAYER │
│ Spring Cloud Gateway (Port 8080) │
│ Routage | Sécurité JWT | Rate Limiting | Load Balancing │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ MICROSERVICES LAYER │
│ User (8081) | Listing (8082) | Booking (8083) │
│ Payment (8084) | Messaging (8085) | Notification (8086) │
│ Review (8087) | Media (8088) | Blockchain (8089) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ SERVICES INFRASTRUCTURE │
│ Eureka (8761) | Config Server (8888) | RabbitMQ (5672) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ DATA LAYER │
│ MySQL 8.0 (3306) | AWS S3 Storage │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ BLOCKCHAIN LAYER │
│ Ethereum Network (Sepolia) | Infura │
└─────────────────────────────────────────────────────────────┘
Nom : Bouzid Mina
Rôle : Architecture & Développement Backend
Responsabilités :
- Conception de l'architecture microservices
- Développement des 9 microservices backend
- Configuration Spring Cloud (Eureka, Gateway, Config)
- Base de données MySQL et intégrations
- Sécurité et authentification JWT
- Conception UML de l'application
Nom : Ikrame Houzane Rôle : Blockchain & AI Engineer
Responsabilités :
- Conception et développement du contrat principal
- Déploiement sur le testnet Sepolia
- Développement de 4 modèles de Machine Learning
- Création d'un microservice REST performant (FastAPI)
- Préparation de l'intégration avec le backend
Nom : Allali Fatima-ezzahra Rôle : Développeur Frontend
Responsabilités :
- Développement de l'interface Angular avec TypeScript
- Intégration Ethers.js et MetaMask
- Développement des composants Angular Material
- Cartographie avec ngx-leaflet
- Gestion d'état avec NgRx (Store, Effects, Selectors)
Nom : Azhich salma
Rôle : Architecte Cloud & Infrastructure
Responsabilités :
- Architecture cloud et déploiement AWS
- Configuration des services cloud (S3, RDS, etc.)
- Optimisation des performances et coûts
- Sécurité cloud et conformité
- Plan de reprise d'activité
Nom : KADDAR MOHAMED ILIASS
Rôle : DevOps & Infrastructure
Responsabilités :
- Containerisation avec Docker
- Orchestration avec Kubernetes
- CI/CD pipelines
- Monitoring et logging
- Automatisation de l'infrastructure
Diagramme des classes
Diagramme des activités
Diagramme des cas d’utilisation
Diagramme des activités
Diagramme des cas d’utilisation
Diagramme des cas d’utilisation
Diagramme des activités
Diagramme des activités
Diagramme des cas d’utilisation
Conception et implémentation d'une architecture modulaire et évolutive basée sur les principes des microservices, permettant une scalabilité horizontale et une maintenabilité optimale.
- Configuration du serveur de découverte de services
- Implémentation du health checking automatisé
- Gestion des instances de services et de leur disponibilité
- Load balancing côté client intégré
- Création d'un repository Git pour la gestion des configurations
- Support multi-environnement (dev, staging, prod)
- Refresh dynamique des configurations sans redémarrage
- Chiffrement des propriétés sensibles
- Configuration des routes dynamiques pour les microservices
- Implémentation de la sécurité JWT avec validation des tokens
- Rate limiting pour la protection contre les attaques DDoS
- Configuration CORS pour la sécurité des requêtes cross-origin
- Filtres personnalisés pour le logging et le monitoring
- Configuration des exchanges, queues et bindings
- Implémentation de patterns publish/subscribe
- Gestion des dead letter queues pour les messages en échec
- Configuration de la persistance des messages
- Optimisation des performances pour le message broker
- Conception du schéma de données normalisé
- Définition des relations (One-to-Many, Many-to-Many, One-to-One)
- Optimisation des indexes pour les performances
- Configuration des contraintes d'intégrité référentielle
- Design des vues et stored procedures
- Documentation de l'architecture globale
- Guides d'installation et de configuration
- Documentation API
- Diagrammes d'activité
- Diagrammes de classe
- Implémentation du flow d'authentification JWT
- Gestion des tokens d'actualisation (refresh tokens)
- Blacklisting des tokens révoqués
- Expiration et rotation des tokens
- Intégration avec service SMTP
- Génération de tokens de vérification uniques
- Logique de ré-émission de codes de vérification
- Création et mise à jour des profils utilisateurs
- Association des adresses Ethereum aux utilisateurs
- Vérification de la propriété des wallets
- Historique des transactions utilisateur
- Système de blacklist pour les tokens révoqués
- Audit logs pour toutes les actions sensibles
- Conformité RGPD pour les données personnelles
- Rotation automatique des logs d'audit
- Table des langues supportées
- Association utilisateur-langue
- Configuration de la sécurité Spring Boot 3
- Hashing des mots de passe avec BCrypt
- Rôles et permissions (USER, HOST, ADMIN)
- Protection contre les attaques par force brute
- Opérations Create, Read, Update, Delete
- Validation des données d'entrée
- Gestion des relations propriété-utilisateur
- Versioning des modifications
- Interface de calendrier interactive
- Blocage/déblocage des dates
- Validation des chevauchements de réservations
- Synchronisation avec le booking service
- Calcul des prix selon la saisonnalité
- Discounts pour séjours prolongés
- Frais de service et de nettoyage
- Historique des changements de prix
- Catalogue d'équipements prédéfinis
- Association propriété-équipements
- Recherche par équipements disponibles
- Images et descriptions des équipements
- Snapshots des modifications importantes
- Restauration de versions précédentes
- Historique complet des changements
- Audit des modifications
- Recherche textuelle sur titre et description
- Filtrage par localisation, prix, équipements
- Tri par pertinence, prix, note
- Pagination et lazy loading
- Vérification de disponibilité atomique
- Locking des dates pendant la réservation
- Rollback en cas d'échec de transaction
- Cache de disponibilité pour performances
- Calcul basé sur les dates et le prix par nuit
- Application des frais de service et de nettoyage
- Taxes locales et TVA
- Récapitulatif détaillé des coûts
- Gestion des transitions d'état (PENDING, CONFIRMED, CANCELLED, etc.)
- Validation des transitions autorisées
- Historique des changements d'état
- Actions automatiques selon l'état
- Tracking de toutes les modifications de réservation
- Audit trail pour conformité
- Restauration en cas d'erreur
- Reporting des modifications
- Synchronisation avec les smart contracts
- Vérification des paiements on-chain
- Confirmation automatique après paiement
- Gestion des échecs de transaction blockchain
- Politiques d'annulation configurables
- Calcul automatique des remboursements
- Notifications aux parties concernées
- Historique des annulations
- Configuration du client Web3j
- Connexion aux nodes Ethereum (Infura/Alchemy)
- Gestion des connexions HTTP/WebSocket
- Fallback sur différents providers
- Construction des transactions Ethereum
- Estimation des gas fees
- Envoi et suivi des transactions
- Confirmation des blocs
- Dépôt des fonds dans le smart contract
- Vérification des soldes en escrow
- Libération des fonds selon conditions
- Gestion des litiges
- Vérification des soldes utilisateur
- Validation des fonds suffisants
- Notifications de solde insuffisant
- Suggestions de recharge
- Monitoring des prix du gas
- Optimisation des frais de transaction
- Historique des gas fees payés
- Alertes de gas fees anormalement élevés
- Initiation des remboursements on-chain
- Suivi du statut des remboursements
- Notifications de remboursement complété
- Reporting des remboursements
- Écoute des événements blockchain
- Vérification des confirmations
- Synchronisation avec la base de données
- Gestion des forks et réorganisations
- Configuration du serveur WebSocket
- Gestion des sessions utilisateur
- Reconnexion automatique
- Création de conversations (1-1)
- Visibilité des conversations
- Tracking des messages lus/non lus
- Notifications push pour nouveaux messages
- Politiques d'archivage configurables
- Compression des messages archivés
- Restauration des conversations archivées
- Purge automatique des anciennes données
- Configuration des serveurs SMTP
- Templates HTML pour les emails
- Gestion des pièces jointes
- Tracking des ouvertures et clics
- Découplage de l'envoi des notifications
- Retry automatique en cas d'échec
- Priorisation des notifications urgentes
- Monitoring de la file d'attente
- Publication d'avis après séjour
- Modération des avis avant publication
- Réponses des propriétaires aux avis
- Signalement d'avis inappropriés
- Moyenne globale par propriété
- Tendances des notes dans le temps
- Comparaison avec la moyenne locale
- Contrôle de la visibilité par les utilisateurs
- Highlight des avis les plus utiles
- Upload de fichiers multipart
- Validation des types de fichiers
- Limites de taille configurables
- Progress bar pour l'upload
- Compression JPEG/PNG optimisée
- Redimensionnement automatique
- Génération de thumbnails
- Conservation des métadonnées EXIF
- Configuration des buckets S3
- Gestion des permissions IAM
- Transfert optimisé des fichiers
- Politiques de rétention et d'archivage
- Thumbnails de différentes tailles
- Cache des thumbnails générés
- Format WebP pour performances
- Lazy loading optimisé
- Calcul de hash MD5/SHA des images
- Détection des doublons
- Réutilisation des images existantes
- Optimisation du stockage
- Drag & drop pour réorganiser les photos
- Photo principale sélectionnable
- Rotation automatique selon orientation
- Masquage de photos de mauvaise qualité
- Génération des wrappers Java à partir des ABI
- Appel des fonctions du smart contract
- Lecture des variables d'état
- Gestion des erreurs et exceptions
- Écoute des événements en temps réel
- Décodage des données d'événement
- Mapping vers objets Java
- Persistance dans la base de données
- Appel de la fonction createBooking
- Validation des paramètres
- Gestion des erreurs de transaction
- Confirmation de la création
- Trigger automatique aux dates prévues
- Vérification des conditions préalables
- Exécution des transactions on-chain
- Synchronisation avec le booking service
- Vérification des conditions de libération
- Appel de la fonction releaseFunds
- Distribution des fonds aux parties
- Gestion des litiges en cours
- Reconciliation régulière des données
- Détection et correction des divergences
- Audit de la cohérence des données
- Reporting de la santé de la synchronisation
- Spring Boot 3.x - Framework principal
- Spring Cloud - Gateway, Config, Eureka, Circuit Breaker
- Spring Security - Authentification et autorisation
- Spring Data JPA - Persistance des données
- Spring WebSocket - Communication temps réel
- MySQL 8.0 - Base de données relationnelle principale
- Hibernate - ORM avec cache de second niveau
- Redis - Cache distribué et session storage
- RabbitMQ - Message broker pour communication asynchrone
- STOMP Protocol - Protocole pour WebSocket
- Web3j - Client Java pour Ethereum
- Solidity ABI - Interface avec smart contracts
- Infura/Alchemy - Nodes Ethereum managés
- JavaMail - Envoi d'emails SMTP
- Twilio SDK - Envoi de SMS
- AWS S3 SDK - Stockage de fichiers cloud
- JWT (JSON Web Tokens) - Authentification stateless
- BCrypt - Hashing des mots de passe
- Spring Security OAuth2 - Authentification tierce (optionnel)
- Rate Limiting - Protection contre les abus
- Spring Boot Actuator - Métriques d'application
- Micrometer - Métriques pour Prometheus
- Logback/SLF4J - Logging structuré
- Lignes de code total : ~40,000+ (backend uniquement)
- Classes Java : 150+
- Interfaces : 80+
- Tests unitaires : 200+
- Tests d'intégration : 50+
- Temps de réponse moyen : < 200ms (API Gateway)
- Disponibilité cible : 99.9%
- Scalabilité : Horizontal scaling supporté
- Throughput : 1000+ req/sec par instance
- JWT token lifetime : 15 minutes (access), 7 jours (refresh)
- BCrypt rounds : 10 (équilibre sécurité/performance)
- Rate limiting : 100 req/min par utilisateur
- Input validation : Validation sur tous les endpoints
- Repository Pattern - Abstraction de l'accès aux données
- Service Pattern - Logique métier encapsulée
- DTO Pattern - Transfert de données optimisé
- Factory Pattern - Création d'objets complexes
- Strategy Pattern - Algorithmes interchangeables
- Observer Pattern - Événements et notifications
- API Gateway Pattern - Point d'entrée unique
- Circuit Breaker Pattern - Tolérance aux pannes
- Service Discovery Pattern - Découverte dynamique
- Config Server Pattern - Configuration centralisée
- Event Sourcing - Persistance basée sur événements
- Publish-Subscribe - Communication découplée
- Event Carried State Transfer - Synchronisation par événements
- ✅ Connexion/Inscription avec MetaMask
- ✅ Signature de message pour authentification
- ✅ Gestion des wallets Ethereum
- ✅ Vérification d'email
- ✅ Recherche avancée avec filtres (lieu, prix, équipements, type)
- ✅ Autocomplete intelligent de localisation
- ✅ Vue détaillée avec galerie photos
- ✅ Carte interactive (Leaflet)
- ✅ Système d'avis et notes
- ✅ Suggestion de prix par IA
- ✅ Tableau de bord avec statistiques
- ✅ Création de propriété (wizard multi-étapes)
- ✅ Gestion du calendrier de disponibilité
- ✅ Édition modulaire des informations
- ✅ Gestion des réservations reçues
- ✅ Upload de photos (S3)
- ✅ Réservation instantanée ou sur demande
- ✅ Calcul automatique des prix (nuits, frais, réductions)
- ✅ Paiement en ETH via MetaMask
- ✅ Système d'escrow blockchain
- ✅ Check-in / Check-out
- ✅ Historique des réservations (à venir, passées, annulées)
- ✅ Annulation avec remboursement
- ✅ Chat WebSocket entre hôte et locataire
- ✅ Indicateurs de présence (en ligne/hors ligne)
- ✅ Compteur de messages non lus
- ✅ Statut de lecture des messages
- ✅ Conversations liées aux réservations
- ✅ Notifications en temps réel
- ✅ Badge avec compteur de non-lus
- ✅ Marquer comme lu
- ✅ Historique complet
- ✅ Notation par critères (propreté, emplacement, communication...)
- ✅ Commentaires détaillés
- ✅ Statistiques globales par propriété
- ✅ Modification/Suppression d'avis
- ✅ Informations personnelles
- ✅ Gestion des langues parlées
- ✅ Photo de profil
- ✅ Historique des avis
- ✅ Mode hôte / invité
- Framework : Angular 18.2
- Language : TypeScript 5.5
- State Management : NgRx 18.0 (Store, Effects, Selectors)
- UI Library : Angular Material 18.2
- Styling : SCSS
- Library : Ethers.js 6.13
- Network : Sepolia Testnet
- Wallet : MetaMask
- Maps : ngx-leaflet 18.0 + Leaflet 1.9
- Geocoding : Google Maps API
- HTTP Client : Axios 1.13
- Real-time : Socket.io-client 4.8
- WebSocket : Native WebSocket API
- API Gateway : Spring Cloud Gateway (port 8080)
Frontend (Angular 18)
├── Core Layer
│ ├── Services (API, Auth, Web3, WebSocket...)
│ ├── Guards (auth, noAuth)
│ ├── Models (TypeScript interfaces)
│ └── Pipes (EthPrice)
│
├── State Management (NgRx)
│ ├── Auth Store
│ ├── Booking Store
│ ├── Listings Store
│ ├── Messaging Store
│ ├── Notifications Store
│ └── Payment Store
│
├── Features (Smart Components)
│ ├── Home
│ ├── Auth (Login, Register)
│ ├── Listings (Search, Filters)
│ ├── Property Detail
│ ├── Booking Management
│ ├── Host Dashboard
│ ├── Messages
│ └── Profile
│
└── Shared (Presentational Components)
├── Navbar
├── Footer
├── Search Bar
├── Property Card
├── Notification Bell
└── Reviews
Angular App
↓
API Gateway (http://localhost:8080/api)
↓
Microservices (8081-8089)
↓
Bases de données (PostgreSQL, MongoDB)
↓
Blockchain (Sepolia Testnet)
src/
├── app/
│ ├── core/ # Services, Guards, Models
│ │ ├── guards/ # auth.guard, noAuth.guard
│ │ ├── models/ # 19 modèles TypeScript
│ │ ├── pipes/ # eth-price.pipe
│ │ └── services/ # 15+ services
│ │ ├── api.service.ts
│ │ ├── auth.service.ts
│ │ ├── booking.service.ts
│ │ ├── property.service.ts
│ │ ├── payment.service.ts
│ │ ├── web3.service.ts
│ │ ├── websocket.service.ts
│ │ └── ...
│ │
│ ├── features/ # Composants métier
│ │ ├── home/
│ │ ├── auth/
│ │ │ ├── login/
│ │ │ └── register/
│ │ ├── listing/
│ │ │ ├── listings.component.ts
│ │ │ ├── filters-modal/
│ │ │ └── property-card/
│ │ ├── property-detail/
│ │ │ ├── property-detail.component.ts
│ │ │ ├── booking-card/
│ │ │ └── payment-modal/
│ │ ├── my-bookings/
│ │ │ ├── my-bookings.component.ts
│ │ │ ├── booking-card/
│ │ │ ├── booking-detail-dialog/
│ │ │ └── review-form/
│ │ ├── host/
│ │ │ ├── host-layout/
│ │ │ ├── host-properties/
│ │ │ ├── property-wizard/
│ │ │ ├── host-property-detail/
│ │ │ └── host-bookings/
│ │ ├── messages/
│ │ │ ├── chat-view/
│ │ │ ├── conversations-list/
│ │ │ └── message-badge/
│ │ └── profile/
│ │ ├── profile.component.ts
│ │ ├── profile-info/
│ │ ├── profile-languages/
│ │ └── profile-reviews/
│ │
│ ├── shared/ # Composants réutilisables
│ │ └── components/
│ │ ├── navbar/
│ │ ├── footer/
│ │ ├── search-bar/
│ │ ├── notification-bell/
│ │ ├── about/
│ │ ├── contact/
│ │ ├── faq/
│ │ ├── trust-safety/
│ │ ├── how-it-works/
│ │ └── become-host/
│ │
│ ├── store/ # NgRx State Management
│ │ ├── auth/
│ │ │ ├── auth.actions.ts
│ │ │ ├── auth.effects.ts
│ │ │ ├── auth.reducer.ts
│ │ │ └── auth.selectors.ts
│ │ ├── booking/
│ │ ├── listings/
│ │ ├── messaging/
│ │ ├── notifications/
│ │ └── payment/
│ │
│ ├── app.routes.ts # Configuration du routing
│ ├── app.component.ts
│ └── app.config.ts
│
├── environments/
│ ├── environment.ts # Config développement
│ └── environment.prod.ts # Config production
│
├── styles.scss # Styles globaux
└── index.html
- Hero section avec search bar
- Destinations populaires
- Propriétés mises en avant
- Section "Pourquoi nous choisir"
- Footer informatif
- Barre de recherche intelligente
- Filtres avancés (prix, type, équipements, règles)
- Cartes de propriétés avec photos
- Pagination et tri
- Galerie photos
- Informations complètes
- Carte de localisation
- Calendrier de disponibilité
- Section réservation
- Avis clients
- Modal de paiement step-by-step
- Vérification du solde ETH
- Intégration MetaMask
- Confirmation blockchain
- Tracking de transaction
- Dashboard avec statistiques
- Gestion des propriétés
- Calendrier de réservations
- Messagerie avec clients
- Édition complète des annonces
- Liste des conversations
- Chat en temps réel
- Indicateurs de présence
- Notifications de nouveaux messages
Technologies principales : Solidity, Hardhat, Ethers.js, Python, FastAPI, Machine Learning
Réseau : Ethereum Sepolia Testnet
-
Blockchain (Smart Contracts)
- Conception et développement du contrat principal
- Déploiement sur le testnet Sepolia
- Tests
-
Intelligence Artificielle
- Développement de 4 modèles de Machine Learning
- Création d'un microservice REST performant (FastAPI)
- Préparation de l'intégration avec le backend
Le module rental-dapp-blockchain contient l'implémentation d'un smart contract Ethereum pour gérer les réservations de propriétés immobilières de manière décentralisée et transparente.
- Créer et gérer des réservations avec paiements en escrow (séquestre)
- Implémenter une politique de remboursement flexible
- Gérer les frais de plateforme (5% prélevés à la réservation)
- Permettre aux locataires de noter les propriétés (ratings immuables)
- Protéger les propriétaires et locataires via des smart contracts
- Intégrer la blockchain avec le backend
| Technologie | Version | Utilisation |
|---|---|---|
| Solidity | 0.8.20 | Langage smart contract |
| Hardhat | 2.26.3 | Framework de développement & tests |
| Ethers.js | 6.15.0 | Interaction avec la blockchain |
| OpenZeppelin | Latest | Bibliothèques sécurisées |
| Node.js | 22.14.0 | Runtime JavaScript |
rental-dapp-blockchain/
├── contracts/
│ └── RentalPlatform.sol # Smart contract principal
├── scripts/
│ ├── deployment/
│ │ ├── deploy.js # Script de déploiement
│ │ └── deployment-info.json # Infos du contrat déployé
│ └── interactions/
│ ├── testRental.js # Tests d'intégration
│ ├── superTestRental.js # Tests avancés
│ └── stressTestRental.js # Tests de charge
├── test/
│ └── unit/
│ └── RentalPlatform.test.js # Tests unitaires
├── blockchain-integration/ # SDK pour intégration
│ ├── services/
│ │ ├── contractService.js # Interactions avec contrat
│ │ ├── eventListener.js # Écoute des événements
│ │ └── syncService.js # Synchronisation BDD
│ ├── config/
│ │ └── blockchain.config.js # Configuration
│ └── abi/
│ └── RentalPlatform.json # ABI du contrat
├── hardhat.config.js # Configuration Hardhat
├── package.json # Dépendances
└── README.md # Documentation technique
Le contrat implémente un système complet de réservation avec états:
enum BookingStatus {
PENDING, // En attente
CONFIRMED, // Confirmée et payée (argent en escrow)
CHECKED_IN, // Locataire arrivé (séjour en cours)
CHECKED_OUT, // Locataire parti (en attente de libération)
COMPLETED, // Terminée (paiements libérés)
CANCELLED // Annulée
}Cycle de vie d'une réservation:
- Création → Locataire crée réservation + paie en ETH
- Confirmation → Argent en escrow dans le contrat
- Check-in → Locataire arrive
- Check-out → Locataire part
- Libération → Admin libère les fonds au propriétaire
- Completion → Réservation terminée
- Optional: Rating → Locataire note la propriété
// Frais de plateforme: 5%
platformFee = rentalAmount * 5 / 100
totalAmount = rentalAmount + platformFee
// Les frais vont IMMÉDIATEMENT au wallet plateforme
// Le rentalAmount reste BLOQUÉ jusqu'au check-out completSécurité:
- Les fonds ne peuvent être libérés qu'après le check-out
- Les frais ne sont PAS remboursables en cas d'annulation
- Utilise le pattern "Pull" pour les retraits (plus sûr)
En cas d'annulation AVANT check-in:
| Délai avant check-in | Remboursement |
|---|---|
| > 7 jours | 100% remboursement |
| 3-7 jours | 50% remboursement |
| < 3 jours | 0% remboursement |
Important: Les frais de plateforme (5%) ne sont JAMAIS remboursables.
function isPropertyAvailable(
uint256 _propertyId,
uint256 _startDate,
uint256 _endDate
) public view returns (bool)Vérification automatique pour éviter que 2 réservations se chevauchent:
- Parcourt toutes les réservations du logement
- Ignore les réservations annulées ou complétées
- Détecte les chevauchements de dates
- Rejette si conflit détecté
// Une note par réservation (après COMPLETED)
// Notes stockées sur blockchain = immuables
// Notes: 1 à 5 étoiles
struct Rating {
address tenant; // Qui a noté
uint256 propertyId; // Propriété notée
uint8 stars; // Note 1-5
uint256 timestamp; // Quand
}
// Optimisation: O(1) pour obtenir la moyenne
function getAverageRating(uint256 _propertyId)
returns uint256 (moyenne * 100)Avantage: Les notes sont immuables sur la blockchain → impossible de tricher.
Protections implémentées:
| Protection | Détail |
|---|---|
| ReentrancyGuard | Évite les attaques de réentrance sur les retraits |
| Ownable | Contrôle d'accès admin (onlyOwner) |
| Modifiers | Vérification des conditions avant exécution |
| Checks-Effects-Interactions | Modifie l'état AVANT les transferts (sécurité) |
| Pull Pattern | Propriétaires retirent eux-mêmes (pas de push direct) |
| Input Validation | Validation stricte de tous les paramètres |
Crée une réservation avec paiement:
- Vérifie disponibilité logement
- Calcule frais (5%)
- Transfère ETH
- Retourne bookingId
Marque l'arrivée du locataire:
- Seulement le locataire
- Après startDate
- Change statut: CONFIRMED → CHECKED_IN
Marque le départ du locataire:
- Seulement le locataire
- Change statut: CHECKED_IN → CHECKED_OUT
Annule une réservation (avant check-in):
- Seulement avant startDate
- Applique politique de remboursement
- Frais plateforme non remboursables
Ajoute une note après séjour:
- Seulement après COMPLETED
- Stars: 1-5
- Stocké immuablement sur blockchain
Retire ses fonds en attente:
- Pattern Pull (plus sûr)
- Propriétaire reçoit rentalAmount après check-out complet
- Protection contre réentrance
Enregistre le propriétaire d'un logement:
- OBLIGATOIRE avant réservation
- Permet la libération des fonds après check-out
Libère les fonds au propriétaire après check-out:
- Seulement admin
- Crédite pendingWithdrawals du propriétaire
- Statut: CHECKED_OUT → COMPLETED
Change les frais de plateforme:
- Max 10%
- N'affecte que les nouvelles réservations
- Émet événement de transparence
Change l'adresse du wallet plateforme:
- Utile en cas de migration ou sécurité
getBooking(bookingId) // Détails complet réservation
getTenantBookings(tenantAddr) // Historique locataire
getPropertyBookings(propertyId) // Historique propriété
getPropertyRatings(propertyId) // Toutes les notes
getPropertyOwner(propertyId) // Propriétaire du logement
getPendingWithdrawal(address) // Montant en attente retraits
getAverageRating(propertyId) // Moyenne notes (optimisée O(1))
isPropertyAvailable(...) // Vérifie disponibilité datesLe contrat émet des événements pour la synchronisation:
| Événement | Détail |
|---|---|
| BookingCreated | Nouvelle réservation créée |
| BookingConfirmed | Paiement confirmé |
| CheckInCompleted | Locataire arrivé |
| CheckOutCompleted | Locataire parti |
| BookingCompleted | Réservation terminée |
| BookingCancelled | Réservation annulée (+ montant remboursé) |
| PaymentReleased | Fonds crédités propriétaire |
| RatingAdded | Note ajoutée |
| PlatformFeeUpdated | Frais modifiés (transparence) |
| PlatformWalletChanged | Wallet plateforme changé |
| PropertyOwnerSet | Propriétaire enregistré |
Utilisation: Le backend écoute ces événements pour synchroniser la base de données.
- Node.js 18+
- npm ou yarn
- Compte MetaMask ou clef privée Ethereum
- RPC URL (Infura, Alchemy, etc.)
cd rental-dapp-blockchain
# Installer les dépendances
npm installcp .env.example .envÉditer .env:
# Réseau Ethereum (Sepolia testnet)
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_INFURA_KEY
PRIVATE_KEY=votre_clef_privee_admin
CONTRACT_ADDRESS=0x... # Après déploiement
# Vérification contrats (Etherscan)
ETHERSCAN_API_KEY=votre_cle_etherscan# Sur testnet Sepolia
npx hardhat run scripts/deployment/deploy.js --network sepolia
# Sur réseau local (Hardhat)
npx hardhat run scripts/deployment/deploy.js --network hardhatLe script génère deployment-info.json:
{
"contractAddress": "0x...",
"deployerAddress": "0x...",
"platformWallet": "0x...",
"deploymentTx": "0x...",
"deploymentBlock": 12345678,
"timestamp": "2024-01-15T10:30:00Z"
}Avant qu'un logement puisse recevoir des réservations:
# Admin enregistre propriétaire du logement (propertyId = 1)
npx hardhat run scripts/interactions/registerProperty.js --network sepolia
# Ou via blockchain-integration:
const contractService = require('./blockchain-integration/services/contractService');
await contractService.setPropertyOwner(propertyId, ownerAddress);# Lancer tous les tests
npx hardhat test
# Avec détails
npx hardhat test --verbose
# Test spécifique
npx hardhat test test/unit/RentalPlatform.test.js# Test complet du flux réservation
npx hardhat run scripts/interactions/testRental.js --network sepolia
# Tests avancés
npx hardhat run scripts/interactions/superTestRental.js --network sepolia
# Tests de charge (stress test)
npx hardhat run scripts/interactions/stressTestRental.js --network sepoliaPour l'intégration avec le backend, on a fait tout un microservice: blockchain-service.
✅ Adresse du contrat déployé
✅ ABI (Application Binary Interface)
✅ Documentation des fonctions
✅ Scripts d'interaction
const contractService = require('./services/contractService');
// Créer réservation
const bookingId = await contractService.createBooking({
propertyId: 1,
startDate: Math.floor(Date.now() / 1000) + 86400, // Demain
endDate: Math.floor(Date.now() / 1000) + 172800, // Dans 2 jours
rentalAmount: ethers.parseEther('0.5') // 0.5 ETH
});
// Vérifier disponibilité
const available = await contractService.isPropertyAvailable(
1,
startDate,
endDate
);
// Obtenir détails réservation
const booking = await contractService.getBooking(1);
// Check-in
await contractService.checkIn(1);
// Check-out
await contractService.checkOut(1);
// Admin: libérer fonds
await contractService.releaseFunds(1);
// Retirer ses fonds (propriétaire)
await contractService.withdraw();
// Ajouter rating
await contractService.addRating(1, 5);
// Admin: enregistrer propriétaire logement
await contractService.setPropertyOwner(1, ownerAddress);const eventListener = require('./services/eventListener');
// Écouter événements
eventListener.listenToBookingEvents((event) => {
console.log('Event reçu:', event);
// Synchroniser BDD MySQL
// Exemple: INSERT booking ou UPDATE statut
});
// Ou événements spécifiques
eventListener.onBookingCreated((bookingId, tenant, propertyId) => {
// Créer booking en BDD
});
eventListener.onCheckInCompleted((bookingId) => {
// Mettre à jour statut en BDD
});
eventListener.onPaymentReleased((bookingId, owner, amount) => {
// Créditer propriétaire en BDD
});const syncService = require('./services/syncService');
// Synchroniser l'état blockchain ↔ BDD
await syncService.syncBookingStatus(bookingId);
// Obtenir état complet (blockchain + BDD)
const bookingState = await syncService.getFullBookingState(bookingId);Frontend (React)
↓ [créer réservation + montant ETH]
Backend (Java/Spring)
↓ [valider données]
Blockchain (Smart Contract)
├→ Vérifier disponibilité
├→ Calculer frais (5%)
├→ Créer Booking en état CONFIRMED
├→ Transférer frais au wallet plateforme
├→ Émettre event BookingCreated
└→ Retourner bookingId
Backend
├→ Écouter event BookingCreated
├→ Insérer booking en BDD MySQL
├→ Notifier propriétaire par email
└→ Retourner confirmation au frontend
Admin Dashboard
↓ [cliquer "Libérer fonds"]
Backend (Admin API)
↓ [appeler releaseFunds(bookingId)]
Blockchain
├→ Vérifier statut = CHECKED_OUT
├→ Récupérer adresse propriétaire
├→ Créditer pendingWithdrawals[owner] += rentalAmount
├→ Changer statut → COMPLETED
├→ Émettre event PaymentReleased
└→ Retourner tx hash
Backend
├→ Écouter event PaymentReleased
├→ Mettre à jour BDD (status = COMPLETED)
├→ Notifier propriétaire du crédit
└→ Logging audit trail
Microservice d'intelligence artificielle FastAPI avec 4 modèles ML optimisés pour la plateforme de location immobilière décentralisée.
Le AI Service est un microservice Python/FastAPI qui fournit 4 fonctionnalités d'IA pour optimiser la plateforme de location:
| Fonctionnalité | Algorithme | Optimisation | Cas d'usage |
|---|---|---|---|
| 💰 Price Prediction | GradientBoosting | GridSearchCV (108 combinaisons) | Suggérer prix optimal en ETH |
| RandomForest | GridSearchCV (216 combinaisons) | Évaluer risque locataire (0-100) | |
| 🏠 Recommendations | Collaborative Filtering | Cosine Similarity | Recommander propriétés personnalisées |
| 📈 Market Trend | KMeans Clustering | Time-series analysis | Prédire tendances marché par quartier |
Ces modèles nécessitent des volumes de données importants, structurés et exploitables pour l’entraînement, C’est pour cette raison qu’on a choisi de travailler sur des données synthétiques.
- Blockchain-native : Prix directement en ETH + EUR
- Production-ready : CORS configuré, health checks, validation Pydantic
- Hyperoptimisé : GridSearchCV sur tous les modèles
- Auto-documenté : Swagger UI générée automatiquement
- Ultra-rapide : Prédictions < 50ms
- Scalable : Architecture microservices
| Technology | Version | Usage |
|---|---|---|
| FastAPI | 0.124.0 | Framework web moderne asynchrone |
| Uvicorn | 0.38.0 | Serveur ASGI haute performance |
| Pydantic | 2.12.5 | Validation données et sérialisation |
| Python | 3.10+ | Langage principal |
| Technology | Version | Usage |
|---|---|---|
| scikit-learn | 1.8.0 | Algorithmes ML (GradientBoosting, RandomForest, KMeans) |
| XGBoost | 3.1.2 | Boosting avancé (optionnel) |
| pandas | 2.3.3 | Manipulation et analyse de données |
| NumPy | 2.3.5 | Calculs vectorisés haute performance |
| SciPy | 1.16.3 | Fonctions scientifiques avancées |
| Technology | Version | Usage |
|---|---|---|
| Matplotlib | 3.10.8 | Graphiques statistiques |
| Seaborn | 0.13.2 | Visualisations statistiques élaborées |
| Plotly | 6.5.0 | Graphiques interactifs |
| Jupyter | N/A | Notebooks d'analyse exploratoire |
┌──────────────────────────────────────────────────────────┐
│ FRONTEND (Angular, React) │
│ Port: 4200 │
└─────────────────────┬────────────────────────────────────┘
│ HTTP/JSON (REST)
↓
┌──────────────────────────────────────────────────────────┐
│ BACKEND (Java/Spring Boot) │
│ Port: 8080 │
│ (booking-service, listing-service, user-service) │
└─────────────────────┬────────────────────────────────────┘
│ HTTP/JSON (REST)
↓
┌──────────────────────────────────────────────────────────┐
│ AI SERVICE (FastAPI + scikit-learn) │
│ Port: 8090 │
│ │
│ ┌──────────────┬──────────────┬──────────────────────┐ │
│ │ Price │ Risk │ Recommend / Trend │ │
│ │ Prediction │ Scoring │ │ │
│ └──────────────┴──────────────┴──────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ML Models (4 × .pkl) │ Datasets (3 × CSV) │ │
│ └──────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
ai-service/
├── app/
│ ├── main.py # Point d'entrée FastAPI
│ ├── config.py # Configuration
│ ├── routers/ # Endpoints API
│ │ ├── price.py # POST /price/predict
│ │ ├── scoring.py # POST /scoring/predict
│ │ ├── recommend.py # POST /recommend/predict
│ │ └── trend.py # GET /trend/trends
│ ├── schemas/ # Validation Pydantic
│ │ ├── price.py # Modèles Price
│ │ ├── risk.py # Modèles Risk
│ │ ├── recommendation.py # Modèles Recommendation
│ │ └── trend.py # Modèles Trend
│ ├── services/ # Logique ML
│ │ ├── price_model.py # Entraînement + prédiction
│ │ ├── scoring_model.py # Entraînement + scoring
│ │ ├── recommend_model.py # Collaborative Filtering
│ │ └── trend_model.py # KMeans clustering
│ └── utils/
│ ├── data_loader.py # Chargement données
│ └── logger.py # Logging
├── datasets/
│ ├── generate_datasets.py # Génération données réalistes
│ ├── raw/
│ │ ├── property_price.csv # 300 propriétés
│ │ ├── tenant_risk.csv # 1000 locataires
│ │ └── recommendation.csv # 5000 interactions
│ └── processed/ # Données prétraitées
├── models/ # Modèles ML entraînés
│ ├── price_prediction_model.pkl
│ ├── risk_scoring_model.pkl
│ ├── recommendation_model.pkl
│ └── trend_model.pkl
├── notebooks/
│ └── ai_service_analysis.ipynb # Analyse exploratoire
├── tests/ # Tests unitaires
├── Dockerfile # Containerisation
├── requirements.txt # Dépendances Python
└── README.md # Documentation
Objectif: Prédire le prix optimal par nuit d'une propriété en ETH
GradientBoostingRegressor(
n_estimators=200,
learning_rate=0.1,
max_depth=5,
min_samples_split=5,
min_samples_leaf=2
)| Métrique | Valeur |
|---|---|
| MAE (Mean Absolute Error) | 0.0106 ETH (~37€) |
| R² Score | 97.4% |
| Erreur moyenne | ±3.5% du prix prédit |
| Temps prédiction | 15ms |
| Feature | Importance | Détail |
|---|---|---|
| surface | 74.5% | Surface en m² (20-250) |
| rooms | 3.2% | Nombre de chambres (1-10) |
| amenities_count | 1.8% | Équipements (0-20) |
| avg_rating | 15.1% | Note moyenne (1-5★) |
| occupancy_rate | 7.6% | Taux occupation (0-1) |
Le modèle a été optimisé avec GridSearchCV testant 108 combinaisons d'hyperparamètres:
PARAM_GRID = {
'n_estimators': [50, 100, 200], # 3 valeurs
'learning_rate': [0.05, 0.1, 0.2], # 3 valeurs
'max_depth': [3, 5, 7], # 3 valeurs
'min_samples_split': [2, 5], # 2 valeurs
'min_samples_leaf': [1, 2] # 2 valeurs
}
# Total: 3×3×3×2×2 = 108 combinaisons# Entrée
{
"surface": 85,
"rooms": 3,
"amenities_count": 8,
"avg_rating": 4.4,
"occupancy_rate": 0.72
}
# Sortie
{
"predicted_price_eth": 0.2006,
"confidence_range_eth": {
"min": 0.1805,
"max": 0.2207
},
"predicted_price_eur": 702,
"confidence_range_eur": {
"min": 631,
"max": 772
},
"eth_eur_rate": 3500.0,
"recommendation": "Prix haut de gamme - Propriété d'exception"
}Objectif: Évaluer le risque d'un locataire (score 0-100)
RandomForestRegressor(
n_estimators=200,
max_depth=15,
min_samples_split=10,
min_samples_leaf=2,
max_features='sqrt'
)| Métrique | Valeur |
|---|---|
| MAE | 2.47 points |
| R² Score | 98.5% |
| Erreur moyenne | ±2.5% |
| Temps prédiction | 20ms |
| Feature | Importance | Détail |
|---|---|---|
| income | 1.8% | Revenu annuel (EUR) |
| debt_ratio | 6.9% | Ratio dette (0-1) |
| total_bookings | 5.0% | Nb réservations |
| cancellations | 49.2% | Nb annulations |
| late_cancellations | 30.2% | Annulations tardives |
| avg_rating | 7.0% | Note moyenne tenant |
if (risk_score < 30) {
level = "LOW" // ✅ Approuver réservation
action = "APPROVE"
}
else if (risk_score < 70) {
level = "MEDIUM" // ⚠️ Vérification supplémentaire
action = "VERIFY"
}
else {
level = "HIGH" // ❌ Rejeter/Demander dépôt
action = "REJECT"
}216 combinaisons d'hyperparamètres testées:
PARAM_GRID = {
'n_estimators': [50, 100, 200], # 3 valeurs
'max_depth': [5, 10, 15, None], # 4 valeurs
'min_samples_split': [2, 5, 10], # 3 valeurs
'min_samples_leaf': [1, 2, 4], # 3 valeurs
'max_features': ['sqrt', 'log2'] # 2 valeurs
}
# Total: 3×4×3×3×2 = 216 combinaisons# Entrée
{
"income": 45000,
"debt_ratio": 0.25,
"total_bookings": 12,
"cancellations": 1,
"late_cancellations": 0,
"avg_rating": 4.7
}
# Sortie
{
"risk_score": 18,
"risk_level": "LOW"
}Objectif: Recommander des propriétés basées sur les préférences
Matrice utilisateur-propriété:
- 991 locataires
- 300 propriétés
- 5000 interactions (historique réservations)
Calcul similarité: Cosine Similarity
# Similarité cosine entre deux propriétés
sim(A, B) = cos(θ) = (A · B) / (||A|| × ||B||)Pourquoi Cosine?
- Plus rapide que Pearson
- Meilleure performance (MAE: 0.42 vs 0.55)
- Robuste aux sparsité (beaucoup de 0)
| Type | Basé sur | Cas d'usage |
|---|---|---|
| User-based | Historique tenant | Recommander propriétés similaires à celles déjà réservées |
| Item-based | Similarité propriétés | Afficher propriétés similaires dans les résultats |
| Popular | Fréquence réservations | Afficher les propriétés "trending" |
# Recommandations pour un tenant
# GET /recommend/predict?tenant_id=5&top_n=5
{
"recommendation_type": "user-based",
"tenant_id": 5,
"recommendations": [
{
"property_id": 42,
"similarity_score": 0.87,
"avg_price_eth": 0.18,
"avg_rating": 4.6,
"location": "Downtown"
},
...
]
}Objectif: Prédire tendances prix par quartier
Analyse time-series des prix par quartier:
KMeans(
n_clusters=2, # STABLE vs RISING
n_init=10,
random_state=42
)| Cluster | Nb propriétés | Prix moyen | Tendance | Détail |
|---|---|---|---|---|
| STABLE | 236 | 0.1895 ETH (~663€) | → | Prix stables, faible volatilité |
| RISING | 64 | 0.3087 ETH (~1081€) | ↗ | Croissance rapide, haute demande |
Downtown, Uptown, Midtown, Bay Area, Tech Hub,
Residential, Harbor, North, South, Airport
# GET /trend/trends
{
"overall_market": {
"average_price_eth": 0.2156,
"trend": "STABLE",
"confidence": 0.92,
"forecast_3m_eth": 0.2187, # Prédiction 3 mois
"forecast_6m_eth": 0.2203 # Prédiction 6 mois
},
"neighborhoods": [
{
"name": "Downtown",
"current_price_eth": 0.25,
"trend": "RISING",
"confidence": 0.85,
"properties_count": 45
},
...
]
}http://localhost:8090
- Swagger UI: http://localhost:8090/docs
- ReDoc: http://localhost:8090/redoc
Prédire le prix optimal d'une propriété
Request:
curl -X POST "http://localhost:8090/price/predict" \
-H "Content-Type: application/json" \
-d '{
"surface": 85,
"rooms": 3,
"amenities_count": 8,
"avg_rating": 4.4,
"occupancy_rate": 0.72
}'Response (200 OK):
{
"predicted_price_eth": 0.2006,
"confidence_range_eth": {
"min": 0.1805,
"max": 0.2207
},
"predicted_price_eur": 702,
"confidence_range_eur": {
"min": 631,
"max": 772
},
"eth_eur_rate": 3500.0,
"recommendation": "Prix haut de gamme - Propriété d'exception"
}Validation:
surface: 20-250 m² (required)rooms: 1-10 (required)amenities_count: 0-20 (required)avg_rating: 1.0-5.0 (required)occupancy_rate: 0.0-1.0 (required)
Évaluer le risque d'un locataire
Request:
curl -X POST "http://localhost:8090/scoring/predict" \
-H "Content-Type: application/json" \
-d '{
"income": 45000,
"debt_ratio": 0.25,
"total_bookings": 12,
"cancellations": 1,
"late_cancellations": 0,
"avg_rating": 4.7
}'Response (200 OK):
{
"risk_score": 18,
"risk_level": "LOW"
}Utilisation recommandée:
risk_score < 30 → APPROVE (approuver automatiquement)
30 ≤ score < 70 → VERIFY (vérification manuelle)
score ≥ 70 → REJECT (rejeter/demander dépôt)
Obtenir des recommandations de propriétés
Request (User-based):
curl -X POST "http://localhost:8090/recommend/predict" \
-H "Content-Type: application/json" \
-d '{
"tenant_id": 5,
"top_n": 5
}'Request (Item-based):
curl -X POST "http://localhost:8090/recommend/predict" \
-H "Content-Type: application/json" \
-d '{
"property_id": 42,
"top_n": 5
}'Response (200 OK):
{
"recommendation_type": "user-based",
"recommendations": [
{
"property_id": 42,
"similarity_score": 0.87,
"avg_price_eth": 0.18,
"avg_rating": 4.6,
"location": "Downtown"
},
...
]
}Obtenir tendances de tous les quartiers
Request:
curl -X GET "http://localhost:8090/trend/trends"Response (200 OK):
{
"overall_market": {
"average_price_eth": 0.2156,
"trend": "STABLE",
"confidence": 0.92,
"forecast_3m_eth": 0.2187,
"forecast_6m_eth": 0.2203
},
"neighborhoods": [
{
"name": "Downtown",
"current_price_eth": 0.25,
"trend": "RISING",
"confidence": 0.85,
"properties_count": 45
},
...
]
}Obtenir tendance d'un quartier spécifique
Request:
curl -X GET "http://localhost:8090/trend/neighborhood/Downtown"Response (200 OK):
{
"neighborhood": "Downtown",
"current_price_eth": 0.25,
"price_history_eth": [0.23, 0.24, 0.25],
"trend": "RISING",
"forecast_3m": 0.26,
"forecast_6m": 0.27,
"volatility": 0.08
}- Python 3.10+
- pip ou conda
- 2GB RAM (minimum)
# 1. Cloner ou accéder au dossier
cd ai-service
# 2. Créer un environnement virtuel (optionnel mais recommandé)
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate
# 3. Installer les dépendances
pip install -r requirements.txt
# 4. Générer les datasets
python datasets/generate_datasets.py
# 5. Entraîner les modèles
python app/services/price_model.py
python app/services/scoring_model.py
python app/services/recommend_model.py
python app/services/trend_model.py
# 6. Lancer le serveur
python -m uvicorn app.main:app --host 0.0.0.0 --port 8090 --reload# Health check
curl http://localhost:8090/health
# Swagger UI
open http://localhost:8090/docs
# Test Price Prediction
curl -X POST "http://localhost:8090/price/predict" \
-H "Content-Type: application/json" \
-d '{"surface": 85, "rooms": 3, "amenities_count": 8, "avg_rating": 4.4, "occupancy_rate": 0.72}'Utilisé pour le modèle Price Prediction
property_id,surface,rooms,amenities_count,avg_rating,occupancy_rate,price_per_night_eth,price_per_night_eur
1,65,2,5,4.2,0.65,0.1429,500
2,120,4,12,4.7,0.82,0.3143,1100
...Statistiques:
- 300 propriétés
- Surface: 20-250 m²
- Prix: 0.05-0.50 ETH
Utilisé pour le modèle Risk Scoring
tenant_id,income,debt_ratio,total_bookings,cancellations,late_cancellations,avg_rating,risk_score
1,35000,0.15,5,0,0,4.8,10
2,28000,0.45,3,2,1,3.2,65
...Statistiques:
- 1000 locataires
- Income: 20k-150k EUR
- Risk Score: 5-95
Utilisé pour le modèle Collaborative Filtering
tenant_id,property_id,rating,stay_duration,booking_date
1,42,5,3,2024-01-15
2,15,4,2,2024-01-20
...Statistiques:
- 5000 interactions (réservations)
- Rating: 1-5 étoiles
- Matrice: 991×300
# Price Prediction
python app/services/price_model.py
# Risk Scoring
python app/services/scoring_model.py
# Recommendations
python app/services/recommend_model.py
# Market Trend
python app/services/trend_model.py# Dans le fichier price_model.py
USE_GRIDSEARCH = True # Activer hyperparameter tuning
# Puis lancer:
python app/services/price_model.py| Modèle | Mode rapide | GridSearchCV |
|---|---|---|
| Price | ~5 sec | ~45 sec |
| Scoring | ~8 sec | ~120 sec |
| Recommend | ~2 sec | N/A |
| Trend | ~1 sec | N/A |
# Lancer Jupyter
jupyter notebook notebooks/ai_service_analysis.ipynb| Endpoint | Temps min | Temps max | Moyenne |
|---|---|---|---|
/price/predict |
10ms | 50ms | 18ms |
/scoring/predict |
12ms | 55ms | 20ms |
/recommend/predict |
8ms | 40ms | 15ms |
/trend/trends |
5ms | 30ms | 12ms |
- ✅ In-memory caching : Les modèles chargent une seule fois au démarrage
- ✅ Vectorization : NumPy pour calculs rapides
- ✅ Batch predictions : Support des prédictions multiples
- ✅ Async I/O : Requests non-bloquantes
- ✅ Model compression : Serialization efficace en pickle
# main.py
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:4200", "https://rental-platform.com"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)# schemas/price.py
class PricePredictionRequest(BaseModel):
surface: float = Field(..., gt=20, lt=250, description="m²")
rooms: int = Field(..., ge=1, le=10)
amenities_count: int = Field(..., ge=0, le=20)
avg_rating: float = Field(..., ge=1.0, le=5.0)
occupancy_rate: float = Field(..., ge=0.0, le=1.0)
class Config:
json_schema_extra = {
"example": {
"surface": 85,
"rooms": 3,
"amenities_count": 8,
"avg_rating": 4.4,
"occupancy_rate": 0.72
}
}- Conception et provisionnement complet de l'infrastructure AWS via Terraform (28 fichiers modulaires organisés par service)
- Architecture réseau sécurisée Multi-AZ : VPC, sous-réseaux publics/privés, tables de routage, Internet Gateway, NAT Gateway unique
- Sécurité avancée :
- Rôles et politiques IAM à privilège minimal
- 8+ Security Groups avec règles très granulaires
- VPC Endpoints (S3, ECR, EKS, EC2) pour accès privé sans traversée Internet
- Optimisation forte des coûts :
- RDS t4g.micro single-AZ
- Node group EKS t3.small avec autoscaling 1–2 nœuds
- NAT Gateway unique pour 2 AZ
- Backup RDS réduit à 1 jour
- VPC Endpoints pour minimiser les coûts de transfert de données
- Gestion du stockage média :
- 2 buckets S3 privés (propriétés + photos utilisateurs)
- Versioning, chiffrement AES256, lifecycle policy (90 jours pour propriétés)
- Accès exclusif via CloudFront Origin Access Identity (OAI)
- Configuration Amazon EKS (Kubernetes 1.32) :
- Cluster managé + node group minimal
- Intégration OIDC + logging complet vers CloudWatch
- Mise en place du CDN CloudFront :
- Deux origines S3
- Cache intelligent, compression automatique, HTTPS forcé
- Monitoring & observabilité :
- Dashboard CloudWatch personnalisé (EKS, RDS, ALB)
- Alertes actives : erreurs 5XX ALB + CPU élevé RDS
- Logs structurés (ALB 7j, applications 3j)
- Pipeline CI/CD :
- Instance Jenkins EC2 t3.micro
- Accès sécurisé uniquement via AWS Session Manager (SSM)
- Rôle IAM dédié (ECR push/pull, EKS describe, S3 artifacts)
-
Infrastructure complète 100% Terraform
VPC 10.0.0.0/16 · ALB public · EKS · RDS MySQL · S3 + CloudFront · Jenkins · Monitoring -
Sécurité renforcée
- 5 rôles IAM spécifiques
- Security Groups ultra-restrictifs
- Buckets S3 100% privés (Block Public Access + OAI)
- RDS & EKS dans subnets privés uniquement
-
- Accès principal sécurisé (recommandé) : via SSM Session Manager
- Accès direct temporaire (dev/test) : http://:8099
- Ancien port (non utilisé actuellement) : http://:8080
-
Optimisation des coûts
- NAT Gateway unique → économie significative (~64$/mois vs 2 NAT)
- RDS single-AZ + petite instance + backup minimal
- VPC Endpoints pour S3/ECR/EKS → réduction coûts de transfert
- EKS node group très léger (1–2 t3.small)
-
Stockage & distribution médias
- Lifecycle 90 jours sur bucket propriétés
- Versioning sur bucket utilisateurs
- CloudFront : cache 1h par défaut, compression, IPv6, HTTPS forcé
-
Observabilité
- Dashboard CloudWatch multi-services
- Alertes proactives (5XX, CPU RDS)
- Intégration logs EKS pods via politique IAM dédiée
-
Documentation & reproductibilité
- Variables centralisées
- ~35 outputs Terraform (URLs, commandes DevOps, guides)
- Structure modulaire claire (alb.tf, eks.tf, s3.tf, security_groups.tf…)
- Guides intégrés : connexion ECR, kubeconfig, SSM, installation Jenkins
Schéma global de l'architecture (VPC, ALB, EKS, RDS, S3+CloudFront, Jenkins)
| Aspect | Choix réalisés | Objectif principal |
|---|---|---|
| Coût | NAT unique, single-AZ RDS, db.t4g.micro, 10GB gp2, backup 1j, pas d'auto-scale | Minimiser la facture mensuelle |
| Sécurité | SG très granulaires (8+), VPC Endpoints, OAI CloudFront, SSM only pour Jenkins | Zero exposition inutile |
| Observabilité | Dashboard CloudWatch + 2 alarmes + logs structurés | Visibilité immédiate sans surcoût |
| CI/CD | Jenkins sur EC2 t3.micro + SSM + ECR push/pull | Déploiement simple et sécurisé |
| Images & médias | S3 privé + CloudFront + compression + lifecycle 90j | Performance + coût maîtrisé |
| Kubernetes | EKS 1.32 minimal (1–2 nœuds) + logging complet + OIDC | Futur-proof pour scaling horizontal |
Fichiers principaux :
├── main.tf # Configuration provider & tags par défaut
├── variables.tf # Variables principales + locals.microservices
├── terraform.tfvars # Valeurs concrètes pour dev
├── outputs.tf # ~35 outputs utiles (URLs, commandes, creds SSM...)
│
├── vpc.tf # VPC + DNS settings
├── subnets.tf # 2 publics + 2 privés Multi-AZ
├── route_tables.tf # Routage public + privé (NAT unique)
├── gateways.tf # IGW + NAT Gateway (1 seul)
├── vpc_endpoint_.tf # Endpoints privés S3 / ECR / EKS / EC2
│
├── security_groups.tf # 8+ SG + règles additionnelles très fines
├── alb.tf # ALB public + listener HTTP + règle /api/
├── alb_target_groups.tf # 2 target groups (frontend + api-gateway)
│
├── s3.tf # 2 buckets privés + politiques + versioning + lifecycle
├── cloudfront.tf # Distribution CDN unique + OAI
│
├── ecr.tf # 13 repositories + lifecycle 10 images + scan on push
├── eks.tf # Cluster EKS 1.32 + nodegroup minimal
├── eks_iam.tf # Rôles cluster & nodes
│
├── rds.tf # MySQL db.t4g.micro single-AZ + param group FR
├── parameter_group.tf # Paramètres MySQL (utf8mb4 + timezone Paris)
│
├── iam_.tf # Rôles IAM : jenkins, backend-s3, backend-rds, devops-ssm...
├── jenkins_ec2.tf # Instance Jenkins t3.micro + SSM + user_data
│
├── cloudwatch_.tf # Logs, Dashboard, 2 alarmes (ALB 5XX + RDS CPU)
- Aucun accès SSH public → tout via AWS Session Manager (SSM)
- Buckets S3 privés → accès uniquement via CloudFront OAI
- Security Groups très restrictifs (8 principaux + règles additionnelles)
- IAM least privilege partout (rôles spécifiques par usage)
- VPC Endpoints pour S3/ECR/EKS/EC2 → réduction NAT + sécurité maximale
-
Dashboard CloudWatch :
- CPU/Mémoire nœuds EKS
- CPU/Connexions/Stockage RDS
- Codes HTTP 2xx/4xx/5xx + latence ALB
-
Alertes actives :
-
10 erreurs 5XX sur ALB (5 min)
- CPU RDS > 80% pendant 10 min
-
# Application (dev)
http://<alb-dns-name>
http://<alb-dns-name>/api
# Jenkins
http://<jenkins-public-ip>:8080
# Jenkins (accès direct temporaire dev)
http://<jenkins-public-ip>:8099
# CloudFront images
https://<distribution-id>.cloudfront.net
# Mise à jour kubeconfig
aws eks update-kubeconfig --name real-estate-dapp-eks-dev --region eu-west-3
# Login ECR
aws ecr get-login-password --region eu-west-3 | docker login --username AWS --password-stdin <account>.dkr.ecr.eu-west-3.amazonaws.com
# Session SSM Jenkins (recommandé)
aws ssm start-session --target <instance-id-jenkins>
# Dashboard CloudWatch
https://eu-west-3.console.aws.amazon.com/cloudwatch/home?region=eu-west-3#dashboards:name=real-estate-dapp-dev-dashboard
- Git & GitHub : Gestion de version et hébergement du code source. Les branches et pull requests structurent le flux de travail.
- Webhooks GitHub : Déclenchent automatiquement le pipeline Jenkins à chaque
pushou événement sur le dépôt. - Jenkins : Orchestrateur principal du pipeline CI/CD. Automatise les étapes de build, test, analyse de sécurité, création de conteneurs et déploiement.
- Builds Multi-étapes : Séparation claire des phases de construction, test et empaquetage pour plus de clarté et d'efficacité.
- Promotion d'Environnements : Déploiement séquentiel et contrôlé des nouvelles versions à travers les environnements Dev → Staging → Production.
- Stratégies de Rollback : Plans de retour arrière automatisés via Jenkins et Helm, permettant une restauration rapide en cas d'incident.
- Docker : Chaque microservice est conteneurisé dans une image Docker autonome et portable.
- Docker Compose : Utilisé pour orchestrer l'environnement de développement local (bases de données, brokers de messages, etc.).
- Docker Hub : Registre central où les images Docker versionnées et scannées sont stockées et distribuées.
- Dockerfiles Multi-étapes : Permettent de créer des images Docker optimisées et sécurisées, en minimisant leur taille finale.
- Clusters Kubernetes : Gèrent le cycle de vie des conteneurs (déploiement, scaling, résilience) en production.
- Helm Charts : Empaquetent et gèrent les configurations d'application pour des déploiements reproductibles sur Kubernetes.
- Service Discovery & Ingress : Gèrent la communication interne entre les services et le routage du trafic entrant externe.
Un pipeline CI/CD complet avec Jenkins automatise le build, le push des images Docker et le déploiement sur AWS EKS.
Le pipeline est déclenché sur la branche main, gère plusieurs microservices en parallèle, utilise des tags intelligents (commit + latest) et inclut des vérifications de sécurité et des mécanismes de rollback.
pipeline {
agent any
options {
timestamps()
}
stages {
stage('Checkout') {
steps { sh 'echo Checkout stage' }
}
stage('Environment Info') {
steps { sh 'echo Environment info stage' }
}
stage('Docker Login') {
steps { sh 'echo Docker login stage' }
}
stage('Build & Push Images') {
steps { sh 'echo Build and push images stage' }
}
stage('Deploy to EKS') {
steps { sh 'echo Deploy to EKS stage' }
}
stage('Cleanup') {
steps { sh 'echo Cleanup stage' }
}
}
post {
always { sh 'echo Pipeline finished' }
success { sh 'echo Success' }
failure { sh 'echo Failure' }
}
}
Les manifests Kubernetes sont organisés de manière modulaire pour faciliter la maintenance, la scalabilité et la séparation des préoccupations (config, secrets, services, monitoring, ingress). Cette structure prend en charge un déploiement multi-environnement (dev / staging / prod) et reste compatible avec Kustomize ou Helm.
k8s/
├── config
│ ├── global-config.yaml # Variables d'environnement communes (ports, URLs, buckets S3...)
│ └── global-secrets.yaml # Secrets sensibles (clés Infura, JWT, DB passwords, Twilio...)
├── infra
│ ├── eureka-server.yaml # Service Discovery (Eureka standalone)
│ ├── mysql-db.yaml # Base de données relationnelle (StatefulSet ou RDS en prod)
│ ├── rabbitmq.yaml # Broker de messages asynchrones
│ └── redis.yaml # Cache distribué
├── ingress
│ ├── api-gateway-ingress-aws.yaml # Ingress spécifique AWS ALB
│ ├── api-gateway-ingress.yaml # Ingress générique (nginx-ingress ou Traefik local)
│ ├── ingress.yaml # Configuration de base
│ └── real-estate-ingress.yaml # Règles d'entrée principales pour l'application
├── monitoring
│ ├── service-monitor.yaml # ServiceMonitor pour scraper automatiquement tous les services Spring Boot
│ └── values-monitoring.yaml # Configuration personnalisée pour kube-prometheus-stack (Helm)
├── namespaces
│ └── dev.yaml # Namespace dédié au développement
└── services
├── ai-service.yaml
├── api-gateway.yaml
├── blockchain-service.yaml
├── booking-service.yaml
├── front-service.yaml # Frontend Angular
├── listing-service.yaml
├── media-service.yaml
├── messaging-service.yaml
├── notification-service.yaml
├── payment-service.yaml
├── review-service.yaml
└── user-service.yaml
Un monitoring avancé est assuré via Prometheus (collecte des métriques) et Grafana (visualisation) grâce au stack officiel kube-prometheus-stack (Helm).
Tous les microservices Spring Boot exposent des métriques Actuator/Prometheus, automatiquement scrapées par un ServiceMonitor couvrant l’ensemble du namespace dev.
- Prometheus : Serveur de métriques et d'alertes.
- Grafana : Visualisation et tableaux de bord.
- ELK Stack : Centralisation et analyse des logs.
- Jaeger : Tracing distribué.
Git → GitHub → Jenkins → Docker → Docker Hub → Kubernetes → Prometheus → Grafana
Un pipeline CI/CD complet avec Jenkins automatise le build, le push des images Docker et le déploiement sur AWS EKS.
Le pipeline est déclenché sur la branche main, gère plusieurs microservices en parallèle, utilise des tags intelligents (commit + latest) et inclut des vérifications de sécurité et des mécanismes de rollback.
pipeline {
agent any
options {
timestamps()
}
stages {
stage('Checkout') {
steps { sh 'echo Checkout stage' }
}
stage('Environment Info') {
steps { sh 'echo Environment info stage' }
}
stage('Docker Login') {
steps { sh 'echo Docker login stage' }
}
stage('Build & Push Images') {
steps { sh 'echo Build and push images stage' }
}
stage('Deploy to EKS') {
steps { sh 'echo Deploy to EKS stage' }
}
stage('Cleanup') {
steps { sh 'echo Cleanup stage' }
}
}
post {
always { sh 'echo Pipeline finished' }
success { sh 'echo Success' }
failure { sh 'echo Failure' }
}
}
Les manifests Kubernetes sont organisés de manière modulaire pour faciliter la maintenance, la scalabilité et la séparation des préoccupations (config, secrets, services, monitoring, ingress). Cette structure prend en charge un déploiement multi-environnement (dev / staging / prod) et reste compatible avec Kustomize ou Helm.
k8s/
├── config
│ ├── global-config.yaml # Variables d'environnement communes (ports, URLs, buckets S3...)
│ └── global-secrets.yaml # Secrets sensibles (clés Infura, JWT, DB passwords, Twilio...)
├── infra
│ ├── eureka-server.yaml # Service Discovery (Eureka standalone)
│ ├── mysql-db.yaml # Base de données relationnelle (StatefulSet ou RDS en prod)
│ ├── rabbitmq.yaml # Broker de messages asynchrones
│ └── redis.yaml # Cache distribué
├── ingress
│ ├── api-gateway-ingress-aws.yaml # Ingress spécifique AWS ALB
│ ├── api-gateway-ingress.yaml # Ingress générique (nginx-ingress ou Traefik local)
│ ├── ingress.yaml # Configuration de base
│ └── real-estate-ingress.yaml # Règles d'entrée principales pour l'application
├── monitoring
│ ├── service-monitor.yaml # ServiceMonitor pour scraper automatiquement tous les services Spring Boot
│ └── values-monitoring.yaml # Configuration personnalisée pour kube-prometheus-stack (Helm)
├── namespaces
│ └── dev.yaml # Namespace dédié au développement
└── services
├── ai-service.yaml
├── api-gateway.yaml
├── blockchain-service.yaml
├── booking-service.yaml
├── front-service.yaml # Frontend Angular
├── listing-service.yaml
├── media-service.yaml
├── messaging-service.yaml
├── notification-service.yaml
├── payment-service.yaml
├── review-service.yaml
└── user-service.yaml
Un monitoring avancé est assuré via Prometheus (collecte des métriques) et Grafana (visualisation) grâce au stack officiel kube-prometheus-stack (Helm).
Tous les microservices Spring Boot exposent des métriques Actuator/Prometheus, automatiquement scrapées par un ServiceMonitor couvrant l’ensemble du namespace dev.
[DEVELOPPEURS]
│
▼ (git push)
[GITHUB] ───webhook───► [JENKINS]
│ │
│ ▼ (pipeline CI/CD)
│ [BUILD & TEST]
│ │
│ ▼ (docker build)
│ [DOCKER IMAGE] ───push───► [DOCKER HUB]
│ │ │
│ ▼ (helm deploy) │
└─────────────────► [KUBERNETES] ◄──────────pull───┘
│
▼ (monitoring)
┌───────────── [PROMETHEUS] ◄──métrics───┐
│ │ │
│ ▼ (datasource) │
│ [GRAFANA] │
│ │ │
└─────dashboard───[ÉQUIPE]◄──alertes────┘
GitHub Repository
├── /src/ → Code applicatif
├── /Dockerfile → Configuration Docker
├── /jenkinsfile → Pipeline Jenkins
├── /k8s/ → Fichiers Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
└── /monitoring/ → Config monitoring
├── prometheus-rules.yaml
└── grafana-dashboard.json
Pipeline: Développement → Production
├── Étape 1: Trigger
│ └── Webhook GitHub → Jenkins
│
├── Étape 2: Build
│ ├── Checkout code GitHub
│ ├── Maven/Gradle build
│ ├── Tests unitaires
│ └── Packaging (JAR/WAR)
│
├── Étape 3: Containerisation
│ ├── Docker build (multi-stage)
│ ├── Scan sécurité image
│ ├── Tag: monapp:${BUILD_ID}
│ └── Push vers Docker Hub
│
├── Étape 4: Déploiement K8s
│ ├── Dev: kubectl apply -f k8s/
│ ├── Tests intégration
│ └── Promotion Staging/Prod
│
└── Étape 5: Monitoring
├── Vérification santé
└── Alertes si échecNamespace: production
├── POD 1: Mon Application
│ ├── Container: monapp:v1.2
│ ├── Port: 8080
│ └── Liveness/Readiness probes
│
├── POD 2: Base de Données
│ ├── Container: mysql:8.0
│ └── Volume: données persistantes
│
├── POD 3: Cache
│ └── Container: redis:alpine
│
└── SERVICE: Load Balancer
├── Type: ClusterIP/NodePort
└── Expose port 80/443
Prometheus Server
├── Scrape Config:
│ ├── k8s-pods (autodiscovery)
│ ├── mysql-exporter:9104
│ ├── redis-exporter:9121
│ └── node-exporter:9100
│
├── Alert Rules:
│ ├── High CPU (>80% for 5min)
│ ├── Pod restart (>3 times)
│ └── Service down
│
└── AlertManager → Slack/Email
Grafana
├── Data Source: Prometheus
├── Dashboard 1: Infrastructure
│ ├── CPU/Memory usage
│ ├── Pod count
│ └── Network traffic
│
├── Dashboard 2: Application
│ ├── Response time
│ ├── Error rate
│ └── Request count
│
└── Dashboard 3: Bases de données
├── MySQL connections
└── Redis hit rate
Internet (Utilisateurs)
│
▼ HTTPS:443
[Cloud Load Balancer]
│
▼
[Kubernetes Ingress]
│
▼
[Services K8s]
├──► Service App (port 8080)
│ │
│ ▼
│ [Pods Application]
│ ├── Pod 1: monapp
│ └── Pod 2: monapp
│
├──► Service MySQL (port 3306)
│ │
│ ▼
│ [Pod MySQL]
│
└──► Service Redis (port 6379)
│
▼
[Pod Redis]
Merci à toute l'équipe de développement pour leur contribution exceptionnelle à ce projet innovant.
Version : 1.0.0






