#!/bin/bash set -e # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # ⏮️ Nocr Services Rollback Script # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # Usage: ./rollback.sh [deployment-name] # Example: ./rollback.sh telegram-listener # ./rollback.sh all (rolls back all deployments) # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DEPLOYMENT=${1:-all} NAMESPACE="nocr" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "⏮️ Starting rollback of Nocr services" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🎯 Deployment: $DEPLOYMENT" echo "🎯 Namespace: $NAMESPACE" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # Check if kubectl is available if ! command -v kubectl &> /dev/null; then echo "❌ kubectl not found. Please install kubectl." exit 1 fi # Check cluster connection echo "🔍 Checking connection to Kubernetes cluster..." if ! kubectl cluster-info &> /dev/null; then echo "❌ Cannot connect to Kubernetes cluster." exit 1 fi echo "✅ Connected to cluster" # Function to rollback a single deployment rollback_deployment() { local dep=$1 echo "" echo "⏮️ Rolling back deployment: $dep" # Check if deployment exists if ! kubectl get deployment "$dep" -n "$NAMESPACE" &> /dev/null; then echo "⚠️ Deployment $dep not found in namespace $NAMESPACE" return 1 fi # Show current revision echo "📊 Current revision:" kubectl rollout history deployment/"$dep" -n "$NAMESPACE" | tail -5 # Perform rollback echo "🔄 Rolling back..." if kubectl rollout undo deployment/"$dep" -n "$NAMESPACE"; then echo "✅ Rollback command issued for $dep" # Wait for rollback to complete echo "⏳ Waiting for rollback to complete..." if kubectl rollout status deployment/"$dep" -n "$NAMESPACE" --timeout=300s; then echo "✅ $dep rolled back successfully" else echo "❌ $dep rollback failed or timed out" echo "🔍 Pod status:" kubectl get pods -n "$NAMESPACE" -l app="$dep" return 1 fi else echo "❌ Failed to rollback $dep" return 1 fi } # Rollback deployments DEPLOYMENTS=("telegram-listener" "text-matcher" "users" "telegram-client") if [ "$DEPLOYMENT" = "all" ]; then echo "🔄 Rolling back all deployments..." FAILED=0 for dep in "${DEPLOYMENTS[@]}"; do if ! rollback_deployment "$dep"; then FAILED=$((FAILED + 1)) fi done if [ $FAILED -gt 0 ]; then echo "" echo "❌ $FAILED deployment(s) failed to rollback" exit 1 fi else # Rollback single deployment if ! rollback_deployment "$DEPLOYMENT"; then exit 1 fi fi echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "✅ Rollback completed successfully!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📊 Pod status:" kubectl get pods -n "$NAMESPACE" -o wide echo "" echo "🔍 Running health checks..." bash "$(dirname "$0")/health-check.sh"