← Tous les projets

Projet personnel 2026

Ewô

Réservation de séjours multi-pays : web, mobile et 15 microservices.

Rôle
Conception et développement en solo : architecture, back-end, back-office, application mobile, CI/CD et déploiement.
Statut
En développement · dépôt privé, accès sur demande
Stack
  • Java 21
  • Spring Boot 3.4
  • Spring Cloud Gateway
  • Eureka
  • PostgreSQL 16
  • Redis
  • RabbitMQ
  • Angular 20
  • Flutter
  • Docker
  • GitHub Actions
  • Caddy
  • Prometheus
  • Grafana

Ewô permet de réserver des activités, hébergements, transports ou packs complets auprès de partenaires locaux, de payer par carte ou par Mobile Money, puis d’obtenir un programme de voyage jour par jour. Chaque pays a son catalogue, sa devise et ses moyens de paiement.

Architecture

App AndroidFlutterBack-officeAngular 20CaddyHTTPSAPI GatewayJWT · pays15 microservicesSpring Boot 3.4PostgreSQL 161 base / serviceRediscacheRabbitMQoutboxStripe · CinetPaypaiements
Toutes les requêtes passent par Caddy puis la gateway ; les services communiquent par événements RabbitMQ.

Ce que j’ai construit

  • 15 microservices Spring Boot 3.4 / Java 21 derrière une Spring Cloud Gateway, avec découverte Eureka et une base PostgreSQL par service.
  • Multi-tenant : 5 pays ouverts (Côte d’Ivoire, Sénégal, Bénin, Cameroun, France), chacun avec sa devise (XOF, XAF, EUR).
  • Back-office Angular 20 (signals, Material) et application Android Flutter (Riverpod, GoRouter).
  • Tests JUnit / Testcontainers, Jest et Flutter lancés par GitHub Actions à chaque push ; images Docker publiées automatiquement.
  • Supervision Prometheus / Grafana, HTTPS automatique avec Caddy, configuration de déploiement pour Raspberry Pi 4.

Décisions techniques

  1. Saga réservation → paiement

    Le prix est recalculé côté serveur et le stock réservé de façon atomique. Le paiement passe par Stripe (cartes) ou CinetPay (Mobile Money) ; en cas d’échec, le remboursement est déclenché automatiquement.

  2. Outbox et consommation idempotente

    Les événements sont écrits dans la même transaction que les données (pattern outbox), publiés sur RabbitMQ puis consommés de façon idempotente : aucun message perdu, aucun message traité deux fois.

  3. Sécurité concentrée à la gateway

    Point d’entrée unique : la gateway valide le JWT, supprime tout en-tête d’identité envoyé par le client, résout le pays et bloque les routes internes.

  4. Programme de voyage sous contraintes

    Génération déterministe selon le budget, le rythme et les centres d’intérêt, avec regroupement géographique des activités et gestion des horaires.

Projet suivantPlateforme terrains →