🚀 Installation et DĂ©marrage d’EXAI

Prérequis

Installez les outils suivants:

Outil Description

Docker Desktop

Moteur de conteneurisation - Télécharger

Minikube

Kubernetes local - choco install minikube (Windows) ou brew install minikube (macOS)

kubectl

CLI Kubernetes - choco install kubernetes-cli (Windows) ou brew install kubectl (macOS)

Skaffold

Workflow Kubernetes - choco install skaffold (Windows) ou brew install skaffold (macOS)

Python 3.8+

Avec le package python-dotenv - pip install python-dotenv

Lancement rapide

IMPORTANT: Le Makefile utilise des commandes Unix et permet de remplacer l’ensemble des commandesq si dessous.

# Utiliser Git Bash au lieu de PowerShell
# Dans Git Bash
make dev
# Installation complÚte + données de test
make dev-with-data

Commandes manuelles (PowerShell)

Si vous ne pouvez pas utiliser WSL/Git Bash, utilisez les commandes détaillées ci-dessous.

Pour Linux (Debian/Ubuntu):

# Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# Skaffold
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
sudo install skaffold /usr/local/bin/

# Python-dotenv
pip install python-dotenv

Configuration des Secrets

Pour le développement local et les déploiements, EXAI utilise un fichier .env à la racine et des scripts Python pour gérer les secrets Kubernetes.

1. Créer un fichier .env

Créez un fichier .env à la racine du projet avec les variables suivantes :

# ClĂ© secrĂšte pour JWT (doit ĂȘtre identique Ă  celle utilisĂ©e pour gĂ©nĂ©rer les tokens)
JWT_SECRET_KEY=09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7

# URL Base de données (généralement pointant vers le service K8s)
DATABASE_URL=postgresql+asyncpg://exai_user:password@postgresql-service.exai.svc.cluster.local:5432/exai_db

# Identifiants Google OAuth
GOOGLE_CLIENT_ID=votre-client-id-google
GOOGLE_CLIENT_SECRET=votre-client-secret-google

# URL de redirection OAuth (FRONTEND) pour le développement LOCAL
# Cette valeur sera utilisée par défaut par l'API Gateway.
# Elle sera surchargée en production par un secret GitHub Actions.
# Utilisée par k8s/base/api-gateway/gateway-secrets.yaml (placeholder: REPLACE_WITH_OAUTH_REDIRECT_URL)
OAUTH_REDIRECT_URL=http://localhost:8080/authentication/callback

# URLs des services backend pour le reverse proxy de l'API Gateway
# Ces URLs permettent Ă  l'API Gateway de rediriger les requĂȘtes vers les bons services

# Service de sélection des datasets
# Développement local (Minikube) - valeur par défaut
SERVICE_SELECTION_URL=http://service-selection-service.exai.svc.cluster.local
# Développement local (services en local)
# SERVICE_SELECTION_URL=http://localhost:8001

# Pipeline ML
# Développement local (Minikube) - valeur par défaut
ML_PIPELINE_URL=http://ml-pipeline-service.exai.svc.cluster.local
# Développement local (services en local)
# ML_PIPELINE_URL=http://localhost:8002

# Moteur XAI
# Développement local (Minikube) - valeur par défaut
XAI_ENGINE_URL=http://xai-engine-service.exai.svc.cluster.local
# Développement local (services en local)
# XAI_ENGINE_URL=http://localhost:8003

# Domaines de production pour la détection automatique HTTPS
PRODUCTION_DOMAINS=your-domain.com,api.your-domain.com

# Origins autorisées pour CORS (séparées par des virgules)
BACKEND_CORS_ORIGINS=http://localhost:8080,https://your-domain.com,https://www.your-domain.com
Le fichier .env est déjà ajouté à .gitignore pour éviter de commiter des secrets. Adaptez les valeurs à votre propre configuration, notamment les identifiants Google.

2. Mettre Ă  jour les secrets Kubernetes

Avant de dĂ©marrer l’application avec Skaffold ou de gĂ©nĂ©rer les manifestes finaux, exĂ©cutez :

# Met à jour les placeholders dans les fichiers secrets avec les valeurs du .env (encodées en base64)
python -m scripts.update-local-secrets

