zhensolid 1 жил өмнө
parent
commit
04e0c6d4f6
1 өөрчлөгдсөн 271 нэмэгдсэн , 0 устгасан
  1. 271 0
      setup-monitoring.sh

+ 271 - 0
setup-monitoring.sh

@@ -0,0 +1,271 @@
+#!/bin/bash
+
+# 清屏
+clear
+
+# 检查并安装 tree 命令
+if ! command -v tree >/dev/null 2>&1; then
+    echo "正在安装 tree 命令..."
+    if command -v apt-get >/dev/null 2>&1; then
+        sudo apt-get update && sudo apt-get install -y tree
+    elif command -v yum >/dev/null 2>&1; then
+        sudo yum install -y tree
+    else
+        echo "无法安装 tree 命令,将使用 ls -R 替代"
+    fi
+fi
+
+# 检查端口是否被占用
+check_port() {
+    local port=$1
+    if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then
+        return 1
+    fi
+    return 0
+}
+
+# 检查监控相关容器是否在运行
+check_running_containers() {
+    local container_patterns=("node_exporter" "prometheus" "grafana")
+    local running_containers=()
+    
+    for pattern in "${container_patterns[@]}"; do
+        # 使用模糊匹配查找包含关键字的容器
+        local found_containers=$(docker ps --format '{{.Names}}' | grep -i "${pattern}")
+        if [ ! -z "$found_containers" ]; then
+            while IFS= read -r container; do
+                running_containers+=("$container")
+            done <<< "$found_containers"
+        fi
+    done
+    
+    if [ ${#running_containers[@]} -gt 0 ]; then
+        echo "发现以下可能相关的监控容器正在运行:"
+        printf '%s\n' "${running_containers[@]}"
+        echo "------------------------"
+        echo "请选择操作:"
+        echo "1. 停止这些容器并继续部署"
+        echo "2. 退出脚本"
+        read -p "请输入选项 (1/2): " choice
+        
+        case $choice in
+            1)
+                echo "正在停止容器..."
+                for container in "${running_containers[@]}"; do
+                    echo "停止并删除容器: $container"
+                    docker stop "$container" && docker rm "$container"
+                done
+                echo "所有容器已停止并删除"
+                ;;
+            2)
+                echo "退出脚本"
+                exit 0
+                ;;
+            *)
+                echo "无效选项,退出脚本"
+                exit 1
+                ;;
+        esac
+    fi
+}
+
+# 检查并清理已存在的项目
+check_existing_project() {
+    local project_name=$1
+    if [ -d "$project_name" ]; then
+        echo "警告: 目录 $project_name 已存在!"
+        echo "请选择操作:"
+        echo "1. 删除现有项目并重新创建"
+        echo "2. 退出脚本"
+        read -p "请输入选项 (1/2): " choice
+        
+        case $choice in
+            1)
+                echo "正在删除现有项目..."
+                # 停止并删除容器
+                if [ -f "$project_name/docker-compose.yml" ]; then
+                    cd $project_name
+                    docker-compose down
+                    cd ..
+                fi
+                rm -rf $project_name
+                echo "项目已删除"
+                return 0
+                ;;
+            2)
+                echo "退出脚本"
+                exit 0
+                ;;
+            *)
+                echo "无效选项,退出脚本"
+                exit 1
+                ;;
+        esac
+    fi
+    return 0
+}
+
+echo "=== 监控系统部署脚本 ==="
+echo "------------------------"
+
+# 首先检查是否有相关容器在运行
+check_running_containers
+
+# 提示输入项目名称
+echo "请输入项目名称 (默认: NPG):"
+read PROJECT_NAME
+PROJECT_NAME=${PROJECT_NAME:-NPG}
+
+# 检查已存在的项目
+check_existing_project $PROJECT_NAME
+
+# 获取 Grafana 端口
+echo "请输入 Grafana 访问端口 (默认: 3000):"
+read PORT
+PORT=${PORT:-3000}
+
+# 验证端口
+while true; do
+    if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
+        echo "错误: 请输入有效的数字端口"
+        read PORT
+        continue
+    fi
+    
+    if ! check_port $PORT; then
+        echo "错误: 端口 $PORT 已被占用,请选择其他端口"
+        read PORT
+        continue
+    fi
+    
+    break
+done
+
+GRAFANA_PORT=$PORT
+
+# 提示输入 Grafana 密码
+echo "请输入 Grafana 管理员密码 (默认: admin123):"
+read GRAFANA_PASSWORD
+GRAFANA_PASSWORD=${GRAFANA_PASSWORD:-admin123}
+
+echo "------------------------"
+echo "确认信息:"
+echo "项目名称: $PROJECT_NAME"
+echo "Grafana端口: $GRAFANA_PORT"
+echo "Grafana密码: $GRAFANA_PASSWORD"
+echo "------------------------"
+echo "是否继续? (y/n)"
+read CONFIRM
+
+if [[ $CONFIRM != "y" && $CONFIRM != "Y" ]]; then
+    echo "取消部署"
+    exit 1
+fi
+
+mkdir -p $PROJECT_NAME
+cd $PROJECT_NAME
+
+# 创建必要的目录
+mkdir -p data/prometheus data/grafana prometheus
+
+# 创建 prometheus.yml
+cat > prometheus/prometheus.yml << 'EOF'
+global:
+  scrape_interval: 15s
+  evaluation_interval: 15s
+
+scrape_configs:
+  - job_name: 'node_exporter'
+    static_configs:
+      - targets: ['node_exporter:9100']
+EOF
+
+# 创建 docker-compose.yml(使用变量替换密码和端口)
+cat > docker-compose.yml << EOF
+version: '3.8'
+
+services:
+  node_exporter:
+    image: prom/node-exporter:latest
+    container_name: node_exporter
+    restart: unless-stopped
+    networks:
+      - monitoring
+    command:
+      - '--path.rootfs=/host'
+    pid: host
+    volumes:
+      - '/:/host:ro,rslave'
+
+  prometheus:
+    image: prom/prometheus:latest
+    container_name: prometheus
+    restart: unless-stopped
+    networks:
+      - monitoring
+    volumes:
+      - ./prometheus:/etc/prometheus
+      - ./data/prometheus:/prometheus
+    command:
+      - '--config.file=/etc/prometheus/prometheus.yml'
+      - '--storage.tsdb.path=/prometheus'
+      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
+      - '--web.console.templates=/usr/share/prometheus/consoles'
+
+  grafana:
+    image: grafana/grafana:latest
+    container_name: grafana
+    restart: unless-stopped
+    networks:
+      - monitoring
+    ports:
+      - "${GRAFANA_PORT}:3000"
+    volumes:
+      - ./data/grafana:/var/lib/grafana
+    environment:
+      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
+
+networks:
+  monitoring:
+    driver: bridge
+EOF
+
+# 设置目录权限
+chmod 777 data/prometheus data/grafana
+
+echo "
+=== 部署完成 ==="
+echo "项目创建在: $(pwd)/${PROJECT_NAME}"
+echo "目录结构如下:"
+cd $PROJECT_NAME
+if command -v tree >/dev/null 2>&1; then
+    tree .
+else
+    echo "提示:未安装 tree 命令,无法显示目录结构"
+fi
+cd ..
+
+echo "
+配置信息:
+- 项目名称: ${PROJECT_NAME}
+- Grafana 访问地址: http://localhost:${GRAFANA_PORT}
+- Grafana 管理员用户名: admin
+- Grafana 管理员密码: ${GRAFANA_PASSWORD}
+
+后续步骤:
+1. cd ${PROJECT_NAME}
+2. 运行 docker-compose up -d 启动服务
+3. 访问 http://localhost:${GRAFANA_PORT} 登录 Grafana
+
+是否现在启动服务? (y/n)"
+read START
+
+if [[ $START == "y" || $START == "Y" ]]; then
+    echo "正在启动服务..."
+    cd $PROJECT_NAME
+    docker-compose up -d
+    echo "服务已启动!"
+    echo "可以通过 http://localhost:${GRAFANA_PORT} 访问 Grafana"
+    echo "Prometheus数据地址为http://prometheus:9090"
+    cd ..
+fi