186 lines
4.9 KiB
Bash
186 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 "$@"
|