Docker、DBGPT一键安装、卸载

系统:AlibabaCloud Linux

使用方法:sh dbgpt_manager.sh,然后根据控制台输出的序号进行输入

bash 复制代码
#!/bin/bash

# dbgpt_manager.sh
# 用于管理 DB-GPT Docker 容器的交互脚本

# =======================
# 配置变量
# =======================

# MySQL 配置
MYSQL_IP=""  # MySQL 服务器地址
MYSQL_USER=""                                        # MySQL 用户名
MYSQL_PASSWORD=""                                # MySQL 密码
MYSQL_PORT="3306"                                            # MySQL 端口
MYSQL_DB="dbgpt"                                             # MySQL 固定数据库名称

# OpenAI API Key
OPENAI_KEY=""  # 请替换为您的 OpenAI API 密钥

# DB-GPT 运行端口
DBGPT_PORT="5670"  # 根据文档,v0.5.4之后版本默认为5670

# Docker 镜像名称
DOCKER_IMAGE="docker pull eosphorosai/dbgpt:latest"

# Docker 容器名称
DOCKER_CONTAINER_NAME="db-gpt-container"

# Embedding 模型配置
EMBEDDING_MODEL_NAME="text2vec-large-chinese"  # 优先选择对中文支持更友好的模型
MODEL_REPO_URL="https://www.modelscope.cn/Jerry0/text2vec-large-chinese.git"  # 模型仓库地址
MODEL_BASE_PATH="/data/models/$EMBEDDING_MODEL_NAME"  # 模型基础路径
MODEL_HOST_PATH="$MODEL_BASE_PATH"  # 本地模型实际路径
MODEL_CONTAINER_PATH="/app/models/text2vec-large-chinese"  # 容器内模型路径

# 数据库初始化脚本 URL
DB_SCHEMA_URL="https://raw.githubusercontent.com/eosphoros-ai/DB-GPT/main/assets/schema/dbgpt.sql"  # SQL 脚本下载地址

# 数据库初始化脚本本地路径(临时文件)
TEMP_SCHEMA_FILE="/tmp/dbgpt.sql"

# =======================
# 函数定义
# =======================

# 获取主机的 IP 地址
get_host_ip() {
    # 尝试通过默认路由获取主机 IP
    HOST_IP=$(ip route get 1 | awk '{print $NF;exit}')
    
    # 如果未获取到 IP,则使用 hostname -I
    if [[ -z "$HOST_IP" ]]; then
        HOST_IP=$(hostname -I | awk '{print $1}')
    fi

    # 如果仍未获取到 IP,则设置为 localhost
    if [[ -z "$HOST_IP" ]]; then
        HOST_IP="localhost"
    fi

    echo "$HOST_IP"
}

# 安装 Docker
install_docker() {
    echo "正在安装 Docker..."
    # 移除旧版本
    sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

    # 安装必要的软件包
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

    # 添加 Docker 仓库
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    # 安装 Docker
    sudo yum install -y docker-ce docker-ce-cli containerd.io

    # 启动并设置开机自启
    sudo systemctl start docker
    sudo systemctl enable docker

    echo "Docker 安装完成。"
}

# 启动 Docker 服务
start_docker() {
    echo "正在启动 Docker 服务..."
    sudo systemctl start docker
    sudo systemctl enable docker
    echo "Docker 服务已启动。"
}

# 重启 Docker 服务
restart_docker() {
    echo "正在重启 Docker 服务..."
    sudo systemctl restart docker
    if [ $? -eq 0 ]; then
        echo "Docker 服务已成功重启。"
    else
        echo "Docker 服务重启失败,请检查日志。"
    fi
}

# 停止 Docker 服务
stop_docker() {
    echo "正在停止 Docker 服务..."
    sudo systemctl stop docker
    if [ $? -eq 0 ]; then
        echo "Docker 服务已停止。"
    else
        echo "Docker 服务停止失败,请检查日志。"
    fi
}

# 卸载 Docker
uninstall_docker() {
    echo "正在卸载 Docker..."
    sudo systemctl stop docker
    sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    sudo rm -rf /var/lib/docker
    echo "Docker 已卸载。"
}

