setup-monitoring.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #!/bin/bash
  2. # 清屏
  3. clear
  4. # 检查并安装 tree 命令
  5. if ! command -v tree >/dev/null 2>&1; then
  6. echo "正在安装 tree 命令..."
  7. if command -v apt-get >/dev/null 2>&1; then
  8. sudo apt-get update && sudo apt-get install -y tree
  9. elif command -v yum >/dev/null 2>&1; then
  10. sudo yum install -y tree
  11. else
  12. echo "无法安装 tree 命令,将使用 ls -R 替代"
  13. fi
  14. fi
  15. # 检查端口是否被占用
  16. check_port() {
  17. local port=$1
  18. if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then
  19. return 1
  20. fi
  21. return 0
  22. }
  23. # 检查监控相关容器是否在运行
  24. check_running_containers() {
  25. local container_patterns=("node_exporter" "prometheus" "grafana")
  26. local running_containers=()
  27. for pattern in "${container_patterns[@]}"; do
  28. # 使用模糊匹配查找包含关键字的容器
  29. local found_containers=$(docker ps --format '{{.Names}}' | grep -i "${pattern}")
  30. if [ ! -z "$found_containers" ]; then
  31. while IFS= read -r container; do
  32. running_containers+=("$container")
  33. done <<< "$found_containers"
  34. fi
  35. done
  36. if [ ${#running_containers[@]} -gt 0 ]; then
  37. echo "发现以下可能相关的监控容器正在运行:"
  38. printf '%s\n' "${running_containers[@]}"
  39. echo "------------------------"
  40. echo "请选择操作:"
  41. echo "1. 停止这些容器并继续部署"
  42. echo "2. 退出脚本"
  43. read -p "请输入选项 (1/2): " choice
  44. case $choice in
  45. 1)
  46. echo "正在停止容器..."
  47. for container in "${running_containers[@]}"; do
  48. echo "停止并删除容器: $container"
  49. docker stop "$container" && docker rm "$container"
  50. done
  51. echo "所有容器已停止并删除"
  52. ;;
  53. 2)
  54. echo "退出脚本"
  55. exit 0
  56. ;;
  57. *)
  58. echo "无效选项,退出脚本"
  59. exit 1
  60. ;;
  61. esac
  62. fi
  63. }
  64. # 检查并清理已存在的项目
  65. check_existing_project() {
  66. local project_name=$1
  67. if [ -d "$project_name" ]; then
  68. echo "警告: 目录 $project_name 已存在!"
  69. echo "请选择操作:"
  70. echo "1. 删除现有项目并重新创建"
  71. echo "2. 退出脚本"
  72. read -p "请输入选项 (1/2): " choice
  73. case $choice in
  74. 1)
  75. echo "正在删除现有项目..."
  76. # 停止并删除容器
  77. if [ -f "$project_name/docker-compose.yml" ]; then
  78. cd $project_name
  79. docker-compose down
  80. cd ..
  81. fi
  82. rm -rf $project_name
  83. echo "项目已删除"
  84. return 0
  85. ;;
  86. 2)
  87. echo "退出脚本"
  88. exit 0
  89. ;;
  90. *)
  91. echo "无效选项,退出脚本"
  92. exit 1
  93. ;;
  94. esac
  95. fi
  96. return 0
  97. }
  98. echo "=== 监控系统部署脚本 ==="
  99. echo "------------------------"
  100. # 首先检查是否有相关容器在运行
  101. check_running_containers
  102. # 提示输入项目名称
  103. echo "请输入项目名称 (默认: NPG):"
  104. read PROJECT_NAME
  105. PROJECT_NAME=${PROJECT_NAME:-NPG}
  106. # 检查已存在的项目
  107. check_existing_project $PROJECT_NAME
  108. # 获取 Grafana 端口
  109. echo "请输入 Grafana 访问端口 (默认: 3000):"
  110. read PORT
  111. PORT=${PORT:-3000}
  112. # 验证端口
  113. while true; do
  114. if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
  115. echo "错误: 请输入有效的数字端口"
  116. read PORT
  117. continue
  118. fi
  119. if ! check_port $PORT; then
  120. echo "错误: 端口 $PORT 已被占用,请选择其他端口"
  121. read PORT
  122. continue
  123. fi
  124. break
  125. done
  126. GRAFANA_PORT=$PORT
  127. # 提示输入 Grafana 密码
  128. echo "请输入 Grafana 管理员密码 (默认: admin123):"
  129. read GRAFANA_PASSWORD
  130. GRAFANA_PASSWORD=${GRAFANA_PASSWORD:-admin123}
  131. echo "------------------------"
  132. echo "确认信息:"
  133. echo "项目名称: $PROJECT_NAME"
  134. echo "Grafana端口: $GRAFANA_PORT"
  135. echo "Grafana密码: $GRAFANA_PASSWORD"
  136. echo "------------------------"
  137. echo "是否继续? (y/n)"
  138. read CONFIRM
  139. if [[ $CONFIRM != "y" && $CONFIRM != "Y" ]]; then
  140. echo "取消部署"
  141. exit 1
  142. fi
  143. mkdir -p $PROJECT_NAME
  144. cd $PROJECT_NAME
  145. # 创建必要的目录
  146. mkdir -p data/prometheus data/grafana prometheus
  147. # 创建 prometheus.yml
  148. cat > prometheus/prometheus.yml << 'EOF'
  149. global:
  150. scrape_interval: 15s
  151. evaluation_interval: 15s
  152. scrape_configs:
  153. - job_name: 'node_exporter'
  154. static_configs:
  155. - targets: ['node_exporter:9100']
  156. EOF
  157. # 创建 docker-compose.yml(使用变量替换密码和端口)
  158. cat > docker-compose.yml << EOF
  159. version: '3.8'
  160. services:
  161. node_exporter:
  162. image: prom/node-exporter:latest
  163. container_name: node_exporter
  164. restart: unless-stopped
  165. networks:
  166. - monitoring
  167. command:
  168. - '--path.rootfs=/host'
  169. pid: host
  170. volumes:
  171. - '/:/host:ro,rslave'
  172. prometheus:
  173. image: prom/prometheus:latest
  174. container_name: prometheus
  175. restart: unless-stopped
  176. networks:
  177. - monitoring
  178. volumes:
  179. - ./prometheus:/etc/prometheus
  180. - ./data/prometheus:/prometheus
  181. command:
  182. - '--config.file=/etc/prometheus/prometheus.yml'
  183. - '--storage.tsdb.path=/prometheus'
  184. - '--web.console.libraries=/usr/share/prometheus/console_libraries'
  185. - '--web.console.templates=/usr/share/prometheus/consoles'
  186. grafana:
  187. image: grafana/grafana:latest
  188. container_name: grafana
  189. restart: unless-stopped
  190. networks:
  191. - monitoring
  192. ports:
  193. - "${GRAFANA_PORT}:3000"
  194. volumes:
  195. - ./data/grafana:/var/lib/grafana
  196. environment:
  197. - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
  198. networks:
  199. monitoring:
  200. driver: bridge
  201. EOF
  202. # 设置目录权限
  203. chmod 777 data/prometheus data/grafana
  204. echo "
  205. === 部署完成 ==="
  206. echo "项目创建在: $(pwd)/${PROJECT_NAME}"
  207. echo "目录结构如下:"
  208. cd $PROJECT_NAME
  209. if command -v tree >/dev/null 2>&1; then
  210. tree .
  211. else
  212. echo "提示:未安装 tree 命令,无法显示目录结构"
  213. fi
  214. cd ..
  215. echo "
  216. 配置信息:
  217. - 项目名称: ${PROJECT_NAME}
  218. - Grafana 访问地址: http://localhost:${GRAFANA_PORT}
  219. - Grafana 管理员用户名: admin
  220. - Grafana 管理员密码: ${GRAFANA_PASSWORD}
  221. 后续步骤:
  222. 1. cd ${PROJECT_NAME}
  223. 2. 运行 docker-compose up -d 启动服务
  224. 3. 访问 http://localhost:${GRAFANA_PORT} 登录 Grafana
  225. 是否现在启动服务? (y/n)"
  226. read START
  227. if [[ $START == "y" || $START == "Y" ]]; then
  228. echo "正在启动服务..."
  229. cd $PROJECT_NAME
  230. docker-compose up -d
  231. echo "服务已启动!"
  232. echo "可以通过 http://localhost:${GRAFANA_PORT} 访问 Grafana"
  233. echo "Prometheus数据地址为http://prometheus:9090"
  234. cd ..
  235. fi