📚 Rapport Technique CI/CD - Projet Qrious Quiz

image.png

Projet Cloud Native DevOps - ESIEE Paris 2025

👤 Auteurs : Ilyas GHANDAOUI & Cyprien BOSCHER - E4FI ESIEE Paris

👨‍🏫 Enseignant : Badr TAJINI

📅 Date : 28 décembre 2025

🔗 Repository : https://github.com/ilyasgdo/Projet-Full-Stack-ESIEE-2025-Ilyas-Cyprien

🌐 Application en Ligne

ComposantURLInfrastructure
Frontendhttps://ilyasghandaoui.storeCloudflare Pages
Backend APIhttps://api.ilyasghandaoui.storeCloudflare Tunnel → Minikube Local
Documentationhttps://docs.ilyasghandaoui.storeCloudflare Pages

Architecture hybride : Le frontend est déployé sur le CDN Cloudflare Pages (disponible 24/7), tandis que le backend utilise un tunnel Cloudflare pour exposer le cluster Kubernetes local (Minikube) sur Internet.


📋 Table des Matières

  1. Introduction
  2. Architecture Globale
  3. Phase 1 : Application Web
  4. Phase 2 : Intégration Continue (CI)
  5. Phase 3 : Livraison Continue (CD)
  6. Phase 4 : Déploiement Kubernetes
  7. Base de Données
  8. Scripts d’Automatisation
  9. Sécurité
  10. Guide de Déploiement
  11. Phase 5 : Déploiement Cloud (Cloudflare)
  12. Métriques de Performance
  13. Sécurité et Zero Trust
  14. Erreurs Rencontrées et Solutions
  15. Couverture des Tests
  16. Bonnes Pratiques et Leçons Apprises
  17. Conclusion

1. Introduction

1.1 Contexte du Projet

Ce projet implémente une architecture CI/CD complète pour une application de quiz web. L’objectif est de démontrer les pratiques DevOps modernes avec :

  • Intégration Continue (CI) : Tests automatisés et build Docker
  • Livraison Continue (CD) : Déploiement automatique sur Kubernetes
  • Infrastructure locale : Minikube pour le cluster Kubernetes

1.2 Technologies Utilisées

1.png

1.3 Objectifs Pédagogiques

ObjectifImplémentation
Tests automatisés✅ Vitest (Frontend) + Pytest (Backend)
Images Docker✅ Multi-architecture (amd64/arm64)
Déploiement K8s✅ Minikube avec manifests YAML
Opérations CRUD✅ Questions, Réponses, Participations
Pipeline CI/CD✅ GitHub Actions

2. Architecture Globale

2.1 Vue d’Ensemble du Système

2.png

2.2 Flux de Données

3.png


3. Phase 1 : Application Web

3.1 Architecture de l’Application

4.png

3.2 Structure des Fichiers

📁 Projet-Full-Stack-ESIEE-2025-Ilyas-Cyprien/
├── 📁 .github/workflows/
│   └── 📄 ci-cd.yml              # Pipeline GitHub Actions
├── 📁 k8s/
│   ├── 📄 configmap.yaml         # Variables d'environnement
│   ├── 📄 secrets.yaml           # Secrets (base64)
│   ├── 📄 backend-deployment.yaml
│   ├── 📄 frontend-deployment.yaml
│   └── 📄 pvc.yaml               # Persistent Volume Claim
├── 📁 scripts/
│   ├── 📄 start-cd.sh            # Setup complet
│   ├── 📄 setup-minikube.sh      # Config Minikube
│   ├── 📄 deploy.sh              # Déploiement K8s
│   └── 📄 auto-deploy.sh         # Watcher Docker Hub
├── 📁 quiz-api/                   
│   ├── 📄 app.py               
│   ├── 📄 models.py              
│   ├── 📄 auth.py                
│   ├── 📄 Dockerfile
│   ├── 📄 requirements.txt
│   └── 📁 tests/
│       └── 📄 test_api.py        
└── 📁 quiz-ui/                    
    ├── 📁 src/
    │   ├── 📁 views/             
    │   ├── 📁 services/          
    │   └── 📁 test/             
    ├── 📄 Dockerfile.k8s
    └── 📄 package.json