# 拉取 DB-GPT Docker 镜像并下载嵌入模型
pull_image_and_download_model() {
    echo "正在拉取 DB-GPT Docker 镜像..."
    sudo docker pull $DOCKER_IMAGE
    if [ $? -eq 0 ]; then
        echo "DB-GPT 镜像已成功拉取。"
    else
        echo "拉取 DB-GPT 镜像失败,请检查网络或镜像名称。"
        return
    fi

    echo "正在下载并配置 Embedding 模型: $EMBEDDING_MODEL_NAME..."

    # 检查是否安装了 Git
    if ! command -v git &> /dev/null; then
        echo "Git 未安装,正在安装..."
        sudo yum install -y git
    fi

    # 创建模型目录
    sudo mkdir -p "$MODEL_BASE_PATH"
    sudo chown -R $(whoami):$(whoami) "$MODEL_BASE_PATH"

    # 进入模型目录
    cd "$MODEL_BASE_PATH" || { echo "无法进入模型目录。"; return; }

    # 克隆模型仓库
    if [ ! -d "text2vec-large-chinese" ]; then
        git clone $MODEL_REPO_URL
        if [ $? -eq 0 ]; then
            echo "Embedding 模型已成功下载到 $MODEL_HOST_PATH。"
        else
            echo "下载 Embedding 模型失败,请检查网络或仓库 URL。"
            cd - > /dev/null
            return
        fi
    else
        echo "Embedding 模型已存在,跳过下载。"
    fi

    # 返回脚本所在目录
    cd - > /dev/null
}

# 运行 DB-GPT(启动 Docker 容器)
run_dbgpt() {
    echo "正在运行 DB-GPT Docker 容器..."

    # 检查是否已有同名容器在运行
    if [ "$(sudo docker ps -a -q -f name=$DOCKER_CONTAINER_NAME)" ]; then
        echo "检测到已有名为 $DOCKER_CONTAINER_NAME 的容器,正在移除..."
        sudo docker stop $DOCKER_CONTAINER_NAME
        sudo docker rm $DOCKER_CONTAINER_NAME
    fi

    # 检查 Embedding 模型路径是否存在
    if [ ! -d "$MODEL_HOST_PATH" ]; then
        echo "Embedding 模型路径 $MODEL_HOST_PATH 不存在。请先拉取镜像并下载嵌入模型。"
        echo "请使用脚本选项 6 进行操作。"
        return
    fi

    # 运行 Docker 容器,设置环境变量并挂载模型目录
    sudo docker run -d \
        -p $DBGPT_PORT:$DBGPT_PORT \
        -e LOCAL_DB_TYPE=mysql \
        -e LOCAL_DB_HOST=$MYSQL_IP \
        -e LOCAL_DB_USER=$MYSQL_USER \
        -e LOCAL_DB_PASSWORD=$MYSQL_PASSWORD \
        -e LOCAL_DB_PORT=$MYSQL_PORT \
        -e LOCAL_DB_NAME=$MYSQL_DB \
        -e OPENAI_API_KEY=$OPENAI_KEY \
        -e LLM_MODEL=chatgpt_proxyllm \
        -e PROXY_API_KEY=$OPENAI_KEY \
        -e PROXY_SERVER_URL=https://api.openai.com/v1/chat/completions \
        -e LANGUAGE=zh \
        -v $MODEL_HOST_PATH:$MODEL_CONTAINER_PATH \
        --name $DOCKER_CONTAINER_NAME \
        $DOCKER_IMAGE

    # 等待几秒以确保容器启动
    sleep 10

    # 检查容器是否正在运行
    CONTAINER_STATUS=$(sudo docker inspect -f '{{.State.Running}}' $DOCKER_CONTAINER_NAME)
    if [ "$CONTAINER_STATUS" == "true" ]; then
        # 获取主机 IP
        HOST_IP=$(get_host_ip)

        # 检查端口是否在监听
        if sudo netstat -tuln | grep -q ":$DBGPT_PORT"; then
            echo "DB-GPT 容器已成功运行。"
            echo "访问地址:http://$HOST_IP:$DBGPT_PORT"
        else
            echo "DB-GPT 容器运行,但端口 $DBGPT_PORT 未在监听。请检查容器内部的服务状态。"
            echo "您可以通过以下命令查看容器日志以获取更多信息:"
            echo "  sudo docker logs $DOCKER_CONTAINER_NAME"
        fi
    else
        echo "运行 DB-GPT 容器失败,请检查容器日志。"
        echo "查看日志的命令:sudo docker logs $DOCKER_CONTAINER_NAME"
    fi
}

# 停止 DB-GPT
stop_dbgpt() {
    echo "正在停止 DB-GPT Docker 容器..."
    sudo docker stop $DOCKER_CONTAINER_NAME
    sudo docker rm $DOCKER_CONTAINER_NAME
    echo "DB-GPT 已停止。"
}

