【教程】Grafana 部署


#!/bin/bash

echo "=== 开始配置 Grafana ==="

# 生成随机端口的函数
generate_random_port() {
    while true; do
        port=$((RANDOM % 55535 + 10000))  # 生成10000-65535之间的端口
        if ! netstat -tuln 2>/dev/null | grep -q ":$port "; then
            echo $port
            break
        fi
    done
}

# 检查本地配置
if [ -d "grafana-data" ]; then
    echo "警告:检测到本地已存在 Grafana 配置"
    read -p "是否清除现有配置并重新初始化?(y/N) " answer
    if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
        echo "清理现有配置..."
        rm -rf grafana-data .env-grafana
        echo "现有配置已清理"
    else
        echo "保留现有配置,退出脚本"
        exit 0
    fi
fi

# 检查 docker-compose-grafana.yml
if [ -f "docker-compose-grafana.yml" ]; then
    echo "发现现有的 docker-compose-grafana.yml"
    read -p "是否覆盖现有的 docker-compose-grafana.yml?(y/N) " answer
    if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then
        echo "保留现有 docker-compose-grafana.yml,退出脚本"
        exit 0
    fi
fi

echo -e "\n1. 生成随机端口..."
GRAFANA_PORT=$(generate_random_port)
echo "Grafana 端口: $GRAFANA_PORT"

echo -e "\n2. 创建环境变量文件..."
cat > .env-grafana << EOL
GRAFANA_PORT=$GRAFANA_PORT
EOL
echo "环境变量文件创建完成"

echo -e "\n3. 创建本地配置目录..."
mkdir -p grafana-data
echo "目录创建完成"

echo -e "\n4. 创建 docker-compose-grafana.yml..."
cat > docker-compose-grafana.yml << EOL
version: "3.8"

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana-\${GRAFANA_PORT}
    restart: unless-stopped
    ports:
      - "\${GRAFANA_PORT}:3000"
    volumes:
      - ./grafana-data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge
    external: false
EOL
echo "配置文件创建完成"

echo -e "\n5. 设置目录权限..."
# Grafana 需要特定的用户权限
sudo chown -R 472:472 grafana-data 2>/dev/null || chown -R 472:472 grafana-data 2>/dev/null || echo "权限设置可能需要sudo"
echo "权限设置完成"

echo -e "\n6. 创建管理脚本..."
cat > manage-grafana.sh << EOL
#!/bin/bash
source .env-grafana

case \$1 in
    start)
        echo "启动 Grafana..."
        docker compose -f docker-compose-grafana.yml --env-file .env-grafana up -d
        echo "Grafana 已启动!"
        echo "访问地址: http://localhost:\$GRAFANA_PORT"
        echo "默认账号: admin/admin"
        ;;
    stop)
        echo "停止 Grafana..."
        docker compose -f docker-compose-grafana.yml down
        ;;
    restart)
        echo "重启 Grafana..."
        docker compose -f docker-compose-grafana.yml restart
        ;;
    status)
        docker compose -f docker-compose-grafana.yml ps
        ;;
    logs)
        docker compose -f docker-compose-grafana.yml logs -f
        ;;
    info)
        echo "Grafana 信息:"
        echo "访问地址: http://localhost:\$GRAFANA_PORT"
        echo "默认账号: admin/admin"
        echo "数据目录: ./grafana-data"
        echo "添加数据源示例:"
        echo "  - Prometheus: http://prometheus:9090 (如果在同一网络)"
        echo "  - Prometheus: http://host.docker.internal:PROMETHEUS_PORT (本地)"
        ;;
    backup)
        echo "备份 Grafana 数据..."
        tar -czf "grafana-backup-\$(date +%Y%m%d-%H%M%S).tar.gz" grafana-data/
        echo "备份完成"
        ;;
    *)
        echo "用法: \$0 {start|stop|restart|status|logs|info|backup}"
        ;;
esac
EOL
chmod +x manage-grafana.sh
echo "管理脚本创建完成"

echo -e "\n7. 创建数据源配置模板..."
mkdir -p config-templates
cat > config-templates/prometheus-datasource.json << EOL
{
  "name": "Prometheus",
  "type": "prometheus",
  "url": "http://prometheus:9090",
  "access": "proxy",
  "isDefault": true,
  "jsonData": {
    "timeInterval": "5s"
  }
}
EOL
echo "数据源配置模板创建完成"

echo -e "\n=== Grafana 配置完成! ==="
echo "随机分配的端口: $GRAFANA_PORT"
echo -e "\n你可以:"
echo "1. 使用 './manage-grafana.sh start' 启动服务"
echo "2. 使用 './manage-grafana.sh info' 查看信息"
echo "3. 访问 http://localhost:$GRAFANA_PORT 使用 Grafana"
echo "4. 默认登录账号: admin/admin"
echo "5. 编辑 docker-compose-grafana.yml 修改设置"
echo -e "\n管理命令:"
echo "- ./manage-grafana.sh start   # 启动服务"
echo "- ./manage-grafana.sh stop    # 停止服务"
echo "- ./manage-grafana.sh restart # 重启服务"
echo "- ./manage-grafana.sh status  # 查看状态"
echo "- ./manage-grafana.sh logs    # 查看日志"
echo "- ./manage-grafana.sh info    # 查看信息"
echo "- ./manage-grafana.sh backup  # 备份数据"
echo -e "\n配置提示:"
echo "- 首次登录请修改默认密码"
echo "- 数据源配置模板保存在 config-templates/ 目录"
echo "- 如需连接本地 Prometheus,请使用 host.docker.internal:端口"
echo "- 端口信息保存在 .env-grafana 文件中"

# 询问是否立即启动服务
read -p "是否立即启动 Grafana?(y/N) " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
    echo "启动 Grafana..."
    docker compose -f docker-compose-grafana.yml --env-file .env-grafana up -d
    echo -e "\nGrafana 已启动!"
    echo "访问地址: http://localhost:$GRAFANA_PORT"
    echo "默认账号: admin/admin"
    echo -e "\n等待服务完全启动后再访问..."
    echo "首次启动可能需要1-2分钟来初始化"
fi

如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录