3.3 API REST Endpoints

5.png


4. Phase 2 : Intégration Continue (CI)

4.1 Pipeline GitHub Actions

6.png

4.2 Configuration du Workflow

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline
 
on:
  push:
    branches: [main, master]
  pull_request:
    branches: [main, master]
 
jobs:
  test-frontend:
    name: Frontend Tests (Vitest)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
        working-directory: quiz-ui
      - run: npm run test:run
        working-directory: quiz-ui
 
  test-backend:
    name: Backend Tests (Pytest)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'
      - run: pip install -r requirements.txt
        working-directory: quiz-api
      - run: pytest tests/ -v
        working-directory: quiz-api
 
  build-and-push:
    needs: [test-frontend, test-backend]
    runs-on: ubuntu-latest
    # ... build Docker multi-arch

4.3 Couverture des Tests

7.png

CatégorieFrameworkNombre de Tests
Frontend - ComposantsVitest2
Frontend - ServicesVitest2
Backend - Health CheckPytest2
Backend - AuthPytest3
Backend - CRUD QuestionsPytest8
Backend - ParticipationsPytest3
Backend - Delete AllPytest2
Total24 tests

5. Phase 3 : Livraison Continue (CD)

5.1 Processus de Déploiement Automatique

8.png

5.2 Images Docker

9.png

ImageBaseTailleArchitectures
ssssssss3/quiz-apipython:3.9-alpine~150 MBamd64, arm64
ssssssss3/quiz-uinginx:alpine~25 MBamd64, arm64

6. Phase 4 : Déploiement Kubernetes

6.1 Architecture du Cluster

10.png

6.2 Manifests Kubernetes

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: quiz-config
data:
  FLASK_ENV: "production"
  FLASK_DEBUG: "0"
  VITE_API_URL: "http://quiz-backend:5000"

Secrets

apiVersion: v1
kind: Secret
metadata:
  name: quiz-secrets
type: Opaque
data:
  SECRET_KEY: <base64>
  ADMIN_PASSWORD: <base64>

6.3 Ressources et Limites

11.png

6.4 Health Checks (Probes)

12.png

ProbeBackendFrontend
LivenessGET / :5000 every 30sGET / :80 every 30s
ReadinessGET / :5000 every 10sGET / :80 every 10s
Initial Delay15s5s

7. Base de Données

7.1 Schéma de la Base de Données

13.png

7.2 Opérations CRUD

14.png


8. Scripts d’Automatisation

8.1 Vue d’Ensemble des Scripts

15.png

8.2 Détail des Scripts

ScriptButCommande
start-cd.shSetup complet en une commande./scripts/start-cd.sh
setup-minikube.shConfigure Minikube (4GB, 2 CPUs)./scripts/setup-minikube.sh
deploy.shDéploie tous les manifests K8s./scripts/deploy.sh
auto-deploy.shWatcher pour CD automatique./scripts/auto-deploy.sh

9. Sécurité

9.1 Matrice de Sécurité

16.png

9.2 Bonnes Pratiques Implémentées

AspectImplémentation
Secrets GitHubVariables chiffrées dans Settings
Secrets K8sEncodés en base64
Auth APIJWT avec expiration
Images DockerTags immuables (SHA)
RéseauBackend non exposé publiquement

10. Guide de Déploiement

10.1 Prérequis

17.png

10.2 Installation Pas à Pas

git clone https://github.com/ilyasgdo/Projet-Full-Stack-ESIEE-2025-Ilyas-Cyprien.git
cd Projet-Full-Stack-ESIEE-2025-Ilyas-Cyprien
 
./scripts/start-cd.sh
 
./scripts/auto-deploy.sh
 
minikube service quiz-frontend --url

10.3 Commandes Utiles

# Status des pods
kubectl get pods -l app=quiz
 
# Logs backend
kubectl logs -l component=backend -f
 
# Logs frontend
kubectl logs -l component=frontend -f
 
# Dashboard Kubernetes
minikube dashboard
 
