veza/veza-stream-server/scripts/deploy_production.sh

186 lines
4.9 KiB
Bash
Raw Normal View History

2025-12-03 19:36:56 +00:00
#!/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 "$@"