系统: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