# Redémarrer les déploiements
kubectl rollout restart deployment/quiz-backend
kubectl rollout restart deployment/quiz-frontend

11. Phase 5 : Déploiement Cloud (Cloudflare)

En plus du déploiement local Minikube, l’application est désormais accessible publiquement via Cloudflare !

11.1 Architecture Cloud

Architecture Cloud

123.png

🔒 Sécurité : Le port-forward écoute uniquement sur localhost (127.0.0.1). Le trafic est chiffré de bout en bout via le tunnel Cloudflare.

11.2 Composants Cloud

ComposantServiceURL
FrontendCloudflare Pageshttps://ilyasghandaoui.store
Backend APICloudflare Tunnelhttps://api.ilyasghandaoui.store
DocumentationCloudflare Pageshttps://docs.ilyasghandaoui.store

11.3 Workflow de Déploiement Frontend

Un nouveau workflow GitHub Actions a été ajouté pour déployer automatiquement le frontend sur Cloudflare Pages :

# .github/workflows/deploy-frontend.yml
name: Deploy Frontend to Cloudflare Pages
 
on:
  push:
    branches: [main, master]
    paths:
      - 'quiz-ui/**'
  workflow_dispatch:
 
jobs:
  deploy:
    name: Deploy to Cloudflare Pages
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
        working-directory: quiz-ui
      - run: npm run build
        working-directory: quiz-ui
        env:
          VITE_API_URL: ${{ secrets.VITE_API_URL }}
      - uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: quiz-frontend
          directory: quiz-ui/dist

11.4 Configuration Cloudflare Tunnel

Le backend Flask sur Minikube est exposé publiquement via un tunnel Cloudflare :

Configuration du tunnel (~/.cloudflared/config.yml) :

tunnel: 50ea3b9e-3937-4c50-b6e0-36bb54fb9591
credentials-file: ~/.cloudflared/50ea3b9e-....json
 
ingress:
  - hostname: api.ilyasghandaoui.store
    service: http://localhost:5000
  - service: http_status:404

Démarrage du tunnel :

# Terminal 1 : Port-forward Kubernetes
kubectl port-forward svc/quiz-backend 5000:5000
 
# Terminal 2 : Tunnel Cloudflare
cloudflared tunnel run quiz-backend

11.5 Secrets GitHub Requis

