155 lines
5.8 KiB
Bash
Executable File
155 lines
5.8 KiB
Bash
Executable File
#!/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 "=========================================="
|