系统:AlibabaCloud Linux
使用方法:sh dbgpt_manager.sh,然后根据控制台输出的序号进行输入
#!/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() {# 尝试通过默认路由获取主机 IPHOST_IP=$(ip route get 1 | awk '{print $NF;exit}')# 如果未获取到 IP,则使用 hostname -Iif [[ -z "$HOST_IP" ]]; thenHOST_IP=$(hostname -I | awk '{print $1}')fi# 如果仍未获取到 IP,则设置为 localhostif [[ -z "$HOST_IP" ]]; thenHOST_IP="localhost"fiecho "$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# 安装 Dockersudo yum install -y docker-ce docker-ce-cli containerd.io# 启动并设置开机自启sudo systemctl start dockersudo systemctl enable dockerecho "Docker 安装完成。"
}# 启动 Docker 服务
start_docker() {echo "正在启动 Docker 服务..."sudo systemctl start dockersudo systemctl enable dockerecho "Docker 服务已启动。"
}# 重启 Docker 服务
restart_docker() {echo "正在重启 Docker 服务..."sudo systemctl restart dockerif [ $? -eq 0 ]; thenecho "Docker 服务已成功重启。"elseecho "Docker 服务重启失败,请检查日志。"fi
}# 停止 Docker 服务
stop_docker() {echo "正在停止 Docker 服务..."sudo systemctl stop dockerif [ $? -eq 0 ]; thenecho "Docker 服务已停止。"elseecho "Docker 服务停止失败,请检查日志。"fi
}# 卸载 Docker
uninstall_docker() {echo "正在卸载 Docker..."sudo systemctl stop dockersudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-enginesudo rm -rf /var/lib/dockerecho "Docker 已卸载。"
}# 拉取 DB-GPT Docker 镜像并下载嵌入模型
pull_image_and_download_model() {echo "正在拉取 DB-GPT Docker 镜像..."sudo docker pull $DOCKER_IMAGEif [ $? -eq 0 ]; thenecho "DB-GPT 镜像已成功拉取。"elseecho "拉取 DB-GPT 镜像失败,请检查网络或镜像名称。"returnfiecho "正在下载并配置 Embedding 模型: $EMBEDDING_MODEL_NAME..."# 检查是否安装了 Gitif ! command -v git &> /dev/null; thenecho "Git 未安装,正在安装..."sudo yum install -y gitfi# 创建模型目录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" ]; thengit clone $MODEL_REPO_URLif [ $? -eq 0 ]; thenecho "Embedding 模型已成功下载到 $MODEL_HOST_PATH。"elseecho "下载 Embedding 模型失败,请检查网络或仓库 URL。"cd - > /dev/nullreturnfielseecho "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)" ]; thenecho "检测到已有名为 $DOCKER_CONTAINER_NAME 的容器,正在移除..."sudo docker stop $DOCKER_CONTAINER_NAMEsudo docker rm $DOCKER_CONTAINER_NAMEfi# 检查 Embedding 模型路径是否存在if [ ! -d "$MODEL_HOST_PATH" ]; thenecho "Embedding 模型路径 $MODEL_HOST_PATH 不存在。请先拉取镜像并下载嵌入模型。"echo "请使用脚本选项 6 进行操作。"returnfi# 运行 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# 获取主机 IPHOST_IP=$(get_host_ip)# 检查端口是否在监听if sudo netstat -tuln | grep -q ":$DBGPT_PORT"; thenecho "DB-GPT 容器已成功运行。"echo "访问地址:http://$HOST_IP:$DBGPT_PORT"elseecho "DB-GPT 容器运行,但端口 $DBGPT_PORT 未在监听。请检查容器内部的服务状态。"echo "您可以通过以下命令查看容器日志以获取更多信息:"echo " sudo docker logs $DOCKER_CONTAINER_NAME"fielseecho "运行 DB-GPT 容器失败,请检查容器日志。"echo "查看日志的命令:sudo docker logs $DOCKER_CONTAINER_NAME"fi
}# 停止 DB-GPT
stop_dbgpt() {echo "正在停止 DB-GPT Docker 容器..."sudo docker stop $DOCKER_CONTAINER_NAMEsudo docker rm $DOCKER_CONTAINER_NAMEecho "DB-GPT 已停止。"
}# 初始化 MySQL 数据库表结构
init_db_schema() {echo "正在初始化 MySQL 数据库表结构..."# 检查是否安装了 MySQL 客户端if ! command -v mysql &> /dev/null; thenecho "MySQL 客户端未安装,正在安装..."sudo yum install -y mysqlfi# 下载 SQL 文件echo "正在从 $DB_SCHEMA_URL 下载数据库初始化脚本..."# 检查是否安装了 curl 或 wget,如果没有则安装 curlif ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; thenecho "curl 和 wget 均未安装,正在安装 curl..."sudo yum install -y curlfi# 重新检查是否安装了 curl 或 wgetif command -v curl &> /dev/null; thencurl -L $DB_SCHEMA_URL -o $TEMP_SCHEMA_FILEelif command -v wget &> /dev/null; thenwget $DB_SCHEMA_URL -O $TEMP_SCHEMA_FILEelseecho "未检测到 curl 或 wget,且安装失败。请手动安装其中一个工具后重试。"returnfi# 检查下载是否成功if [ ! -f "$TEMP_SCHEMA_FILE" ]; thenecho "下载数据库初始化脚本失败。"returnfi# 导入数据库echo "正在导入数据库初始化脚本到数据库 $MYSQL_DB..."mysql -h"$MYSQL_IP" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DB" < "$TEMP_SCHEMA_FILE"# 检查导入是否成功if [ $? -eq 0 ]; thenecho "MySQL 数据库表结构已成功初始化。"elseecho "MySQL 数据库表结构初始化失败。请检查 MySQL 连接信息和 SQL 脚本内容。"fi# 删除临时 SQL 文件rm -f $TEMP_SCHEMA_FILE
}# 安装 NVIDIA Container Toolkit(GPU 支持)
install_gpu_support() {echo "正在安装 NVIDIA Container Toolkit(GPU 支持)..."# 检查是否安装了 curlif ! command -v curl &> /dev/null; thenecho "curl 未安装,正在安装..."sudo yum install -y curlfi# 检查是否已安装 NVIDIA 驱动程序if ! lsmod | grep -i nvidia > /dev/null; thenecho "未检测到 NVIDIA 驱动程序。请先安装 NVIDIA 驱动程序后再继续。"returnfi# 配置生产环境的存储库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 dockerecho "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; doshow_menuread -p "请输入你的选择 [1-11]:" choicecase $choice in1)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 "无效的选择,请重新输入。";;esacecho ""
done