SecretDescription
CLOUDFLARE_API_TOKENToken API Cloudflare
CLOUDFLARE_ACCOUNT_IDID du compte Cloudflare
VITE_API_URLURL de l’API backend (https://api.ilyasghandaoui.store)

11.6 Avantages du Déploiement Cloud

AspectBénéfice
AccessibilitéApplication accessible depuis n’importe où
SSL/TLSCertificats HTTPS gérés automatiquement
CDNDistribution globale via le réseau Cloudflare
Zero TrustProtection par authentification email (ESIEE)
CI/CD completDéploiement automatique sur push

12. Métriques de Performance

12.1 Temps de Build et Déploiement

ÉtapeDurée MoyenneOptimisation
Tests Frontend (Vitest)~22sCache npm
Tests Backend (Pytest)~15sCache pip
Build Docker multi-arch~5-6 minCache GHA, BuildKit
Deploy Cloudflare Pages~10-30sCDN edge
Startup pods K8s~15-30sProbes configurées

12.2 Performance de l’Application

MétriqueValeurContexte
Time to First Byte (TTFB)< 100msVia Cloudflare CDN
Temps de réponse API< 50msBackend Flask local
Taille bundle Frontend~500KB gzippedVite build optimisé
Temps démarrage pod~15sAvec health checks

13. Sécurité et Zero Trust

13.1 Architecture de Sécurité

Sécurité

CoucheProtection
Edge (Cloudflare)WAF, DDoS protection, SSL/TLS
TunnelChiffrement end-to-end, pas de ports ouverts
KubernetesNetwork policies, Secrets management
ApplicationJWT auth, CORS, input validation

13.2 Cloudflare Zero Trust

L’application est protégée par Cloudflare Zero Trust Access :

  • Politique d’accès : Uniquement les emails @esiee.fr et @edu.esiee.fr
  • Authentification : Email OTP (One-Time Password)
  • Session : Expiration configurable
Utilisateur → Cloudflare Access → Vérification email ESIEE → Application

13.3 Chiffrement du Tunnel

Le tunnel Cloudflare assure un chiffrement TLS de bout en bout :

flowchart LR
    subgraph Internet
        User["👤 Utilisateur"]
    end
    subgraph Cloudflare["☁️ Cloudflare Edge"]
        CF["TLS Termination"]
    end
    subgraph Local["💻 Machine Locale"]
        Tunnel["cloudflared<br/>TLS Tunnel"]
        K8s["Kubernetes<br/>Backend"]
    end
    
    User -->|HTTPS| CF
    CF -->|TLS 1.3| Tunnel
    Tunnel -->|localhost| K8s

Avantages sécurité :

  • ✅ Aucun port exposé sur la machine locale
  • ✅ Pas besoin de VPN ou IP publique
  • ✅ Authentification gérée par Cloudflare
  • ✅ Logs et audit centralisés

14. Erreurs Rencontrées et Solutions

14.1 Problèmes CI/CD

ErreurCauseSolution
Resource not accessible by integrationGitHub token sans permissionsUtiliser wrangler-action@v3 au lieu de pages-action@v1
fetch failed sur WranglerProblème réseau/timeoutRetry automatique ou déploiement manuel
Tests échouésDépendances manquantesCache npm/pip + npm ci

14.2 Problèmes Kubernetes

ErreurCauseSolution
Pods en CrashLoopBackOffVariables d’env manquantesVérifier ConfigMap et Secrets
ImagePullBackOffImage Docker introuvableVérifier le tag et les credentials
Service inaccessibleClusterIP vs NodePortUtiliser minikube service ou port-forward

14.3 Problèmes Cloudflare

ErreurCauseSolution
DNS non résoluConflit avec ancien tunnelSupprimer l’ancien record CNAME
Tunnel déconnectéPort-forward arrêtéRelancer kubectl port-forward
403 Access DeniedEmail non autoriséConfigurer politique Zero Trust

15. Couverture des Tests

15.1 Métriques de Couverture

ModuleTestsCouvertureFramework
Frontend - Components2~70%Vitest
Frontend - Services2~85%Vitest
Backend - Routes14~90%Pytest
Backend - Auth3~95%Pytest
Backend - Models3~80%Pytest
Total24~85%-

15.2 Types de Tests

TypeDescriptionImplémenté
Tests unitairesFonctions isolées
Tests d’intégrationAPI endpoints
Tests composantsVue components
Tests E2EParcours utilisateur❌ (amélioration future)

16. Bonnes Pratiques et Leçons Apprises

16.1 Leçons Apprises

DomaineLeçon
CI/CDToujours tester le workflow en local avant de push
DockerLe multi-arch prend du temps mais est essentiel pour la portabilité
KubernetesLes probes (liveness/readiness) sont cruciales pour la stabilité
SécuritéNe jamais committer de secrets, utiliser des vaults
CloudflareLe tunnel simplifie énormément l’exposition de services locaux

16.2 Bonnes Pratiques Appliquées

  • Infrastructure as Code : Tout est versionné (K8s manifests, workflows)
  • Secrets Management : Secrets GitHub et Kubernetes Secrets
  • Immutable Tags : Images Docker avec SHA commit
  • Blue-Green possible : Architecture prête pour déploiements sans downtime
  • Observabilité : Logs centralisés, health checks

17. Conclusion

17.1 Récapitulatif du Projet

18.png

18.2 Objectifs Atteints

ObjectifStatutDétails
Application Web Full StackFlask + Vue 3 + SQLite
Tests Automatisés24 tests (Vitest + Pytest)
Pipeline CI/CDGitHub Actions
Images DockerMulti-arch (amd64/arm64)
Déploiement K8sMinikube avec manifests
Déploiement CloudCloudflare Pages + Tunnel
Opérations CRUDCreate, Read, Update, Delete
DocumentationREADME + Rapport technique

📎 Annexes

A. Liens Utiles

B. Références

0 items under this folder.