From efe5923f18fcbcf3523d0191a1325cc4174e67a6 Mon Sep 17 00:00:00 2001 From: liujiangbin11 Date: Thu, 22 May 2025 10:28:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E6=96=B0=E7=9A=84=20?= =?UTF-8?q?euler-copilot=20=E9=83=A8=E7=BD=B2=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/euler-copilot/config.yaml | 80 +++-- ...56\351\203\250\347\275\262EulerCopilot.md" | 90 +++-- .../workspace/files/deploy-embedding.sh | 2 + .../workspace/files/deploy_deepseek.sh | 2 + .../workspace/files/install_ollama.sh | 2 + plugins/euler-copilot/workspace/install.yml | 80 ++--- .../0-one-click-deploy/one-click-deploy.sh.j2 | 228 ------------ .../7-install-authhub/install_authhub.sh.j2 | 176 ---------- .../install_eulercopilot.sh.j2 | 325 ------------------ .../workspace/templates/values.yaml.j2 | 158 +++++++++ 10 files changed, 325 insertions(+), 818 deletions(-) create mode 100644 plugins/euler-copilot/workspace/files/deploy-embedding.sh create mode 100644 plugins/euler-copilot/workspace/files/deploy_deepseek.sh create mode 100644 plugins/euler-copilot/workspace/files/install_ollama.sh delete mode 100644 plugins/euler-copilot/workspace/templates/scripts/0-one-click-deploy/one-click-deploy.sh.j2 delete mode 100644 plugins/euler-copilot/workspace/templates/scripts/7-install-authhub/install_authhub.sh.j2 delete mode 100644 plugins/euler-copilot/workspace/templates/scripts/8-install-EulerCopilot/install_eulercopilot.sh.j2 create mode 100644 plugins/euler-copilot/workspace/templates/values.yaml.j2 diff --git a/plugins/euler-copilot/config.yaml b/plugins/euler-copilot/config.yaml index 17ab3cf..62df97f 100644 --- a/plugins/euler-copilot/config.yaml +++ b/plugins/euler-copilot/config.yaml @@ -1,31 +1,67 @@ all: hosts: host1: - ansible_host: HOST_IP1 - ansible_port: 22 - ansible_user: root - ansible_password: "" - vars: - temp_dir: /tmp - log_dir: /var/log - pypi_index_url: https://mirrors.huaweicloud.com/repository/pypi/simple - pypi_trusted_host: mirrors.huaweicloud.com + # 部署节点 IP + ansible_host: HOST_IP + # 部署节点 SSH 端口 + ansible_port: PORT + # 部署节点用户 + ansible_user: USER + # 部署节点密码 + ansible_password: PASSWORD - eulercopilot_domain: "www.eulercopilot.local" - authhub_domain: "authhub.eulercopilot.local" + vars: + # 部署日志目录 + log_dir: "/var/log/deploy-euler-copilot" - install_ollama: "true" - deploy_deepseek: "true" - deploy_embedding: "true" + # 源码仓库配置 + repo_config: + # 源码 url + url: "https://gitee.com/openeuler/euler-copilot-framework.git" + # 源码仓放置目录 + dest_dir: "/opt/euler-copilot-framework" + # 指定分支、tag 和 commit + version: "master" + # 是否覆盖本地修改 + force: yes + # 模型配置 models: + # 用于问答的大模型;需要为OpenAI兼容接口 answer: - url: http://$host:11434 - key: sk-123456 - name: deepseek-llm-7b-chat:latest - ctx_length: 8192 - max_tokens: 2048 + # [必填] 接口URL(无需带上“v1”后缀) + endpoint: https://api.deepseek.com + # [必填] 接口API Key;默认置空 + key: sk-xxx + # [必填] 模型名称 + name: deepseek-chat + # [必填] 模型最大上下文数;建议>=8192 + ctxLength: 8192 + # 模型最大输出长度,建议>=2048 + maxTokens: 8192 + # 用于Function Call的模型;建议使用特定推理框架 + functionCall: + # 推理框架类型,默认为ollama + # 可用的框架类型:["vllm", "sglang", "ollama", "openai"] + backend: openai + # 模型地址;不填则与问答模型一致 + endpoint: https://dashscope.aliyuncs.com/compatible-mode/v1 + # API Key;不填则与问答模型一致 + key: sk-xxx + # 模型名称;不填则与问答模型一致 + name: qwen-plus + # 模型最大上下文数;不填则与问答模型一致 + ctxLength: + # 模型最大输出长度;不填则与问答模型一致 + maxTokens: + # 用于数据向量化(Embedding)的模型 embedding: - url: http://$host:11434 - key: sk-123456 - name: bge-m3:latest + # 推理框架类型,默认为openai + # [必填] Embedding接口类型:["openai", "mindie"] + type: openai + # [必填] Embedding URL(需要带上“v1”后缀) + endpoint: https://api.siliconflow.cn/v1 + # [必填] Embedding 模型API Key + key: sk-xxx + # [必填] Embedding 模型名称 + name: BAAI/bge-m3 diff --git "a/plugins/euler-copilot/doc/\344\270\200\351\224\256\351\203\250\347\275\262EulerCopilot.md" "b/plugins/euler-copilot/doc/\344\270\200\351\224\256\351\203\250\347\275\262EulerCopilot.md" index 4270cc7..ef79160 100644 --- "a/plugins/euler-copilot/doc/\344\270\200\351\224\256\351\203\250\347\275\262EulerCopilot.md" +++ "b/plugins/euler-copilot/doc/\344\270\200\351\224\256\351\203\250\347\275\262EulerCopilot.md" @@ -87,42 +87,76 @@ cd xxx/euler-copilot all: hosts: host1: - ansible_host: 172.0.0.1 # 更换为实际部署机器的IP - ansible_port: 22 - ansible_user: root - ansible_password: 123456 # 更换为实际部署机器的登录密码 + # 部署节点 IP + ansible_host: HOST_IP + # 部署节点 SSH 端口 + ansible_port: PORT + # 部署节点用户 + ansible_user: USER + # 部署节点密码 + ansible_password: PASSWORD + vars: - temp_dir: /tmp - log_dir: /var/log - # 如果不指定PyPI源,可以留空 - pypi_index_url: https://mirrors.huaweicloud.com/repository/pypi/simple - pypi_trusted_host: mirrors.huaweicloud.com - # 可根据实际需要更换域名 - eulercopilot_domain: "www.eulercopilot.local" - authhub_domain: "authhub.eulercopilot.local" - # 选择是否自带部署大模型 - install_ollama: "true" - deploy_deepseek: "true" - deploy_embedding: "true" - # 配置大模型,如果使用自带部署的大模型请不要修改 + # 部署日志目录 + log_dir: "/var/log/deploy-euler-copilot" + + # 源码仓库配置 + repo_config: + # 源码 url + url: "https://gitee.com/openeuler/euler-copilot-framework.git" + # 源码仓放置目录 + dest_dir: "/opt/euler-copilot-framework" + # 指定分支、tag 和 commit + version: "master" + # 是否覆盖本地修改 + force: yes + + # 模型配置 models: + # 用于问答的大模型;需要为OpenAI兼容接口 answer: - # url后不要带有v1/... - url: http://$host:11434 - key: sk-123456 - name: deepseek-llm-7b-chat:latest - ctx_length: 8192 - max_tokens: 2048 + # [必填] 接口URL(无需带上“v1”后缀) + endpoint: https://api.deepseek.com + # [必填] 接口API Key;默认置空 + key: sk-xxx + # [必填] 模型名称 + name: deepseek-chat + # [必填] 模型最大上下文数;建议>=8192 + ctxLength: 8192 + # 模型最大输出长度,建议>=2048 + maxTokens: 8192 + # 用于Function Call的模型;建议使用特定推理框架 + functionCall: + # 推理框架类型,默认为ollama + # 可用的框架类型:["vllm", "sglang", "ollama", "openai"] + backend: openai + # 模型地址;不填则与问答模型一致 + endpoint: https://dashscope.aliyuncs.com/compatible-mode/v1 + # API Key;不填则与问答模型一致 + key: sk-xxx + # 模型名称;不填则与问答模型一致 + name: qwen-plus + # 模型最大上下文数;不填则与问答模型一致 + ctxLength: + # 模型最大输出长度;不填则与问答模型一致 + maxTokens: + # 用于数据向量化(Embedding)的模型 embedding: - url: http://$host:11434 - key: sk-123456 - name: bge-m3:latest + # 推理框架类型,默认为openai + # [必填] Embedding接口类型:["openai", "mindie"] + type: openai + # [必填] Embedding URL(需要带上“v1”后缀) + endpoint: https://api.siliconflow.cn/v1 + # [必填] Embedding 模型API Key + key: sk-xxx + # [必填] Embedding 模型名称 + name: BAAI/bge-m3 ``` ### 2.2 执行一键部署命令 ```shell -oedp run install +oedp run install -p ./euler-copilot ``` 等待脚本执行完成即可。 @@ -136,7 +170,7 @@ oedp run install 在插件目录下,执行以下命令: ```shell -oedp run uninstall +oedp run uninstall -p ./euler-copilot ``` 等待脚本执行完成即可。 \ No newline at end of file diff --git a/plugins/euler-copilot/workspace/files/deploy-embedding.sh b/plugins/euler-copilot/workspace/files/deploy-embedding.sh new file mode 100644 index 0000000..c3c3f3f --- /dev/null +++ b/plugins/euler-copilot/workspace/files/deploy-embedding.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exit 0 \ No newline at end of file diff --git a/plugins/euler-copilot/workspace/files/deploy_deepseek.sh b/plugins/euler-copilot/workspace/files/deploy_deepseek.sh new file mode 100644 index 0000000..c3c3f3f --- /dev/null +++ b/plugins/euler-copilot/workspace/files/deploy_deepseek.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exit 0 \ No newline at end of file diff --git a/plugins/euler-copilot/workspace/files/install_ollama.sh b/plugins/euler-copilot/workspace/files/install_ollama.sh new file mode 100644 index 0000000..c3c3f3f --- /dev/null +++ b/plugins/euler-copilot/workspace/files/install_ollama.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exit 0 \ No newline at end of file diff --git a/plugins/euler-copilot/workspace/install.yml b/plugins/euler-copilot/workspace/install.yml index a7b84b6..75e36ed 100644 --- a/plugins/euler-copilot/workspace/install.yml +++ b/plugins/euler-copilot/workspace/install.yml @@ -7,50 +7,52 @@ tasks: - name: Create log directory file: - path: "{{ log_dir }}/deploy-euler-copilot" + path: "{{ log_dir }}" state: directory - mode: '0644' + mode: '0744' - - name: Install python3-libselinux + - name: Install python3-libselinux, git yum: - name: python3-libselinux - state: present - - - name: Set environment variables - shell: echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> /root/.bashrc && source /root/.bashrc - - - name: Pip install requests and ruamel.yaml - pip: name: - - requests - - ruamel.yaml - extra_args: >- - {% if pypi_index_url %} - -i {{ pypi_index_url }} --trusted-host {{ pypi_trusted_host }} - {% endif %} - - - name: Copy "deploy-euler-copilot" to hosts - copy: - src: deploy-euler-copilot - dest: "{{ temp_dir }}" - - - name: Copy one-click-deploy.sh to hosts - template: - src: templates/scripts/0-one-click-deploy/one-click-deploy.sh.j2 - dest: "{{ temp_dir }}/deploy-euler-copilot/scripts/0-one-click-deploy/one-click-deploy.sh" - - - name: Copy install_authhub.sh to hosts - template: - src: templates/scripts/7-install-authhub/install_authhub.sh.j2 - dest: "{{ temp_dir }}/deploy-euler-copilot/scripts/7-install-authhub/install_authhub.sh" + - python3-libselinux + - git + state: present - - name: Copy install_eulercopilot.sh to hosts - template: - src: templates/scripts/8-install-EulerCopilot/install_eulercopilot.sh.j2 - dest: "{{ temp_dir }}/deploy-euler-copilot/scripts/8-install-EulerCopilot/install_eulercopilot.sh" + - name: git clone euler-copilot-framework + ansible.builtin.git: + repo: "{{ repo_config.url }}" + dest: "{{ repo_config.dest_dir }}" + version: "{{ repo_config.version }}" + update: yes # 如果目录存在,则执行 git pull 更新到指定 version + force: "{{ repo_config.force }}" + + - name: Copy values.yaml template + ansible.builtin.template: + src: values.yaml.j2 + dest: "{{ repo_config.dest_dir }}/deploy/chart/euler_copilot/values.yaml" + mode: "0644" + backup: yes + + - name: Disable deploy-embedding.sh, deploy_deepseek.sh and install_ollama.sh script + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "0770" # 可选:设置文件权限 + owner: root # 可选:设置文件所有者 + group: root # 可选:设置文件所属组 + backup: yes # 可选:启用备份 + loop: + - { src: deploy-embedding.sh, dest: "{{ repo_config.dest_dir }}/deploy/scripts/3-install-ollama/install_ollama.sh" } + - { src: deploy_deepseek.sh, dest: "{{ repo_config.dest_dir }}/deploy/scripts/4-deploy-deepseek/deploy_deepseek.sh" } + - { src: install_ollama.sh, dest: "{{ repo_config.dest_dir }}/deploy/scripts/5-deploy-embedding/deploy-embedding.sh" } + + - name: Add execute permission to all deploy scripts recursively + ansible.builtin.file: + path: "{{ repo_config.dest_dir }}/deploy/scripts" + mode: "a+X" + recurse: yes - name: Execute one-click-deploy.sh shell: > - sh {{ temp_dir }}/deploy-euler-copilot/scripts/0-one-click-deploy/one-click-deploy.sh - >"{{ log_dir }}/deploy-euler-copilot/{{ timestamp }}.out" - 2>"{{ log_dir }}/deploy-euler-copilot/{{ timestamp }}.err" + sh {{ repo_config.dest_dir }}/deploy/scripts/0-one-click-deploy/one-click-deploy.sh + &>"{{ log_dir }}/{{ timestamp }}.log" diff --git a/plugins/euler-copilot/workspace/templates/scripts/0-one-click-deploy/one-click-deploy.sh.j2 b/plugins/euler-copilot/workspace/templates/scripts/0-one-click-deploy/one-click-deploy.sh.j2 deleted file mode 100644 index 5d86b83..0000000 --- a/plugins/euler-copilot/workspace/templates/scripts/0-one-click-deploy/one-click-deploy.sh.j2 +++ /dev/null @@ -1,228 +0,0 @@ -#!/bin/bash - -# 增强颜色定义 -RESET='\033[0m' -BOLD='\033[1m' -RED='\033[38;5;196m' -GREEN='\033[38;5;46m' -YELLOW='\033[38;5;226m' -BLUE='\033[38;5;45m' -MAGENTA='\033[38;5;201m' -CYAN='\033[38;5;51m' -WHITE='\033[38;5;255m' -BG_RED='\033[48;5;196m' -BG_GREEN='\033[48;5;46m' -BG_BLUE='\033[48;5;45m' -DIM='\033[2m' - -# 进度条宽度 -PROGRESS_WIDTH=50 -NAMESPACE="euler-copilot" -TIMEOUT=300 # 最大等待时间(秒) -INTERVAL=10 # 检查间隔(秒) - - -# 带颜色输出的进度条函数 -colorful_progress() { - local current=$1 - local total=$2 - local progress=$((current*100/total)) - local completed=$((PROGRESS_WIDTH*current/total)) - local remaining=$((PROGRESS_WIDTH-completed)) - - printf "\r${BOLD}${BLUE}⟦${RESET}" - printf "${BG_BLUE}${WHITE}%${completed}s${RESET}" | tr ' ' '▌' - printf "${DIM}${BLUE}%${remaining}s${RESET}" | tr ' ' '·' - printf "${BOLD}${BLUE}⟧${RESET} ${GREEN}%3d%%${RESET} ${CYAN}[%d/%d]${RESET}" \ - $progress $current $total -} - -# 打印装饰线 -print_separator() { - echo -e "${BLUE}${BOLD}$(printf '━%.0s' $(seq 1 $(tput cols)))${RESET}" -} - -# 打印步骤标题 -print_step_title() { - echo -e "\n${BG_BLUE}${WHITE}${BOLD} 步骤 $1 ${RESET} ${MAGENTA}${BOLD}$2${RESET}" - echo -e "${DIM}${BLUE}$(printf '━%.0s' $(seq 1 $(tput cols)))${RESET}" -} - -# 获取主脚本绝对路径并切换到所在目录 -MAIN_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -cd "$MAIN_DIR" || exit 1 - -# 带错误检查的脚本执行函数(改进版) -run_script_with_check() { - local script_path=$1 - local script_name=$2 - local step_number=$3 - local auto_input=${4:-false} - - # 前置检查:脚本是否存在 - if [ ! -f "$script_path" ]; then - echo -e "\n${BOLD}${RED}✗ 致命错误:${RESET}${YELLOW}${script_name}${RESET}${RED} 不存在 (路径: ${CYAN}${script_path}${RED})${RESET}" >&2 - exit 1 - fi - - print_step_title $step_number "$script_name" - - # 获取绝对路径和执行目录 - local script_abs_path=$(realpath "$script_path") - local script_dir=$(dirname "$script_abs_path") - local script_base=$(basename "$script_abs_path") - - echo -e "${DIM}${BLUE}🠖 脚本绝对路径:${YELLOW}${script_abs_path}${RESET}" - echo -e "${DIM}${BLUE}🠖 执行工作目录:${YELLOW}${script_dir}${RESET}" - echo -e "${DIM}${BLUE}🠖 开始执行时间:${YELLOW}$(date +'%Y-%m-%d %H:%M:%S')${RESET}" - - # 创建临时日志文件 - local log_file=$(mktemp) - echo -e "${DIM}${BLUE}🠖 临时日志文件:${YELLOW}${log_file}${RESET}" - - # 执行脚本(带自动输入处理和实时日志输出) - local exit_code=0 - if $auto_input; then - (cd "$script_dir" && yes "" | bash "$script_base" 2>&1 | tee "$log_file") - else - (cd "$script_dir" && bash "$script_base" 2>&1 | tee "$log_file") - fi - exit_code=${PIPESTATUS[0]} - - # 处理执行结果 - if [ $exit_code -eq 0 ]; then - echo -e "\n${BOLD}${GREEN}✓ ${script_name} 执行成功!${RESET}" - echo -e "${DIM}${CYAN}$(printf '%.0s─' $(seq 1 $(tput cols)))${RESET}" - echo -e "${DIM}${CYAN}操作日志:${RESET}" - cat "$log_file" | sed -e "s/^/${DIM}${CYAN} 🠖 ${RESET}/" - echo -e "${DIM}${CYAN}$(printf '%.0s─' $(seq 1 $(tput cols)))${RESET}" - else - echo -e "\n${BOLD}${RED}✗ ${script_name} 执行失败!${RESET}" >&2 - echo -e "${DIM}${RED}$(printf '%.0s─' $(seq 1 $(tput cols)))${RESET}" >&2 - echo -e "${DIM}${RED}错误日志:${RESET}" >&2 - cat "$log_file" | sed -e "s/^/${DIM}${RED} ✗ ${RESET}/" >&2 - echo -e "${DIM}${RED}$(printf '%.0s─' $(seq 1 $(tput cols)))${RESET}" >&2 - rm "$log_file" - exit 1 - fi - - rm "$log_file" - return $exit_code -} - -# 卸载所有组件 -uninstall_all() { - echo -e "\n${CYAN}▸ 开始卸载所有Helm Release...${RESET}" - local RELEASES - RELEASES=$(helm list -n $NAMESPACE --short 2>/dev/null || true) - - if [ -n "$RELEASES" ]; then - echo -e "${YELLOW}找到以下Helm Release:${RESET}" - echo "$RELEASES" | awk '{print " ➤ "$0}' - for release in $RELEASES; do - echo -e "${BLUE}正在删除: ${release}${RESET}" - helm uninstall "$release" -n $NAMESPACE || echo -e "${RED}删除失败,继续执行...${RESET}" - done - else - echo -e "${YELLOW}未找到需要清理的Helm Release${RESET}" - fi - - echo -e "\n${CYAN}▸ 清理持久化存储...${RESET}" - local pvc_list - pvc_list=$(kubectl get pvc -n $NAMESPACE -o name 2>/dev/null || true) - - if [ -n "$pvc_list" ]; then - echo -e "${YELLOW}找到以下PVC资源:${RESET}" - echo "$pvc_list" | awk '{print " ➤ "$0}' - echo "$pvc_list" | xargs -n 1 kubectl delete -n $NAMESPACE || echo -e "${RED}删除失败,继续执行...${RESET}" - else - echo -e "${YELLOW}未找到需要清理的PVC${RESET}" - fi - - echo -e "\n${CYAN}▸ 清理Secret资源...${RESET}" - local secret_list - secret_list=$(kubectl get secret -n $NAMESPACE -o name 2>/dev/null || true) - - if [ -n "$secret_list" ]; then - echo -e "${YELLOW}找到以下Secret资源:${RESET}" - echo "$secret_list" | awk '{print " ➤ "$0}' - echo "$secret_list" | xargs -n 1 kubectl delete -n $NAMESPACE || echo -e "${RED}删除失败,继续执行...${RESET}" - else - echo -e "${YELLOW}未找到需要清理的Secret${RESET}" - fi - - echo -e "\n${BG_GREEN}${WHITE}${BOLD} ✓ 完成 ${RESET} ${GREEN}所有资源已清理完成${RESET}" -} - -# 主界面显示 -show_header() { - clear - echo -e "\n${BOLD}${MAGENTA}$(printf '✧%.0s' $(seq 1 $(tput cols)))${RESET}" - echo -e "${BOLD}${WHITE} Euler Copilot 一键部署系统 ${RESET}" - echo -e "${BOLD}${MAGENTA}$(printf '✧%.0s' $(seq 1 $(tput cols)))${RESET}" - echo -e "${CYAN}◈ 主工作目录:${YELLOW}${MAIN_DIR}${RESET}\n" -} - -# 初始化部署流程 -start_deployment() { - local total_steps=8 - local current_step=1 - - # 步骤配置(脚本路径 脚本名称 自动输入) - local steps=( - "../1-check-env/check_env.sh 环境检查 false" - "_conditional_tools_step 基础工具安装(k3s+helm) true" - "../3-install-ollama/install_ollama.sh Ollama部署 true" - "../4-deploy-deepseek/deploy_deepseek.sh Deepseek模型部署 false" - "../5-deploy-embedding/deploy-embedding.sh Embedding服务部署 false" - "../6-install-databases/install_databases.sh 数据库集群部署 false" - "../7-install-authhub/install_authhub.sh Authhub部署 true" - "_conditional_eulercopilot_step EulerCopilot部署 true" - ) - - for step in "${steps[@]}"; do - local script_path=$(echo "$step" | awk '{print $1}') - local script_name=$(echo "$step" | awk '{sub($1 OFS, ""); print $1}') - local auto_input=$(echo "$step" | awk '{print $NF}') - if [[ "$script_path" == "_conditional_tools_step" ]]; then - handle_tools_step $current_step - elif [[ "$script_path" == "_conditional_eulercopilot_step" ]]; then - handle_eulercopilot_step $current_step - elif [[ "$script_path" == "../3-install-ollama/install_ollama.sh" && x"{{ install_ollama }}" != x"true" ]]; then - echo "Step 3 is skipped" - elif [[ "$script_path" == "../4-deploy-deepseek/deploy_deepseek.sh" && x"{{ deploy_deepseek }}" != x"true" ]]; then - echo "Step 4 is skipped" - elif [[ "$script_path" == "../5-deploy-embedding/deploy-embedding.sh" && x"{{ deploy_embedding }}" != x"true" ]]; then - echo "Step 5 is skipped" - elif ! run_script_with_check "$script_path" "$script_name" $current_step $auto_input; then - echo "Error: Script execution failed" - fi - - colorful_progress $current_step $total_steps - ((current_step++)) - done - -} - -# 处理工具安装步骤 -handle_tools_step() { - local current_step=$1 - if command -v k3s >/dev/null 2>&1 && command -v helm >/dev/null 2>&1; then - echo -e "${CYAN}🠖 检测到已安装 k3s 和 helm,执行环境清理...${RESET}" - uninstall_all - else - run_script_with_check "../2-install-tools/install_tools.sh" "基础工具安装" $current_step true - fi -} - -# 处理工具安装步骤 -handle_eulercopilot_step() { - local current_step=$1 - sleep 60 - run_script_with_check "../8-install-EulerCopilot/install_eulercopilot.sh" "EulerCopilot部署" $current_step true - -} - -# 主执行流程 -show_header -start_deployment diff --git a/plugins/euler-copilot/workspace/templates/scripts/7-install-authhub/install_authhub.sh.j2 b/plugins/euler-copilot/workspace/templates/scripts/7-install-authhub/install_authhub.sh.j2 deleted file mode 100644 index 34eb4f9..0000000 --- a/plugins/euler-copilot/workspace/templates/scripts/7-install-authhub/install_authhub.sh.j2 +++ /dev/null @@ -1,176 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -RED='\033[31m' -GREEN='\033[32m' -YELLOW='\033[33m' -BLUE='\033[34m' -NC='\033[0m' - -SCRIPT_PATH="$( - cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 - pwd -)/$(basename "${BASH_SOURCE[0]}")" - -CHART_DIR="$( - canonical_path=$(readlink -f "$SCRIPT_PATH" 2>/dev/null || echo "$SCRIPT_PATH") - dirname "$(dirname "$(dirname "$canonical_path")")" -)/chart" - -# 获取系统架构 -get_architecture() { - local arch=$(uname -m) - case "$arch" in - x86_64) - arch="x86" - ;; - aarch64) - arch="arm" - ;; - *) - echo -e "${RED}错误:不支持的架构 $arch${NC}" >&2 - return 1 - ;; - esac - echo -e "${GREEN}检测到系统架构:$(uname -m)${NC}" >&2 - echo "$arch" -} - -create_namespace() { - echo -e "${BLUE}==> 检查命名空间 euler-copilot...${NC}" - if ! kubectl get namespace euler-copilot &> /dev/null; then - kubectl create namespace euler-copilot || { - echo -e "${RED}命名空间创建失败!${NC}" - return 1 - } - echo -e "${GREEN}命名空间创建成功${NC}" - else - echo -e "${YELLOW}命名空间已存在,跳过创建${NC}" - fi -} - -uninstall_authhub() { - echo -e "${BLUE}==> 清理现有资源...${NC}" - - local RELEASES - RELEASES=$(helm list -n euler-copilot --short | grep authhub || true) - - if [ -n "$RELEASES" ]; then - echo -e "${YELLOW}找到以下Helm Release,开始清理...${NC}" - for release in $RELEASES; do - echo -e "${BLUE}正在删除Helm Release: ${release}${NC}" - helm uninstall "$release" -n euler-copilot || echo -e "${RED}删除Helm Release失败,继续执行...${NC}" - done - else - echo -e "${YELLOW}未找到需要清理的Helm Release${NC}" - fi - - local pvc_name - pvc_name=$(kubectl get pvc -n euler-copilot | grep 'mysql-pvc' 2>/dev/null || true) - - if [ -n "$pvc_name" ]; then - echo -e "${YELLOW}找到以下PVC,开始清理...${NC}" - kubectl delete pvc mysql-pvc -n euler-copilot --force --grace-period=0 || echo -e "${RED}PVC删除失败,继续执行...${NC}" - else - echo -e "${YELLOW}未找到需要清理的PVC${NC}" - fi - - # 新增:删除 authhub-secret - local authhub_secret="authhub-secret" - if kubectl get secret "$authhub_secret" -n euler-copilot &>/dev/null; then - echo -e "${YELLOW}找到Secret: ${authhub_secret},开始清理...${NC}" - if ! kubectl delete secret "$authhub_secret" -n euler-copilot; then - echo -e "${RED}错误:删除Secret ${authhub_secret} 失败!${NC}" >&2 - return 1 - fi - else - echo -e "${YELLOW}未找到需要清理的Secret: ${authhub_secret}${NC}" - fi - - echo -e "${GREEN}资源清理完成${NC}" -} - -get_user_input() { - authhub_domain="{{ authhub_domain }}" -} - -helm_install() { - local arch="$1" - echo -e "${BLUE}==> 进入部署目录...${NC}" - [ ! -d "${CHART_DIR}" ] && { - echo -e "${RED}错误:部署目录不存在 ${CHART_DIR} ${NC}" - return 1 - } - cd "${CHART_DIR}" - - echo -e "${BLUE}正在安装 authhub...${NC}" - helm upgrade --install authhub -n euler-copilot ./authhub \ - --set globals.arch="$arch" \ - --set domain.authhub="${authhub_domain}" || { - echo -e "${RED}Helm 安装 authhub 失败!${NC}" - return 1 - } -} - -check_pods_status() { - echo -e "${BLUE}==> 等待初始化就绪(30秒)...${NC}" >&2 - sleep 30 - - local timeout=300 - local start_time=$(date +%s) - - echo -e "${BLUE}开始监控Pod状态(总超时时间300秒)...${NC}" >&2 - - while true; do - local current_time=$(date +%s) - local elapsed=$((current_time - start_time)) - - if [ $elapsed -gt $timeout ]; then - echo -e "${YELLOW}警告:部署超时!请检查以下资源:${NC}" >&2 - kubectl get pods -n euler-copilot -o wide - echo -e "\n${YELLOW}建议检查:${NC}" - echo "1. 查看未就绪Pod的日志: kubectl logs -n euler-copilot " - echo "2. 检查PVC状态: kubectl get pvc -n euler-copilot" - echo "3. 检查Service状态: kubectl get svc -n euler-copilot" - return 1 - fi - - local not_running=$(kubectl get pods -n euler-copilot -o jsonpath='{range .items[*]}{.metadata.name} {.status.phase} {.status.conditions[?(@.type=="Ready")].status}{"\n"}{end}' \ - | awk '$2 != "Running" || $3 != "True" {print $1 " " $2}') - - if [ -z "$not_running" ]; then - echo -e "${GREEN}所有Pod已正常运行!${NC}" >&2 - kubectl get pods -n euler-copilot -o wide - return 0 - else - echo "等待Pod就绪(已等待 ${elapsed} 秒)..." - echo "当前未就绪Pod:" - echo "$not_running" | awk '{print " - " $1 " (" $2 ")"}' - sleep 10 - fi - done -} - -main() { - local arch - arch=$(get_architecture) || exit 1 - create_namespace || exit 1 - uninstall_authhub || exit 1 - get_user_input || exit 1 - helm_install "$arch" || exit 1 - check_pods_status || { - echo -e "${RED}部署失败:Pod状态检查未通过!${NC}" - exit 1 - } - - echo -e "\n${GREEN}=========================" - echo -e "Authhub 部署完成!" - echo -e "查看pod状态:kubectl get pod -n euler-copilot" - echo -e "Authhub登录地址为: https://${authhub_domain}" - echo -e "默认账号密码: administrator/changeme" - echo -e "=========================${NC}" -} - -trap 'echo -e "${RED}操作被中断!${NC}"; exit 1' INT -main "$@" diff --git a/plugins/euler-copilot/workspace/templates/scripts/8-install-EulerCopilot/install_eulercopilot.sh.j2 b/plugins/euler-copilot/workspace/templates/scripts/8-install-EulerCopilot/install_eulercopilot.sh.j2 deleted file mode 100644 index f6d33ca..0000000 --- a/plugins/euler-copilot/workspace/templates/scripts/8-install-EulerCopilot/install_eulercopilot.sh.j2 +++ /dev/null @@ -1,325 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -# 颜色定义 -RED='\e[31m' -GREEN='\e[32m' -YELLOW='\e[33m' -BLUE='\e[34m' -NC='\e[0m' # 恢复默认颜色 - -NAMESPACE="euler-copilot" -PLUGINS_DIR="/home/eulercopilot/semantics" - -SCRIPT_PATH="$( - cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 - pwd -)/$(basename "${BASH_SOURCE[0]}")" - -DEPLOY_DIR="$( - canonical_path=$(readlink -f "$SCRIPT_PATH" 2>/dev/null || echo "$SCRIPT_PATH") - dirname "$(dirname "$(dirname "$canonical_path")")" -)" - - -# 获取系统架构 -get_architecture() { - local arch=$(uname -m) - case "$arch" in - x86_64) arch="x86" ;; - aarch64) arch="arm" ;; - *) - echo -e "${RED}错误:不支持的架构 $arch${NC}" >&2 - return 1 - ;; - esac - echo -e "${GREEN}检测到系统架构:${arch} (原始标识: $(uname -m))${NC}" >&2 - echo "$arch" -} - -# 自动检测业务网口 -get_network_ip() { - echo -e "${BLUE}自动检测业务网络接口 IP 地址...${NC}" >&2 - local timeout=20 - local start_time=$(date +%s) - local interface="" - local host="" - - # 查找可用的网络接口 - while [ $(( $(date +%s) - start_time )) -lt $timeout ]; do - # 获取所有非虚拟接口(排除 lo, docker, veth 等) - interfaces=$(ip -o link show | awk -F': ' '{print $2}' | grep -vE '^lo$|docker|veth|br-|virbr|tun') - - for intf in $interfaces; do - # 检查接口状态是否为 UP - if ip link show "$intf" | grep -q 'state UP'; then - # 获取 IPv4 地址 - ip_addr=$(ip addr show "$intf" | grep -w inet | awk '{print $2}' | cut -d'/' -f1) - if [ -n "$ip_addr" ]; then - interface=$intf - host=$ip_addr - break 2 # 跳出两层循环 - fi - fi - done - sleep 1 - done - - if [ -z "$interface" ]; then - echo -e "${RED}错误:未找到可用的业务网络接口${NC}" >&2 - exit 1 - fi - - echo -e "${GREEN}使用网络接口:${interface},IP 地址:${host}${NC}" >&2 - echo "$host" -} - - -# 处理域名 -get_domain_input() { - # 从环境变量读取或使用默认值 - eulercopilot_domain="{{ eulercopilot_domain }}" - authhub_domain="{{ authhub_domain }}" -} - -get_client_info_auto() { - get_domain_input - # 直接调用Python脚本并传递域名参数 - python3 "${DEPLOY_DIR}/scripts/9-other-script/get_client_id_and_secret.py" "${eulercopilot_domain}" > 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 - - # 输出结果 - echo -e "${GREEN}==============================${NC}" - echo -e "${GREEN}Client ID: ${client_id}${NC}" - echo -e "${GREEN}Client Secret: ${client_secret}${NC}" - echo -e "${GREEN}==============================${NC}" -} - -get_client_info_manual() { - - # 非交互模式直接使用默认值 - if [ -t 0 ]; then # 仅在交互式终端显示提示 - echo -e "${BLUE}请输入 Client ID: 域名(端点信息:Client ID): ${NC}" - read -p "> " input_id - [ -n "$input_id" ] && client_id=$input_id - - echo -e "${BLUE}请输入 Client Secret: 域名(端点信息:Client Secret):${NC}" - read -p "> " input_secret - [ -n "$input_secret" ] && client_secret=$input_secret - fi - - # 统一验证域名格式 - echo -e "${GREEN}使用配置:" - echo "Client ID: $client_id" - echo "Client Secret: $client_secret" - -} - -# 检查语义接口是否存在 -check_directories() { - echo -e "${BLUE}检查语义接口目录是否存在...${NC}" >&2 - if [ -d "${PLUGINS_DIR}" ]; then - echo -e "${GREEN}目录已存在:${PLUGINS_DIR}${NC}" >&2 - else - if mkdir -p "${PLUGINS_DIR}"; then - echo -e "${GREEN}目录已创建:${PLUGINS_DIR}${NC}" >&2 - mkdir -p "${PLUGINS_DIR}"/app "${PLUGINS_DIR}"/service "${PLUGINS_DIR}"/call - chmod -R 775 ${PLUGINS_DIR}/* - else - echo -e "${RED}错误:无法创建目录 ${PLUGINS_DIR}${NC}" >&2 - exit 1 - fi - fi -} - -uninstall_eulercopilot() { - echo -e "${YELLOW}检查是否存在已部署的 EulerCopilot...${NC}" >&2 - - # 删除 Helm Release: euler-copilot - if helm list -n euler-copilot --short | grep -q '^euler-copilot$'; then - echo -e "${GREEN}找到Helm Release: euler-copilot,开始清理...${NC}" - if ! helm uninstall euler-copilot -n euler-copilot; then - echo -e "${RED}错误:删除Helm Release euler-copilot 失败!${NC}" >&2 - return 1 - fi - else - echo -e "${YELLOW}未找到需要清理的Helm Release: euler-copilot${NC}" - fi - - # 删除 PVC: framework-semantics-claim - local pvc_name="framework-semantics-claim" - if kubectl get pvc "$pvc_name" -n euler-copilot &>/dev/null; then - echo -e "${GREEN}找到PVC: ${pvc_name},开始清理...${NC}" - if ! kubectl delete pvc "$pvc_name" -n euler-copilot --force --grace-period=0; then - echo -e "${RED}错误:删除PVC ${pvc_name} 失败!${NC}" >&2 - return 1 - fi - else - echo -e "${YELLOW}未找到需要清理的PVC: ${pvc_name}${NC}" - fi - - # 删除 Secret: euler-copilot-system - local secret_name="euler-copilot-system" - if kubectl get secret "$secret_name" -n euler-copilot &>/dev/null; then - echo -e "${GREEN}找到Secret: ${secret_name},开始清理...${NC}" - if ! kubectl delete secret "$secret_name" -n euler-copilot; then - echo -e "${RED}错误:删除Secret ${secret_name} 失败!${NC}" >&2 - return 1 - fi - else - echo -e "${YELLOW}未找到需要清理的Secret: ${secret_name}${NC}" - fi - - echo -e "${GREEN}资源清理完成${NC}" -} - -# 修改配置文件 -modify_yaml() { - local host=$1 - echo -e "${BLUE}开始修改YAML配置文件...${NC}" >&2 - python3 "${DEPLOY_DIR}/scripts/9-other-script/modify_eulercopilot_yaml.py" \ - "${DEPLOY_DIR}/chart/euler_copilot/values.yaml" \ - "${DEPLOY_DIR}/chart/euler_copilot/values.yaml" \ - --set "models.answer.url={{ models.answer.url }}" \ - --set "models.answer.key={{ models.answer.key }}" \ - --set "models.answer.name={{ models.answer.name }}" \ - --set "models.answer.ctx_length={{ models.answer.ctx_length }}" \ - --set "models.answer.max_tokens={{ models.answer.max_tokens }}" \ - --set "models.embedding.url={{ models.embedding.url }}" \ - --set "models.embedding.key={{ models.embedding.key }}" \ - --set "models.embedding.name={{ models.embedding.name }}" \ - --set "login.client.id=${client_id}" \ - --set "login.client.secret=${client_secret}" \ - --set "domain.authhub=${authhub_domain}" \ - --set "domain.euler_copilot=${eulercopilot_domain}" || { - echo -e "${RED}错误:YAML文件修改失败${NC}" >&2 - exit 1 - } - echo -e "${GREEN}YAML文件修改成功!${NC}" >&2 -} - -# 检查目录 -enter_chart_directory() { - echo -e "${BLUE}进入Chart目录...${NC}" >&2 - cd "${DEPLOY_DIR}/chart/" || { - echo -e "${RED}错误:无法进入Chart目录 ${DEPLOY_DIR}/chart/${NC}" >&2 - exit 1 - } -} - -# 执行安装 -execute_helm_install() { - local arch=$1 - echo -e "${BLUE}开始部署EulerCopilot(架构: $arch)...${NC}" >&2 - - enter_chart_directory - helm upgrade --install $NAMESPACE -n $NAMESPACE ./euler_copilot --set globals.arch=$arch --create-namespace || { - echo -e "${RED}Helm 安装 EulerCopilot 失败!${NC}" >&2 - exit 1 - } - echo -e "${GREEN}Helm安装 EulerCopilot 成功!${NC}" >&2 -} - -# 检查pod状态 -check_pods_status() { - echo -e "${BLUE}==> 等待初始化就绪(30秒)...${NC}" >&2 - sleep 30 - - local timeout=300 - local start_time=$(date +%s) - - echo -e "${BLUE}开始监控Pod状态(总超时时间300秒)...${NC}" >&2 - - while true; do - local current_time=$(date +%s) - local elapsed=$((current_time - start_time)) - - if [ $elapsed -gt $timeout ]; then - echo -e "${YELLOW}警告:部署超时!请检查以下资源:${NC}" >&2 - kubectl get pods -n $NAMESPACE -o wide - echo -e "\n${YELLOW}建议检查:${NC}" - echo "1. 查看未就绪Pod的日志: kubectl logs -n $NAMESPACE " - echo "2. 检查PVC状态: kubectl get pvc -n $NAMESPACE" - echo "3. 检查Service状态: kubectl get svc -n $NAMESPACE" - return 1 - fi - - local not_running=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name} {.status.phase} {.status.conditions[?(@.type=="Ready")].status}{"\n"}{end}' \ - | awk '$2 != "Running" || $3 != "True" {print $1 " " $2}') - - if [ -z "$not_running" ]; then - echo -e "${GREEN}所有Pod已正常运行!${NC}" >&2 - kubectl get pods -n $NAMESPACE -o wide - return 0 - else - echo "等待Pod就绪(已等待 ${elapsed} 秒)..." - echo "当前未就绪Pod:" - echo "$not_running" | awk '{print " - " $1 " (" $2 ")"}' - sleep 10 - fi - done -} - -main() { - local arch host - arch=$(get_architecture) || exit 1 - host=$(get_network_ip) || exit 1 - uninstall_eulercopilot - if ! get_client_info_auto; then - echo -e "${YELLOW}需要手动登录Authhub域名并创建应用,获取client信息${NC}" - get_client_info_manual - fi - check_directories - modify_yaml "$host" - execute_helm_install "$arch" - - if check_pods_status; then - echo -e "${GREEN}所有组件已就绪!${NC}" - else - echo -e "${YELLOW}注意:部分组件尚未就绪,建议进行排查${NC}" >&2 - fi - - # 最终部署信息输出 - echo -e "\n${GREEN}==================================================${NC}" - echo -e "${GREEN} EulerCopilot 部署完成! ${NC}" - echo -e "${GREEN}==================================================${NC}" - echo -e "${YELLOW}访问地址:" - echo -e "EulerCopilot UI:\thttps://${eulercopilot_domain}" - echo -e "AuthHub 管理界面:\thttps://${authhub_domain}" - echo -e "\n${YELLOW}系统信息:" - echo -e "业务网络IP:\t${host}" - echo -e "系统架构:\t$(uname -m) (识别为: ${arch})" - echo -e "插件目录:\t${PLUGINS_DIR}" - echo -e "Chart目录:\t${DEPLOY_DIR}/chart/${NC}" - echo -e "" - echo -e "${BLUE}操作指南:" - echo -e "1. 查看集群状态: kubectl get all -n $NAMESPACE" - echo -e "2. 查看实时日志: kubectl logs -n $NAMESPACE -f deployment/$NAMESPACE" - echo -e "3. 查看POD状态:kubectl get pods -n $NAMESPACE" - echo -e "4. 查看数据库并使用base64密码:kubectl edit secret $NAMESPACE-system -n $NAMESPACE" - echo -e "5. 添加域名解析(示例):" - echo -e " ${host} ${eulercopilot_domain}" - echo -e " ${host} ${authhub_domain}${NC}" -} - -main - diff --git a/plugins/euler-copilot/workspace/templates/values.yaml.j2 b/plugins/euler-copilot/workspace/templates/values.yaml.j2 new file mode 100644 index 0000000..54c48df --- /dev/null +++ b/plugins/euler-copilot/workspace/templates/values.yaml.j2 @@ -0,0 +1,158 @@ +# 全局设置 +globals: + # 节点架构:默认是x86 + # 节点设置:["x86", "arm"] + arch: + # 镜像拉取策略, 默认为IfNotPresent + imagePullPolicy: + # 存储类;默认为local-path + storageClass: + +# 模型设置 +models: + # 用于问答的大模型;需要为OpenAI兼容接口 + answer: + # [必填] 接口URL(无需带上“v1”后缀) + endpoint: {{ models.answer.endpoint }} + # [必填] 接口API Key;默认置空 + key: {{ models.answer.key }} + # [必填] 模型名称 + name: {{ models.answer.name }} + # [必填] 模型最大上下文数;建议>=8192 + ctxLength: {{ models.answer.ctxLength }} + # 模型最大输出长度,建议>=2048 + maxTokens: {{ models.answer.maxTokens }} + # 用于Function Call的模型;建议使用特定推理框架 + functionCall: + # 推理框架类型,默认为ollama + # 可用的框架类型:["vllm", "sglang", "ollama", "openai"] + backend: {{ models.functionCall.backend }} + # 模型地址;不填则与问答模型一致 + endpoint: {{ models.functionCall.endpoint }} + # API Key;不填则与问答模型一致 + key: {{ models.functionCall.key }} + # 模型名称;不填则与问答模型一致 + name: {{ models.functionCall.name }} + # 模型最大上下文数;不填则与问答模型一致 + ctxLength: {{ models.functionCall.ctxLength }} + # 模型最大输出长度;不填则与问答模型一致 + maxTokens: {{ models.functionCall.maxTokens }} + # 用于数据向量化(Embedding)的模型 + embedding: + # 推理框架类型,默认为openai + # [必填] Embedding接口类型:["openai", "mindie"] + type: {{ models.embedding.type }} + # [必填] Embedding URL(需要带上“v1”后缀) + endpoint: {{ models.embedding.endpoint }} + # [必填] Embedding 模型API Key + key: {{ models.embedding.key }} + # [必填] Embedding 模型名称 + name: {{ models.embedding.name }} + +# 登录设置 +login: + # 客户端ID设置,仅在type为authhub时有效 + client: + # [必填] 客户端ID + id: + # [必填] 客户端密钥 + secret: + +# 域名设置 +domain: + # 用于EulerCopilot的域名;默认为www.eulercopilot.local + euler_copilot: + # 部署authhub时使用的域名;默认为suthhub.eulercopilot.local + authhub: + +# 存储设置 +storage: + # 语义接口 + frameworkSemantics: + # 语义接口地址 + path: + # 语义接口存储大小,默认为5GB + size: + +euler_copilot: + # 配置文件工具 + secretInject: + # 镜像设置;默认为hub.oepkgs.net/neocopilot/secret_inject:dev-x86 + # 镜像标签:["dev-x86", "dev-arm"] + image: + + framework: + # [必填] 是否部署Framework后端框架服务 + enabled: true + # 镜像设置;默认为hub.oepkgs.net/neocopilot/euler-copilot-framework:0.9.5-x86 + # 镜像标签:["0.9.5-x86", "0.9.5-arm"] + image: + # 容器根目录只读 + readOnly: + # 性能限制设置 + resourceLimits: {} + # Service设置 + service: + # Service类型,例如NodePorts + type: + # 当类型为nodePort时,填写主机的端口号 + nodePort: + + web: + # [必填] 是否部署Web前端用户界面 + enabled: true + # 镜像设置;默认为hub.oepkgs.net/neocopilot/euler-copilot-web:0.9.5-x86 + # 镜像标签:["0.9.5-x86", "0.9.5-arm"] + image: + # 容器根目录只读 + readOnly: + # 性能限制设置 + resourceLimits: {} + # Service设置 + service: + # Service类型,例如NodePort + type: + # 当类型为NodePort时,填写主机的端口号 + nodePort: + # Ingress设置 + ingress: + # URI前缀,默认为/ + prefix: + + rag_web: + # [必填] 是否部署RAG Web前端用户界面 + enabled: true + # 镜像设置;默认为hub.oepkgs.net/neocopilot/data_chain_web:0.9.5-x86 + # 镜像标签:["0.9.5-x86", "0.9.5-arm"] + image: + # 容器根目录只读 + readOnly: + # 性能限制设置 + resourceLimits: {} + # Service设置 + service: + # Service类型,例如NodePort + type: + # 当类型为NodePort时,填写主机的端口号 + nodePort: + # Ingress设置 + ingress: + # URI前缀;默认为/ + prefix: + + rag: + # [必填] 是否部署RAG后端服务 + enabled: true + # 镜像设置;默认为hub.oepkgs.net/neocopilot/data_chain_back_end:0.9.5-x86 + # 镜像标签:["0.9.5-x86", "0.9.5-arm"] + image: + # 容器根目录只读 + readOnly: + # 性能限制设置 + resourceLimits: {} + # Service设置 + service: + # Service类型,例如NodePort + type: + # 当类型为NodePort时,填写主机的端口号 + nodePort: -- Gitee