Ce script (scripts/update_local_secrets.py) lit le fichier .env et remplace les placeholders correspondants dans les fichiers YAML de Kubernetes : - Il met Ă  jour k8s/base/api-gateway/gateway-secrets.yaml avec les valeurs de JWT_SECRET_KEY, DATABASE_URL, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, et OAUTH_REDIRECT_URL (via REPLACE_WITH_…​). - Il ne modifie plus de patch spĂ©cifique pour l’URL de redirection en production.

Exécutez ce script chaque fois que vous modifiez le fichier .env.

3. Restaurer les placeholders avant de commiter

Avant de pousser votre code vers le dĂ©pĂŽt Git, il est recommandĂ© d’exĂ©cuter le script inverse pour remettre les placeholders gĂ©nĂ©riques dans les fichiers YAML. Cela Ă©vite de commiter accidentellement des valeurs spĂ©cifiques Ă  votre environnement local.

# Restaure les placeholders génériques (REPLACE_WITH_...) dans les fichiers de secrets
python -m scripts.reset-placeholders

🚀 DĂ©marrage Ultra-Rapide

Linux/macOS/WSL/Git Bash: Toutes les Ă©tapes ci-dessous peuvent ĂȘtre rĂ©alisĂ©es en une seule commande :

make dev

Cette commande dĂ©marre Minikube, dĂ©ploie l’application, exĂ©cute les migrations et affiche les logs.

Windows PowerShell: Utilisez les commandes détaillées ci-dessous.

đŸȘŸ DĂ©marrage Manuel (Windows PowerShell)

Si vous ne pouvez pas utiliser WSL/Git Bash, voici les étapes détaillées :

1. Vérification des prérequis

# Vérifier que les outils sont installés
docker --version
minikube version
kubectl version --client
skaffold version
python --version

# Vérifier le fichier .env
if (Test-Path .env) { "✅ Fichier .env trouvĂ©" } else { "❌ Fichier .env manquant" }

2. Démarrage de Minikube

# Démarrer Minikube
minikube start --memory 4096 --cpus 2 --disk-size 20g
minikube addons enable ingress
minikube addons enable storage-provisioner

3. Configuration

# Créer le namespace
kubectl create namespace exai

# Mettre Ă  jour les secrets
python -m scripts.update-local-secrets

# Configurer Docker pour Minikube
& minikube -p minikube docker-env --shell powershell | Invoke-Expression

4. Déploiement

# Déployer l'application
skaffold run --profile=local --namespace=exai

5. Attendre que les services soient prĂȘts

# Attendre PostgreSQL
kubectl wait --for=condition=ready pod -l app=postgresql -n exai --timeout=300s

# Attendre API Gateway
kubectl wait --for=condition=ready pod -l app=api-gateway -n exai --timeout=300s

# Attendre Service Selection
kubectl wait --for=condition=ready pod -l app=service-selection -n exai --timeout=300s

6. Migrations

# Supprimer les anciens jobs
kubectl delete job api-gateway-migration-job -n exai --ignore-not-found=true
kubectl delete job service-selection-migration-job -n exai --ignore-not-found=true

# Lancer les migrations
kubectl apply -f k8s/base/jobs/api-gateway-migration-job.yaml -n exai
kubectl wait --for=condition=complete job/api-gateway-migration-job -n exai --timeout=300s

kubectl apply -f k8s/base/jobs/service-selection-migration-job.yaml -n exai
kubectl wait --for=condition=complete job/service-selection-migration-job -n exai --timeout=300s

7. AccĂšs aux services

# Démarrer les logs et redirections de port
skaffold dev --profile=local --namespace=exai

AccĂšs aux services : - Frontend: http://localhost:8080 - API Gateway: http://localhost:9000 - Documentation API: http://localhost:9000/docs

