samy.boudaoud
EN Portfolio
Terminé, juin 2026

TicketFlowBilletterie cloud-native sur Kubernetes

Une plateforme de billetterie avec réservation de sièges, paiement et billets QR en PDF, découpée en microservices et déployée sur Kubernetes chez Azure. Projet de Mastère en équipe de trois, construit en 48 heures : j'ai porté le back-end, l'infrastructure et la chaîne de livraison.

Node.js · ExpressReactPostgreSQLRedis · BullMQKubernetes (AKS)TerraformGitHub Actions
01

Le projet

Le sujet imposait de démontrer dix concepts cloud-native sur une application réelle, avec une URL publique, une infrastructure en code et un déploiement continu. Nous avons choisi une billetterie, parce qu'elle concentre les vrais problèmes d'un système distribué : deux personnes qui veulent le même siège, un paiement qui ne répond pas, un billet qui doit être généré une fois et une seule.

SSamy

Back-end, infrastructure, CI/CD

API, worker, passerelle de paiement, Terraform, manifestes Kubernetes, pipelines.

FFayrouz

Front-end

Application React : catalogue, plan de salle, panier, billets.

MMelvin

Documentation et oral

Dossier, script de démonstration, refonte du rendu des billets.

48 hde la page blanche à la démo
4images déployées à chaque push
10concepts cloud-native démontrés
3personnes dans l'équipe
3décisions écrites (ADR)
0double réservation possible

Chiffres tirés du dépôt GitHub.

02

Architecture

Tout tourne dans un cluster AKS. Traefik reçoit le trafic et l'aiguille vers le front ou l'API ; l'API reste sans état, ce qui permet d'en lancer autant de copies que nécessaire.

infra/k8s-aks/ticketflow.yamlSchéma simplifié du déploiement de production.
Azure AKS (Kubernetes): Traefik, frontend, api, payment-gateway, Redis, PostgreSQL, worker, MinIO Azure AKS (Kubernetes) HTTP / /api checkout SET NX EX SQL tâche Utilisateur TraefikIngress frontendReact + nginx apiExpress · JWT payment-gatewayvia disjoncteur Redisverrous + broker PostgreSQLStatefulSet + PVC workerconsommateur BullMQ MinIO / BlobQR + PDF
01

L'utilisateur choisit ses sièges : l'API pose un verrou Redis de quelques minutes sur chacun.

02

Au paiement, l'API appelle la passerelle à travers un disjoncteur, avec délai maximal et repli.

03

Paiement accepté : l'API publie l'événement reservation.paid dans la file BullMQ.

04

Le worker génère le QR code et le PDF, les dépose dans le stockage objet, puis acquitte.

05

L'API sert le PDF et la page de vérification du QR, sans jamais exposer le stockage.

03

Les patterns, et où ils vivent

Chaque concept est vérifiable dans le code. Voici les plus importants.

Pas de double réservation

Verrou atomique SET NX EX sur chaque siège : le premier gagne, le second reçoit un 409, et le verrou expire seul si l'utilisateur abandonne.

api/src/holds.js

Un paiement lent ne fait pas tomber le site

Disjoncteur opossum avec délai maximal et repli : après trop d'échecs, l'API répond tout de suite au lieu d'empiler les requêtes.

api/src/payment.js

Un message n'est jamais perdu

File BullMQ avec cinq tentatives, attente exponentielle et file des échecs conservée. Le worker n'acquitte qu'une fois le travail fait.

api/src/queue.js · worker/src/index.js

Un billet, une seule fois

Worker idempotent : garde en entrée, ON CONFLICT DO NOTHING et contrainte d'unicité réservation-siège en base.

worker/src/handlers/reservationPaid.js

Une base qui survit aux redémarrages

PostgreSQL en StatefulSet avec volume persistant, service headless et sondes de disponibilité.

infra/k8s-aks/ticketflow.yaml

Prêt pour la production

Routes /healthz et /readyz, journaux structurés pino, arrêt propre sur SIGTERM, sondes Kubernetes partout.

api/src/health.js · server.js

04

Choix assumés

Trois décisions défendues devant le jury plutôt que subies.

01AKS plutôt qu'Azure Container Apps

Container Apps masque Kubernetes. Un vrai cluster permettait de démontrer StatefulSet, Ingress, sondes et haute disponibilité. En contrepartie, un coût à surveiller et un repli sur minikube prévu pour la démo.

02PostgreSQL dans le cluster

Plutôt qu'une base managée : le pattern StatefulSet et volume persistant devient concret, et l'infrastructure reste simple à reproduire.

03Billets servis par l'API

Le stockage objet reste privé. Les PDF passent par une route authentifiée au lieu d'une URL de stockage exposée : meilleure posture de sécurité.

05

Livraison

Terraform provisionne le groupe de ressources, le registre d'images, le cluster AKS, le stockage et le coffre de secrets. À chaque push sur main, GitHub Actions construit et publie les quatre images, puis met à jour le cluster.

  • 22 juin 2026Squelette et infrastructure

    Monorepo, services, manifestes Kubernetes, Terraform pour Azure.

  • 23 juin 2026Déploiement continu et audit

    Pipeline de déploiement activé, audit de conformité qui relève deux défauts bloquants avant la démo, corrigés dans la foulée.

  • 24 juin 2026Démonstration

    Guide de déploiement, script de démo : un commit en direct part en production pendant la soutenance.

  • Terminé, juin 2026Résultat

    Les dix concepts attendus démontrés par du code vérifiable, une démo de bout en bout, et un dépôt documenté (architecture, contrat d'API, ADR, guide de déploiement).

Pas besoin de compte Azure pour l'essayer : tout le projet se lance en local avec une seule commande, docker compose up.