diff --git a/scripts/deploy/0-one-click-deploy/one-click-deploy.sh b/scripts/deploy/0-one-click-deploy/one-click-deploy.sh index ded2d0d3281ccabcb56af219699685022d510020..cb52eea78f414c30146568b4f8b3fcadf29f5b8b 100644 --- a/scripts/deploy/0-one-click-deploy/one-click-deploy.sh +++ b/scripts/deploy/0-one-click-deploy/one-click-deploy.sh @@ -132,7 +132,7 @@ run_script_with_check() { } # 初始化部署流程 start_deployment() { - local total_steps=4 + local total_steps=3 local current_step=1 export GLOBAL_IS_AUTO="TRUE" diff --git a/scripts/deploy/1-check-env/check_env.sh b/scripts/deploy/1-check-env/check_env.sh index 786f7fd68fe56e93655460f04de9e7ae1634c4ce..e42d3e73392498c4670d0781ba9b0a269114ba93 100644 --- a/scripts/deploy/1-check-env/check_env.sh +++ b/scripts/deploy/1-check-env/check_env.sh @@ -5,45 +5,24 @@ COLOR_SUCCESS='\033[32m' # 绿色成功 COLOR_ERROR='\033[31m' # 红色错误 COLOR_WARNING='\033[33m' # 黄色警告 COLOR_RESET='\033[0m' # 重置颜色 - +INSTALL_MODEL_FILE="/etc/euler_Intelligence_install_model" # 全局模式标记 OFFLINE_MODE=false -# 需要检查的软件包列表 -PACKAGES=( - "euler-copilot-web" - "euler-copilot-witchaind-web" - "authHub" - "authhub-web" - "euler-copilot-rag" - "euler-copilot-framework" - "nginx" - "redis" - "mysql" - "mysql-server" - "java-17-openjdk" - "postgresql-server" - "postgresql-server-devel" - "postgresql" - "libpq-devel" - "git" - "make" - "gcc" - "gcc-c++" - "clang" - "llvm" - "tar" - "python3-pip" -) +is_x86_architecture() { + # 获取系统架构信息(使用 uname -m 或 arch 命令) + local arch + arch=$(uname -m) # 多数系统支持,返回架构名称(如 x86_64、i686、aarch64 等) + # 备选:arch 命令,输出与 uname -m 类似 + # arch=$(arch) -#需要检测wget是否可达 -wget_urls=( - "https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" - "https://downloads.mongodb.com/compass/mongodb-mongosh-2.5.2.x86_64.rpm" - "https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/RPMS/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" - "https://github.com/pgvector/pgvector.git" - "https://github.com/amutu/zhparser.git" -) + # x86 架构的常见标识:i386、i686(32位),x86_64(64位) + if [[ $arch == i386 || $arch == i686 || $arch == x86_64 ]]; then + return 0 # 是 x86 架构,返回 0(成功) + else + return 1 # 非 x86 架构,返回 1(失败) + fi +} # 安装wget工具 install_wget() { echo -e "${COLOR_INFO}[INFO] 正在尝试安装wget...${COLOR_RESET}" @@ -72,39 +51,81 @@ install_wget() { fi } +# 基础URL列表(无论RAG是否启用都需要检测) +base_urls_x86=( + "https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" + "https://downloads.mongodb.com/compass/mongodb-mongosh-2.5.2.x86_64.rpm" + "https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/RPMS/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" +) + +base_urls_arm=( + "https://dl.min.io/server/minio/release/linux-arm64/minio" + "https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/aarch64/RPMS/mongodb-org-server-7.0.21-1.el9.aarch64.rpm" + "https://downloads.mongodb.com/compass/mongodb-mongosh-2.5.2.aarch64.rpm" +) + +# RAG专用URL列表(仅当RAG启用时检测) +rag_urls=( + "https://gitee.com/fromhsc/pgvector.git" + "https://gitee.com/fromhsc/zhparser.git" +) + # 检测URL可达性的函数 check_url_accessibility() { # 首先检查wget是否安装 if ! command -v wget &>/dev/null; then echo -e "${COLOR_WARNING}[WARN] wget未安装,尝试自动安装...${COLOR_RESET}" if ! install_wget; then - echo -e "${COLOR_FAILURE}[ERROR] URL检测中止:wget安装失败${COLOR_RESET}" + echo -e "${COLOR_ERROR}[ERROR] URL检测中止:wget安装失败${COLOR_RESET}" return 1 fi fi + # 读取RAG安装状态(依赖之前的read_install_model函数设置RAG_INSTALL变量) + if ! read_install_model; then + echo -e "${COLOR_WARNING}[WARN] 无法读取安装模式,默认按RAG未启用检测${COLOR_RESET}" + local RAG_INSTALL="n" + fi + + # 根据架构和RAG状态组合最终需要检测的URL列表 + local detect_urls=() + if is_x86_architecture; then + detect_urls+=("${base_urls_x86[@]}") + else + detect_urls+=("${base_urls_arm[@]}") + fi + + # 如果启用RAG,添加RAG专用URL + if [ "$RAG_INSTALL" = "y" ]; then + detect_urls+=("${rag_urls[@]}") + echo -e "${COLOR_INFO} RAG组件已启用,将检测所有必要URL(共${#detect_urls[@]}个)${COLOR_RESET}" + else + echo -e "${COLOR_INFO} RAG组件未启用,仅检测基础URL(共${#detect_urls[@]}个)${COLOR_RESET}" + fi + local all_success=true local timeout_seconds=15 # 设置超时时间 local temp_file=$(mktemp) # 创建临时文件 local failed_urls=() # 存储失败的URL - echo -e "${COLOR_INFO}[Info] 开始检测 ${#wget_urls[@]} 个URL的可达性...${COLOR_RESET}" - echo -e "${COLOR_INFO} 超时时间: ${timeout_seconds}秒${COLOR_RESET}" + echo -e "${COLOR_INFO}开始检测URL可达性...${COLOR_RESET}" + echo -e "${COLOR_INFO}超时时间: ${timeout_seconds}秒${COLOR_RESET}" - for url in "${wget_urls[@]}"; do + for url in "${detect_urls[@]}"; do + # 格式化输出,保持对齐 printf "%-80s" "检测: $url" - # 使用timeout命令包裹wget,确保严格超时控制 + # 使用timeout命令控制超时,--spider只检查URL是否存在不下载 if timeout $timeout_seconds wget --spider --timeout=$timeout_seconds --tries=1 --no-check-certificate "$url" >"$temp_file" 2>&1; then echo -e "${COLOR_SUCCESS} [OK]${COLOR_RESET}" else - echo -e "${COLOR_FAILURE} [FAIL]${COLOR_RESET}" + echo -e "${COLOR_ERROR} [FAIL]${COLOR_RESET}" - # 判断是否是超时导致的失败 + # 提取错误原因 if grep -q "timed out" "$temp_file"; then error_msg="操作超时 (${timeout_seconds}秒)" else - error_msg=$(grep -i "error\|failed\|timeout" "$temp_file" | head -1) + error_msg=$(grep -i "error\|failed\|timeout" "$temp_file" | head -1 | cut -d' ' -f4- | sed 's/[[:cntrl:]]//g') fi echo -e " ${COLOR_WARNING}原因: ${error_msg:-未知错误}${COLOR_RESET}" @@ -113,12 +134,13 @@ check_url_accessibility() { fi done - rm -rf "$temp_file" # 删除临时文件 + # 清理临时文件 + rm -rf "$temp_file" # 结果汇总 - echo -e "${COLOR_INFO}====== 检测结果 ======${COLOR_RESET}" + echo -e "\n${COLOR_INFO}====== 检测结果 ======${COLOR_RESET}" if $all_success; then - echo -e "${COLOR_SUCCESS}[Success] 所有URL均可访问${COLOR_RESET}" + echo -e "${COLOR_SUCCESS}[Success] 所有必要URL均可访问${COLOR_RESET}" return 0 else echo -e "${COLOR_ERROR}[Error] ${#failed_urls[@]}个URL不可访问:${COLOR_RESET}" @@ -130,8 +152,25 @@ check_url_accessibility() { fi } -# 需要开放的端口列表 -PORTS=(8080 9888 8000 11120) +# 全局变量:默认端口列表(未启用Web时) +PORTS=(8002) + +# 读取安装模式并设置端口列表的函数 +init_ports_based_on_web() { + if ! read_install_model; then + echo -e "${COLOR_WARNING}[Warning] 无法读取安装模式,使用默认端口配置${COLOR_RESET}" + return 1 + fi + + # 根据Web组件状态更新全局PORTS变量 + if [ "$WEB_INSTALL" = "y" ]; then + PORTS=(8080 9888 8000 11120) + echo -e "${COLOR_INFO} Web组件已启用,端口列表: ${PORTS[*]}${COLOR_RESET}" + else + PORTS=(8002) + echo -e "${COLOR_INFO} Web组件未启用,端口列表: ${PORTS[*]}${COLOR_RESET}" + fi +} function check_user { if [[ $(id -u) -ne 0 ]]; then @@ -219,14 +258,40 @@ check_package() { return 1 fi } - +# 需要检查的软件包列表 +PACKAGES=( + "euler-copilot-web" + "euler-copilot-witchaind-web" + "authHub" + "authhub-web" + "euler-copilot-rag" + "euler-copilot-framework" + "nginx" + "redis" + "mysql" + "mysql-server" + "java-17-openjdk" + "postgresql-server" + "postgresql-server-devel" + "postgresql" + "libpq-devel" + "git" + "make" + "gcc" + "gcc-c++" + "clang" + "llvm" + "tar" + "python3-pip" +) +all_available=true # 检查所有软件包 check_all_packages() { - local all_available=true + local PACKAGES=("$@") + local timeout_seconds=30 local start_time=$(date +%s) - echo -e "${COLOR_INFO}[Info]正在检查软件包可用性(超时:${timeout_seconds}s)...${COLOR_RESET}" echo -e "${COLOR_INFO}--------------------------------${COLOR_RESET}" for pkg in "${PACKAGES[@]}"; do @@ -239,26 +304,57 @@ check_all_packages() { echo -e "${COLOR_INFO}--------------------------------${COLOR_RESET}" return 2 fi - if ! check_package "$pkg"; then all_available=false fi sleep 0.1 # 避免请求过快 done - echo -e "--------------------------------" - - if $all_available; then - echo -e "${COLOR_SUCCESS}[Success] 所有软件包都可用${COLOR_RESET}" - return 0 - else - echo -e "${COLOR_ERROR}[Error] 部分软件包不可用${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 提示:可以尝试以下命令更新仓库缓存:${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] sudo dnf clean all && sudo dnf makecache${COLOR_RESET}" +} +check_web_pkg() { + local pkgs=( + "nginx" + "redis" + "mysql" + "mysql-server" + "authHub" + "authhub-web" + "euler-copilot-web" + "euler-copilot-witchaind-web" + ) + if ! check_all_packages "${pkgs[@]}"; then + return 1 + fi +} +check_framework_pkg() { + local pkgs=( + "euler-copilot-framework" + "git" + "make" + "gcc" + "gcc-c++" + "tar" + "python3-pip" + ) + if ! check_all_packages "${pkgs[@]}"; then + return 1 + fi +} +check_rag_pkg() { + local pkgs=( + "euler-copilot-rag" + "clang" + "llvm" + "java-17-openjdk" + "postgresql" + "postgresql-server" + "postgresql-server-devel" + "libpq-devel" + ) + if ! check_all_packages "${pkgs[@]}"; then return 1 fi } - function check_network { echo -e "${COLOR_INFO}[Info] 检查网络连接...${COLOR_RESET}" @@ -335,6 +431,7 @@ function check_firewall { check_ports() { local occupied=() echo -e "${COLOR_INFO}正在检查端口占用情况...${COLOR_RESET}" + init_ports_based_on_web for port in "${PORTS[@]}"; do if ss -tuln | grep -q ":${port} "; then @@ -380,6 +477,55 @@ setup_firewall() { echo -e "${COLOR_SUCCESS}[Success]重新加载防火墙规则成功${COLOR_RESET}" return 0 } +# 读取安装模式的方法 +read_install_model() { + # 检查文件是否存在 + if [ ! -f "$INSTALL_MODEL_FILE" ]; then + echo "web_install=n" >"$INSTALL_MODEL_FILE" + echo "rag_install=n" >>"$INSTALL_MODEL_FILE" + fi + + # 从文件读取配置(格式:key=value) + local web_install=$(grep "web_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + local rag_install=$(grep "rag_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + + # 验证读取结果 + if [ -z "$web_install" ] || [ -z "$rag_install" ]; then + echo -e "${COLOR_ERROR}[Error] 安装模式文件格式错误${COLOR_RESET}" + return 1 + fi + # 将结果存入全局变量(供其他函数使用) + WEB_INSTALL=$web_install + RAG_INSTALL=$rag_install + return 0 +} +# 示例:根据安装模式执行对应操作(可根据实际需求扩展) +install_components() { + # 读取安装模式 + read_install_model || return 1 + echo -e "${COLOR_INFO}[Info] 检查软件包是否可用${COLOR_RESET}" + if [ "$WEB_INSTALL" = "y" ]; then + check_web_pkg + fi + + if [ "$RAG_INSTALL" = "y" ]; then + # 此处添加RAG安装命令,示例: + check_rag_pkg + fi + + check_framework_pkg + echo -e "--------------------------------" + + if $all_available; then + echo -e "${COLOR_SUCCESS}[Success] 所有软件包都可用${COLOR_RESET}" + return 0 + else + echo -e "${COLOR_ERROR}[Error] 部分软件包不可用${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 提示:可以尝试以下命令更新仓库缓存:${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] sudo dnf clean all && sudo dnf makecache${COLOR_RESET}" + return 1 + fi +} function main { check_user || return 1 @@ -387,7 +533,7 @@ function main { check_hostname || return 1 # 网络检查与模式判断 - check_all_packages || return 1 + install_components || return 1 check_dns || return 1 check_ram || return 1 diff --git a/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh b/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh index b383545d9b67c8447d4d689f88323bce884c5653..d83cc339a6faeefe4dd8446a2fc7adc95ef8bd2c 100644 --- a/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh +++ b/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh @@ -5,32 +5,7 @@ COLOR_SUCCESS='\033[32m' # 绿色成功 COLOR_ERROR='\033[31m' # 红色错误 COLOR_WARNING='\033[33m' # 黄色警告 COLOR_RESET='\033[0m' # 重置颜色 -pkgs=( - "nginx" - "redis" - "mysql" - "mysql-server" - "java-17-openjdk" - "postgresql" - "postgresql-server" - "postgresql-server-devel" - "libpq-devel" - "authHub" - "authhub-web" - "euler-copilot-web" - "euler-copilot-witchaind-web" - "euler-copilot-rag" - "euler-copilot-framework" - "git" - "make" - "gcc" - "gcc-c++" - "clang" - "llvm" - "tar" - "python3-pip" -) - +INSTALL_MODEL_FILE="/etc/euler_Intelligence_install_model" # 全局变量 declare -a installed_pkgs=() install_success=true @@ -41,7 +16,7 @@ LOCAL_REPO_FILE="/etc/yum.repos.d/local.repo" init_local_repo() { [ "$(id -u)" -ne 0 ] && { echo "需要root权限" - exit 1 + return 1 } # 检查仓库目录和repo文件是否存在 @@ -116,8 +91,10 @@ smart_install() { return 1 } - +#&>/dev/null install_and_verify() { + # 接收传入的包列表参数 + local pkgs=("$@") # 检查并安装每个包 for pkg in "${pkgs[@]}"; do smart_install $pkg @@ -128,13 +105,13 @@ install_and_verify() { echo -e "${COLOR_SUCCESS}[Success] dnf 包安装完成!${COLOR_RESET}" else echo -e "${COLOR_ERROR}[Error] 以下包安装失败: ${missing_pkgs[*]}${COLOR_RESET}" - exit 1 + return 1 fi } # 安装pgvector服务 install_pgvector() { local pgvector_dir="/opt/pgvector" - local zhparser_url="https://github.com/pgvector/pgvector.git" + local zhparser_url="https://gitee.com/fromhsc/pgvector.git" local pgvector_installed_marker="/usr/share/pgsql/extension/vector.control" # pgvector安装后的标志文件 echo -e "${COLOR_INFO}[Info] 开始安装pgvector...${COLOR_RESET}" if [ -f "$pgvector_installed_marker" ]; then @@ -146,9 +123,9 @@ install_pgvector() { git config --global http.sslVerify false # 2. 克隆仓库 - echo -e "${COLOR_INFO}[Info] 正在克隆zhparser仓库...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在克隆zhparser仓库...${COLOR_RESET}" if [ -d "$pgvector_dir" ]; then - echo -e "${COLOR_INFO}[Info] 目标目录已存在,尝试更新代码...${COLOR_RESET}" + echo -e "${COLOR_INFO} 目标目录已存在,尝试更新代码...${COLOR_RESET}" cd "$pgvector_dir" || { echo -e "${COLOR_ERROR}[Error] 无法进入目录: $pgvector_dir${COLOR_RESET}" return 1 @@ -173,7 +150,7 @@ install_pgvector() { git config --global http.sslVerify true # 4. 进入解压目录编译安装 - echo -e "${COLOR_INFO}[Info] 正在编译安装pgvector...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在编译安装pgvector...${COLOR_RESET}" cd "$pgvector_dir" || { echo -e "${COLOR_ERROR}[Error] 无法进入目录: $pgvector_dir${COLOR_RESET}" return 1 @@ -204,7 +181,7 @@ install_scws() { return 0 fi # 2. 下载SCWS安装包 - echo -e "${COLOR_INFO}[Info] 正在下载SCWS...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在下载SCWS...${COLOR_RESET}" if ! wget "$scws_url" --no-check-certificate -O "$scws_tar"; then echo -e "${COLOR_ERROR}[Error] SCWS下载失败${COLOR_RESET}" return 1 @@ -217,14 +194,14 @@ install_scws() { fi # 4. 解压安装包 - echo -e "${COLOR_INFO}[Info] 正在解压SCWS...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在解压SCWS...${COLOR_RESET}" if ! tar -xjf "$scws_tar" -C "$scws_dir" --strip-components=1; then echo -e "${COLOR_ERROR}[Error] 解压SCWS失败${COLOR_RESET}" return 1 fi # 5. 编译安装 - echo -e "${COLOR_INFO}[Info] 正在编译安装SCWS...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在编译安装SCWS...${COLOR_RESET}" cd "$scws_dir" || { echo -e "${COLOR_ERROR}[Error] 无法进入目录: $scws_dir${COLOR_RESET}" return 1 @@ -252,7 +229,7 @@ install_scws() { install_zhparser() { # 目标目录 local zhparser_dir="/opt/zhparser" - local zhparser_url="https://github.com/amutu/zhparser.git" + local zhparser_url="https://gitee.com/fromhsc/zhparser.git" local zhparser_installed_marker="/usr/share/pgsql/extension/zhparser.control" # zhparser安装后的标志文件 echo -e "${COLOR_INFO}[Info] 开始安装zhparser...${COLOR_RESET}" # 检查是否已安装 @@ -265,7 +242,7 @@ install_zhparser() { git config --global http.sslVerify false # 2. 克隆仓库 - echo -e "${COLOR_INFO}[Info] 正在克隆zhparser仓库...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在克隆zhparser仓库...${COLOR_RESET}" if [ -d "$zhparser_dir" ]; then echo -e "${COLOR_INFO}[Info] 目标目录已存在,尝试更新代码...${COLOR_RESET}" cd "$zhparser_dir" || { @@ -306,19 +283,33 @@ install_zhparser() { echo -e "${COLOR_SUCCESS}[Success] zhparser安装成功${COLOR_RESET}" return 0 } - +is_x86_architecture() { + # 获取系统架构信息(使用 uname -m 或 arch 命令) + local arch + arch=$(uname -m) # 多数系统支持,返回架构名称(如 x86_64、i686、aarch64 等) + # 备选:arch 命令,输出与 uname -m 类似 + # arch=$(arch) + + # x86 架构的常见标识:i386、i686(32位),x86_64(64位) + if [[ $arch == i386 || $arch == i686 || $arch == x86_64 ]]; then + return 0 # 是 x86 架构,返回 0(成功) + else + return 1 # 非 x86 架构,返回 1(失败) + fi +} # 安装MinIO install_minio() { - local minio_url="https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" - local minio_src="../5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm" - local minio_dir="/opt/minio" - local minio_file="/opt/minio/minio-20250524170830.0.0-1.x86_64.rpm" echo -e "${COLOR_INFO}[Info] 开始安装MinIO...${COLOR_RESET}" - + local minio_dir="/opt/minio" if ! mkdir -p "$minio_dir"; then echo -e "${COLOR_ERROR}[Error] 创建目录失败: $minio_dir${COLOR_RESET}" return 1 fi + ! is_x86_architecture || { + local minio_url="https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" + local minio_src="../5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm" + local minio_file="/opt/minio/minio-20250524170830.0.0-1.x86_64.rpm" + if [ -f "$minio_src" ]; then cp -r "$minio_src" "$minio_file" sleep 1 @@ -337,18 +328,43 @@ install_minio() { } echo -e "${COLOR_SUCCESS}[Success] MinIO安装成功...${COLOR_RESET}" return 0 + } + echo -e "${COLOR_INFO}[Info] 下载MinIO二进制文件(aarch64)...${COLOR_RESET}" + local minio_url="https://dl.min.io/server/minio/release/linux-arm64/minio" + local temp_dir=$minio_dir + local minio_path="../5-resource/rpm/minio" + + # 检查文件是否已存在 + if [ -f "$minio_path" ]; then + cp -r $minio_path $temp_dir + echo -e "${COLOR_INFO}[Info] MinIO二进制文件已存在,跳过下载${COLOR_RESET}" + else + echo -e "${COLOR_INFO}[Info] 下载MinIO二进制文件(aarch64)...${COLOR_RESET}" + if ! wget -q --show-progress "$minio_url" -O "$temp_dir/minio" --no-check-certificate; then + echo -e "${COLOR_ERROR}[Error] 下载MinIO失败,请检查网络连接${COLOR_RESET}" + rm -rf "$temp_dir" + return 1 + fi + fi } # 安装配置mongodb install_mongodb() { local mongodb_server_url="https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/RPMS/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" local mongodb_mongosh_url="https://downloads.mongodb.com/compass/mongodb-mongosh-2.5.2.x86_64.rpm" + local mongodb_server_arm_url="https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/aarch64/RPMS/mongodb-org-server-7.0.21-1.el9.aarch64.rpm" + local mongodb_mongosh_arm_url="https://downloads.mongodb.com/compass/mongodb-mongosh-2.5.2.aarch64.rpm" + + is_x86_architecture || { + mongodb_server_url=$mongodb_server_arm_url + mongodb_mongosh_url=$mongodb_mongosh_arm_url + } local mongodb_dir="/opt/mongodb" local mongodb_server="/opt/mongodb/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" local mongodb_server_src="../5-resource/rpm/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" local mongodb_mongosh="/opt/mongodb/mongodb-mongosh-2.5.2.x86_64.rpm" local mongodb_mongosh_src="../5-resource/rpm/mongodb-mongosh-2.5.2.x86_64.rpm" - echo -e "${COLOR_INFO}[Info] 开始安装配置MongoDB...${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 开始安装MongoDB...${COLOR_RESET}" if rpm -q mongod &>/dev/null; then echo -e "${COLOR_WARNING}[Warning] MongoDB 已安装,当前版本: $(rpm -q mongod)${COLOR_RESET}" echo -e "${COLOR_INFO}[Info] 跳过MongoDB安装${COLOR_RESET}" @@ -369,14 +385,14 @@ install_mongodb() { sleep 1 fi if [ ! -f "$mongodb_server" ]; then - echo -e "${COLOR_INFO}[Info] 正在下载MongoDB软件包...${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 正在下载MongoDB server软件包...${COLOR_RESET}" if ! wget "$mongodb_server_url" --no-check-certificate -O "$mongodb_server"; then echo -e "${COLOR_ERROR}[Error] MongoDB下载失败${COLOR_RESET}" return 1 fi fi if [ ! -f "$mongodb_mongosh" ]; then - echo -e "${COLOR_INFO}[Info] 正在下载MongoDB软件包...${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 正在下载MongoDB mongosh软件包...${COLOR_RESET}" if ! wget "$mongodb_mongosh_url" --no-check-certificate -O "$mongodb_mongosh"; then echo -e "${COLOR_ERROR}[Error] MongoDB下载失败${COLOR_RESET}" return 1 @@ -455,7 +471,10 @@ check_pip() { ["sqlalchemy"]="2.0.23" ["paddlepaddle"]="2.6.2" ["paddleocr"]="2.9.1" - ["pymongo"]="" # 不指定版本 + ["pymongo"]="" + ["requests"]="" + ["pydantic"]="" + ["tiktoken"]="" ) local need_install=0 @@ -499,31 +518,128 @@ check_pip() { return 0 } +install_framework(){ + echo -e "\n${COLOR_INFO}[Info] 开始安装框架服务...${COLOR_RESET}" + local pkgs=( + "euler-copilot-framework" + "git" + "make" + "gcc" + "gcc-c++" + "tar" + "python3-pip" + ) + if ! install_and_verify "${pkgs[@]}"; then + echo -e "${COLOR_ERROR}[Error] dnf安装验证未通过!${COLOR_RESET}" + return 1 + fi + cd "$SCRIPT_DIR" || return 1 + install_minio || return 1 + cd "$SCRIPT_DIR" || return 1 + install_mongodb || return 1 + check_pip || return 1 +} +install_rag(){ + local pkgs=( + "euler-copilot-rag" + "clang" + "llvm" + "java-17-openjdk" + "postgresql" + "postgresql-server" + "postgresql-server-devel" + "libpq-devel" + ) + if ! install_and_verify "${pkgs[@]}"; then + echo -e "${COLOR_ERROR}[Error] dnf安装验证未通过!${COLOR_RESET}" + return 1 + fi + cd "$SCRIPT_DIR" || return 1 + install_scws || return 1 + cd "$SCRIPT_DIR" || return 1 + install_pgvector || return 1 + cd "$SCRIPT_DIR" || return 1 + install_zhparser || return 1 + +} +install_web(){ + local pkgs=( + "nginx" + "redis" + "mysql" + "mysql-server" + "authHub" + "authhub-web" + "euler-copilot-web" + "euler-copilot-witchaind-web" + ) + if ! install_and_verify "${pkgs[@]}"; then + echo -e "${COLOR_ERROR}[Error] dnf安装验证未通过!${COLOR_RESET}" + return 1 + fi +} +# 读取安装模式的方法 +read_install_model() { + if [ ! -f "$INSTALL_MODEL_FILE" ]; then + echo "web_install=n" >"$INSTALL_MODEL_FILE" + echo "rag_install=n" >>"$INSTALL_MODEL_FILE" + fi + + # 从文件读取配置(格式:key=value) + local web_install=$(grep "web_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + local rag_install=$(grep "rag_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + + # 验证读取结果 + if [ -z "$web_install" ] || [ -z "$rag_install" ]; then + echo -e "${COLOR_ERROR}[Error] 安装模式文件格式错误${COLOR_RESET}" + return 1 + fi + + # 输出读取结果(也可根据需要返回变量) + echo -e "${COLOR_INFO}[Info] 读取安装模式:" + echo -e " 安装Web界面: ${web_install}" + echo -e " 安装RAG组件: ${rag_install}${COLOR_RESET}" + + # 将结果存入全局变量(供其他函数使用) + WEB_INSTALL=$web_install + RAG_INSTALL=$rag_install + return 0 +} +# 示例:根据安装模式执行对应操作(可根据实际需求扩展) +install_components() { + # 读取安装模式 + read_install_model || return 1 + + # 安装Web界面(如果用户选择) + if [ "$WEB_INSTALL" = "y" ]; then + echo -e "\n${COLOR_INFO}[Info] 开始安装Web管理界面...${COLOR_RESET}" + # 此处添加Web安装命令,示例: + install_web || return 1 + fi + + # 安装RAG组件(如果用户选择) + if [ "$RAG_INSTALL" = "y" ]; then + echo -e "\n${COLOR_INFO}[Info] 开始安装RAG检索增强组件...${COLOR_RESET}" + # 此处添加RAG安装命令,示例: + install_rag || return 1 + fi +} + # 主执行函数 main() { echo -e "${COLOR_INFO}[Info] === 开始服务安装===${COLOR_RESET}" # 获取脚本所在的绝对路径 - SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) + declare SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # 切换到脚本所在目录 - cd "$SCRIPT_DIR" || exit 1 - systemctl stop dnf-makecache.timer + cd "$SCRIPT_DIR" || return 1 + #查看当前脚本执行的模式 + systemctl stop dnf-makecache.timer # 执行安装验证 init_local_repo - if ! install_and_verify; then - echo -e "${COLOR_ERROR}[Error] dnf安装验证未通过!${COLOR_RESET}" - return 1 - fi - install_pgvector || return 1 - cd "$SCRIPT_DIR" || exit 1 - install_scws || return 1 - cd "$SCRIPT_DIR" || exit 1 - install_zhparser || return 1 - cd "$SCRIPT_DIR" || exit 1 - install_minio || exut 1 - cd "$SCRIPT_DIR" || exit 1 - install_mongodb || exut 1 - check_pip || exit 1 + #分支执行TODO + install_framework || return 1 + install_components || return 1 echo -e "${COLOR_SUCCESS}[Success] 安装 openEuler Intelligence 完成!${COLOR_RESET}" return 0 } diff --git a/scripts/deploy/3-install-server/init_config.sh b/scripts/deploy/3-install-server/init_config.sh index d4f6d58870b31f3802629e680dc37363475f6aed..2f2698513938fd6b6f7d05b730fd44c42fa6daa2 100644 --- a/scripts/deploy/3-install-server/init_config.sh +++ b/scripts/deploy/3-install-server/init_config.sh @@ -5,7 +5,7 @@ COLOR_SUCCESS='\033[32m' # 绿色成功 COLOR_ERROR='\033[31m' # 红色错误 COLOR_WARNING='\033[33m' # 黄色警告 COLOR_RESET='\033[0m' # 重置颜色 - +INSTALL_MODEL_FILE="/etc/euler_Intelligence_install_model" ## 配置参数 #MYSQL_ROOT_PASSWORD="n6F2tJvvY9Khv16CoybL" # 设置您的MySQL root密码 #AUTHHUB_USER_PASSWORD="n6F2tJvvY9Khv16CoybL" @@ -49,7 +49,7 @@ update_password() { # 启用并启动服务(改进版) enable_services() { - echo -e "${COLOR_INFO}[Info] === 配置系统服务 ===${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 启动redis、mysql服务...${COLOR_RESET}" local services=("redis" "mysqld") for service in "${services[@]}"; do @@ -68,9 +68,9 @@ enable_services() { fi # 3. 启动服务 - echo -e "${COLOR_INFO}[Info] 正在启动 $service ...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在启动 $service ...${COLOR_RESET}" if systemctl enable --now "$service" >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 启动成功${COLOR_RESET}" + echo -e "${COLOR_SUCCESS}[Success] $service 服务 启动成功${COLOR_RESET}" # 可选:验证服务是否真正启动 sleep 1 @@ -93,28 +93,28 @@ import_sql_file() { return 1 fi - echo -e "${COLOR_INFO}[Info] 正在准备导入数据库($SQL_FILE)...${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在准备导入数据库($SQL_FILE)...${COLOR_RESET}" # 检查数据库是否已存在 if mysql -u "$DB_USER" -e "USE $DB_NAME" 2>/dev/null; then - echo -e "${COLOR_INFO}[Info] 检测到已存在数据库 $DB_NAME,将执行重建...${COLOR_RESET}" + echo -e "${COLOR_INFO} 检测到已存在数据库 $DB_NAME,将执行重建...${COLOR_RESET}" # 删除现有数据库 if ! mysql -u "$DB_USER" -e "DROP DATABASE $DB_NAME" 2>/dev/null; then echo -e "${COLOR_ERROR}[Error] 错误:无法删除现有数据库 $DB_NAME${COLOR_RESET}" return 1 fi - echo -e "${COLOR_SUCCESS}[Success] 成功删除旧数据库${COLOR_RESET}" + echo -e "${COLOR_SUCCESS} 成功删除旧数据库${COLOR_RESET}" fi # 导入SQL文件 echo -e "${COLOR_INFO}正在导入SQL文件...${COLOR_RESET}" if mysql -u "$DB_USER" <"$SQL_FILE"; then - echo -e "${COLOR_SUCCESS}[Success] 数据库导入成功${COLOR_RESET}" + echo -e "${COLOR_SUCCESS} 数据库导入成功${COLOR_RESET}" # 验证导入结果 if mysql -u "$DB_USER" -e "USE $DB_NAME; SHOW TABLES" 2>/dev/null | grep -q .; then - echo -e "${COLOR_SUCCESS}[Success] 数据库验证通过${COLOR_RESET}" + echo -e "${COLOR_SUCCESS} 数据库验证通过${COLOR_RESET}" return 0 else echo -e "${COLOR_WARNING}[Warning] 警告:数据库导入后未检测到数据表${COLOR_RESET}" @@ -131,11 +131,11 @@ import_sql_file() { } # 配置MySQL configure_mysql() { - echo -e "${COLOR_INFO}[Info] === 配置MySQL数据库 ===${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 初始化MySQL数据库... ${COLOR_RESET}" # 安全初始化MySQL(如果未初始化) if ! mysql -u root -e "SELECT 1" >/dev/null 2>&1; then - echo -e "${COLOR_INFO}[Info] 正在初始化MySQL安全配置...${COLOR_RESET}" + echo -e "${COLOR_INFO}正在初始化MySQL安全配置...${COLOR_RESET}" mysql_secure_installation </dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 成功${COLOR_RESET}" + echo -e "${COLOR_SUCCESS} 创建authhub用户成功${COLOR_RESET}" else echo -e "${COLOR_ERROR}[Error] 失败${COLOR_RESET}" echo -e "${COLOR_ERROR}[Error] 错误:无法创建MySQL用户${COLOR_RESET}" @@ -160,15 +160,16 @@ EOF import_sql_file || return 1 # 设置权限 - echo -e "${COLOR_INFO}[Info] 正在设置数据库权限... ${COLOR_RESET}" + echo -e "${COLOR_INFO} 正在设置数据库权限... ${COLOR_RESET}" if mysql -u root -e "GRANT ALL PRIVILEGES ON oauth2.* TO 'authhub'@'localhost' WITH GRANT OPTION" >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 成功${COLOR_RESET}" + echo -e "${COLOR_SUCCESS} 设置数据库权限成功${COLOR_RESET}" return 0 else echo -e "${COLOR_ERROR}[Error] 失败${COLOR_RESET}" echo -e "${COLOR_ERROR}[Error] 错误:权限设置失败,请检查oauth2数据库是否存在${COLOR_RESET}" return 1 fi + echo -e "${COLOR_SUCCESS}[Success] 初始化MySQL数据库成功 ${COLOR_RESET}" } #配置nginx @@ -177,7 +178,7 @@ configure_nginx() { local backup_conf="/etc/nginx/conf.d/authhub.nginx.conf.bak" local temp_conf="/tmp/authhub.nginx.conf.tmp" - echo -e "${COLOR_INFO}[Info] 开始配置Nginx...${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 初始化Nginx...${COLOR_RESET}" # 1. 检查原配置文件是否存在 if [ ! -f "$nginx_conf" ]; then @@ -190,7 +191,7 @@ configure_nginx() { echo -e "${COLOR_ERROR}[Error] 创建配置文件备份失败${COLOR_RESET}" return 1 fi - echo -e "${COLOR_INFO}[Info] 已创建配置文件备份: $backup_conf${COLOR_RESET}" + echo -e "${COLOR_INFO} 已创建配置文件备份: $backup_conf${COLOR_RESET}" # 3. 执行替换操作 if ! sed 's|proxy_pass http://oauth2server;|proxy_pass http://127.0.0.1:11120;|g' "$nginx_conf" >"$temp_conf"; then @@ -223,7 +224,7 @@ configure_nginx() { return 1 fi - echo -e "${COLOR_SUCCESS}[Success] Nginx配置更新成功!${COLOR_RESET}" + echo -e "${COLOR_SUCCESS}[Success] Nginx初始化成功!${COLOR_RESET}" return 0 } # 安装并配置Tika服务 @@ -384,63 +385,546 @@ configure_postgresql() { echo -e "${COLOR_SUCCESS}[Success] PostgreSQL配置完成${COLOR_RESET}" return 0 } -# 安装配置MinIO -install_minio() { - echo -e "${COLOR_INFO}[Info] 开始配置MinIO...${COLOR_RESET}" +is_x86_architecture() { + # 获取系统架构信息(使用 uname -m 或 arch 命令) + local arch + arch=$(uname -m) # 多数系统支持,返回架构名称(如 x86_64、i686、aarch64 等) + # 备选:arch 命令,输出与 uname -m 类似 + # arch=$(arch) + + # x86 架构的常见标识:i386、i686(32位),x86_64(64位) + if [[ $arch == i386 || $arch == i686 || $arch == x86_64 ]]; then + return 0 # 是 x86 架构,返回 0(成功) + else + return 1 # 非 x86 架构,返回 1(失败) + fi +} +# 安装配置MinIO(非x86架构专用) +install_minio_arrch64() { + # 仅在非x86架构执行(主要针对aarch64) + if is_x86_architecture; then + echo -e "${COLOR_INFO}[Info] 当前为x86架构,跳过MinIO安装流程${COLOR_RESET}" + return 0 + fi + + # 检查是否已设置密码,未设置则使用默认值 + if [ -z "$MINIO_ROOT_PASSWORD" ]; then + echo -e "${COLOR_INFO}[Info] 未指定MINIO_ROOT_PASSWORD,使用默认密码${COLOR_RESET}" + MINIO_ROOT_PASSWORD="minioadmin" # 默认为minioadmin + fi + + echo -e "${COLOR_INFO}[Info] 开始在非x86架构上安装配置MinIO...${COLOR_RESET}" + + # 1. 检查系统架构(主要支持aarch64) + local arch=$(uname -m) + if [ "$arch" != "aarch64" ]; then + echo -e "${COLOR_WARN}[Warn] 检测到未知架构: $arch,仅推荐在aarch64上使用此脚本${COLOR_RESET}" + fi + + # 2. 下载对应架构的MinIO二进制文件 + echo -e "${COLOR_INFO}[Info] 下载MinIO二进制文件(aarch64)...${COLOR_RESET}" + local minio_url="https://dl.min.io/server/minio/release/linux-arm64/minio" + local temp_dir=$(mktemp -d) + + if ! wget -q --show-progress "$minio_url" -O "$temp_dir/minio"; then + echo -e "${COLOR_ERROR}[Error] 下载MinIO失败,请检查网络连接${COLOR_RESET}" + rm -rf "$temp_dir" + return 1 + fi + + # 3. 安装二进制文件 + echo -e "${COLOR_INFO}[Info] 安装MinIO到系统目录...${COLOR_RESET}" + chmod +x "$temp_dir/minio" + mv "$temp_dir/minio" /usr/local/bin/ || { + echo -e "${COLOR_ERROR}[Error] 无法安装MinIO到/usr/local/bin${COLOR_RESET}" + rm -rf "$temp_dir" + return 1 + } + rm -rf "$temp_dir" + + # 验证二进制文件 + if ! file /usr/local/bin/minio | grep -q "ARM aarch64"; then + echo -e "${COLOR_ERROR}[Error] MinIO二进制文件架构不匹配${COLOR_RESET}" + rm -f /usr/local/bin/minio + return 1 + fi - # 3. 配置MinIO环境 - echo -e "${COLOR_INFO}[Info] 配置MinIO环境...${COLOR_RESET}" + # 4. 配置MinIO环境变量 + echo -e "${COLOR_INFO}[Info] 配置MinIO环境变量...${COLOR_RESET}" cat >/etc/default/minio </dev/null; then groupadd minio-user - useradd -g minio-user --shell=/sbin/nologin -r minio-user + useradd -g minio-user --shell=/sbin/nologin -r minio-user || { + echo -e "${COLOR_ERROR}[Error] 创建minio-user失败${COLOR_RESET}" + return 1 + } fi mkdir -p /var/lib/minio - chown -R minio-user:minio-user /var/lib/minio + chown -R minio-user:minio-user /var/lib/minio || { + echo -e "${COLOR_ERROR}[Error] 无法设置/var/lib/minio权限${COLOR_RESET}" + return 1 + } - # 5. 启动服务 + # 6. 配置systemd服务 + echo -e "${COLOR_INFO}[Info] 配置MinIO系统服务...${COLOR_RESET}" + cat >/etc/systemd/system/minio.service <<'EOF' +[Unit] +Description=MinIO Object Storage Server +Documentation=https://min.io/docs/minio/linux/index.html +Wants=network-online.target +After=network-online.target + +[Service] +User=minio-user +Group=minio-user +EnvironmentFile=/etc/default/minio +ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES +Restart=always +RestartSec=5 +LimitNOFILE=65536 + +[Install] +WantedBy=multi-user.target +EOF + + # 7. 启动并启用服务 echo -e "${COLOR_INFO}[Info] 启动MinIO服务...${COLOR_RESET}" + systemctl daemon-reload systemctl enable --now minio || { echo -e "${COLOR_ERROR}[Error] MinIO服务启动失败${COLOR_RESET}" return 1 } - # 6. 检查服务状态 - echo -e "${COLOR_INFO}[Info] 检查MinIO服务状态...${COLOR_RESET}" - if ! systemctl is-active --quiet minio; then - echo -e "${COLOR_ERROR}[Error] MinIO服务未正常运行${COLOR_RESET}" + # 8. 检查服务状态 + echo -e "${COLOR_INFO}[Info] 验证MinIO服务状态...${COLOR_RESET}" + if systemctl is-active --quiet minio; then + echo -e "${COLOR_SUCCESS}[Success] MinIO安装配置完成" + return 0 + else + echo -e "${COLOR_ERROR}[Error] MinIO服务未正常运行,请查看日志: journalctl -u minio -f${COLOR_RESET}" + return 1 + fi +} + +# 安装配置MinIO +install_minio() { + ! is_x86_architecture || { + echo -e "${COLOR_INFO}[Info] 开始配置MinIO...${COLOR_RESET}" + + cat >/etc/default/minio </dev/null; then + groupadd minio-user + useradd -g minio-user --shell=/sbin/nologin -r minio-user + fi + + mkdir -p /var/lib/minio + chown -R minio-user:minio-user /var/lib/minio + + # 5. 启动服务 + echo -e "${COLOR_INFO}[Info] 启动MinIO服务...${COLOR_RESET}" + systemctl enable --now minio || { + echo -e "${COLOR_ERROR}[Error] MinIO服务启动失败${COLOR_RESET}" + return 1 + } + + # 6. 检查服务状态 + echo -e "${COLOR_INFO}[Info] 检查MinIO服务状态...${COLOR_RESET}" + if ! systemctl is-active --quiet minio; then + echo -e "${COLOR_ERROR}[Error] MinIO服务未正常运行${COLOR_RESET}" + return 1 + fi + + echo -e "${COLOR_SUCCESS}[Success] MinIO配置完成${COLOR_RESET}" + return 0 + } + install_minio_arrch64 || return 1 + return 0 + +} +install_rag() { + echo -e "${COLOR_INFO}[Info] 开始初始化配置 euler-copilot-rag...${COLOR_RESET}" + + # 2. 配置文件处理 + local env_file="../5-resource/env" + local env_target="/etc/euler-copilot-rag/data_chain/env" + local service_file="../5-resource/rag.service" + local service_target="/etc/systemd/system/rag.service" + + # 复制配置文件(验证文件存在性) + if [[ -f "$env_file" ]]; then + cp -v "$env_file" "$env_target" || { + echo -e "${COLOR_ERROR}[Error] 复制 env 文件失败!${COLOR_RESET}" + return 1 + } + else + echo -e "${COLOR_WARNING}[Warning] 未找到 env 文件:$env_file${COLOR_RESET}" + fi + + if [[ -f "$service_file" ]]; then + cp -v "$service_file" "$service_target" || { + echo -e "${COLOR_ERROR}[Error] 复制 service 文件失败!${COLOR_RESET}" + return 1 + } + else + echo -e "${COLOR_WARNING}[Warning] 未找到 service 文件:$service_file${COLOR_RESET}" + fi + + # 3. 安装图形库依赖(OpenGL) + if ! dnf install -y mesa-libGL >/dev/null; then + echo -e "${COLOR_WARNING}[Warning] mesa-libGL 安装失败,可能影响图形功能${COLOR_RESET}" + fi + + # 5. 启动服务 + echo -e "${COLOR_INFO}[Info] 设置并启动rag服务...${COLOR_RESET}" + systemctl daemon-reload + systemctl enable --now rag || { + echo -e "${COLOR_ERROR}[Error] rag服务启动失败!${COLOR_RESET}" + systemctl status rag --no-pager + return 1 + } + + # 6. 验证服务状态 + echo -e "${COLOR_INFO}[Info] 验证rag服务状态...${COLOR_RESET}" + if systemctl is-active --quiet rag; then + echo -e "${COLOR_SUCCESS}[Success] rag服务运行正常${COLOR_RESET}" + systemctl status rag --no-pager | grep -E "Active:|Loaded:" + else + echo -e "${COLOR_ERROR}[Error] rag服务未运行!${COLOR_RESET}" + journalctl -u rag --no-pager -n 20 + return 1 + fi + + echo -e "${COLOR_SUCCESS}[Success] euler-copilot-rag 安装完成${COLOR_RESET}" + return 0 +} + +# 网络检测函数 +check_network_reachable() { + local test_url="https://openaipublic.blob.core.windows.net" + local timeout=3 + + echo -e "${COLOR_INFO}[Info] 检测网络连通性 (测试地址: $test_url)...${COLOR_RESET}" + + # 使用curl检测 + if curl --silent --connect-timeout $timeout --head $test_url >/dev/null; then + echo -e "${COLOR_SUCCESS}[Success] 网络连接正常${COLOR_RESET}" + return 0 + fi + + # 使用ping二次验证 + if ping -c 1 -W $timeout openaipublic.blob.core.windows.net >/dev/null 2>&1; then + echo -e "${COLOR_SUCCESS}[Success] 网络连接正常 (ping检测)${COLOR_RESET}" + return 0 + fi + + echo -e "${COLOR_WARNING}[Warning] 网络不可达${COLOR_RESET}" + return 1 +} +setup_tiktoken_cache() { + # 预置的本地资源路径 + local local_tiktoken_file="../5-resource/9b5ad71b2ce5302211f9c61530b329a4922fc6a4" + local cache_dir="/root/.cache/tiktoken" + local target_file="$cache_dir/9b5ad71b2ce5302211f9c61530b329a4922fc6a4" + + # 1. 检查本地资源文件是否存在 + if [[ ! -f "$local_tiktoken_file" ]]; then + echo -e "${COLOR_ERROR}[Error] 本地tiktoken资源文件不存在: $local_tiktoken_file${COLOR_RESET}" + return 1 + fi + + # 2. 创建缓存目录 + echo -e "${COLOR_INFO}[Info] 创建tiktoken缓存目录...${COLOR_RESET}" + if ! mkdir -p "$cache_dir"; then + echo -e "${COLOR_ERROR}[Error] 无法创建缓存目录: $cache_dir${COLOR_RESET}" + return 1 + fi + + # 3. 复制文件到缓存目录 + # 解压tar文件 + dos2unix "$local_tiktoken_file" + if ! cp -r "$local_tiktoken_file" "$target_file"; then + echo -e "${COLOR_ERROR}[Error] tiktoken.tar 解压失败${COLOR_RESET}" + return 1 + fi + + # 4. 设置权限(确保可读) + chmod 644 "$target_file" || { + echo -e "${COLOR_WARNING}[Warning] 无法设置文件权限${COLOR_RESET}" + } + + # 6. 设置环境变量(影响当前进程) + #特殊处理改token代码 + FILE="/usr/lib/euler-copilot-framework/apps/llm/token.py" + token_py_file="../5-resource/token.py" + cp $token_py_file $FILE + echo -e "${COLOR_SUCCESS}[Success] tiktoken缓存已配置: $target_file${COLOR_RESET}" +} +install_framework() { + # 安装前检查 + echo -e "${COLOR_INFO}[Info] 开始初始化配置 euler-copilot-framework...${COLOR_RESET}" + + # 2. 检查并创建必要目录 + echo -e "${COLOR_INFO}[Info] 创建数据目录...${COLOR_RESET}" + mkdir -p /opt/copilot || { + echo -e "${COLOR_ERROR}[Error] 无法创建数据目录 /opt/copilot${COLOR_RESET}" + return 1 + } + + # 3. 获取本机IP + local ip_address + config_toml_path="../5-resource/config.toml" + # 提取 domain 的值(假设文件为 config.ini) + ip_address=$(grep -E "^\s*domain\s*=" $config_toml_path | awk -F"'" '{print $2}') + echo -e "${COLOR_INFO} [Info] 提取的IP地址: $ip_address" + + # 4. 获取客户端信息 + #针对代理服务器做特殊处理 + unset http_proxy https_proxy + + # 5. 配置文件处理 + local framework_file="../5-resource/config.toml" + local framework_target="/etc/euler-copilot-framework/config.toml" + local framework_service_file="../5-resource/framework.service" + local framework_service_target="/etc/systemd/system/framework.service" + + # 检查源文件是否存在 + for file in "$framework_file" "$framework_service_file"; do + if [[ ! -f "$file" ]]; then + echo -e "${COLOR_ERROR}[Error] 找不到配置文件: $file${COLOR_RESET}" + return 1 + fi + done + + # 备份原文件 + echo -e "${COLOR_INFO}[Info] 备份配置文件...${COLOR_RESET}" + cp -v "$framework_file" "${framework_file}.bak" || { + echo -e "${COLOR_ERROR}[Error] 无法备份配置文件${COLOR_RESET}" + return 1 + } + echo -e "${COLOR_INFO}[Info] 更新配置文件参数...${COLOR_RESET}" + port=8080 + # 安装Web界面(如果用户选择)配置app_id + if [ "$WEB_INSTALL" = "y" ]; then + echo -e "${COLOR_INFO}[Info] 获取客户端凭证...${COLOR_RESET}" + if ! get_client_info_auto $ip_address; then + echo -e "${COLOR_ERROR}[Error] 获取客户端凭证失败${COLOR_RESET}" + return 1 + fi + sed -i "s/app_id = '.*'/app_id = '$client_id'/" $framework_file + sed -i "s/app_secret = '.*'/app_secret = '$client_secret'/" $framework_file + # 验证替换结果 + if ! grep -q "app_id = '$client_id'" "$framework_file" || ! grep -q "app_secret = '$client_secret'" "$framework_file"; then + echo -e "${COLOR_ERROR}[Error] 配置文件验证失败${COLOR_RESET}" + mv -v "${framework_file}.bak" "$framework_file" + return 1 + fi + port=8002 + else + sed -i "/\[login\.settings\]/,/^\[/ s|host = '.*'|host = 'http://${ip_address}:8000'|" "$framework_file" + sed -i "s|login_api = '.*'|login_api = 'http://${ip_address}:8080/api/auth/login'|" $framework_file + sed -i "s/domain = '.*'/domain = '$ip_address'/" $framework_file + #添加no_auth参数 + # 检查文件中是否已存在 [no_auth] 块 + if grep -q '^\[no_auth\]$' "$framework_file"; then + echo -e "${COLOR_INFO}[Info] 文件中已存在 [no_auth] 配置块,更新内容...${COLOR_RESET}" + + # 使用 sed 替换现有 [no_auth] 块下的内容(保留块,更新键值) + # 先删除现有块内的内容,再添加新内容 + sed -i '/^\[no_auth\]$/,/^\[.*\]$/ { + /^\[no_auth\]$/!{ /^\[.*\]$/!d; } + }' "$framework_file" + + # 在 [no_auth] 块后添加配置 + sed -i '/^\[no_auth\]$/a\enable = true' "$framework_file" + else + echo -e "${COLOR_INFO}[Info] 向文件添加 [no_auth] 配置块...${COLOR_RESET}" + # 追加新的配置块到文件末尾 + cat <>"$framework_file" + +[no_auth] +enable = true +EOF + fi + fi + + # 6. 部署配置文件 + echo -e "${COLOR_INFO}[Info] 部署配置文件...${COLOR_RESET}" + mkdir -p "$(dirname "$framework_target")" + if ! cp -v "$framework_file" "$framework_target"; then + echo -e "${COLOR_ERROR}[Error] 无法复制配置文件到 $framework_target${COLOR_RESET}" + return 1 + fi + + if ! cp -v "$framework_service_file" "$framework_service_target"; then + echo -e "${COLOR_ERROR}[Error] 无法复制服务文件到 $framework_service_target${COLOR_RESET}" + return 1 + fi + + # 7. 设置文件权限 + echo -e "${COLOR_INFO}[Info] 设置文件权限...${COLOR_RESET}" + chmod 640 "$framework_target" || { + echo -e "${COLOR_WARNING}[Warning] 无法设置配置文件权限${COLOR_RESET}" + } + chmod 644 "$framework_service_target" || { + echo -e "${COLOR_WARNING}[Warning] 无法设置服务文件权限${COLOR_RESET}" + } + + #特殊处理,如果 openaipublic.blob.core.windows.net 网络不可达 + # 创建缓存目录(通常是 ~/.cache/tiktoken) + check_network_reachable || { + setup_tiktoken_cache || echo -e "${COLOR_WARNING}[Warning] 无网络 cl100k_base.tiktoken 文件下载失败,请检查网络${COLOR_RESET}" + } + + # 8. 启动服务 + echo -e "${COLOR_INFO}[Info] 启动 framework 服务...${COLOR_RESET}" + systemctl daemon-reload || { + echo -e "${COLOR_ERROR}[Error] systemd 配置重载失败${COLOR_RESET}" + return 1 + } + + if ! systemctl enable --now framework; then + echo -e "${COLOR_ERROR}[Error] 无法启动 framework 服务${COLOR_RESET}" + systemctl status framework --no-pager + return 1 + fi + + # 9. 验证服务状态 + echo -e "${COLOR_INFO}[Info] 检查服务状态...${COLOR_RESET}" + if ! systemctl is-active --quiet framework; then + echo -e "${COLOR_ERROR}[Error] framework 服务未运行${COLOR_RESET}" + journalctl -u framework --no-pager -n 20 return 1 fi - echo -e "${COLOR_SUCCESS}[Success] MinIO配置完成${COLOR_RESET}" + # 10. 清理备份文件 + rm -f "${framework_file}.bak" + + echo -e "${COLOR_SUCCESS}[Success] euler-copilot-framework 安装完成${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 服务访问地址: http://${ip_address}:$port${COLOR_RESET}" return 0 } +uninstall_pkg() { + dnf remove -y euler-copilot-rag + dnf remove -y euler-copilot-framework +} +get_client_info_auto() { + + # 声明全局变量 + declare -g client_id="" + declare -g client_secret="" + + # 直接调用Python脚本并传递域名参数 + python3 "../4-other-script/get_client_id_and_secret.py" $1 >client_info.tmp 2>&1 + + # 检查Python脚本执行结果 + if [ $? -ne 0 ]; then + echo -e "${RED}错误:Python脚本执行失败${NC}" + cat client_info.tmp + rm -f client_info.tmp + return 1 + fi + + # 提取凭证信息 + client_id=$(grep "client_id: " client_info.tmp | awk '{print $2}') + client_secret=$(grep "client_secret: " client_info.tmp | awk '{print $2}') + rm -f client_info.tmp + + # 验证结果 + if [ -z "$client_id" ] || [ -z "$client_secret" ]; then + echo -e "${RED}错误:无法获取有效的客户端凭证${NC}" >&2 + return 1 + fi +} +# 读取安装模式的方法 +read_install_model() { + # 检查文件是否存在 + if [ ! -f "$INSTALL_MODEL_FILE" ]; then + echo -e "${COLOR_ERROR}[Error] 安装模式文件不存在: $INSTALL_MODEL_FILE${COLOR_RESET}" + return 1 + fi + + # 从文件读取配置(格式:key=value) + local web_install=$(grep "web_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + local rag_install=$(grep "rag_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + + # 验证读取结果 + if [ -z "$web_install" ] || [ -z "$rag_install" ]; then + echo -e "${COLOR_ERROR}[Error] 安装模式文件格式错误${COLOR_RESET}" + return 1 + fi + + # 输出读取结果(也可根据需要返回变量) + echo -e "${COLOR_INFO}[Info] 读取安装模式:" + echo -e " 安装Web界面: ${web_install}" + echo -e " 安装RAG组件: ${rag_install}${COLOR_RESET}" + + # 将结果存入全局变量(供其他函数使用) + WEB_INSTALL=$web_install + RAG_INSTALL=$rag_install + return 0 +} +# 示例:根据安装模式执行对应操作(可根据实际需求扩展) +install_components() { + # 读取安装模式 + read_install_model || return 1 + + # 安装Web界面(如果用户选择) + if [ "$WEB_INSTALL" = "y" ]; then + echo -e "\n${COLOR_INFO}[Info] 开始初始化Web管理界面...${COLOR_RESET}" + # 此处添加Web初始化命令,示例: + init_web || return 1 + fi + + # 初始化RAG组件(如果用户选择) + if [ "$RAG_INSTALL" = "y" ]; then + echo -e "\n${COLOR_INFO}[Info] 开始初始化RAG检索增强组件...${COLOR_RESET}" + # 此处添加RAG初始化命令,示例: + init_rag || return 1 + fi +} + +init_rag() { + cd "$SCRIPT_DIR" || exit 1 + install_tika || return 1 + cd "$SCRIPT_DIR" || exit 1 + configure_postgresql || exit 1 + install_rag || return 1 +} +init_web() { + cd "$SCRIPT_DIR" || exit 1 + enable_services || return 1 + configure_mysql || return 1 + configure_nginx || return 1 + cd "$SCRIPT_DIR" || exit 1 + ./install_authhub_config.sh || return 1 +} # 主函数 main() { # 获取脚本所在的绝对路径 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # 切换到脚本所在目录 - cd "$SCRIPT_DIR" || exit 1 + cd "$SCRIPT_DIR" || return 1 update_password - enable_services || return 1 - configure_mysql || return 1 - configure_nginx || return 1 - install_tika || return 1 install_minio || return 1 - cd "$SCRIPT_DIR" || exit 1 - configure_postgresql || exit 1 - cd "$SCRIPT_DIR" || exit 1 - ./install_authhub_config.sh || return 1 - ./install_eulercopilot.sh || return 1 + install_components || return 1 + install_framework || return 1 + cd "$SCRIPT_DIR" || return 1 + ./init_mcpserver.sh || return 1 } main "$@" diff --git a/scripts/deploy/3-install-server/init_mcpserver.sh b/scripts/deploy/3-install-server/init_mcpserver.sh new file mode 100644 index 0000000000000000000000000000000000000000..dbbc1acce866b74b4ed54d7de17aa82ecc716485 --- /dev/null +++ b/scripts/deploy/3-install-server/init_mcpserver.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# 颜色定义 +COLOR_INFO='\033[34m' # 蓝色信息 +COLOR_SUCCESS='\033[32m' # 绿色成功 +COLOR_ERROR='\033[31m' # 红色错误 +COLOR_WARNING='\033[33m' # 黄色警告 +COLOR_RESET='\033[0m' # 重置颜色 + +init_mcp_config(){ + local mcp_config_path="../5-resource/mcp_config" + local target_path="/opt/copilot/semantics/mcp/template" + + echo -e "${COLOR_INFO}[Info] 开始初始化MCP配置文件...${COLOR_RESET}" + + # 检查源目录是否存在 + if [ ! -d "$mcp_config_path" ]; then + echo -e "${COLOR_ERROR}[Error] 源目录不存在: $mcp_config_path${COLOR_RESET}" + return 1 + fi + + # 创建目标目录(如果不存在) + if [ ! -d "$target_path" ]; then + echo -e "${COLOR_INFO}[Info] 目标目录不存在,创建: $target_path${COLOR_RESET}" + mkdir -p "$target_path" || { + echo -e "${COLOR_ERROR}[Error] 无法创建目标目录: $target_path${COLOR_RESET}" + return 1 + } + fi + + # 递归复制所有文件和子目录(保留权限和属性) + echo -e "${COLOR_INFO}[Info] 正在复制配置文件到目标目录...${COLOR_RESET}" + cp -R -p "$mcp_config_path"/* "$target_path/" || { + echo -e "${COLOR_ERROR}[Error] 配置文件复制失败${COLOR_RESET}" + return 1 + } + + echo -e "${COLOR_SUCCESS}[Success] MCP配置文件初始化完成${COLOR_RESET}" + return 0 +} +main(){ + # 获取脚本所在的绝对路径 + SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) + if [ -z "$SCRIPT_DIR" ]; then + echo -e "${COLOR_ERROR}[Error] 无法获取脚本所在目录路径${COLOR_RESET}" + return 1 + fi + + # 切换到脚本所在目录 + echo -e "${COLOR_INFO}[Info] 切换到脚本目录: $SCRIPT_DIR${COLOR_RESET}" + cd "$SCRIPT_DIR" || { + echo -e "${COLOR_ERROR}[Error] 无法切换到脚本目录: $SCRIPT_DIR${COLOR_RESET}" + return 1 + } + + # 执行MCP配置初始化 + echo -e "${COLOR_INFO}[Info] 开始执行MCP配置初始化...${COLOR_RESET}" + init_mcp_config + local init_result=$? + if [ $init_result -ne 0 ]; then + echo -e "${COLOR_ERROR}[Error] MCP配置初始化失败,终止执行${COLOR_RESET}" + return $init_result + fi + + # 重启framework服务 + echo -e "${COLOR_INFO}[Info] 开始重启framework服务...${COLOR_RESET}" + if ! systemctl restart framework; then + echo -e "${COLOR_ERROR}[Error] framework服务重启失败${COLOR_RESET}" + return 1 + fi + + # 检查服务状态 + echo -e "${COLOR_INFO}[Info] 验证framework服务状态...${COLOR_RESET}" + sleep 5 + if systemctl is-active --quiet framework; then + echo -e "${COLOR_SUCCESS}[Success] framework服务重启成功并正常运行${COLOR_RESET}" + return 0 + else + echo -e "${COLOR_ERROR}[Error] framework服务重启后未正常运行${COLOR_RESET}" + return 1 + fi + sleep 10 + python3 "../4-other-script/init_agent.py" > client_info.tmp 2>&1 +} + +main diff --git a/scripts/deploy/3-install-server/install_authhub_config.sh b/scripts/deploy/3-install-server/install_authhub_config.sh index de37fa38f62b7e30b8f447dce7dcabb11a4f9bb3..9e20b27f2e70c856079af0293674d7121014b0bc 100644 --- a/scripts/deploy/3-install-server/install_authhub_config.sh +++ b/scripts/deploy/3-install-server/install_authhub_config.sh @@ -46,7 +46,6 @@ modify_authhub_yml() { return 1 } - echo -e "${COLOR_INFO}[Info] YAML file has been updated successfully. Original file backed up as $YAML_FILE.bak${COLOR_RESET}" return 0 } @@ -72,7 +71,7 @@ validate_config() { # 安装服务 install_service() { - echo -e "${COLOR_INFO}[Info] 启动服务...${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] authhub 服务启动...${COLOR_RESET}" systemctl enable --now authhub && systemctl status authhub --no-pager } @@ -107,9 +106,9 @@ main() { modify_authhub_yml || return 1 if validate_config; then install_service - echo -e "${COLOR_SUCCESS}[Success] 配置完成${COLOR_RESET}" + echo -e "${COLOR_SUCCESS}[Success] authhub 服务初始化完成${COLOR_RESET}" else - echo -e "${COLOR_ERROR}[Error] 配置验证失败${COLOR_RESET}" + echo -e "${COLOR_ERROR}[Error] authhub 服务初始化失败${COLOR_RESET}" exit 1 fi } diff --git a/scripts/deploy/3-install-server/install_database.sh b/scripts/deploy/3-install-server/install_database.sh deleted file mode 100644 index 4507b17d6433fccfbfd3aa571632b9f55d740bb0..0000000000000000000000000000000000000000 --- a/scripts/deploy/3-install-server/install_database.sh +++ /dev/null @@ -1,842 +0,0 @@ -#!/bin/bash -# 颜色定义 -COLOR_INFO='\033[34m' # 蓝色信息 -COLOR_SUCCESS='\033[32m' # 绿色成功 -COLOR_ERROR='\033[31m' # 红色错误 -COLOR_WARNING='\033[33m' # 黄色警告 -COLOR_RESET='\033[0m' # 重置颜色 - -## 配置参数 -#MYSQL_ROOT_PASSWORD="n6F2tJvvY9Khv16CoybL" # 设置您的MySQL root密码 -#AUTHHUB_USER_PASSWORD="n6F2tJvvY9Khv16CoybL" -#MINIO_ROOT_PASSWORD="ZVzc6xJr3B7HsEUibVBh" -#MONGODB_PASSWORD="YqzzpxJtF5tMAMCrHWw6" -#PGSQL_PASSWORD="6QoJxWoBTL5C6syXhR6k" -# 生成随机密码函数 -generate_random_password() { - # 生成24位随机密码(包含大小写字母、数字和特殊字符) - local password=$(tr -dc 'A-Za-z0-9' >$mysql_temp - return 0 -} - -# 启用并启动服务(改进版) -enable_services() { - echo -e "${COLOR_INFO}[Info] === 配置系统服务 ===${COLOR_RESET}" - local services=("redis" "mysqld") - - for service in "${services[@]}"; do - echo -e "${COLOR_INFO}[Info] 正在处理 $service 服务...${COLOR_RESET}" - - # 检查服务是否存在 - if ! systemctl list-unit-files | grep -q "^$service.service"; then - echo -e "${COLOR_ERROR}[Error] 服务 $service 不存在${COLOR_RESET}" - continue - fi - - # 2. 检查服务是否已运行 - if systemctl is-active "$service" >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 服务已在运行中${COLOR_RESET}" - continue - fi - - # 3. 启动服务 - echo -e "${COLOR_INFO}[Info] 正在启动 $service ...${COLOR_RESET}" - if systemctl enable --now "$service" >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 启动成功${COLOR_RESET}" - - # 可选:验证服务是否真正启动 - sleep 1 - if ! systemctl is-active "$service" >/dev/null 2>&1; then - echo -e "${COLOR_ERROR}[Error] 服务启动后未保持运行状态${COLOR_RESET}" - fi - else - echo -e "${COLOR_ERROR}[Error] 启动失败${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 请手动检查:systemctl status $service${COLOR_RESET}" - fi - done -} -import_sql_file() { - local DB_NAME="oauth2" # 替换为你的数据库名 - local DB_USER="root" # 数据库用户名 - - # 检查SQL文件是否存在 - if [ ! -f "$SQL_FILE" ]; then - echo -e "${COLOR_WARNING}[Warning] 警告:未找到 $SQL_FILE 文件,跳过数据库导入${COLOR_RESET}" - return 1 - fi - - echo -e "${COLOR_INFO}[Info] 正在准备导入数据库($SQL_FILE)...${COLOR_RESET}" - - # 检查数据库是否已存在 - if mysql -u "$DB_USER" -e "USE $DB_NAME" 2>/dev/null; then - echo -e "${COLOR_INFO}[Info] 检测到已存在数据库 $DB_NAME,将执行重建...${COLOR_RESET}" - - # 删除现有数据库 - if ! mysql -u "$DB_USER" -e "DROP DATABASE $DB_NAME" 2>/dev/null; then - echo -e "${COLOR_ERROR}[Error] 错误:无法删除现有数据库 $DB_NAME${COLOR_RESET}" - return 1 - fi - echo -e "${COLOR_SUCCESS}[Success] 成功删除旧数据库${COLOR_RESET}" - fi - - # 导入SQL文件 - echo -e "${COLOR_INFO}正在导入SQL文件...${COLOR_RESET}" - if mysql -u "$DB_USER" <"$SQL_FILE"; then - echo -e "${COLOR_SUCCESS}[Success] 数据库导入成功${COLOR_RESET}" - - # 验证导入结果 - if mysql -u "$DB_USER" -e "USE $DB_NAME; SHOW TABLES" 2>/dev/null | grep -q .; then - echo -e "${COLOR_SUCCESS}[Success] 数据库验证通过${COLOR_RESET}" - return 0 - else - echo -e "${COLOR_WARNING}[Warning] 警告:数据库导入后未检测到数据表${COLOR_RESET}" - return 1 - fi - else - echo -e "${COLOR_ERROR}[Error] 数据库导入失败${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 可能原因:" - echo -e "[Info] 1. SQL文件格式错误" - echo -e "[Info] 2. 数据库权限不足" - echo -e "[Info] 3. SQL文件包含错误语句${COLOR_RESET}" - return 1 - fi -} -# 配置MySQL -configure_mysql() { - echo -e "${COLOR_INFO}[Info] === 配置MySQL数据库 ===${COLOR_RESET}" - - # 安全初始化MySQL(如果未初始化) - if ! mysql -u root -e "SELECT 1" >/dev/null 2>&1; then - echo -e "${COLOR_INFO}[Info] 正在初始化MySQL安全配置...${COLOR_RESET}" - mysql_secure_installation </dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 成功${COLOR_RESET}" - else - echo -e "${COLOR_ERROR}[Error] 失败${COLOR_RESET}" - echo -e "${COLOR_ERROR}[Error] 错误:无法创建MySQL用户${COLOR_RESET}" - return 1 - fi - - import_sql_file || return 1 - - # 设置权限 - echo -e "${COLOR_INFO}[Info] 正在设置数据库权限... ${COLOR_RESET}" - if mysql -u root -e "GRANT ALL PRIVILEGES ON oauth2.* TO 'authhub'@'localhost' WITH GRANT OPTION" >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 成功${COLOR_RESET}" - return 0 - else - echo -e "${COLOR_ERROR}[Error] 失败${COLOR_RESET}" - echo -e "${COLOR_ERROR}[Error] 错误:权限设置失败,请检查oauth2数据库是否存在${COLOR_RESET}" - return 1 - fi -} - -# 验证安装 -verify_installation() { - echo -e "${COLOR_INFO}[Info] === 验证安装结果 ===${COLOR_RESET}" - - # 验证服务状态 - echo -e "${COLOR_INFO}[Info] 服务状态:${COLOR_RESET}" - systemctl status redis --no-pager | grep -E "Active:|Loaded:" - systemctl status mysqld --no-pager | grep -E "Active:|Loaded:" - - # 验证数据库连接 - echo -e "${COLOR_INFO}[Info] 验证authhub用户连接... ${COLOR_RESET}" - if mysql -u authhub -p"${AUTHHUB_USER_PASSWORD}" -e "SELECT 1" >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 成功${COLOR_RESET}" - else - echo -e "${COLOR_ERROR}[Error] 失败${COLOR_RESET}" - fi - return 0 - # echo -e "${COLOR_INFO}[Info] === 重要信息 ===${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] authhub用户密码: ${AUTHHUB_USER_PASSWORD}${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] 请妥善保管以上密码!${COLOR_RESET}" -} -#配置nginx -configure_nginx() { - local nginx_conf="/etc/nginx/conf.d/authhub.nginx.conf" - local backup_conf="/etc/nginx/conf.d/authhub.nginx.conf.bak" - local temp_conf="/tmp/authhub.nginx.conf.tmp" - - echo -e "${COLOR_INFO}[Info] 开始配置Nginx...${COLOR_RESET}" - - # 1. 检查原配置文件是否存在 - if [ ! -f "$nginx_conf" ]; then - echo -e "${COLOR_ERROR}[Error] Nginx配置文件不存在: $nginx_conf${COLOR_RESET}" - return 1 - fi - - # 2. 创建备份 - if ! cp -f "$nginx_conf" "$backup_conf"; then - echo -e "${COLOR_ERROR}[Error] 创建配置文件备份失败${COLOR_RESET}" - return 1 - fi - echo -e "${COLOR_INFO}[Info] 已创建配置文件备份: $backup_conf${COLOR_RESET}" - - # 3. 执行替换操作 - if ! sed 's|proxy_pass http://oauth2server;|proxy_pass http://127.0.0.1:11120;|g' "$nginx_conf" >"$temp_conf"; then - echo -e "${COLOR_ERROR}[Error] 配置文件替换失败${COLOR_RESET}" - return 1 - fi - - # 4. 应用新配置 - if ! mv -f "$temp_conf" "$nginx_conf"; then - echo -e "${COLOR_ERROR}[Error] 应用新配置文件失败${COLOR_RESET}" - return 1 - fi - # 5. 验证新配置文件语法 - if ! nginx -t &>/dev/null; then - echo -e "${COLOR_ERROR}[Error] 新配置文件语法检查失败${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 正在恢复原始配置...${COLOR_RESET}" - cp -f "$backup_conf" "$nginx_conf" - return 1 - fi - - if ! systemctl enable --now nginx; then - echo -e "${COLOR_ERROR}[Error] Nginx启动失败${COLOR_RESET}" - fi - # 6. 重载Nginx配置 - if ! systemctl reload nginx; then - echo -e "${COLOR_ERROR}[Error] Nginx配置重载失败${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 正在恢复原始配置...${COLOR_RESET}" - cp -f "$backup_conf" "$nginx_conf" - systemctl reload nginx - return 1 - fi - - echo -e "${COLOR_SUCCESS}[Success] Nginx配置更新成功!${COLOR_RESET}" - return 0 -} -# 安装并配置Tika服务 -install_tika() { - - echo -e "${COLOR_INFO}[Info] 开始安装Tika服务...${COLOR_RESET}" - - # 1. 检查源文件是否存在 - if [ ! -f "$tika_jar_src" ]; then - echo -e "${COLOR_ERROR}[Error] Tika JAR文件不存在: $tika_jar_src${COLOR_RESET}" - return 1 - fi - - if [ ! -f "$tika_service_src" ]; then - echo -e "${COLOR_ERROR}[Error] Tika服务文件不存在: $tika_service_src${COLOR_RESET}" - return 1 - fi - - # 2. 复制JAR文件并设置权限 - if [ ! -d "$tika_dir" ]; then - echo -e "${COLOR_INFO}[Info] 创建目录: $tika_dir${COLOR_RESET}" - if ! mkdir -p "$tika_dir"; then - echo -e "${COLOR_ERROR}[Error] 无法创建目录: $tika_dir${COLOR_RESET}" - return 1 - fi - fi - if ! cp -v "$tika_jar_src" "$tika_jar_dest"; then - echo -e "${COLOR_ERROR}[Error] 复制Tika JAR文件失败${COLOR_RESET}" - return 1 - fi - - if ! chmod 755 "$tika_jar_dest"; then - echo -e "${COLOR_WARNING}[Warning] 设置Tika JAR文件权限失败${COLOR_RESET}" - fi - - # 3. 复制服务文件并设置权限 - if ! cp -v "$tika_service_src" "$tika_service_dest"; then - echo -e "${COLOR_ERROR}[Error] 复制Tika服务文件失败${COLOR_RESET}" - return 1 - fi - - if ! chmod 644 "$tika_service_dest"; then - echo -e "${COLOR_WARNING}[Warning] 设置Tika服务文件权限失败${COLOR_RESET}" - fi - - # 4. 重载systemd - if ! systemctl daemon-reload; then - echo -e "${COLOR_ERROR}[Error] systemd重载失败${COLOR_RESET}" - return 1 - fi - - # 5. 启用并启动服务 - if ! systemctl enable --now tika; then - echo -e "${COLOR_ERROR}[Error] Tika服务启动失败${COLOR_RESET}" - - # 检查服务状态获取更多信息 - local service_status=$(systemctl status tika --no-pager 2>&1) - echo -e "${COLOR_INFO}[Debug] 服务状态信息:\n$service_status${COLOR_RESET}" - - journalctl -u tika --no-pager -n 20 | grep -i error - return 1 - fi - - # 6. 验证服务运行状态 - sleep 2 # 等待服务启动 - if ! systemctl is-active --quiet tika; then - echo -e "${COLOR_ERROR}[Error] Tika服务未正常运行${COLOR_RESET}" - return 1 - fi - - echo -e "${COLOR_SUCCESS}[Success] Tika服务安装配置完成!${COLOR_RESET}" - - # 显示安装信息 - # echo -e "${COLOR_INFO}[Info] Tika JAR位置: $tika_jar_dest${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] 服务文件位置: $tika_service_dest${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] 使用命令: systemctl status tika 查看服务状态${COLOR_RESET}" - return 0 -} -# 安装并配置pgvector服务 -install_pgvector() { - local pgvector_dir="/opt/pgvector" - local zhparser_url="https://github.com/pgvector/pgvector.git" - local pgvector_installed_marker="/usr/share/pgsql/extension/vector.control" # pgvector安装后的标志文件 - echo -e "${COLOR_INFO}[Info] 开始安装pgvector...${COLOR_RESET}" - if [ -f "$pgvector_installed_marker" ]; then - echo -e "${COLOR_INFO}[Info] pgvector已安装,跳过安装过程${COLOR_RESET}" - return 0 - fi - # 1. 临时禁用SSL验证 - echo -e "${COLOR_INFO}[Info] 临时禁用Git SSL验证...${COLOR_RESET}" - git config --global http.sslVerify false - - # 2. 克隆仓库 - echo -e "${COLOR_INFO}[Info] 正在克隆zhparser仓库...${COLOR_RESET}" - if [ -d "$pgvector_dir" ]; then - echo -e "${COLOR_INFO}[Info] 目标目录已存在,尝试更新代码...${COLOR_RESET}" - cd "$pgvector_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法进入目录: $pgvector_dir${COLOR_RESET}" - return 1 - } - git pull origin master || { - echo -e "${COLOR_ERROR}[Error] 代码更新失败${COLOR_RESET}" - return 1 - } - else - git clone --branch v0.8.0 "$zhparser_url" "$pgvector_dir" || { - echo -e "${COLOR_ERROR}[Error] 克隆仓库失败${COLOR_RESET}" - return 1 - } - cd "$pgvector_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法进入目录: $pgvector_dir${COLOR_RESET}" - return 1 - } - fi - - # 3. 恢复SSL验证 - echo -e "${COLOR_INFO}[Info] 恢复Git SSL验证...${COLOR_RESET}" - git config --global http.sslVerify true - - # 4. 进入解压目录编译安装 - echo -e "${COLOR_INFO}[Info] 正在编译安装pgvector...${COLOR_RESET}" - cd "$pgvector_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法进入目录: $pgvector_dir${COLOR_RESET}" - return 1 - } - - if ! make >/dev/null; then - echo -e "${COLOR_ERROR}[Error] make编译失败${COLOR_RESET}" - return 1 - fi - if ! make install >/dev/null; then - echo -e "${COLOR_ERROR}[Error] make install安装失败${COLOR_RESET}" - return 1 - fi - echo -e "${COLOR_SUCCESS}[Success] pgvector安装成功${COLOR_RESET}" - return 0 -} -# 安装并配置scws服务 -install_scws() { - local scws_url="http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2" - local scws_tar="/opt/scws-1.2.3.tar.bz2" - local scws_dir="/opt/scws" - local scws_installed_marker="/usr/local/lib/libscws.la" # SCWS安装后的标志性文件 - - echo -e "${COLOR_INFO}[Info] 开始安装SCWS分词库...${COLOR_RESET}" - # 1. 检查是否已安装 - if [ -f "$scws_installed_marker" ]; then - echo -e "${COLOR_INFO}[Info] SCWS已安装,跳过安装过程${COLOR_RESET}" - return 0 - fi - # 2. 下载SCWS安装包 - echo -e "${COLOR_INFO}[Info] 正在下载SCWS...${COLOR_RESET}" - if ! wget "$scws_url" --no-check-certificate -O "$scws_tar"; then - echo -e "${COLOR_ERROR}[Error] SCWS下载失败${COLOR_RESET}" - return 1 - fi - - # 3. 创建目标目录 - if ! mkdir -p "$scws_dir"; then - echo -e "${COLOR_ERROR}[Error] 创建目录失败: $scws_dir${COLOR_RESET}" - return 1 - fi - - # 4. 解压安装包 - echo -e "${COLOR_INFO}[Info] 正在解压SCWS...${COLOR_RESET}" - if ! tar -xjf "$scws_tar" -C "$scws_dir" --strip-components=1; then - echo -e "${COLOR_ERROR}[Error] 解压SCWS失败${COLOR_RESET}" - return 1 - fi - - # 5. 编译安装 - echo -e "${COLOR_INFO}[Info] 正在编译安装SCWS...${COLOR_RESET}" - cd "$scws_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法进入目录: $scws_dir${COLOR_RESET}" - return 1 - } - - if ! ./configure >/dev/null; then - echo -e "${COLOR_ERROR}[Error] configure配置失败${COLOR_RESET}" - return 1 - fi - - if ! make >/dev/null; then - echo -e "${COLOR_ERROR}[Error] make编译失败${COLOR_RESET}" - return 1 - fi - - if ! make install >/dev/null; then - echo -e "${COLOR_ERROR}[Error] make install安装失败${COLOR_RESET}" - return 1 - fi - - echo -e "${COLOR_SUCCESS}[Success] SCWS安装成功${COLOR_RESET}" - return 0 -} -# 安装并配置zhparser服务 -install_zhparser() { - # 目标目录 - local zhparser_dir="/opt/zhparser" - local zhparser_url="https://github.com/amutu/zhparser.git" - local zhparser_installed_marker="/usr/share/pgsql/extension/zhparser.control" # zhparser安装后的标志文件 - echo -e "${COLOR_INFO}[Info] 开始安装zhparser...${COLOR_RESET}" - # 检查是否已安装 - if [ -f "$zhparser_installed_marker" ]; then - echo -e "${COLOR_INFO}[INFO] zhparser已安装,跳过安装过程${COLOR_RESET}" - return 0 - fi - # 1. 临时禁用SSL验证 - echo -e "${COLOR_INFO}[Info] 临时禁用Git SSL验证...${COLOR_RESET}" - git config --global http.sslVerify false - - # 2. 克隆仓库 - echo -e "${COLOR_INFO}[Info] 正在克隆zhparser仓库...${COLOR_RESET}" - if [ -d "$zhparser_dir" ]; then - echo -e "${COLOR_INFO}[Info] 目标目录已存在,尝试更新代码...${COLOR_RESET}" - cd "$zhparser_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法进入目录: $zhparser_dir${COLOR_RESET}" - return 1 - } - git pull origin master || { - echo -e "${COLOR_ERROR}[Error] 代码更新失败${COLOR_RESET}" - return 1 - } - else - git clone "$zhparser_url" "$zhparser_dir" || { - echo -e "${COLOR_ERROR}[Error] 克隆仓库失败${COLOR_RESET}" - return 1 - } - cd "$zhparser_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法进入目录: $zhparser_dir${COLOR_RESET}" - return 1 - } - fi - - # 3. 恢复SSL验证 - echo -e "${COLOR_INFO}[Info] 恢复Git SSL验证...${COLOR_RESET}" - git config --global http.sslVerify true - - # 4. 编译安装 - echo -e "${COLOR_INFO}[Info] 正在编译安装zhparser...${COLOR_RESET}" - if ! make; then - echo -e "${COLOR_ERROR}[Error] 编译失败${COLOR_RESET}" - return 1 - fi - - if ! make install; then - echo -e "${COLOR_ERROR}[Error] 安装失败${COLOR_RESET}" - return 1 - fi - - echo -e "${COLOR_SUCCESS}[Success] zhparser安装成功${COLOR_RESET}" - return 0 -} -# PostgreSQL配置函数 -configure_postgresql() { - echo -e "${COLOR_INFO}[Info] 开始配置PostgreSQL...${COLOR_RESET}" - - local pg_data_dir="/var/lib/pgsql/data" - local pg_service="postgresql" - - # 1. 检查并处理PostgreSQL服务状态 - echo -e "${COLOR_INFO}[Info] 检查PostgreSQL服务状态...${COLOR_RESET}" - - if systemctl is-active --quiet "$pg_service"; then - echo -e "${COLOR_WARNING}[Warning] PostgreSQL服务正在运行,正在停止服务...${COLOR_RESET}" - systemctl stop "$pg_service" || { - echo -e "${COLOR_ERROR}[Error] 无法停止PostgreSQL服务${COLOR_RESET}" - return 1 - } - fi - - # 2. 检查并处理数据目录 - echo -e "${COLOR_INFO}[Info] 检查PostgreSQL数据目录...${COLOR_RESET}" - - if [ -d "$pg_data_dir" ] && [ "$(ls -A $pg_data_dir)" ]; then - echo -e "${COLOR_WARNING}[Warning] 数据目录不为空: $pg_data_dir${COLOR_RESET}" - - # 检查是否已经是有效的PostgreSQL数据目录 - if [ -f "$pg_data_dir/PG_VERSION" ]; then - echo -e "${COLOR_INFO}[Info] 检测到已有PostgreSQL数据,准备重新初始化${COLOR_RESET}" - # read -p "确定要重新初始化数据库吗?所有现有数据将被删除!(y/n) " choice - # if [[ ! "$choice" =~ ^[Yy]$ ]]; then - # echo -e "${COLOR_INFO}[Info] 用户取消操作${COLOR_RESET}" - # return 1 - # fi - - echo -e "${COLOR_INFO}[Info] 删除现有数据目录...${COLOR_RESET}" - rm -rf "$pg_data_dir" || { - echo -e "${COLOR_ERROR}[Error] 无法删除数据目录${COLOR_RESET}" - return 1 - } - else - echo -e "${COLOR_WARNING}[Warning] 目录不是有效的PostgreSQL数据目录${COLOR_RESET}" - read -p "是否要清空目录?(y/n) " choice - if [[ "$choice" =~ ^[Yy]$ ]]; then - echo -e "${COLOR_INFO}[Info] 清空数据目录...${COLOR_RESET}" - rm -rf "${pg_data_dir}"/* - else - echo -e "${COLOR_INFO}[Info] 跳过目录处理${COLOR_RESET}" - fi - fi - - # 确保目录权限正确 - chown postgres:postgres "$pg_data_dir" - chmod 700 "$pg_data_dir" - fi - - # 3. 初始化数据库 - echo -e "${COLOR_INFO}[Info] 初始化PostgreSQL数据库...${COLOR_RESET}" - /usr/bin/postgresql-setup --initdb || { - echo -e "${COLOR_ERROR}[Error] 数据库初始化失败" - echo -e "请检查日志文件: /var/lib/pgsql/initdb_postgresql.log${COLOR_RESET}" - return 1 - } - - # 2. 启动服务 - echo -e "${COLOR_INFO}[Info] 启动PostgreSQL服务...${COLOR_RESET}" - systemctl enable --now postgresql || { - echo -e "${COLOR_ERROR}[Error] 服务启动失败${COLOR_RESET}" - return 1 - } - - # 3. 设置postgres用户密码 - echo -e "${COLOR_INFO}[Info] 设置PostgreSQL密码...${COLOR_RESET}" - sudo -u postgres psql -c "ALTER USER postgres PASSWORD '$PGSQL_PASSWORD';" || { - echo -e "${COLOR_ERROR}[Error] 密码设置失败${COLOR_RESET}" - return 1 - } - - # 4. 启用扩展 - echo -e "${COLOR_INFO}[Info] 启用PostgreSQL扩展...${COLOR_RESET}" - sudo -u postgres psql -c "CREATE EXTENSION zhparser;" || { - echo -e "${COLOR_ERROR}[Error] 无法启用zhparser扩展${COLOR_RESET}" - return 1 - } - - sudo -u postgres psql -c "CREATE EXTENSION vector;" || { - echo -e "${COLOR_ERROR}[Error] 无法启用vector扩展${COLOR_RESET}" - return 1 - } - - sudo -u postgres psql -c "CREATE TEXT SEARCH CONFIGURATION zhparser (PARSER = zhparser);" || { - echo -e "${COLOR_ERROR}[Error] 无法创建全文搜索配置${COLOR_RESET}" - return 1 - } - - sudo -u postgres psql -c "ALTER TEXT SEARCH CONFIGURATION zhparser ADD MAPPING FOR n,v,a,i,e,l WITH simple;" || { - echo -e "${COLOR_ERROR}[Error] 无法添加映射${COLOR_RESET}" - return 1 - } - - # 5. 查找并修改pg_hba.conf - echo -e "${COLOR_INFO}[Info] 配置认证方式...${COLOR_RESET}" - local pg_hba_conf=$(find / -name pg_hba.conf 2>/dev/null | head -n 1) - - if [ -z "$pg_hba_conf" ]; then - echo -e "${COLOR_ERROR}[Error] 找不到pg_hba.conf文件${COLOR_RESET}" - return 1 - fi - - # 备份原始文件 - cp "$pg_hba_conf" "${pg_hba_conf}.bak" - - # 修改认证方式 - sed -i -E 's/(local\s+all\s+all\s+)peer/\1md5/' "$pg_hba_conf" - sed -i -E 's/(host\s+all\s+all\s+127\.0\.0\.1\/32\s+)ident/\1md5/' "$pg_hba_conf" - sed -i -E 's/(host\s+all\s+all\s+::1\/128\s+)ident/\1md5/' "$pg_hba_conf" - # 2. 启动服务 - echo -e "${COLOR_INFO}[Info] 重启PostgreSQL服务...${COLOR_RESET}" - systemctl daemon-reload - systemctl restart postgresql || { - echo -e "${COLOR_ERROR}[Error] 服务重启失败${COLOR_RESET}" - return 1 - } - echo -e "${COLOR_SUCCESS}[Success] PostgreSQL配置完成${COLOR_RESET}" - return 0 -} -# 安装配置MinIO -install_minio() { - local minio_url="https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" - local minio_src="../5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm" - local minio_dir="/opt/minio" - local minio_file="/opt/minio/minio-20250524170830.0.0-1.x86_64.rpm" - echo -e "${COLOR_INFO}[Info] 开始安装配置MinIO...${COLOR_RESET}" - # 1. 检查MinIO是否已安装 - if rpm -q minio &>/dev/null; then - echo -e "${COLOR_WARNING}[Warning] MinIO 已安装,当前版本: $(rpm -q minio)${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 跳过MinIO安装${COLOR_RESET}" - return 0 - fi - # 2. 安装MinIO - echo -e "${COLOR_INFO}[Info] 安装MinIO软件包...${COLOR_RESET}" - - if ! mkdir -p "$minio_dir"; then - echo -e "${COLOR_ERROR}[Error] 创建目录失败: $minio_dir${COLOR_RESET}" - return 1 - fi - if [ -f "$minio_src" ]; then - cp -r "$minio_src" "$minio_file" - sleep 1 - fi - if [ ! -f "$minio_file" ]; then - echo -e "${COLOR_INFO}[Info] 正在下载MinIO软件包...${COLOR_RESET}" - if ! wget "$minio_url" --no-check-certificate -O "$minio_file"; then - echo -e "${COLOR_ERROR}[Error] MinIO下载失败${COLOR_RESET}" - return 1 - fi - fi - - dnf install -y $minio_file || { - echo -e "${COLOR_ERROR}[Error] MinIO安装失败${COLOR_RESET}" - return 1 - } - - # 3. 配置MinIO环境 - echo -e "${COLOR_INFO}[Info] 配置MinIO环境...${COLOR_RESET}" - cat >/etc/default/minio </dev/null; then - groupadd minio-user - useradd -g minio-user --shell=/sbin/nologin -r minio-user - fi - - mkdir -p /var/lib/minio - chown -R minio-user:minio-user /var/lib/minio - - # 5. 启动服务 - echo -e "${COLOR_INFO}[Info] 启动MinIO服务...${COLOR_RESET}" - systemctl enable --now minio || { - echo -e "${COLOR_ERROR}[Error] MinIO服务启动失败${COLOR_RESET}" - return 1 - } - - # 6. 检查服务状态 - echo -e "${COLOR_INFO}[Info] 检查MinIO服务状态...${COLOR_RESET}" - if ! systemctl is-active --quiet minio; then - echo -e "${COLOR_ERROR}[Error] MinIO服务未正常运行${COLOR_RESET}" - return 1 - fi - - echo -e "${COLOR_SUCCESS}[Success] MinIO安装配置完成${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] 访问地址: http://<服务器IP>:9000${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] 用户名: minioadmin${COLOR_RESET}" - # echo -e "${COLOR_INFO}[Info] 密码: ZVzc6xJr3B7HsEUibVBh${COLOR_RESET}" - return 0 -} - -# 安装配置mongodb -install_mongodb() { - local mongodb_server_url="https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/RPMS/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" - local mongodb_mongosh_url="https://downloads.mongodb.com/compass/mongodb-mongosh-2.5.2.x86_64.rpm" - local mongodb_dir="/opt/mongodb" - local mongodb_server="/opt/mongodb/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" - local mongodb_server_src="../5-resource/rpm/mongodb-org-server-7.0.21-1.el9.x86_64.rpm" - local mongodb_mongosh="/opt/mongodb/mongodb-mongosh-2.5.2.x86_64.rpm" - local mongodb_mongosh_src="../5-resource/rpm/mongodb-mongosh-2.5.2.x86_64.rpm" - echo -e "${COLOR_INFO}[Info] 开始安装配置MongoDB...${COLOR_RESET}" - if rpm -q mongod &>/dev/null; then - echo -e "${COLOR_WARNING}[Warning] MongoDB 已安装,当前版本: $(rpm -q mongod)${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 跳过MongoDB安装${COLOR_RESET}" - return 0 - fi - echo -e "${COLOR_INFO}[Info] 安装MongoDB软件包...${COLOR_RESET}" - - if ! mkdir -p "$mongodb_dir"; then - echo -e "${COLOR_ERROR}[Error] 创建目录失败: $mongodb_dir${COLOR_RESET}" - return 1 - fi - if [ -f "$mongodb_server_src" ]; then - cp -r "$mongodb_server_src" "$mongodb_server" - sleep 1 - fi - if [ -f "$mongodb_mongosh_src" ]; then - cp -r "$mongodb_mongosh_src" "$mongodb_mongosh" - sleep 1 - fi - if [ ! -f "$mongodb_server" ]; then - echo -e "${COLOR_INFO}[Info] 正在下载MongoDB软件包...${COLOR_RESET}" - if ! wget "$mongodb_server_url" --no-check-certificate -O "$mongodb_server"; then - echo -e "${COLOR_ERROR}[Error] MongoDB下载失败${COLOR_RESET}" - return 1 - fi - fi - if [ ! -f "$mongodb_mongosh" ]; then - echo -e "${COLOR_INFO}[Info] 正在下载MongoDB软件包...${COLOR_RESET}" - if ! wget "$mongodb_mongosh_url" --no-check-certificate -O "$mongodb_mongosh"; then - echo -e "${COLOR_ERROR}[Error] MongoDB下载失败${COLOR_RESET}" - return 1 - fi - fi - dnf install -y $mongodb_server || { - echo -e "${COLOR_ERROR}[Error] MongoDB server安装失败${COLOR_RESET}" - return 1 - } - dnf install -y $mongodb_mongosh || { - echo -e "${COLOR_ERROR}[Error] MongoDB sh安装失败${COLOR_RESET}" - return 1 - } - # 3. 配置MongoDB环境 - echo -e "${COLOR_INFO}[Info] 配置 MongoDB 副本集环境...${COLOR_RESET}" - # 定义 MongoDB 配置文件路径 - mongo_config_file="/etc/mongod.conf" - # 检查 MongoDB 配置文件是否存在 - if [ ! -f "$mongo_config_file" ]; then - echo -e "${COLOR_ERROR}[Error] MongoDB 配置文件 $mongo_config_file 不存在${COLOR_RESET}" - return 1 - fi - # 检查是否已经配置了副本集 - if grep -q "replication:" "$mongo_config_file" && grep -q "replSetName:" "$mongo_config_file"; then - echo -e "${COLOR_WARNING}[Warning] MongoDB 副本集已经配置,跳过...${COLOR_RESET}" - return 0 - fi - # 使用 sed 添加配置 - if ! sed -i '/^#replication:/a replication:\n replSetName: "rs0"' "$mongo_config_file"; then - echo -e "${COLOR_ERROR}[Error] 无法添加副本集配置${COLOR_RESET}" - return 1 - fi - # 5. 启动服务 - echo -e "${COLOR_INFO}[Info] 启动MongoDB服务...${COLOR_RESET}" - systemctl enable --now mongod || { - echo -e "${COLOR_ERROR}[Error] MongoDB服务启动失败${COLOR_RESET}" - return 1 - } - - # 6. 检查服务状态 - echo -e "${COLOR_INFO}[Info] 检查MongoDB服务状态...${COLOR_RESET}" - if ! systemctl is-active --quiet mongod; then - echo -e "${COLOR_ERROR}[Error] MongoDB服务未正常运行${COLOR_RESET}" - return 1 - fi - # 等待 MongoDB 服务完全启动 - echo -e "${COLOR_INFO}[Info] 等待 MongoDB 服务启动..." - sleep 5 - - # 初始化副本集和创建用户 - echo -e "${COLOR_INFO}[Info] 正在初始化副本集和创建用户..." - # 初始化副本集(单节点) - mongosh --eval 'rs.initiate({_id: "rs0", members: [{_id: 0, host: "localhost:27017"}]})' || { - echo -e "${COLOR_ERROR}[Error] 初始化副本集失败 ${COLOR_RESET}" - return 1 - } - # 创建管理员用户 - mongosh admin --eval ' - db.createUser({ - user: "euler_copilot", - pwd: "YqzzpxJtF5tMAMCrHWw6", - roles: [ - { role: "readWrite", db: "admin" } - ] - })' || { - echo -e "${COLOR_ERROR}[Error] 创建管理员用户失败 ${COLOR_RESET}" - return 1 - } - - echo "MongoDB 配置完成" - echo -e "${COLOR_SUCCESS}[Success] MongoDB安装配置完成${COLOR_RESET}" - return 0 -} -# 主函数 -main() { - # 获取脚本所在的绝对路径 - SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) - # 切换到脚本所在目录 - cd "$SCRIPT_DIR" || exit 1 - update_password - enable_services || return 1 - configure_mysql || return 1 - verify_installation || return 1 - configure_nginx || return 1 - install_tika || return 1 - install_pgvector || return 1 - install_scws || return 1 - install_zhparser || return 1 - cd "$SCRIPT_DIR" || exit 1 - install_minio || return 1 - cd "$SCRIPT_DIR" || exit 1 - install_mongodb || return 1 - # 执行配置函数 - if configure_postgresql; then - echo -e "${COLOR_SUCCESS}[Success] postgresql配置已完成${COLOR_RESET}" - else - echo -e "${COLOR_ERROR}[Error] postgresql配置过程中出现错误${COLOR_RESET}" - exit 1 - fi - cd "$SCRIPT_DIR" || exit 1 - ./install_authhub_config.sh || return 1 -} - -main "$@" diff --git a/scripts/deploy/3-install-server/install_eulercopilot.sh b/scripts/deploy/3-install-server/install_eulercopilot.sh deleted file mode 100644 index f688dd2766ff2263e34870c6e7d2284e25300142..0000000000000000000000000000000000000000 --- a/scripts/deploy/3-install-server/install_eulercopilot.sh +++ /dev/null @@ -1,289 +0,0 @@ -#!/bin/bash -# 颜色定义 -COLOR_INFO='\033[34m' # 蓝色信息 -COLOR_SUCCESS='\033[32m' # 绿色成功 -COLOR_ERROR='\033[31m' # 红色错误 -COLOR_WARNING='\033[33m' # 黄色警告 -COLOR_RESET='\033[0m' # 重置颜色 - -install_rag() { - echo -e "${COLOR_INFO}[Info] === 开始初始化配置 euler-copilot-rag ===${COLOR_RESET}" - - # 2. 配置文件处理 - local env_file="../5-resource/env" - local env_target="/etc/euler-copilot-rag/data_chain/env" - local service_file="../5-resource/rag.service" - local service_target="/etc/systemd/system/rag.service" - - # 复制配置文件(验证文件存在性) - if [[ -f "$env_file" ]]; then - cp -v "$env_file" "$env_target" || { - echo -e "${COLOR_ERROR}[Error] 复制 env 文件失败!${COLOR_RESET}" - return 1 - } - else - echo -e "${COLOR_WARNING}[Warning] 未找到 env 文件:$env_file${COLOR_RESET}" - fi - - if [[ -f "$service_file" ]]; then - cp -v "$service_file" "$service_target" || { - echo -e "${COLOR_ERROR}[Error] 复制 service 文件失败!${COLOR_RESET}" - return 1 - } - else - echo -e "${COLOR_WARNING}[Warning] 未找到 service 文件:$service_file${COLOR_RESET}" - fi - - # 3. 安装图形库依赖(OpenGL) - if ! dnf install -y mesa-libGL >/dev/null; then - echo -e "${COLOR_WARNING}[Warning] mesa-libGL 安装失败,可能影响图形功能${COLOR_RESET}" - fi - - # 5. 启动服务 - echo -e "${COLOR_INFO}[Info] 设置并启动rag服务...${COLOR_RESET}" - systemctl daemon-reload - systemctl enable --now rag || { - echo -e "${COLOR_ERROR}[Error] rag服务启动失败!${COLOR_RESET}" - systemctl status rag --no-pager - return 1 - } - - # 6. 验证服务状态 - echo -e "${COLOR_INFO}[Info] 验证rag服务状态...${COLOR_RESET}" - if systemctl is-active --quiet rag; then - echo -e "${COLOR_SUCCESS}[Success] rag服务运行正常${COLOR_RESET}" - systemctl status rag --no-pager | grep -E "Active:|Loaded:" - else - echo -e "${COLOR_ERROR}[Error] rag服务未运行!${COLOR_RESET}" - journalctl -u rag --no-pager -n 20 - return 1 - fi - - echo -e "${COLOR_SUCCESS}[Success] euler-copilot-rag 安装完成${COLOR_RESET}" - return 0 -} -# 网络检测函数 -check_network_reachable() { - local test_url="https://openaipublic.blob.core.windows.net" - local timeout=3 - - echo -e "${COLOR_INFO}[Info] 检测网络连通性 (测试地址: $test_url)...${COLOR_RESET}" - - # 使用curl检测 - if curl --silent --connect-timeout $timeout --head $test_url >/dev/null; then - echo -e "${COLOR_SUCCESS}[Success] 网络连接正常${COLOR_RESET}" - return 0 - fi - - # 使用ping二次验证 - if ping -c 1 -W $timeout openaipublic.blob.core.windows.net >/dev/null 2>&1; then - echo -e "${COLOR_SUCCESS}[Success] 网络连接正常 (ping检测)${COLOR_RESET}" - return 0 - fi - - echo -e "${COLOR_WARNING}[Warning] 网络不可达${COLOR_RESET}" - return 1 -} -setup_tiktoken_cache() { - # 预置的本地资源路径 - local local_tiktoken_file="../5-resource/9b5ad71b2ce5302211f9c61530b329a4922fc6a4" - local cache_dir="/root/.cache/tiktoken" - local target_file="$cache_dir/9b5ad71b2ce5302211f9c61530b329a4922fc6a4" - - # 1. 检查本地资源文件是否存在 - if [[ ! -f "$local_tiktoken_file" ]]; then - echo -e "${COLOR_ERROR}[Error] 本地tiktoken资源文件不存在: $local_tiktoken_file${COLOR_RESET}" - return 1 - fi - - # 2. 创建缓存目录 - echo -e "${COLOR_INFO}[Info] 创建tiktoken缓存目录...${COLOR_RESET}" - if ! mkdir -p "$cache_dir"; then - echo -e "${COLOR_ERROR}[Error] 无法创建缓存目录: $cache_dir${COLOR_RESET}" - return 1 - fi - - # 3. 复制文件到缓存目录 - # 解压tar文件 - dos2unix "$local_tiktoken_file" - if ! cp -r "$local_tiktoken_file" "$target_file"; then - echo -e "${COLOR_ERROR}[Error] tiktoken.tar 解压失败${COLOR_RESET}" - return 1 - fi - - # 4. 设置权限(确保可读) - chmod 644 "$target_file" || { - echo -e "${COLOR_WARNING}[Warning] 无法设置文件权限${COLOR_RESET}" - } - - # 6. 设置环境变量(影响当前进程) - #特殊处理改token代码 - FILE="/usr/lib/euler-copilot-framework/apps/llm/token.py" - token_py_file="../5-resource/token.py" - cp $token_py_file $FILE - echo -e "${COLOR_SUCCESS}[Success] tiktoken缓存已配置: $target_file${COLOR_RESET}" -} -install_framework() { - # 安装前检查 - echo -e "${COLOR_INFO}[Info] 开始初始化配置 euler-copilot-framework...${COLOR_RESET}" - - # 2. 检查并创建必要目录 - echo -e "${COLOR_INFO}[Info] 创建数据目录...${COLOR_RESET}" - mkdir -p /opt/copilot || { - echo -e "${COLOR_ERROR}[Error] 无法创建数据目录 /opt/copilot${COLOR_RESET}" - return 1 - } - - # 3. 获取本机IP - local ip_address - config_toml_path="../5-resource/config.toml" - # 提取 domain 的值(假设文件为 config.ini) - ip_address=$(grep -E "^\s*domain\s*=" $config_toml_path | awk -F"'" '{print $2}') - echo -e "${COLOR_INFO} [Info] 提取的IP地址: $ip_address" - - # 4. 获取客户端信息 - #针对代理服务器做特殊处理 - unset http_proxy https_proxy - - echo -e "${COLOR_INFO}[Info] 获取客户端凭证...${COLOR_RESET}" - if ! get_client_info_auto $ip_address; then - echo -e "${COLOR_ERROR}[Error] 获取客户端凭证失败${COLOR_RESET}" - return 1 - fi - # 5. 配置文件处理 - local framework_file="../5-resource/config.toml" - local framework_target="/etc/euler-copilot-framework/config.toml" - local framework_service_file="../5-resource/framework.service" - local framework_service_target="/etc/systemd/system/framework.service" - - # 检查源文件是否存在 - for file in "$framework_file" "$framework_service_file"; do - if [[ ! -f "$file" ]]; then - echo -e "${COLOR_ERROR}[Error] 找不到配置文件: $file${COLOR_RESET}" - return 1 - fi - done - - # 备份原文件 - echo -e "${COLOR_INFO}[Info] 备份配置文件...${COLOR_RESET}" - cp -v "$framework_file" "${framework_file}.bak" || { - echo -e "${COLOR_ERROR}[Error] 无法备份配置文件${COLOR_RESET}" - return 1 - } - - # 替换配置参数 - echo -e "${COLOR_INFO}[Info] 更新配置文件参数...${COLOR_RESET}" - sed -i "s/app_id = '.*'/app_id = '$client_id'/" $framework_file - sed -i "s/app_secret = '.*'/app_secret = '$client_secret'/" $framework_file - sed -i "/\[login\.settings\]/,/^\[/ s|host = '.*'|host = 'http://${ip_address}:8000'|" "$framework_file" - sed -i "s|login_api = '.*'|login_api = 'http://${ip_address}:8080/api/auth/login'|" $framework_file - sed -i "s/domain = '.*'/domain = '$ip_address'/" $framework_file - - # 验证替换结果 - if ! grep -q "app_id = '$client_id'" "$framework_file" || ! grep -q "app_secret = '$client_secret'" "$framework_file"; then - echo -e "${COLOR_ERROR}[Error] 配置文件验证失败${COLOR_RESET}" - mv -v "${framework_file}.bak" "$framework_file" - return 1 - fi - - # 6. 部署配置文件 - echo -e "${COLOR_INFO}[Info] 部署配置文件...${COLOR_RESET}" - mkdir -p "$(dirname "$framework_target")" - if ! cp -v "$framework_file" "$framework_target"; then - echo -e "${COLOR_ERROR}[Error] 无法复制配置文件到 $framework_target${COLOR_RESET}" - return 1 - fi - - if ! cp -v "$framework_service_file" "$framework_service_target"; then - echo -e "${COLOR_ERROR}[Error] 无法复制服务文件到 $framework_service_target${COLOR_RESET}" - return 1 - fi - - # 7. 设置文件权限 - echo -e "${COLOR_INFO}[Info] 设置文件权限...${COLOR_RESET}" - chmod 640 "$framework_target" || { - echo -e "${COLOR_WARNING}[Warning] 无法设置配置文件权限${COLOR_RESET}" - } - chmod 644 "$framework_service_target" || { - echo -e "${COLOR_WARNING}[Warning] 无法设置服务文件权限${COLOR_RESET}" - } - - #特殊处理,如果 openaipublic.blob.core.windows.net 网络不可达 - # 创建缓存目录(通常是 ~/.cache/tiktoken) - check_network_reachable || { - setup_tiktoken_cache || echo -e "${COLOR_WARNING}[Warning] 无网络 cl100k_base.tiktoken 文件下载失败,请检查网络${COLOR_RESET}" - } - - # 8. 启动服务 - echo -e "${COLOR_INFO}[Info] 启动 framework 服务...${COLOR_RESET}" - systemctl daemon-reload || { - echo -e "${COLOR_ERROR}[Error] systemd 配置重载失败${COLOR_RESET}" - return 1 - } - - if ! systemctl enable --now framework; then - echo -e "${COLOR_ERROR}[Error] 无法启动 framework 服务${COLOR_RESET}" - systemctl status framework --no-pager - return 1 - fi - - # 9. 验证服务状态 - echo -e "${COLOR_INFO}[Info] 检查服务状态...${COLOR_RESET}" - if ! systemctl is-active --quiet framework; then - echo -e "${COLOR_ERROR}[Error] framework 服务未运行${COLOR_RESET}" - journalctl -u framework --no-pager -n 20 - return 1 - fi - - # 10. 清理备份文件 - rm -f "${framework_file}.bak" - - echo -e "${COLOR_SUCCESS}[Success] euler-copilot-framework 安装完成${COLOR_RESET}" - echo -e "${COLOR_INFO}[Info] 服务访问地址: http://${ip_address}:8080${COLOR_RESET}" - return 0 -} - -uninstall_pkg() { - dnf remove -y euler-copilot-rag - dnf remove -y euler-copilot-framework -} -get_client_info_auto() { - - # 声明全局变量 - declare -g client_id="" - declare -g client_secret="" - - # 直接调用Python脚本并传递域名参数 - python3 "../4-other-script/get_client_id_and_secret.py" $1 >client_info.tmp 2>&1 - - # 检查Python脚本执行结果 - if [ $? -ne 0 ]; then - echo -e "${RED}错误:Python脚本执行失败${NC}" - cat client_info.tmp - rm -f client_info.tmp - return 1 - fi - - # 提取凭证信息 - client_id=$(grep "client_id: " client_info.tmp | awk '{print $2}') - client_secret=$(grep "client_secret: " client_info.tmp | awk '{print $2}') - rm -f client_info.tmp - - # 验证结果 - if [ -z "$client_id" ] || [ -z "$client_secret" ]; then - echo -e "${RED}错误:无法获取有效的客户端凭证${NC}" >&2 - return 1 - fi -} -# 主函数 -main() { - # 获取脚本所在的绝对路径 - SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) - cd "$SCRIPT_DIR" || exit 1 - install_rag || return 1 - # 切换到脚本所在目录 - install_framework || return 1 - echo -e "${COLOR_SUCCESS}[Success] openEuler intelligence 安装部署完成${COLOR_RESET}" -} - -main "$@" diff --git a/scripts/deploy/3-install-server/uninstall_server.sh b/scripts/deploy/3-install-server/uninstall_server.sh index 8203fb6c94462a24326fecd42c06f49ef2e86529..8183ebc82dcc3383904c19b43c1c7b376e60a0de 100644 --- a/scripts/deploy/3-install-server/uninstall_server.sh +++ b/scripts/deploy/3-install-server/uninstall_server.sh @@ -49,7 +49,15 @@ uninstall_tika() { return 1 fi } - +is_x86_architecture() { + local arch + arch=$(uname -m) + if [[ $arch == i386 || $arch == i686 || $arch == x86_64 ]]; then + return 0 # 是 x86 架构,返回 0(成功) + else + return 1 # 非 x86 架构,返回 1(失败) + fi +} uninstall_server() { uninstall_tika @@ -70,6 +78,21 @@ uninstall_server() { flag=1 elif [[ "$pkg" = "euler-copilot-web" || "$pkg" = "euler-copilot-witchaind-web" || "$pkg" = "euler-copilot-rag" ]]; then : # 什么都不做 + elif [ "$pkg" = "minio" ];then + if is_x86_architecture;then + dnf remove -y "$pkg" >/dev/null 2>&1 + else + systemctl stop minio >/dev/null 2>&1 + rm -rf /etc/systemd/system/minio.service + rm -rf /etc/default/minio + rm -rf /var/lib/minio + rm -rf /etc/systemd/system/minio.service + rm -rf /usr/local/bin/minio + systemctl daemon-reload || { + echo -e "${COLOR_WARNING}[Warning] 卸载 $pkg 重载systemd失败${COLOR_RESET}" + } + + fi elif [ "$pkg" = "euler-copilot-framework" ]; then systemctl stop framework else diff --git a/scripts/deploy/4-other-script/get_install_model.sh b/scripts/deploy/4-other-script/get_install_model.sh new file mode 100644 index 0000000000000000000000000000000000000000..e6a4a55c6224af9cae063b747dc24c75860faedc --- /dev/null +++ b/scripts/deploy/4-other-script/get_install_model.sh @@ -0,0 +1,149 @@ +#!/bin/bash + +# 颜色定义 +COLOR_INFO='\033[34m' # 蓝色信息 +COLOR_SUCCESS='\033[32m' # 绿色成功 +COLOR_ERROR='\033[31m' # 红色错误 +COLOR_RESET='\033[0m' # 重置颜色 + +# 存储安装模式的文件路径 +INSTALL_MODEL_FILE="/etc/euler_Intelligence_install_model" + + + +# 询问用户并保存安装模式 +ask_install_options() { + # 存储安装模式的文件路径 + INSTALL_MODEL_FILE="/etc/euler_Intelligence_install_model" + echo -e "\n${COLOR_INFO}[Info] 请选择附加组件安装选项:${COLOR_RESET}" + + # 询问是否安装web + while true; do + read -p "是否安装Web管理界面? (y/n,默认y): " web_choice + web_choice=${web_choice:-y} # 默认值为y + if [[ "$web_choice" =~ ^[YyNn]$ ]]; then + break + else + echo -e "${COLOR_ERROR}[Error] 输入无效,请输入y或n${COLOR_RESET}" + fi + done + + # 询问是否安装rag + while true; do + read -p "是否安装RAG检索增强组件? (y/n,默认n): " rag_choice + rag_choice=${rag_choice:-n} # 默认值为n + if [[ "$rag_choice" =~ ^[YyNn]$ ]]; then + break + else + echo -e "${COLOR_ERROR}[Error] 输入无效,请输入y或n${COLOR_RESET}" + fi + done + + # 转换为小写(统一格式) + web_install=$(echo "$web_choice" | tr '[:upper:]' '[:lower:]') + rag_install=$(echo "$rag_choice" | tr '[:upper:]' '[:lower:]') + + # 保存到文件(格式:key=value,便于后续读取) + echo "web_install=$web_install" >"$INSTALL_MODEL_FILE" + echo "rag_install=$rag_install" >>"$INSTALL_MODEL_FILE" + + echo -e "\n${COLOR_INFO}[Info] 安装模式已保存到: $INSTALL_MODEL_FILE${COLOR_RESET}" + return 0 +} +# 读取安装模式的方法 +read_install_model() { + # 检查文件是否存在 + if [ ! -f "$INSTALL_MODEL_FILE" ]; then + echo -e "${COLOR_ERROR}[Error] 安装模式文件不存在: $INSTALL_MODEL_FILE${COLOR_RESET}" + return 1 + fi + + # 从文件读取配置(格式:key=value) + local web_install=$(grep "web_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + local rag_install=$(grep "rag_install=" "$INSTALL_MODEL_FILE" | cut -d'=' -f2) + + # 验证读取结果 + if [ -z "$web_install" ] || [ -z "$rag_install" ]; then + echo -e "${COLOR_ERROR}[Error] 安装模式文件格式错误${COLOR_RESET}" + return 1 + fi + + # 输出读取结果(也可根据需要返回变量) + echo -e "${COLOR_INFO}[Info] 读取安装模式:" + echo -e " 安装Web界面: ${web_install}" + echo -e " 安装RAG组件: ${rag_install}${COLOR_RESET}" + + # 将结果存入全局变量(供其他函数使用) + WEB_INSTALL=$web_install + RAG_INSTALL=$rag_install + return 0 +} +# 示例:根据安装模式执行对应操作(可根据实际需求扩展) +install_components() { + # 读取安装模式 + read_install_model || return 1 + + # 安装Web界面(如果用户选择) + if [ "$WEB_INSTALL" = "y" ]; then + echo -e "\n${COLOR_INFO}[Info] 开始安装Web管理界面...${COLOR_RESET}" + # 此处添加Web安装命令,示例: + # yum install -y web-component + else + echo -e "\n${COLOR_INFO}[Info] 跳过Web管理界面安装${COLOR_RESET}" + fi + + # 安装RAG组件(如果用户选择) + if [ "$RAG_INSTALL" = "y" ]; then + echo -e "\n${COLOR_INFO}[Info] 开始安装RAG检索增强组件...${COLOR_RESET}" + # 此处添加RAG安装命令,示例: + # yum install -y rag-component + else + echo -e "\n${COLOR_INFO}[Info] 跳过RAG检索增强组件安装${COLOR_RESET}" + fi +} + +# 假设的初始化本地仓库函数(示例) +init_local_repo() { + echo -e "${COLOR_INFO}[Info] 初始化本地仓库...${COLOR_RESET}" + # 实际逻辑... + return 0 +} + +# 假设的安装框架函数(示例) +install_framework() { + echo -e "${COLOR_INFO}[Info] 安装核心框架...${COLOR_RESET}" + # 实际逻辑... + return 0 +} + +# 主执行函数 +main() { + echo -e "${COLOR_INFO}[Info] === 开始服务安装 ===${COLOR_RESET}" + + # 获取脚本所在的绝对路径 + declare SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) + # 切换到脚本所在目录 + cd "$SCRIPT_DIR" || return 1 + echo -e "${COLOR_INFO}[Info] 脚本执行目录: $SCRIPT_DIR${COLOR_RESET}" + + # 停止dnf缓存定时器 + systemctl stop dnf-makecache.timer || echo -e "${COLOR_WARNING}[Warning] 停止dnf-makecache.timer失败,继续执行...${COLOR_RESET}" + + # 执行安装验证 + init_local_repo || return 1 + + # 询问用户安装选项并保存 + ask_install_options || return 1 + + # 安装核心框架 + install_framework || return 1 + + # 根据用户选择安装附加组件 + install_components || return 1 + + echo -e "\n${COLOR_SUCCESS}[Success] 安装 openEuler Intelligence 完成!${COLOR_RESET}" + return 0 +} + +# 执行主函数 +main "$@" diff --git a/scripts/deploy/4-other-script/init_agent.py b/scripts/deploy/4-other-script/init_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..f260a734276e55b0fb740287fa0abf946abcccd9 --- /dev/null +++ b/scripts/deploy/4-other-script/init_agent.py @@ -0,0 +1,254 @@ +import requests +from pydantic import BaseModel, Field +from enum import Enum + +base_url = "http://76.53.17.51:10002" + + +class AppType(str, Enum): + """应用中心应用类型""" + + FLOW = "flow" + AGENT = "agent" + + +class AppLink(BaseModel): + """App的相关链接""" + + title: str = Field(description="链接标题") + url: str = Field(..., description="链接地址", pattern=r"^(https|http)://.*$") + + +class PermissionType(str, Enum): + """权限类型""" + + PROTECTED = "protected" + PUBLIC = "public" + PRIVATE = "private" + + +class AppPermissionData(BaseModel): + """应用权限数据结构""" + + type: PermissionType = Field( + default=PermissionType.PRIVATE, + alias="visibility", + description="可见性(public/private/protected)", + ) + users: list[str] | None = Field( + None, + alias="authorizedUsers", + description="附加人员名单(如果可见性为部分人可见)", + ) + + +class AppFlowInfo(BaseModel): + """应用工作流数据结构""" + + id: str = Field(..., description="工作流ID") + name: str = Field(..., description="工作流名称") + description: str = Field(..., description="工作流简介") + debug: bool = Field(..., description="是否经过调试") + + +class AppData(BaseModel): + """应用信息数据结构""" + + app_type: AppType = Field(..., alias="appType", description="应用类型") + icon: str = Field(default="", description="图标") + name: str = Field(..., max_length=20, description="应用名称") + description: str = Field(..., max_length=150, description="应用简介") + links: list[AppLink] = Field(default=[], description="相关链接", max_length=5) + first_questions: list[str] = Field( + default=[], alias="recommendedQuestions", description="推荐问题", max_length=3) + history_len: int = Field(3, alias="dialogRounds", ge=1, le=10, description="对话轮次(1~10)") + permission: AppPermissionData = Field( + default_factory=lambda: AppPermissionData(authorizedUsers=None), description="权限配置") + workflows: list[AppFlowInfo] = Field(default=[], description="工作流信息列表") + mcp_service: list[str] = Field(default=[], alias="mcpService", description="MCP服务id列表") + + +def call_mcp_api(): + """ + 调用MCP API获取服务列表信息 + + 返回: + dict: 解析后的API响应数据,如果请求失败则返回None + """ + # API地址 + url = base_url + "/api/mcp" + + try: + # 发送GET请求 + response = requests.get(url, timeout=10) + + # 检查响应状态码 + if response.status_code == 200: + # 解析JSON响应 + result = response.json() + + # 检查返回的code是否为200 + if result.get("code") == 200: + print("API调用成功") + return result + else: + print(f"API返回错误: {result.get('message', '未知错误')}") + return None + else: + print(f"请求失败,状态码: {response.status_code}") + return None + + except requests.exceptions.RequestException as e: + print(f"请求发生异常: {str(e)}") + return None + + +def call_app_api(appdata: AppData): + """ + 创建智能体应用agent + + 返回: + 接口响应对象 app_id,如果请求失败则返回None + """ + # 接口URL + url = base_url + "/api/app" + try: + # 发送POST请求 + response = requests.post(url, json=appdata.model_dump(by_alias=True)) + + # 检查响应状态码 + response.raise_for_status() # 如果状态码不是200,会抛出HTTPError异常 + + print(f"创建智能体应用agent成功,name: {appdata.name}") + return response.json().get("result", {})["appId"] + + except requests.exceptions.HTTPError as e: + print(f"HTTP错误: {e}") + except requests.exceptions.ConnectionError: + print("连接错误,无法连接到服务器") + except requests.exceptions.Timeout: + print("请求超时") + except requests.exceptions.RequestException as e: + print(f"请求发生错误: {e}") + + return None + + +def query_mcp_server(mcp_id: str): + """ + 查询mcp服务状态 + """ + url = base_url + "/api/mcp/" + mcp_id + try: + # 发送POST请求 + response = requests.get(url) + + # 检查响应状态码 + response.raise_for_status() # 如果状态码不是200,会抛出HTTPError异常 + + print(f"请求成功,状态码: {response.status_code}") + return response.json() + + except requests.exceptions.HTTPError as e: + print(f"HTTP错误: {e}") + except requests.exceptions.ConnectionError: + print("连接错误,无法连接到服务器") + except requests.exceptions.Timeout: + print("请求超时") + except requests.exceptions.RequestException as e: + print(f"请求发生错误: {e}") + + return None + + +def activate_mcp_server(mcp_id: str): + """ + 激活mcp服务 + """ + url = base_url + "/api/mcp/" + mcp_id + body = {"active": "true"} + try: + # 发送POST请求 + response = requests.post(url, json=body) + + # 检查响应状态码 + response.raise_for_status() # 如果状态码不是200,会抛出HTTPError异常 + + print(f"激活mcp服务 mcp_id: {mcp_id} 成功") + return response.json() + + except requests.exceptions.HTTPError as e: + print(f"HTTP错误: {e}") + except requests.exceptions.ConnectionError: + print("连接错误,无法连接到服务器") + except requests.exceptions.Timeout: + print("请求超时") + except requests.exceptions.RequestException as e: + print(f"请求发生错误: {e}") + + return None + + +def deploy_app(app_id:str): + """ + 发布应用 + """ + url = base_url + "/api/app/" + app_id + try: + # 发送POST请求 + response = requests.post(url, json={}) + + # 检查响应状态码 + response.raise_for_status() # 如果状态码不是200,会抛出HTTPError异常 + + print(f"发布应用 app_id: {app_id} 成功") + return response.json() + + except requests.exceptions.HTTPError as e: + print(f"HTTP错误: {e}") + except requests.exceptions.ConnectionError: + print("连接错误,无法连接到服务器") + except requests.exceptions.Timeout: + print("请求超时") + except requests.exceptions.RequestException as e: + print(f"请求发生错误: {e}") + + return None + +def create_agent(): + """ + 主入口 + 查询mcp服务,依次激活,根据mcp服务创建agent + """ + api_result = call_mcp_api() + if api_result: + # 打印服务列表信息 + services = api_result.get("result", {}).get("services", []) + print(f"\n共获取到 {len(services)} 个服务:") + + for service in services: + print(f"\n服务ID: {service.get('mcpserviceId')}") + print(f"服务名称: {service.get('name')}") + print(f"服务状态: {service.get('status')}") + print(f"服务描述: {service.get('description')}") + app_data = AppData( + appType=AppType.AGENT, + description=service.get('description')[:150], + dialogRounds=3, + icon="", + mcpService=[service.get('mcpserviceId')], + name=service.get('name'), + permission=AppPermissionData( + visibility="public", + authorizedUsers=[] + ) + ) + if not service.get("isActive"): + activate_mcp_server(service.get('mcpserviceId')) + app_id = call_app_api(app_data) + deploy_app(app_id) + + +# 使用示例 +if __name__ == "__main__": + create_agent() \ No newline at end of file diff --git a/scripts/deploy/5-resource/mcp_config/sysTrace_mcp_server/config.json b/scripts/deploy/5-resource/mcp_config/sysTrace_mcp_server/config.json new file mode 100644 index 0000000000000000000000000000000000000000..74d2beda8e49279bdb73a9c78b8d9b15c0f548ba --- /dev/null +++ b/scripts/deploy/5-resource/mcp_config/sysTrace_mcp_server/config.json @@ -0,0 +1,16 @@ +{ + "name": "systrace_mcp_server", + "overview": "sysTrace server 服务器", + "description": "面向运维、开发人员,支持自然语言对接,实现启发式调优,实现3个工具接口,分别为性能劣化感知工具,慢卡定界工具,报告输出工具。\n其中:\n性能劣化感知工具:通过解析sysTrace采集的L0数据,即AI框架关键阶段 dataloader、forward、backward的类step时延数据,检测是否存在性能劣化现象;\n慢卡定界工具:性能劣化后,开启慢卡定界,输入通信算子数据(5分钟左右),输出故障节点,时间,覆盖计算慢、通信慢、算子下发慢、IO慢问题;\n报告输出工具:在上述工具的输出基础上,整理结果,形成报告输出;", + "type": "sse", + "author": "hx", + "config": { + "env": { + }, + "autoApprove": [], + "disabled": false, + "autoInstall": false, + "command": "", + "url": "http://192.168.122.196:12140/sse" + } +} \ No newline at end of file diff --git a/scripts/deploy/5-resource/mcp_config/sysTrace_mcp_server/project/package.json b/scripts/deploy/5-resource/mcp_config/sysTrace_mcp_server/project/package.json new file mode 100644 index 0000000000000000000000000000000000000000..33703d582243a41bdebff8ee7dd046a01fc054b9 --- /dev/null +++ b/scripts/deploy/5-resource/mcp_config/sysTrace_mcp_server/project/package.json @@ -0,0 +1,3 @@ +{ + "dependencies": {} +} \ No newline at end of file diff --git a/scripts/deploy/5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm b/scripts/deploy/5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm deleted file mode 100644 index da24c583980f9781cf01f0abf58e4197caf3b5f0..0000000000000000000000000000000000000000 Binary files a/scripts/deploy/5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm and /dev/null differ diff --git a/scripts/deploy/5-resource/rpm/mongodb-mongosh-2.5.2.x86_64.rpm b/scripts/deploy/5-resource/rpm/mongodb-mongosh-2.5.2.x86_64.rpm deleted file mode 100644 index 5d18c3913b7ffc6082f893954b509adf57a3dfa3..0000000000000000000000000000000000000000 Binary files a/scripts/deploy/5-resource/rpm/mongodb-mongosh-2.5.2.x86_64.rpm and /dev/null differ diff --git a/scripts/deploy/5-resource/rpm/mongodb-org-server-7.0.21-1.el9.x86_64.rpm b/scripts/deploy/5-resource/rpm/mongodb-org-server-7.0.21-1.el9.x86_64.rpm deleted file mode 100644 index bf698bc9a9442bc2640a672fae26dde15a956ed4..0000000000000000000000000000000000000000 Binary files a/scripts/deploy/5-resource/rpm/mongodb-org-server-7.0.21-1.el9.x86_64.rpm and /dev/null differ diff --git a/scripts/deploy/deploy.sh b/scripts/deploy/deploy.sh index e12ebd570f5a285344d93bad19cefdc611c8398f..d6371d947967111c7c62acdd429cf313a17866c6 100644 --- a/scripts/deploy/deploy.sh +++ b/scripts/deploy/deploy.sh @@ -1,242 +1,367 @@ #!/bin/bash -COLOR_INFO='\033[34m' # 蓝色信息 -COLOR_SUCCESS='\033[32m' # 绿色成功 -COLOR_ERROR='\033[31m' # 红色错误 -COLOR_WARNING='\033[33m' # 黄色警告 -COLOR_RESET='\033[0m' # 重置颜色 +COLOR_INFO='\033[34m' # 蓝色信息 +COLOR_SUCCESS='\033[32m' # 绿色成功 +COLOR_ERROR='\033[31m' # 红色错误 +COLOR_WARNING='\033[33m' # 黄色警告 +COLOR_RESET='\033[0m' # 重置颜色 GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' +INSTALL_MODEL_FILE="/etc/euler_Intelligence_install_model" # 顶层菜单 show_top_menu() { - clear - echo "==============================" - echo " 主部署菜单 " - echo "==============================" - echo "0) 一键自动部署" - echo "1) 手动分步部署" - echo "2) 重启服务" - echo "3) 卸载所有组件并清除数据" - echo "4) 退出程序" - echo "==============================" - echo -n "请输入选项编号(0-4): " + clear + echo "==============================" + echo " 一键部署菜单 " + echo "==============================" + echo "0) 自动部署" + echo "1) 手动部署" + echo "2) 重启服务" + echo "3) 卸载服务" + echo "4) 退出程序" + echo "==============================" + echo -n "请输入选项编号(0-4): " } # 安装选项菜单(手动部署子菜单) show_sub_menu() { - clear - echo "==============================" - echo " 手动分步部署菜单 " - echo "==============================" - echo "1) 环境检查" - echo "2) 安装 openEuler Intelligence" - echo "3) 初始化配置" - echo "4) 返回主菜单" - echo "==============================" - echo -n "请输入选项编号(1-4): " + clear + echo "==============================" + echo " 手动分步部署菜单 " + echo "==============================" + echo "1) 环境检查" + echo "2) 安装 openEuler Intelligence" + echo "3) 初始化配置" + echo "4) 返回主菜单" + echo "==============================" + echo -n "请输入选项编号(1-4): " +} +# 安装选项菜单(手动选择模式部署部署子菜单) +show_sub_model_menu() { + clear + echo "==============================" + echo " 手动分步部署菜单 " + echo "==============================" + echo "1) 轻量部署 # 仅部署framework框架服务" + echo "2) 全量部署 # 带有web界面和rag知识库" + echo "3) 返回主菜单" + echo "==============================" + echo -n "请输入选项编号(1-3): " } - show_restart_menu() { - clear - echo "==============================" - echo " 服务重启菜单 " - echo "==============================" - echo "可重启的服务列表:" - echo "1) authhub" - echo "2) framework" - echo "3) rag" - echo "4) mysql" - echo "5) minio" - echo "6) redis" - echo "7) postgresql" - echo "8) 返回主菜单" - echo "==============================" - echo -n "请输入要重启的服务编号(1-8): " + clear + echo "==============================" + echo " 服务重启菜单 " + echo "==============================" + echo "可重启的服务列表:" + echo "1) authhub" + echo "2) framework" + echo "3) rag" + echo "4) mysql" + echo "5) minio" + echo "6) redis" + echo "7) postgresql" + echo "8) 返回主菜单" + echo "==============================" + echo -n "请输入要重启的服务编号(1-8): " } +# 询问用户并保存安装模式 +ask_install_options() { + local force_mode="$1" # 接收可选参数(force或空值) + echo $force_mode + # 只有当参数不是force,且存在有效配置时才跳过询问 + if [ "$force_mode" != "force" ] && check_existing_install_model "$INSTALL_MODEL_FILE"; then + return 0 # 非强制模式且配置有效,直接返回 + fi + echo -e "\n${COLOR_INFO}[Info] 请选择附加组件安装选项:${COLOR_RESET}" + # 询问是否安装web + while true; do + read -p "是否安装Web管理界面? (y/n,默认n): " web_choice + web_choice=${web_choice:-n} # 默认值为y + if [[ "$web_choice" =~ ^[YyNn]$ ]]; then + break + else + echo -e "${COLOR_ERROR}[Error] 输入无效,请输入y或n${COLOR_RESET}" + fi + done + # 询问是否安装rag + while true; do + read -p "是否安装RAG检索增强组件? (y/n,默认n): " rag_choice + rag_choice=${rag_choice:-n} # 默认值为n + if [[ "$rag_choice" =~ ^[YyNn]$ ]]; then + break + else + echo -e "${COLOR_ERROR}[Error] 输入无效,请输入y或n${COLOR_RESET}" + fi + done + + # 转换为小写(统一格式) + web_install=$(echo "$web_choice" | tr '[:upper:]' '[:lower:]') + rag_install=$(echo "$rag_choice" | tr '[:upper:]' '[:lower:]') + + # 保存到文件(格式:key=value,便于后续读取) + echo "web_install=$web_install" >"$INSTALL_MODEL_FILE" + echo "rag_install=$rag_install" >>"$INSTALL_MODEL_FILE" + + echo -e "\n${COLOR_INFO}[Info] 安装模式已保存到: $INSTALL_MODEL_FILE${COLOR_RESET}" + return 0 +} +# 轻量部署 +light_deploy() { + # 保存到文件(格式:key=value,便于后续读取) + echo "web_install=n" >"$INSTALL_MODEL_FILE" + echo "rag_install=n" >>"$INSTALL_MODEL_FILE" + return 0 +} +# 全量部署 +wight_deploy() { + # 保存到文件(格式:key=value,便于后续读取) + echo "web_install=y" >"$INSTALL_MODEL_FILE" + echo "rag_install=y" >>"$INSTALL_MODEL_FILE" + return 0 +} # 带错误检查的脚本执行函数 run_script_with_check() { - local script_path=$1 - local script_name=$2 - - echo "--------------------------------------------------" - echo "开始执行:$script_name" - "$script_path" || { - echo -e "\n\033[31m$script_name 执行失败!\033[0m" - exit 1 - } - echo -e "\n\033[32m$script_name 执行成功!\033[0m" - echo "--------------------------------------------------" + local script_path=$1 + local script_name=$2 + + echo "--------------------------------------------------" + echo "开始执行:$script_name" + "$script_path" || { + echo -e "\n\033[31m$script_name 执行失败!\033[0m" + exit 1 + } + echo -e "\n\033[32m$script_name 执行成功!\033[0m" + echo "--------------------------------------------------" } # 执行子菜单对应脚本 run_sub_script() { - case $1 in - 1) - run_script_with_check "./1-check-env/check_env.sh" "环境检查" - ;; - 2) - run_script_with_check "./2-install-dependency/install_openEulerIntelligence.sh" "安装 openEuler Intelligence" - ;; - 3) - run_script_with_check "./3-install-server/init_config.sh" "初始化配置" - ;; - 4) - echo "正在返回主菜单..." - echo "按任意键继续..." - read -r -n 1 -s - return 2 # 特殊返回码表示返回上级菜单 - ;; - *) - echo -e "\033[31m无效的选项,请输入1-5之间的数字\033[0m" - return 1 - ;; - esac - return 0 + case $1 in + 1) + run_script_with_check "./1-check-env/check_env.sh" "环境检查" + ;; + 2) + run_script_with_check "./2-install-dependency/install_openEulerIntelligence.sh" "安装 openEuler Intelligence" + ;; + 3) + run_script_with_check "./3-install-server/init_config.sh" "初始化配置" + ;; + 4) + echo "正在返回主菜单..." + echo "按任意键继续..." + read -r -n 1 -s + return 2 # 特殊返回码表示返回上级菜单 + ;; + *) + echo -e "\033[31m无效的选项,请输入1-5之间的数字\033[0m" + return 1 + ;; + esac + return 0 +} +# 执行子菜单选择部署模式对应脚本 +run_sub_model_script() { + case $1 in + 1) + light_deploy + "./0-one-click-deploy/one-click-deploy.sh" + ;; + 2) + wight_deploy + "./0-one-click-deploy/one-click-deploy.sh" + ;; + 3) + echo "正在返回主菜单..." + echo "按任意键继续..." + read -r -n 1 -s + return 2 # 特殊返回码表示返回上级菜单 + ;; + *) + echo -e "\033[31m无效的选项,请输入1-3之间的数字\033[0m" + return 1 + ;; + esac + return 0 +} +# 检查是否存在有效的安装模式配置文件 +check_existing_install_model() { + local target_file="$1" + + # 检查文件是否存在 + if [ ! -f "$target_file" ]; then + return 1 # 文件不存在,需要询问 + fi + + # 检查文件格式是否正确(包含必要的键) + local web_val=$(grep "^web_install=" "$target_file" | cut -d'=' -f2) + local rag_val=$(grep "^rag_install=" "$target_file" | cut -d'=' -f2) + + # 验证值是否合法(必须是y或n) + if [[ -n "$web_val" && -n "$rag_val" && + "$web_val" =~ ^[yn]$ && "$rag_val" =~ ^[yn]$ ]]; then + echo -e "${COLOR_INFO}[Info] 检测到有效的安装模式配置文件: $target_file${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 已配置: Web=${web_val^^}, RAG=${rag_val^^}${COLOR_RESET}" + return 0 # 配置有效,无需询问 + else + echo -e "${COLOR_WARNING}[Warning] 安装模式配置文件格式无效,将重新询问${COLOR_RESET}" + return 1 # 配置无效,需要重新询问 + fi } # 手动部署子菜单循环 manual_deployment_loop() { - while true; do - show_sub_menu - read -r sub_choice - run_sub_script "$sub_choice" - retval=$? - - if [ $retval -eq 2 ]; then # 返回主菜单 - break - elif [ $retval -eq 0 ]; then - echo "按任意键继续..." - read -r -n 1 -s - fi - done + while true; do +# show_sub_menu + show_sub_model_menu + read -r sub_choice + run_sub_model_script "$sub_choice" + retval=$? + + if [ $retval -eq 2 ]; then # 返回主菜单 + break + elif [ $retval -eq 0 ]; then + echo "按任意键继续..." + read -r -n 1 -s + fi + done } restart_service() { - local service="$1" - if [[ -z "$service" ]]; then - echo -e "${COLOR_ERROR}[Error] 错误:请输入服务名称${COLOR_RESET}" - return 1 - fi + local service="$1" + if [[ -z "$service" ]]; then + echo -e "${COLOR_ERROR}[Error] 错误:请输入服务名称${COLOR_RESET}" + return 1 + fi - # 检查服务是否存在 - if ! systemctl list-unit-files | grep -q "^$service.service"; then - echo -e "${COLOR_ERROR}[Error] 服务 ${service} 不存在${COLOR_RESET}" - return 2 - fi + # 检查服务是否存在 + if ! systemctl list-unit-files | grep -q "^$service.service"; then + echo -e "${COLOR_ERROR}[Error] 轻量化部署模式 服务 ${service} 未安装${COLOR_RESET}" + return 1 + fi - # 检查服务是否活跃 - if systemctl is-active --quiet "$service"; then - echo -e "${COLOR_INFO}[Info] ${service} 服务正在运行,准备重启...${COLOR_RESET}" - systemctl restart "$service" - else - echo -e "${COLOR_INFO}[Info] ${service} 服务未运行,准备启动...${COLOR_RESET}" - systemctl start "$service" - fi + # 检查服务是否活跃 + if systemctl is-active --quiet "$service"; then + echo -e "${COLOR_INFO}[Info] ${service} 服务正在运行,准备重启...${COLOR_RESET}" + systemctl restart "$service" + else + echo -e "${COLOR_INFO}[Info] ${service} 服务未运行,准备启动...${COLOR_RESET}" + systemctl start "$service" + fi - sleep 2 # 给系统一点时间处理 + sleep 2 # 给系统一点时间处理 - # 验证最终状态 - if systemctl is-active --quiet "$service"; then - echo -e "${COLOR_SUCCESS}[Success] ${service} 服务操作成功${COLOR_RESET}" - return 0 - else - echo -e "${COLOR_ERROR}[Error] ${service} 服务操作失败${COLOR_RESET}" - return 3 - fi + # 验证最终状态 + if systemctl is-active --quiet "$service"; then + echo -e "${COLOR_SUCCESS}[Success] ${service} 服务操作成功${COLOR_RESET}" + return 0 + else + echo -e "${COLOR_ERROR}[Error] ${service} 服务操作失败${COLOR_RESET}" + return 3 + fi } # 帮助信息函数 show_help() { - echo -e "${GREEN}openEuler Intelligence 一键部署系统使用说明${COLOR_RESET}" - echo "==============================================================================" - echo -e "${BLUE}使用方式:${COLOR_RESET}" - echo " $0 [选项]" - echo "" - echo -e "${BLUE}选项:${COLOR_RESET}" - echo " 无参数 进入交互式菜单" - echo " --h 显示本帮助信息" - echo " --help 同 --h" - echo "" - echo -e "${BLUE}服务部署手册查看位置:${COLOR_RESET}" - echo " 1. 在线文档: https://gitee.com/openeuler/euler-copilot-shell/blob/dev/README.md" - echo "" - echo -e "${BLUE}常见问题:${COLOR_RESET}" - echo " - 服务启动失败请检查: journalctl -xe -u [服务名称] --all" - echo " - 部署日志查看: /var/log/openEulerIntelligence/Install-xxx.log" - echo "" - echo -e "${YELLOW}如需详细配置指导,请参考上述文档或联系系统管理员${COLOR_RESET}" - echo "==============================================================================" - exit 0 + echo -e "${GREEN}openEuler Intelligence 一键部署系统使用说明${COLOR_RESET}" + echo "==============================================================================" + echo -e "${BLUE}使用方式:${COLOR_RESET}" + echo " $0 [选项]" + echo "" + echo -e "${BLUE}选项:${COLOR_RESET}" + echo " 无参数 进入交互式菜单" +# echo " --q 切换安装部署模式" + echo " --h 显示本帮助信息" + echo " --help 同 --h" + echo "" + echo -e "${BLUE}服务部署手册查看位置:${COLOR_RESET}" + echo " 1. 在线文档: https://gitee.com/openeuler/euler-copilot-shell/blob/dev/scripts/deploy/安装部署手册.md" + echo "" + echo -e "${BLUE}常见问题:${COLOR_RESET}" + echo " - 服务启动失败排查: journalctl -xe -u [服务名称] --all" + echo " - 部署日志查看: /var/log/openEulerIntelligence/Install-xxx.log" + echo "" + echo -e "${YELLOW}如需详细配置指导,请参考上述文档或联系系统管理员${COLOR_RESET}" + echo "==============================================================================" + exit 0 } # 检查帮助参数 if [[ "$1" == "--h" || "$1" == "--help" ]]; then - show_help - return 0 + show_help + return 0 +fi +## 检查切换部署方式 +#if [[ "$1" == "--q" ]]; then +# ask_install_options "force" +# return 0 +#fi + +# 获取主脚本绝对路径并切换到所在目录 +MAIN_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +if [ "${MAIN_DIR}" = "/usr/bin" ]; then + cd /usr/lib/deploy/scripts || exit 1 +else + cd "$MAIN_DIR" || exit 1 fi # 主程序循环改进 while true; do - show_top_menu - read -r main_choice - # 获取主脚本绝对路径并切换到所在目录 - MAIN_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) - if [ "${MAIN_DIR}" = "/usr/bin" ];then - cd /usr/lib/deploy/scripts || exit 1 - else - cd "$MAIN_DIR" || exit 1 - fi - case $main_choice in - 0) - "./0-one-click-deploy/one-click-deploy.sh" - echo "按任意键继续..." - read -r -n 1 -s - ;; - 1) - manual_deployment_loop - ;; - 2) - while true; do - show_restart_menu - read -r restart_choice - case $restart_choice in - 1) service="authhub" ;; - 2) service="framework" ;; - 3) service="rag" ;; - 4) service="mysqld" ;; - 5) service="minio" ;; - 6) service="redis" ;; - 7) service="postgresql" ;; - 8) break ;; - *) - echo -e "${COLOR_ERROR}无效的选项,请输入1-8之间的数字${COLOR_RESET}" - continue - ;; - esac - - if [[ -n "$service" ]]; then - restart_service "$service" - echo "按任意键继续..." - read -r -n 1 -s - fi - done - ;; - - 3) - run_script_with_check "./3-install-server/uninstall_server.sh" "卸载所有服务" - run_script_with_check "./2-install-dependency/uninstall_dependency.sh" "卸载数据库和文件服务" - echo "按任意键继续..." - read -r -n 1 -s - ;; - 4) - echo "退出部署系统" - exit 0 - ;; - *) - echo -e "${COLOR_ERROR}无效的选项,请输入0-4之间的数字${COLOR_RESET}" - sleep 1 - ;; - esac + show_top_menu + read -r main_choice + case $main_choice in + 0) + light_deploy + "./0-one-click-deploy/one-click-deploy.sh" + echo "按任意键继续..." + read -r -n 1 -s + ;; + 1) + manual_deployment_loop + ;; + 2) + while true; do + show_restart_menu + read -r restart_choice + case $restart_choice in + 1) service="authhub" ;; + 2) service="framework" ;; + 3) service="rag" ;; + 4) service="mysqld" ;; + 5) service="minio" ;; + 6) service="redis" ;; + 7) service="postgresql" ;; + 8) break ;; + *) + echo -e "${COLOR_ERROR}无效的选项,请输入1-8之间的数字${COLOR_RESET}" + continue + ;; + esac + + if [[ -n "$service" ]]; then + restart_service "$service" + echo "按任意键继续..." + read -r -n 1 -s + fi + done + ;; + + 3) + run_script_with_check "./3-install-server/uninstall_server.sh" "卸载所有服务" + run_script_with_check "./2-install-dependency/uninstall_dependency.sh" "卸载数据库和文件服务" + echo "按任意键继续..." + read -r -n 1 -s + ;; + 4) + echo "退出部署系统" + exit 0 + ;; + *) + echo -e "${COLOR_ERROR}无效的选项,请输入0-4之间的数字${COLOR_RESET}" + sleep 1 + ;; + esac done +return 0 diff --git "a/scripts/deploy/\345\256\211\350\243\205\351\203\250\347\275\262\346\211\213\345\206\214.md" "b/scripts/deploy/\345\256\211\350\243\205\351\203\250\347\275\262\346\211\213\345\206\214.md" index d1deb39bb4f2d150d3cb188a8ca0a70d78c68941..048a3ce65d55ba078433f2145978168d7edf2ec7 100644 --- "a/scripts/deploy/\345\256\211\350\243\205\351\203\250\347\275\262\346\211\213\345\206\214.md" +++ "b/scripts/deploy/\345\256\211\350\243\205\351\203\250\347\275\262\346\211\213\345\206\214.md" @@ -2,7 +2,8 @@ 版本信息 当前版本:v0.9.6 -更新日期:2025年7月26日 +更新日期:2025年8月4日 + ## 产品概述 openEuler Intelligence 是一款智能问答工具,使用 openEuler Intelligence 可以解决操作系统知识获取的便捷性,并且为OS领域模型赋能开发者及运维人员。作为获取操作系统知识,使能操作系统生产力工具 (如 A-Ops / A-Tune / x2openEuler / EulerMaker / EulerDevOps / StratoVirt / iSulad 等),颠覆传统命令交付方式,由传统命令交付方式向自然语义进化,并结合智能体任务规划能力,降低开发、使用操作系统特性的门槛。 @@ -100,16 +101,15 @@ domain = '192.168.2.112' #修改ip为部署服务器ip #### 3. 执行一键部署 ~~~bash [root@localhost 5-resource]# openEuler-Intelligence-Install #启动后直接输入 0 开启一键部署 等待部署完成,视网络情况好坏,大概在10~40分钟 -============================== - 主部署菜单 -============================== -0) 一键自动部署 -1) 手动分步部署 +一键部署菜单 +0) 自动部署 +1) 手动部署 2) 重启服务 -3) 卸载所有组件并清除数据 +3) 卸载服务 4) 退出程序 -============================== 请输入选项编号(0-4): +说明:0 是默认轻量部署,只部署framework框架;1 手动部署支持选择轻量部署还是全量部署,全量部署包含web端和知识库rag。 + ~~~ \ No newline at end of file