Déploiement Local avec Minikube et Skaffold

  1. Cloner le dépÎt (si pas déjà fait):

    git clone <URL_DU_DEPOT_GIT_EXAI>
    cd <NOM_DU_DOSSIER_PROJET_EXAI>
  2. Démarrer Minikube:

    minikube start
    # Pour plus de ressources: minikube start --memory 4096 --cpus 2

    Assurez-vous que l’addon ingress est activĂ© si vous comptez tester le dĂ©ploiement avec Ingress plus tard (bien que non utilisĂ© pour l’accĂšs local par dĂ©faut dĂ©crit ici). L’addon storage-provisioner est Ă©galement nĂ©cessaire et gĂ©nĂ©ralement activĂ© par dĂ©faut.

  3. Créer le namespace (si pas déjà fait):

    kubectl create namespace exai
    # Ignorez l'erreur si le namespace existe déjà.
  4. Mettre à jour les secrets Kubernetes (voir section précédente) :

    python -m scripts.update-local-secrets
  5. Configurer l’environnement Docker :

    # Linux/macOS
    eval $(minikube docker-env)
    
    # Windows (PowerShell)
    & minikube -p minikube docker-env --shell powershell | Invoke-Expression
    
    # Windows (cmd.exe)
    @FOR /f "tokens=*" %i IN ('minikube -p minikube docker-env --shell cmd') DO @%i
  6. Déployer avec Skaffold:

    # Pour le mode local (développement)
    skaffold dev --profile=local

    Skaffold va :

    • DĂ©tecter le contexte Minikube et utiliser son environnement Docker.

    • Construire les images Docker nĂ©cessaires (si le code a changĂ©).

    • DĂ©ployer les manifestes Kubernetes dĂ©finis dans skaffold.yaml pour le profil local (Base de donnĂ©es, API Gateway, Service Selection, Frontend) dans le namespace exai.

    • Mettre en place des redirections de port automatiques (voir section AccĂšs).

    • Surveiller les changements de code et redĂ©ployer automatiquement.

    • Afficher les logs des conteneurs en temps rĂ©el dans la console.

    Le premier dĂ©ploiement peut prendre plusieurs minutes. Attendez que Skaffold indique Deployments stabilized ou que tous les pods principaux (postgresql, api-gateway, service-selection, frontend) passent Ă  l’Ă©tat Running (vous pouvez vĂ©rifier avec kubectl get pods -n exai).

Initialisation de la Base de Données

L’architecture EXAI utilise une base de donnĂ©es PostgreSQL partagĂ©e par tous les microservices, chaque service gĂ©rant ses migrations spĂ©cifiques.

Exécutez les migrations depuis les pods Kubernetes :

Service de Sélection

# 1. Identifier le pod
kubectl get pods -n exai -l app=service-selection

# 2. Exécuter la migration (remplacer <pod-name>)
kubectl exec -it <pod-name> -n exai -- bash -c "cd /app && DATABASE_URL='postgresql+asyncpg://exai_user:password@postgresql-service:5432/exai_db' alembic upgrade head"

API Gateway

# Identifier le pod et exécuter la migration
kubectl get pods -n exai -l app=api-gateway
kubectl exec -it <pod-name> -n exai -- bash -c "cd /app && DATABASE_URL='postgresql+asyncpg://exai_user:password@postgresql-service:5432/exai_db' alembic upgrade head"

Ces commandes exĂ©cutent les migrations Alembic directement Ă  l’intĂ©rieur des pods. Cela Ă©vite les problĂšmes de connectivitĂ© et assure que la configuration est identique Ă  celle utilisĂ©e par l’application.

Chaque service utilise sa propre table de version Alembic (alembic_version_gateway et alembic_version_selection) pour suivre ses migrations dans la base de données partagée.

AccĂ©der Ă  l’Application

Avec le profil local, Skaffold configure automatiquement des redirections de port (port-forward) pour faciliter l’accĂšs. Il n’est PAS nĂ©cessaire d’utiliser minikube service ou minikube tunnel pour ce workflow local par dĂ©faut.

Les services sont accessibles directement sur localhost via les ports suivants (tant que skaffold dev --profile=local est actif) :

Le frontend est configurĂ© (via frontend/src/environments/environment.ts) pour appeler l’API Gateway sur http://localhost:9000.

Workflow de Développement

Structure des Fichiers Kubernetes

Le projet utilise Kustomize pour gérer les configurations Kubernetes de maniÚre structurée :

