veza/veza-stream-server/scripts/deploy_production.sh
2025-12-03 20:36:56 +01:00

185 lines
4.9 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
# === 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 "$@"