#!/bin/bash # ============================================================================ # SigNoz Deployment Script for Bakery IA # ============================================================================ # This script deploys SigNoz monitoring stack using Helm # Supports both development and production environments # ============================================================================ set -e # Color codes for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Function to display help show_help() { echo "Usage: $0 [OPTIONS] ENVIRONMENT" echo "" echo "Deploy SigNoz monitoring stack for Bakery IA" echo "" echo "Arguments: ENVIRONMENT Environment to deploy to (dev|prod)" echo "" echo "Options: -h, --help Show this help message -d, --dry-run Dry run - show what would be done without actually deploying -u, --upgrade Upgrade existing deployment -r, --remove Remove/Uninstall SigNoz deployment -n, --namespace NAMESPACE Specify namespace (default: signoz)" echo "" echo "Examples: $0 dev # Deploy to development $0 prod # Deploy to production $0 --upgrade prod # Upgrade production deployment $0 --remove dev # Remove development deployment" echo "" echo "Docker Hub Authentication:" echo " This script automatically creates a Docker Hub secret for image pulls." echo " Provide credentials via environment variables (recommended):" echo " export DOCKERHUB_USERNAME='your-username'" echo " export DOCKERHUB_PASSWORD='your-personal-access-token'" echo " Or ensure you're logged in with Docker CLI:" echo " docker login" } # Parse command line arguments DRY_RUN=false UPGRADE=false REMOVE=false NAMESPACE="signoz" while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -d|--dry-run) DRY_RUN=true shift ;; -u|--upgrade) UPGRADE=true shift ;; -r|--remove) REMOVE=true shift ;; -n|--namespace) NAMESPACE="$2" shift 2 ;; dev|prod) ENVIRONMENT="$1" shift ;; *) echo "Unknown argument: $1" show_help exit 1 ;; esac done # Validate environment if [[ -z "$ENVIRONMENT" ]]; then echo "Error: Environment not specified. Use 'dev' or 'prod'." show_help exit 1 fi if [[ "$ENVIRONMENT" != "dev" && "$ENVIRONMENT" != "prod" ]]; then echo "Error: Invalid environment. Use 'dev' or 'prod'." exit 1 fi # Function to check if Helm is installed check_helm() { if ! command -v helm &> /dev/null; then echo "${RED}Error: Helm is not installed. Please install Helm first.${NC}" echo "Installation instructions: https://helm.sh/docs/intro/install/" exit 1 fi } # Function to check if kubectl is configured check_kubectl() { if ! kubectl cluster-info &> /dev/null; then echo "${RED}Error: kubectl is not configured or cannot connect to cluster.${NC}" echo "Please ensure you have access to a Kubernetes cluster." exit 1 fi } # Function to check if namespace exists, create if not ensure_namespace() { if ! kubectl get namespace "$NAMESPACE" &> /dev/null; then echo "${BLUE}Creating namespace $NAMESPACE...${NC}" if [[ "$DRY_RUN" == true ]]; then echo " (dry-run) Would create namespace $NAMESPACE" else kubectl create namespace "$NAMESPACE" echo "${GREEN}Namespace $NAMESPACE created.${NC}" fi else echo "${BLUE}Namespace $NAMESPACE already exists.${NC}" fi } # Function to create Docker Hub secret for image pulls create_dockerhub_secret() { echo "${BLUE}Setting up Docker Hub image pull secret...${NC}" if [[ "$DRY_RUN" == true ]]; then echo " (dry-run) Would create Docker Hub secret in namespace $NAMESPACE" return fi # Check if secret already exists if kubectl get secret dockerhub-creds -n "$NAMESPACE" &> /dev/null; then echo "${GREEN}Docker Hub secret already exists in namespace $NAMESPACE.${NC}" return fi # Check if Docker Hub credentials are available if [[ -n "$DOCKERHUB_USERNAME" ]] && [[ -n "$DOCKERHUB_PASSWORD" ]]; then echo "${BLUE}Found DOCKERHUB_USERNAME and DOCKERHUB_PASSWORD environment variables${NC}" kubectl create secret docker-registry dockerhub-creds \ --docker-server=https://index.docker.io/v1/ \ --docker-username="$DOCKERHUB_USERNAME" \ --docker-password="$DOCKERHUB_PASSWORD" \ --docker-email="${DOCKERHUB_EMAIL:-noreply@bakery-ia.local}" \ -n "$NAMESPACE" echo "${GREEN}Docker Hub secret created successfully.${NC}" elif [[ -f "$HOME/.docker/config.json" ]]; then echo "${BLUE}Attempting to use Docker CLI credentials...${NC}" # Try to extract credentials from Docker config if grep -q "credsStore" "$HOME/.docker/config.json"; then echo "${YELLOW}Docker is using a credential store. Please set environment variables:${NC}" echo " export DOCKERHUB_USERNAME='your-username'" echo " export DOCKERHUB_PASSWORD='your-password-or-token'" echo "${YELLOW}Continuing without Docker Hub authentication...${NC}" return fi # Try to extract from base64 encoded auth AUTH=$(cat "$HOME/.docker/config.json" | jq -r '.auths["https://index.docker.io/v1/"].auth // empty' 2>/dev/null) if [[ -n "$AUTH" ]]; then echo "${GREEN}Found Docker Hub credentials in Docker config${NC}" local DOCKER_USERNAME=$(echo "$AUTH" | base64 -d | cut -d: -f1) local DOCKER_PASSWORD=$(echo "$AUTH" | base64 -d | cut -d: -f2-) kubectl create secret docker-registry dockerhub-creds \ --docker-server=https://index.docker.io/v1/ \ --docker-username="$DOCKER_USERNAME" \ --docker-password="$DOCKER_PASSWORD" \ --docker-email="${DOCKERHUB_EMAIL:-noreply@bakery-ia.local}" \ -n "$NAMESPACE" echo "${GREEN}Docker Hub secret created successfully.${NC}" else echo "${YELLOW}Could not find Docker Hub credentials${NC}" echo "${YELLOW}To enable automatic Docker Hub authentication:${NC}" echo " 1. Run 'docker login', OR" echo " 2. Set environment variables:" echo " export DOCKERHUB_USERNAME='your-username'" echo " export DOCKERHUB_PASSWORD='your-password-or-token'" echo "${YELLOW}Continuing without Docker Hub authentication...${NC}" fi else echo "${YELLOW}Docker Hub credentials not found${NC}" echo "${YELLOW}To enable automatic Docker Hub authentication:${NC}" echo " 1. Run 'docker login', OR" echo " 2. Set environment variables:" echo " export DOCKERHUB_USERNAME='your-username'" echo " export DOCKERHUB_PASSWORD='your-password-or-token'" echo "${YELLOW}Continuing without Docker Hub authentication...${NC}" fi echo "" } # Function to deploy SigNoz deploy_signoz() { local values_file="infrastructure/helm/signoz-values-$ENVIRONMENT.yaml" if [[ ! -f "$values_file" ]]; then echo "${RED}Error: Values file $values_file not found.${NC}" exit 1 fi echo "${BLUE}Deploying SigNoz to $ENVIRONMENT environment...${NC}" echo " Using values file: $values_file" echo " Target namespace: $NAMESPACE" if [[ "$DRY_RUN" == true ]]; then echo " (dry-run) Would deploy SigNoz with:" echo " helm install signoz signoz/signoz -n $NAMESPACE -f $values_file" return fi # Use upgrade --install to handle both new installations and upgrades echo "${BLUE}Installing/Upgrading SigNoz...${NC}" helm upgrade --install signoz signoz/signoz -n "$NAMESPACE" -f "$values_file" echo "${GREEN}SigNoz deployment initiated.${NC}" echo "Waiting for pods to become ready..." # Wait for deployment to complete wait_for_deployment } # Function to remove SigNoz remove_signoz() { echo "${BLUE}Removing SigNoz deployment from namespace $NAMESPACE...${NC}" if [[ "$DRY_RUN" == true ]]; then echo " (dry-run) Would remove SigNoz deployment" return fi if helm list -n "$NAMESPACE" | grep -q signoz; then helm uninstall signoz -n "$NAMESPACE" echo "${GREEN}SigNoz deployment removed.${NC}" else echo "${YELLOW}No SigNoz deployment found in namespace $NAMESPACE.${NC}" fi } # Function to wait for deployment to complete wait_for_deployment() { echo "${BLUE}Waiting for SigNoz pods to become ready...${NC}" # Wait for pods to be ready local timeout=600 # 10 minutes local start_time=$(date +%s) while true; do local current_time=$(date +%s) local elapsed=$((current_time - start_time)) if [[ $elapsed -ge $timeout ]]; then echo "${RED}Timeout waiting for SigNoz pods to become ready.${NC}" break fi # Check pod status local ready_pods=$(kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/instance=signoz --field-selector=status.phase=Running 2>/dev/null | grep -c "Running" | tr -d '[:space:]' || echo "0") local total_pods=$(kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/instance=signoz 2>/dev/null | grep -v "NAME" | wc -l | tr -d '[:space:]' || echo "0") if [[ $ready_pods -eq 0 ]]; then echo " Waiting for pods to start..." else echo " $ready_pods/$total_pods pods are running" if [[ $ready_pods -eq $total_pods && $total_pods -gt 0 ]]; then echo "${GREEN}All SigNoz pods are running!${NC}" break fi fi sleep 10 done # Show deployment status show_deployment_status } # Function to show deployment status show_deployment_status() { echo "" echo "${BLUE}=== SigNoz Deployment Status ===${NC}" echo "" # Get pods echo "Pods:" kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/instance=signoz echo "" # Get services echo "Services:" kubectl get svc -n "$NAMESPACE" -l app.kubernetes.io/instance=signoz echo "" # Get ingress echo "Ingress:" kubectl get ingress -n "$NAMESPACE" -l app.kubernetes.io/instance=signoz echo "" # Show access information show_access_info } # Function to show access information show_access_info() { echo "${BLUE}=== Access Information ===${NC}" if [[ "$ENVIRONMENT" == "dev" ]]; then echo "SigNoz UI: https://localhost/signoz" echo "SigNoz API: https://localhost/signoz-api" echo "" echo "OpenTelemetry Collector Endpoints:" echo " gRPC: localhost:4317" echo " HTTP: localhost:4318" echo " Metrics: localhost:8888" else echo "SigNoz UI: https://monitoring.bakewise.ai/signoz" echo "SigNoz API: https://monitoring.bakewise.ai/signoz-api" echo "SigNoz Alerts: https://monitoring.bakewise.ai/signoz-alerts" echo "" echo "OpenTelemetry Collector Endpoints:" echo " gRPC: monitoring.bakewise.ai:4317" echo " HTTP: monitoring.bakewise.ai:4318" fi echo "" echo "Default credentials:" echo " Username: admin" echo " Password: admin" echo "" } # Main execution main() { echo "${BLUE}" echo "==========================================" echo "🚀 SigNoz Deployment for Bakery IA" echo "==========================================" echo "${NC}" # Check prerequisites check_helm check_kubectl # Ensure namespace ensure_namespace if [[ "$REMOVE" == true ]]; then remove_signoz exit 0 fi # Create Docker Hub secret for image pulls create_dockerhub_secret # Deploy SigNoz deploy_signoz echo "${GREEN}" echo "==========================================" echo "✅ SigNoz deployment completed!" echo "==========================================" echo "${NC}" } # Run main function main