Skip to content
This repository was archived by the owner on Apr 20, 2025. It is now read-only.

GoofyTeam/GoofyCDN

Repository files navigation

CDN Go - Projet de Content Delivery Network

Membres :

CDN GO
Back GO
Front React avec Vite, Tailwind, Shadcn UI, et TanStack Router

Tests

On a des tests de fausses metrics pour vérifier si ils sont bien reçus dans le Grafana. On a des tests dans le backend pour vérifier les performances et du CDN (run_load_tests.sh dans le k6 et wrk qui doit être installé sur le PC).

Vidéo de présentation : Lien Vidéo de présentation AWS : Lien

🚀 Fonctionnalités

Prise en charge de différents types de load balancing et cache au lancement de l'application.

  • Proxy HTTP : Redirection intelligente des requĂŞtes
  • Système de Cache :,
    • Cache LRU en mĂ©moire
    • Support Redis pour le cache distribuĂ©
  • Load Balancing :
    • Round Robin
    • Weighted Round Robin
    • Least Connections
  • SĂ©curitĂ© :
    • Rate Limiting
    • Protection DDoS
    • Headers de sĂ©curitĂ© HTTP
  • Monitoring :
    • MĂ©triques Prometheus
    • Visualisation Grafana
    • Logging structurĂ© avec Logrus

🛠 Prérequis

  • Docker
  • Docker Compose
  • Go 1.23+ (pour le dĂ©veloppement local)

🚦 Démarrage

  1. Mode Développement :
docker compose -f .\docker-compose.dev.yml up -d
  1. Mode Production :
docker compose -f .\docker-compose.prod.yml up -d
  1. Lancement du front :
cd front
npm install
npm run dev
  1. Services additionnels :

🏗 Structure du Projet

app/
├── back/
│   └── internal/
│       ├── api/            # Endpoints API
│       ├── loadbalancer/   # Algorithmes de load balancing
│       └── middleware/     # Middlewares (sécurité, métriques)
|
├── CDN/
│   └── config/             # Configuration de l'application
│   └── internal/           # Implémentation du CDN
│   └── docs/               # Documentation de l'API
|   └── main.go             # Point d'entrée de l'application
|
└── front/
    └── public/             # Fichiers statiques
    └── src/
        ├── assets/         # Images, etc.
        ├── components/     # Composants React
        ├── hooks/          # Hooks personnalisés
        ├── libs/           # Fonctions utilitaires
        ├── pages/          # Pages de l'application
        └── routes/         # Routes de l'application par TanStack-Router

🔍 Fonctionnement Détaillé

1. Système de Cache

  • Cache LRU (internal/cache/cache.go) :

    • ImplĂ©mente l'interface Cache
    • Utilise hashicorp/golang-lru pour la gestion du cache en mĂ©moire
    • Limite configurable de la taille du cache
    • Cache uniquement les requĂŞtes GET
    • TTL configurable pour les entrĂ©es du cache
  • Endpoints de Gestion du Cache :

    • POST /cache/purge : Vide complètement le cache
      # Exemple d'utilisation
      curl -X POST http://localhost:8080/cache/purge

2. Load Balancer

  • ImplĂ©mentations (internal/loadbalancer/loadbalancer.go) :
    • RoundRobin : Distribution cyclique des requĂŞtes
    • WeightedRoundRobin : Distribution pondĂ©rĂ©e selon la capacitĂ© des serveurs
    • LeastConnections : Envoi vers le serveur le moins chargĂ©

3. Endpoints API

Backend Service (port 8080)

  • Authentification :

    • POST /register : Inscription d'un nouvel utilisateur
    • POST /login : Connexion utilisateur
  • Gestion des Fichiers (requiert authentification) :

    • POST /api/files : Upload d'un fichier
    • GET /api/files/:id : RĂ©cupĂ©ration d'un fichier
    • DELETE /api/files/:id : Suppression d'un fichier
  • Gestion des Dossiers (requiert authentification) :

    • POST /api/folders : CrĂ©ation d'un dossier
    • GET /api/folders/:id : Liste du contenu d'un dossier
    • DELETE /api/folders/:id : Suppression d'un dossier
  • Health Check :

    • GET /health : VĂ©rification de l'Ă©tat du service