# 初始化 MySQL 数据库表结构
init_db_schema() {
    echo "正在初始化 MySQL 数据库表结构..."

    # 检查是否安装了 MySQL 客户端
    if ! command -v mysql &> /dev/null; then
        echo "MySQL 客户端未安装,正在安装..."
        sudo yum install -y mysql
    fi

    # 下载 SQL 文件
    echo "正在从 $DB_SCHEMA_URL 下载数据库初始化脚本..."

    # 检查是否安装了 curl 或 wget,如果没有则安装 curl
    if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
        echo "curl 和 wget 均未安装,正在安装 curl..."
        sudo yum install -y curl
    fi

    # 重新检查是否安装了 curl 或 wget
    if command -v curl &> /dev/null; then
        curl -L $DB_SCHEMA_URL -o $TEMP_SCHEMA_FILE
    elif command -v wget &> /dev/null; then
        wget $DB_SCHEMA_URL -O $TEMP_SCHEMA_FILE
    else
        echo "未检测到 curl 或 wget,且安装失败。请手动安装其中一个工具后重试。"
        return
    fi

    # 检查下载是否成功
    if [ ! -f "$TEMP_SCHEMA_FILE" ]; then
        echo "下载数据库初始化脚本失败。"
        return
    fi

    # 导入数据库
    echo "正在导入数据库初始化脚本到数据库 $MYSQL_DB..."
    mysql -h"$MYSQL_IP" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DB" < "$TEMP_SCHEMA_FILE"

    # 检查导入是否成功
    if [ $? -eq 0 ]; then
        echo "MySQL 数据库表结构已成功初始化。"
    else
        echo "MySQL 数据库表结构初始化失败。请检查 MySQL 连接信息和 SQL 脚本内容。"
    fi

    # 删除临时 SQL 文件
    rm -f $TEMP_SCHEMA_FILE
}

# 安装 NVIDIA Container Toolkit(GPU 支持)
install_gpu_support() {
    echo "正在安装 NVIDIA Container Toolkit(GPU 支持)..."

    # 检查是否安装了 curl
    if ! command -v curl &> /dev/null; then
        echo "curl 未安装,正在安装..."
        sudo yum install -y curl
    fi

    # 检查是否已安装 NVIDIA 驱动程序
    if ! lsmod | grep -i nvidia > /dev/null; then
        echo "未检测到 NVIDIA 驱动程序。请先安装 NVIDIA 驱动程序后再继续。"
        return
    fi

    # 配置生产环境的存储库
    curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

    # 更新存储库中的包列表
    sudo yum update -y

    # 安装 NVIDIA Container Toolkit 包
    sudo yum install -y nvidia-container-toolkit

    # 配置 Docker 的容器运行时
    sudo nvidia-ctk runtime configure --runtime=docker

    # 重启 Docker 守护进程
    sudo systemctl restart docker

    echo "NVIDIA Container Toolkit 安装和配置成功完成。"
}

# 显示菜单
show_menu() {
    echo "=============================="
    echo "        DB-GPT 管理脚本        "
    echo "=============================="
    echo "1. 安装 Docker"
    echo "2. 启动 Docker 服务"
    echo "3. 重启 Docker 服务"
    echo "4. 停止 Docker 服务"
    echo "5. 卸载 Docker"
    echo "6. 拉取 DB-GPT 镜像并下载嵌入模型"
    echo "7. 运行 DB-GPT(启动容器)"
    echo "8. 停止 DB-GPT"
    echo "9. 初始化 MySQL 数据库表结构"
    echo "10. 安装 NVIDIA Container Toolkit(GPU 支持)"
    echo "11. 退出"
    echo "=============================="
}

# =======================
# 主程序
# =======================

while true; do
    show_menu
    read -p "请输入你的选择 [1-11]:" choice
    case $choice in
        1)
            install_docker
            ;;
        2)
            start_docker
            ;;
        3)
            restart_docker
            ;;
        4)
            stop_docker
            ;;
        5)
            uninstall_docker
            ;;
        6)
            pull_image_and_download_model
            ;;
        7)
            run_dbgpt
            ;;
        8)
            stop_dbgpt
            ;;
        9)
            init_db_schema
            ;;
        10)
            install_gpu_support
            ;;
        11)
            echo "退出脚本。"
            exit 0
            ;;
        *)
            echo "无效的选择,请重新输入。"
            ;;
    esac
    echo ""
done
相关推荐
一休哥助手5 分钟前
全面解析 Linux 系统监控与性能优化
linux·运维·性能优化
gs8014022 分钟前
替换 Docker.io 的 Harbor 安全部署指南:域名与 IP 双支持的镜像管理解决方案
docker·harbor
watl024 分钟前
【Android】unzip aar删除冲突classes再zip
android·linux·运维
coco_1998_225 分钟前
nvidia docker, nvidia docker2, nvidia container toolkits区别
docker·容器
团儿.39 分钟前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
赵大仁1 小时前
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc
linux·运维·服务器·ide·ubuntu·centos·计算机基础
vvw&1 小时前
Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程
linux·运维·服务器·ubuntu·docker·容器·开源
李白你好1 小时前
家用无线路由器的 2.4GHz 和 5GHz
运维·网络
苹果醋31 小时前
React系列(八)——React进阶知识点拓展
运维·vue.js·spring boot·nginx·课程设计
冷冰鱼1 小时前
【问题实录】服务器ping不通win11笔记本
运维·服务器