#!/bin/bash set -e # ========================================== # VARIABLES — personnalisables via env vars # ========================================== RESOURCE_GROUP="ExamApp-RG" LOCATION="polandcentral" ACR_NAME="examappregistrycharles" AKS_NAME="ExamApp-AKS" DB_NAME="postgres" # ⚠️ Exportez ces variables AVANT de lancer le script : # export DB_USER="postgres" # export DB_PASSWORD="votremotdepasse" # Le script refuse de démarrer si elles sont absentes. if [ -z "$DB_USER" ] || [ -z "$DB_PASSWORD" ]; then echo "❌ DB_USER et DB_PASSWORD doivent être exportés avant de lancer ce script." echo " export DB_USER=\"postgres\"" echo " export DB_PASSWORD=\"votremotdepasse\"" exit 1 fi # ========================================== echo "🚀 1. INFRASTRUCTURE CLOUD" # ========================================== az group create --name $RESOURCE_GROUP --location $LOCATION --output none echo " ✅ Resource Group '$RESOURCE_GROUP'" if az acr show --name $ACR_NAME --resource-group $RESOURCE_GROUP --output none 2>/dev/null; then echo " ✅ ACR '$ACR_NAME' déjà existant." else if ! az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic \ --location $LOCATION --output none; then ACR_NAME="examapp$(date +%s | tail -c 8)" az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic \ --location $LOCATION --output none fi echo " ✅ ACR '$ACR_NAME' créé." fi ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --resource-group $RESOURCE_GROUP \ --query loginServer --output tsv) if az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME --output none 2>/dev/null; then echo " ✅ Cluster '$AKS_NAME' déjà existant." else echo " ⏳ Création du cluster AKS (3-5 min)..." az aks create \ --resource-group $RESOURCE_GROUP --name $AKS_NAME \ --node-count 2 \ --node-vm-size Standard_B2als_v2 \ --location $LOCATION \ --generate-ssh-keys \ --attach-acr $ACR_NAME \ --output none echo " ✅ Cluster '$AKS_NAME' créé." fi az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME \ --overwrite-existing echo " ✅ kubectl configuré." # ========================================== echo "🐳 2. BUILD ET PUSH DES IMAGES DOCKER" # ========================================== az acr login --name $ACR_NAME --resource-group $RESOURCE_GROUP docker build -t $ACR_LOGIN_SERVER/vigimeteo-backend:latest ./Back-end/ docker build -t $ACR_LOGIN_SERVER/vigimeteo-frontend:latest ./Front-end/ docker push $ACR_LOGIN_SERVER/vigimeteo-backend:latest docker push $ACR_LOGIN_SERVER/vigimeteo-frontend:latest echo " ✅ Images buildées et pushées." # ========================================== echo "☸️ 3. DÉPLOIEMENT KUBERNETES" # ========================================== kubectl apply -f namespace.yaml # Secret BDD — injecté par le script, jamais dans Git kubectl create secret generic db-credentials --namespace vigimeteo \ --from-literal=host="vigimeteo-db.vigimeteo.svc.cluster.local" \ --from-literal=port="5432" \ --from-literal=dbname="$DB_NAME" \ --from-literal=username="$DB_USER" \ --from-literal=password="$DB_PASSWORD" \ --dry-run=client -o yaml | kubectl apply -f - # ConfigMap SQL — init PostgreSQL au premier démarrage uniquement kubectl create configmap vigimeteo-db-init --namespace vigimeteo \ --from-file=init_db.sql=./sql/init_db.sql \ --dry-run=client -o yaml | kubectl apply -f - # Base de données (StatefulSet PostgreSQL + Azure Disk managed-csi + Service headless) kubectl apply -f statefulset.yaml # Services réseau, puis Application kubectl apply -f service.yaml sed "s|MON_REGISTRE|$ACR_LOGIN_SERVER|g" deployment.yaml | kubectl apply -f - echo " ✅ Pods déployés. État : kubectl get pods -n vigimeteo" # ========================================== echo "🌐 4. EXPOSITION HTTPS" # ========================================== # ingress-nginx : téléchargé localement pour éviter une dépendance réseau au moment du deploy NGINX_URL="https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml" CERTMGR_URL="https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml" echo " ⏳ Application de ingress-nginx..." kubectl apply -f "$NGINX_URL" echo " ⏳ Application de cert-manager..." kubectl apply -f "$CERTMGR_URL" echo " ⏳ Attente IP publique Azure (peut prendre 1-2 min)..." PUBLIC_IP="" ATTEMPTS=0 MAX_ATTEMPTS=24 # 24 × 10s = 4 min max while [ -z "$PUBLIC_IP" ] && [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do sleep 10 ATTEMPTS=$((ATTEMPTS + 1)) PUBLIC_IP=$(kubectl get svc ingress-nginx-controller -n ingress-nginx \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null || true) done if [ -z "$PUBLIC_IP" ]; then echo "❌ IP publique non obtenue après 4 minutes. Vérifiez : kubectl get svc -n ingress-nginx" exit 1 fi echo " ✅ IP : $PUBLIC_IP" NODE_RG=$(az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME \ --query nodeResourceGroup -o tsv) PUBLIC_IP_NAME=$(az network public-ip list --resource-group $NODE_RG \ --query "[?ipAddress!=null]|[?contains(ipAddress, '$PUBLIC_IP')].[name]" -o tsv) DNS_LABEL="vigimeteo-$RANDOM" az network public-ip update \ --resource-group $NODE_RG --name $PUBLIC_IP_NAME \ --dns-name $DNS_LABEL --output none FQDN=$(az network public-ip show \ --resource-group $NODE_RG --name $PUBLIC_IP_NAME \ --query dnsSettings.fqdn -o tsv) sed "s|MON_DOMAINE|$FQDN|g" ingress.yaml | kubectl apply -f - kubectl apply -f cluster-issuer.yaml echo "" echo "==========================================" echo "✅ DÉPLOIEMENT TERMINÉ !" echo "👉 https://$FQDN (cert TLS prêt dans ~2 min)" echo "🗄️ DB PostgreSQL : vigimeteo-db.vigimeteo.svc.cluster.local" echo "=========================================="