CDN Service (port 8080)

  • Cache :

    • POST /cache/purge : Vide le cache
    • Note : Seules les requĂŞtes GET sont mises en cache
  • Monitoring :

    • GET /metrics : MĂ©triques Prometheus
    • GET /health : État du CDN
    • GET /ready : VĂ©rification de disponibilitĂ©

4. Monitoring

  • MĂ©triques :

    • Temps de rĂ©ponse des requĂŞtes
    • Nombre de requĂŞtes par endpoint
    • Taux de succès/erreur
    • Utilisation du cache
  • Visualisation dans Grafana via Prometheus

5. Application Principale

Le fichier main.go orchestre tous ces composants :

  1. Initialise le logger et le cache
  2. Configure le load balancer
  3. Met en place les middlewares de sécurité et monitoring
  4. Démarre le serveur HTTP avec gestion gracieuse de l'arrêt

📊 Monitoring

Métriques disponibles :

  • http_duration_seconds : Temps de rĂ©ponse des requĂŞtes
  • http_requests_total : Nombre total de requĂŞtes par endpoint
  • Visualisation dans Grafana via Prometheus

🔒 Sécurité

  • Rate limiting : 100 requĂŞtes/seconde par dĂ©faut
  • Headers de sĂ©curitĂ© :
    • X-Frame-Options
    • X-Content-Type-Options
    • X-XSS-Protection
    • Content-Security-Policy
    • Strict-Transport-Security

🚀 Déploiement sur AWS EKS

Prérequis AWS

  • Un compte AWS avec les droits nĂ©cessaires
  • AWS CLI configurĂ©
  • eksctl installĂ©
  • kubectl installĂ©

1. Construction de l'Image Docker

# Construction de l'image
docker build -t misterzapp/goofy-cdn:latest -f docker/cdn/Dockerfile .

# Push vers Docker Hub
docker push misterzapp/goofy-cdn:latest

2. Déploiement sur EKS

Création du Cluster

# Création du cluster EKS
eksctl create cluster \
  --name hetic-groupe5 \
  --region eu-west-3 \
  --nodegroup-name goofy-cdn-workers \
  --node-type t3.small \
  --nodes 2 \
  --nodes-min 1 \
  --nodes-max 3

Déploiement de l'Application

# Déployer l'application
kubectl apply -f k8s

# Vérifier le déploiement
kubectl get pods
kubectl get services

3. Gestion des Ressources

Vérification des Ressources

# Lister les nœuds
kubectl get nodes

# Lister les pods
kubectl get pods --all-namespaces

# Voir les logs
kubectl logs -l app=goofy-cdn

Nettoyage des Ressources

# Supprimer le nodegroup
eksctl delete nodegroup --cluster hetic-groupe5 --name goofy-cdn-workers

# Supprimer le cluster complet (arrĂŞte toute facturation)
eksctl delete cluster --name hetic-groupe5

4. Coûts AWS à Surveiller

  • Cluster EKS : ~$0.10 par heure
  • NĹ“uds EC2 (t3.small) : ~$0.023 par heure par nĹ“ud
  • Load Balancer : ~$0.025 par heure
  • Volumes EBS et ENI : coĂ»ts variables selon l'utilisation

⚠️ Important : Pensez à supprimer toutes les ressources après utilisation pour éviter des coûts inutiles.

5. Troubleshooting Courant

Problèmes de CNI ( a voir car problème pour l'instant)

Si les pods restent en état "ContainerCreating" :

# Réinstaller le CNI Amazon VPC
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.12.6/config/master/aws-k8s-cni.yaml

# Redémarrer les pods CNI
kubectl delete pods -n kube-system -l k8s-app=aws-node

6. Troubleshooting

Pod en CrashLoopBackOff ou Error

# Voir les logs du pod
kubectl logs -l app=goofy-cdn

# Voir les détails et événements du pod
kubectl describe pod -l app=goofy-cdn

Service inaccessible

  1. Vérifier que le service est bien créé :
kubectl get services
  1. Vérifier que le pod est Ready :
kubectl get pods -l app=goofy-cdn
  1. Voir les endpoints :
kubectl get endpoints goofy-cdn-service

Problèmes d'image

Si l'image n'est pas trouvée, assurez-vous que :

  1. L'image est bien construite localement : docker images | grep goofy-cdn
  2. Le fichier deployment.yaml utilise le bon nom d'image : image: goofy-cdn:local

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •