zkt26/sk1/prepare-app.bak
2026-05-12 19:27:18 +02:00

155 lines
5.8 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "=========================================="