k8s/
├── base/                      # Configurations communes à tous les environnements
│   ├── api-gateway/           # Manifestes pour l'API Gateway (Deployment, Service, Secrets...)
│   ├── frontend/              # Manifestes pour le Frontend
│   ├── postgres/              # Manifestes pour PostgreSQL (StatefulSet, Service, PVC...)
│   ├── service-selection/     # Manifestes pour le Service Selection
│   └── kustomization.yaml     # RĂ©fĂ©rence toutes les ressources de la base
└── overlays/                  # Surcouches pour des environnements spĂ©cifiques
    ├── minikube/              # Configurations pour le dĂ©veloppement local (Minikube)
    │   ├── kustomization.yaml # RĂ©fĂ©rence la base et applique des patches spĂ©cifiques (ex: type Service)
    │   └── ... (patches si nĂ©cessaire)
    └── azure/                 # Configurations pour le dĂ©ploiement en production (Azure)
        ├── kustomization.yaml # RĂ©fĂ©rence la base et applique des patches (ex: Ingress)
        └── ... (autres patches ou ressources spĂ©cifiques)

Cette structure permet de : - DĂ©finir les ressources principales une seule fois dans base/. - Personnaliser la configuration pour chaque environnement (local, production) dans overlays/ en utilisant des patches ou des ressources supplĂ©mentaires. - Pour la production (Azure), les secrets sensibles comme l’URL de la base de donnĂ©es ou l’URL de redirection OAuth sont injectĂ©s via le pipeline CI/CD (GitHub Actions) qui modifie directement les manifestes de base avant le dĂ©ploiement par Skaffold/Kustomize.

Cycle de Développement avec Skaffold

  1. Modifiez votre code dans l’un des microservices (frontend, api-gateway, service-selection)

  2. Skaffold détecte automatiquement les changements

  3. Reconstruction et redéploiement automatiques des images Docker affectées

  4. Services redémarrés avec le nouveau code

  5. Visualisez les logs en temps réel dans la console Skaffold

Pour un workflow plus fluide, utilisez des outils comme Lens, k9s ou le Kubernetes Dashboard (minikube dashboard).

Dépannage

ProblĂšmes Courants

  • Minikube ne dĂ©marre pas : VĂ©rifiez Docker Desktop, essayez minikube delete puis minikube start

  • Pod bloquĂ© en Pending : Augmentez les ressources (minikube stop && minikube config set memory 4096 && minikube start)

  • Pod en CrashLoopBackOff : VĂ©rifiez les logs avec kubectl logs -n exai <pod-name>

  • Services inaccessibles : VĂ©rifiez que skaffold dev --profile=local est en cours d’exĂ©cution et qu’aucun autre programme n’utilise les ports locaux 8080 ou 9000. VĂ©rifiez les logs Skaffold pour des erreurs de port-forwarding. Assurez-vous que les pods sont Running (kubectl get pods -n exai).

  • Pod PostgreSQL bloquĂ© en Pending : VĂ©rifiez les PVC (kubectl get pvc -n exai) et la StorageClass (kubectl get sc). Assurez-vous que la configuration du volume dans k8s/base/postgres/postgresql-statefulset.yaml utilise la bonne storageClassName (standard pour Minikube par dĂ©faut).

  • Erreurs "MIME type" sur le frontend : Assurez-vous que la configuration Nginx (frontend/nginx.conf), le Dockerfile (frontend/Dockerfile), et le baseHref dans angular.json sont cohĂ©rents pour un service Ă  la racine (/).

  • Secrets incorrects : Si vous rencontrez des erreurs d’authentification, vĂ©rifiez que vous avez bien exĂ©cutĂ© python -m scripts.update-local-secrets aprĂšs avoir mis Ă  jour votre fichier .env.

Étapes de Diagnostic

  1. Logs Skaffold

  2. État des pods : kubectl get pods -n exai

  3. DĂ©tails d’un pod : kubectl describe pod <pod-name> -n exai

  4. Logs d’un pod : kubectl logs -n exai <pod-name>

  5. Logs Minikube : minikube logs

ArrĂȘter l’environnement

# ArrĂȘter Skaffold : Ctrl+C

# ArrĂȘter Minikube
minikube stop

# Supprimer complÚtement Minikube (supprime les données)
minikube delete