From b3e8840649869b8e61045db138beb24ffd046513 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 7 Jan 2026 08:27:25 +0000 Subject: [PATCH] Add apps/cluster-health-dashboard/setup.sh --- apps/cluster-health-dashboard/setup.sh | 269 +++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 apps/cluster-health-dashboard/setup.sh diff --git a/apps/cluster-health-dashboard/setup.sh b/apps/cluster-health-dashboard/setup.sh new file mode 100644 index 0000000..236228e --- /dev/null +++ b/apps/cluster-health-dashboard/setup.sh @@ -0,0 +1,269 @@ +#!/bin/bash + +# Cluster Health Dashboard - Quick Setup Script +# This script helps you set up the dashboard pipeline + +set -e + +echo "╔══════════════════════════════════════════════════════════╗" +echo "║ Kubernetes Cluster Health Dashboard - Quick Setup ║" +echo "╚══════════════════════════════════════════════════════════╝" +echo "" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Check if running in correct directory +if [ ! -f "Jenkinsfile" ]; then + echo -e "${RED}❌ Error: Jenkinsfile not found!${NC}" + echo "Please run this script from the cluster-health-dashboard directory" + exit 1 +fi + +echo -e "${BLUE}🔍 Checking prerequisites...${NC}" +echo "" + +# Check kubectl +echo -n "Checking kubectl... " +if command -v kubectl &> /dev/null; then + KUBECTL_VERSION=$(kubectl version --client --short 2>/dev/null | cut -d" " -f3) + echo -e "${GREEN}✅ Found (${KUBECTL_VERSION})${NC}" +else + echo -e "${RED}❌ Not found${NC}" + echo "Please install kubectl first" + exit 1 +fi + +# Check jq +echo -n "Checking jq... " +if command -v jq &> /dev/null; then + JQ_VERSION=$(jq --version) + echo -e "${GREEN}✅ Found (${JQ_VERSION})${NC}" +else + echo -e "${YELLOW}⚠️ Not found${NC}" + echo "Installing jq..." + if [[ "$OSTYPE" == "darwin"* ]]; then + brew install jq + else + sudo apt-get update && sudo apt-get install -y jq + fi +fi + +# Check curl +echo -n "Checking curl... " +if command -v curl &> /dev/null; then + echo -e "${GREEN}✅ Found${NC}" +else + echo -e "${RED}❌ Not found${NC}" + exit 1 +fi + +# Check cluster access +echo -n "Checking Kubernetes cluster access... " +if kubectl cluster-info &> /dev/null; then + CLUSTER_VERSION=$(kubectl version --short 2>/dev/null | grep Server | cut -d" " -f3) + echo -e "${GREEN}✅ Connected (${CLUSTER_VERSION})${NC}" +else + echo -e "${RED}❌ Cannot connect to cluster${NC}" + echo "Please configure kubectl first" + exit 1 +fi + +# Check Prometheus +echo "" +echo -e "${BLUE}🔍 Checking Prometheus...${NC}" +echo "" + +echo -n "Looking for Prometheus service... " +if kubectl get svc -A | grep -q prometheus; then + PROM_NAMESPACE=$(kubectl get svc -A | grep prometheus-server | awk '{print $1}' | head -1) + PROM_SERVICE=$(kubectl get svc -A | grep prometheus-server | awk '{print $2}' | head -1) + PROM_URL="http://${PROM_SERVICE}.${PROM_NAMESPACE}.svc.cluster.local" + + echo -e "${GREEN}✅ Found${NC}" + echo " Namespace: ${PROM_NAMESPACE}" + echo " Service: ${PROM_SERVICE}" + echo " URL: ${PROM_URL}" + + # Test Prometheus access + echo -n " Testing Prometheus API... " + if kubectl run test-prom --rm -i --restart=Never --image=curlimages/curl:latest -- \ + curl -s "${PROM_URL}/api/v1/query?query=up" | grep -q '"status":"success"' 2>/dev/null; then + echo -e "${GREEN}✅ Accessible${NC}" + else + echo -e "${YELLOW}⚠️ Cannot verify (might still work)${NC}" + fi +else + echo -e "${YELLOW}⚠️ Not found in cluster${NC}" + echo " Dashboard will work but without Prometheus metrics" + echo " You can install Prometheus later" +fi + +# Get cluster info +echo "" +echo -e "${BLUE}📊 Your cluster overview:${NC}" +echo "" + +NODE_COUNT=$(kubectl get nodes --no-headers | wc -l) +NAMESPACE_COUNT=$(kubectl get namespaces --no-headers | wc -l) +POD_COUNT=$(kubectl get pods --all-namespaces --no-headers | wc -l) + +echo " Nodes: ${NODE_COUNT}" +echo " Namespaces: ${NAMESPACE_COUNT}" +echo " Total Pods: ${POD_COUNT}" + +# Calculate total resources +TOTAL_CPU=0 +TOTAL_MEMORY_GB=0 + +while IFS= read -r line; do + CPU=$(echo $line | jq -r '.status.capacity.cpu') + MEMORY_KI=$(echo $line | jq -r '.status.capacity.memory' | sed 's/Ki//') + + TOTAL_CPU=$((TOTAL_CPU + CPU)) + MEMORY_GB=$((MEMORY_KI / 1024 / 1024)) + TOTAL_MEMORY_GB=$((TOTAL_MEMORY_GB + MEMORY_GB)) +done < <(kubectl get nodes -o json | jq -c '.items[]') + +echo " Total CPU: ${TOTAL_CPU} cores" +echo " Total Memory: ${TOTAL_MEMORY_GB} GB" + +# Estimate costs +CPU_PRICE=0.04 +MEMORY_PRICE=0.005 + +MONTHLY_CPU_COST=$(echo "${TOTAL_CPU} * 24 * 30 * ${CPU_PRICE}" | bc) +MONTHLY_MEMORY_COST=$(echo "${TOTAL_MEMORY_GB} * 24 * 30 * ${MEMORY_PRICE}" | bc) +TOTAL_COST=$(echo "${MONTHLY_CPU_COST} + ${MONTHLY_MEMORY_COST}" | bc) + +echo "" +echo -e "${BLUE}💰 Estimated monthly costs (at default rates):${NC}" +echo " CPU: \$${MONTHLY_CPU_COST}" +echo " Memory: \$${MONTHLY_MEMORY_COST}" +echo " Total: \$${TOTAL_COST}" +echo "" +echo -e "${YELLOW} 💡 You can adjust pricing in Jenkinsfile${NC}" + +# Telegram setup +echo "" +echo -e "${BLUE}📱 Telegram Setup${NC}" +echo "" + +read -p "Do you want to set up Telegram notifications? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "" + echo "To set up Telegram:" + echo "1. Open Telegram and find @BotFather" + echo "2. Send: /newbot" + echo "3. Follow instructions to get your bot token" + echo "" + echo "Then get your Chat ID:" + echo "1. Find @userinfobot in Telegram" + echo "2. Send: /start" + echo "3. Copy your ID" + echo "" + + read -p "Press Enter when you have both token and chat ID..." + echo "" + + read -p "Enter Bot Token: " BOT_TOKEN + read -p "Enter Chat ID: " CHAT_ID + + # Test + echo -n "Testing Telegram connection... " + RESPONSE=$(curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \ + -d chat_id="${CHAT_ID}" \ + -d text="🎉 Cluster Health Dashboard setup test!") + + if echo "$RESPONSE" | grep -q '"ok":true'; then + echo -e "${GREEN}✅ Success!${NC}" + echo "" + echo "Add these credentials to Jenkins:" + echo "" + echo "Credential 1:" + echo " Kind: Secret text" + echo " Secret: ${BOT_TOKEN}" + echo " ID: telegram-bot-token" + echo "" + echo "Credential 2:" + echo " Kind: Secret text" + echo " Secret: ${CHAT_ID}" + echo " ID: telegram-chat-id" + echo "" + else + echo -e "${RED}❌ Failed${NC}" + echo "Response: $RESPONSE" + fi +else + echo "Skipping Telegram setup" +fi + +# Git setup +echo "" +echo -e "${BLUE}📦 Git Repository Setup${NC}" +echo "" + +read -p "Add to GitOps repository? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + read -p "Enter path to k3s-gitops repository: " GITOPS_PATH + + if [ -d "$GITOPS_PATH" ]; then + TARGET_DIR="${GITOPS_PATH}/apps/cluster-health-dashboard" + mkdir -p "$TARGET_DIR" + + cp Jenkinsfile "$TARGET_DIR/" + cp README.md "$TARGET_DIR/" + + echo -e "${GREEN}✅ Files copied to ${TARGET_DIR}${NC}" + echo "" + echo "Next steps:" + echo " cd ${GITOPS_PATH}" + echo " git add apps/cluster-health-dashboard/" + echo " git commit -m 'feat: add cluster health dashboard pipeline'" + echo " git push origin main" + else + echo -e "${RED}❌ Directory not found: ${GITOPS_PATH}${NC}" + fi +fi + +# Summary +echo "" +echo "╔══════════════════════════════════════════════════════════╗" +echo "║ Setup Summary ║" +echo "╚══════════════════════════════════════════════════════════╝" +echo "" +echo -e "${GREEN}✅ Prerequisites verified${NC}" +echo -e "${GREEN}✅ Cluster access confirmed${NC}" +echo "" +echo -e "${BLUE}📋 Next Steps:${NC}" +echo "" +echo "1. Create Jenkins Pipeline:" +echo " - Jenkins → New Item → Pipeline" +echo " - Name: cluster-health-dashboard" +echo " - Pipeline script from SCM → Git" +echo " - Repository: your-gitea/k3s-gitops" +echo " - Script Path: apps/cluster-health-dashboard/Jenkinsfile" +echo "" +echo "2. Configure Credentials (if using Telegram):" +echo " - Add 'telegram-bot-token'" +echo " - Add 'telegram-chat-id'" +echo "" +echo "3. Run First Build:" +echo " - Build with Parameters" +echo " - REPORT_PERIOD: 24h" +echo " - SEND_TELEGRAM: true" +echo "" +echo "4. View Dashboard:" +echo " - Build #1 → Cluster Health Dashboard (sidebar)" +echo "" +echo -e "${BLUE}📚 Documentation:${NC}" +echo " See README.md for detailed setup and troubleshooting" +echo "" +echo -e "${GREEN}🎉 Setup complete! Good luck!${NC}" +echo "" \ No newline at end of file