185 lines
4.9 KiB
Bash
185 lines
4.9 KiB
Bash
#!/bin/bash
|
||
|
||
# === SCRIPT DE DÉPLOIEMENT PRODUCTION ===
|
||
# Déploie les modules Rust Veza en production
|
||
# Usage: ./scripts/deploy_production.sh [version]
|
||
|
||
set -euo pipefail
|
||
|
||
# Configuration
|
||
PROJECT_NAME="veza-stream-server"
|
||
NAMESPACE="veza-production"
|
||
VERSION="${1:-latest}"
|
||
REGISTRY="ghcr.io/veza"
|
||
|
||
# Couleurs pour les logs
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Fonctions utilitaires
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
# Vérifications pré-déploiement
|
||
check_prerequisites() {
|
||
log_info "Vérification des prérequis..."
|
||
|
||
# Vérifier kubectl
|
||
if ! command -v kubectl &> /dev/null; then
|
||
log_error "kubectl non trouvé. Veuillez l'installer."
|
||
exit 1
|
||
fi
|
||
|
||
# Vérifier la connexion au cluster
|
||
if ! kubectl cluster-info &> /dev/null; then
|
||
log_error "Impossible de se connecter au cluster Kubernetes"
|
||
exit 1
|
||
fi
|
||
|
||
# Vérifier le namespace
|
||
if ! kubectl get namespace "$NAMESPACE" &> /dev/null; then
|
||
log_warning "Namespace $NAMESPACE non trouvé, création..."
|
||
kubectl create namespace "$NAMESPACE"
|
||
fi
|
||
|
||
log_success "Prérequis vérifiés"
|
||
}
|
||
|
||
# Déploiement des secrets
|
||
deploy_secrets() {
|
||
log_info "Déploiement des secrets..."
|
||
|
||
if kubectl get secret postgres-secret -n "$NAMESPACE" &> /dev/null; then
|
||
log_warning "Secret postgres-secret existe déjà"
|
||
else
|
||
kubectl apply -f k8s/production/secrets.yaml
|
||
fi
|
||
|
||
log_success "Secrets déployés"
|
||
}
|
||
|
||
# Déploiement des ConfigMaps
|
||
deploy_config() {
|
||
log_info "Déploiement des ConfigMaps..."
|
||
kubectl apply -f k8s/production/configmap.yaml
|
||
log_success "ConfigMaps déployées"
|
||
}
|
||
|
||
# Déploiement de l'application
|
||
deploy_application() {
|
||
log_info "Déploiement de l'application version $VERSION..."
|
||
|
||
# Mettre à jour l'image dans le manifest
|
||
sed "s|image: veza/stream-server:.*|image: $REGISTRY/stream-server:$VERSION|g" \
|
||
k8s/production/stream-server-deployment.yaml | kubectl apply -f -
|
||
|
||
# Attendre le déploiement
|
||
log_info "Attente du déploiement..."
|
||
kubectl rollout status deployment/"$PROJECT_NAME" -n "$NAMESPACE" --timeout=600s
|
||
|
||
log_success "Application déployée"
|
||
}
|
||
|
||
# Vérifications post-déploiement
|
||
verify_deployment() {
|
||
log_info "Vérification du déploiement..."
|
||
|
||
# Vérifier les pods
|
||
local pods_ready
|
||
pods_ready=$(kubectl get pods -n "$NAMESPACE" -l app="$PROJECT_NAME" --no-headers | awk '{print $2}' | grep -c "1/1" || true)
|
||
local total_pods
|
||
total_pods=$(kubectl get pods -n "$NAMESPACE" -l app="$PROJECT_NAME" --no-headers | wc -l)
|
||
|
||
log_info "Pods prêts: $pods_ready/$total_pods"
|
||
|
||
if [ "$pods_ready" -eq "$total_pods" ] && [ "$total_pods" -gt 0 ]; then
|
||
log_success "Tous les pods sont prêts"
|
||
else
|
||
log_error "Certains pods ne sont pas prêts"
|
||
kubectl get pods -n "$NAMESPACE" -l app="$PROJECT_NAME"
|
||
exit 1
|
||
fi
|
||
|
||
# Vérifier les services
|
||
if kubectl get service "$PROJECT_NAME" -n "$NAMESPACE" &> /dev/null; then
|
||
log_success "Service accessible"
|
||
else
|
||
log_error "Service non accessible"
|
||
exit 1
|
||
fi
|
||
|
||
# Test de santé
|
||
log_info "Test de santé de l'application..."
|
||
local service_ip
|
||
service_ip=$(kubectl get service "$PROJECT_NAME" -n "$NAMESPACE" -o jsonpath='{.spec.clusterIP}')
|
||
|
||
if kubectl run test-pod --rm -i --restart=Never --image=curlimages/curl -- \
|
||
curl -f "http://$service_ip:8080/health" &> /dev/null; then
|
||
log_success "Application répond correctement"
|
||
else
|
||
log_error "Application ne répond pas"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Fonction de rollback
|
||
rollback() {
|
||
log_warning "Rollback en cours..."
|
||
kubectl rollout undo deployment/"$PROJECT_NAME" -n "$NAMESPACE"
|
||
kubectl rollout status deployment/"$PROJECT_NAME" -n "$NAMESPACE"
|
||
log_success "Rollback terminé"
|
||
}
|
||
|
||
# Fonction de nettoyage
|
||
cleanup() {
|
||
if [ $? -ne 0 ]; then
|
||
log_error "Erreur détectée, rollback automatique..."
|
||
rollback
|
||
fi
|
||
}
|
||
|
||
# Main
|
||
main() {
|
||
echo "🚀 DÉPLOIEMENT PRODUCTION VEZA STREAM SERVER"
|
||
echo "============================================="
|
||
echo "Version: $VERSION"
|
||
echo "Namespace: $NAMESPACE"
|
||
echo "Registry: $REGISTRY"
|
||
echo ""
|
||
|
||
# Trap pour le nettoyage en cas d'erreur
|
||
trap cleanup ERR
|
||
|
||
check_prerequisites
|
||
deploy_secrets
|
||
deploy_config
|
||
deploy_application
|
||
verify_deployment
|
||
|
||
echo ""
|
||
log_success "🎉 DÉPLOIEMENT RÉUSSI !"
|
||
echo ""
|
||
echo "Informations de déploiement:"
|
||
kubectl get pods -n "$NAMESPACE" -l app="$PROJECT_NAME"
|
||
echo ""
|
||
kubectl get services -n "$NAMESPACE" -l app="$PROJECT_NAME"
|
||
}
|
||
|
||
# Exécution
|
||
main "$@"
|