diff --git a/deploy/chart/euler_copilot/configs/framework/.env b/deploy/chart/euler_copilot/configs/framework/.env index 99e48bca0862ffe202c92144df1afebab1bf484f..bf15c85bad099fc1590ac2e40c777bb66a9e2135 100644 --- a/deploy/chart/euler_copilot/configs/framework/.env +++ b/deploy/chart/euler_copilot/configs/framework/.env @@ -34,7 +34,7 @@ SESSION_TTL=30 LOG="stdout" # Embedding -EMBEDDING_URL={{ .Values.models.embedding.url }} +EMBEDDING_URL={{ .Values.models.embedding.url }}/v1/embeddings EMBEDDING_KEY={{ .Values.models.embedding.key }} EMBEDDING_MODEL={{ .Values.models.embedding.name }} diff --git a/deploy/scripts/7-install-authhub/install_authhub.sh b/deploy/scripts/7-install-authhub/install_authhub.sh index 0ef7f18f35ffc6de71e25f3daf802e03e6285b74..271fa0f82a64b15b0d23f8875d2702f2022193eb 100644 --- a/deploy/scripts/7-install-authhub/install_authhub.sh +++ b/deploy/scripts/7-install-authhub/install_authhub.sh @@ -1,4 +1,6 @@ #!/bin/bash + + set -eo pipefail RED='\033[31m' @@ -10,7 +12,6 @@ NC='\033[0m' SCRIPTS_DIR=/home/euler-copilot-framework/deploy/scripts/8-install-EulerCopilot CHART_DIR=/home//euler-copilot-framework/deploy/chart - create_namespace() { echo -e "${BLUE}==> 检查命名空间 euler-copilot...${NC}" if ! kubectl get namespace euler-copilot &> /dev/null; then @@ -53,26 +54,22 @@ delete_pvcs() { echo -e "${GREEN}资源清理完成${NC}" } - -# 获取用户输入参数 get_user_input() { - echo -e "${BLUE}请输入 Authhub的域名配置:${NC}" - echo - - read -p "Authhub的前端域名: " authhub_domain - if ! [[ "${authhub_domain}" =~ ^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$ ]]; then - echo -e "${RED}错误:输入的AuthHub域名格式不正确${NC}" - exit 1 - fi + echo -e "${BLUE}请输入 Authhub 的域名配置(直接回车使用默认值 authhub.eulercopilot.local):${NC}" + read -p "Authhub 的前端域名: " authhub_domain if [[ -z "$authhub_domain" ]]; then - echo -e "${RED}错误:所有输入字段都不能为空${NC}" - exit 1 + authhub_domain="authhub.eulercopilot.local" + echo -e "${GREEN}使用默认域名:${authhub_domain}${NC}" + else + if ! [[ "${authhub_domain}" =~ ^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$ ]]; then + echo -e "${RED}错误:输入的AuthHub域名格式不正确${NC}" + exit 1 + fi + echo -e "${GREEN}输入域名:${authhub_domain}${NC}" fi } - -# 修改YAML配置文件的方法 modify_yaml() { echo -e "${BLUE}开始修改YAML配置文件...${NC}" python "${SCRIPTS_DIR}/modify_eulercopilot_yaml.py" \ @@ -87,7 +84,6 @@ modify_yaml() { echo -e "${GREEN}YAML文件修改成功!${NC}" } - helm_install() { echo -e "${BLUE}==> 进入部署目录...${NC}" [ ! -d "${CHART_DIR}" ] && { @@ -103,15 +99,14 @@ helm_install() { } } -# 检查Pod状态 check_pods_status() { echo -e "${BLUE}==> 等待初始化就绪(30秒)...${NC}" - sleep 30 # 初始等待时间 + sleep 30 local timeout=300 local start_time=$(date +%s) - echo -e "${BLUE}开始监控Pod状态(总超时时间300秒)...${NC}" + echo -e "${BLUE}开始监控Authhub Pod状态(总超时时间300秒)...${NC}" while true; do local current_time=$(date +%s) @@ -119,16 +114,16 @@ check_pods_status() { if [ $elapsed -gt $timeout ]; then echo -e "${RED}错误:部署超时!${NC}" - kubectl get pods -n euler-copilot + kubectl get pods -n euler-copilot --selector=app.kubernetes.io/instance=authhub return 1 fi - # 检查所有Pod状态 - local not_running=$(kubectl get pods -n euler-copilot -o jsonpath='{range .items[*]}{.metadata.name} {.status.phase}{"\n"}{end}' | grep -v "Running") + # 检查所有属于authhub的Pod状态 + local not_running=$(kubectl get pods -n euler-copilot --selector=app.kubernetes.io/instance=authhub -o jsonpath='{range .items[*]}{.metadata.name} {.status.phase}{"\n"}{end}' | grep -v "Running") if [ -z "$not_running" ]; then - echo -e "${GREEN}所有Pod已正常运行!${NC}" - kubectl get pods -n euler-copilot + echo -e "${GREEN}所有Authhub Pod已正常运行!${NC}" + kubectl get pods -n euler-copilot --selector=app.kubernetes.io/instance=authhub return 0 else echo "等待Pod就绪(已等待 ${elapsed} 秒)..." @@ -139,7 +134,6 @@ check_pods_status() { done } -# 主执行流程 main() { create_namespace delete_pvcs @@ -150,9 +144,10 @@ main() { echo -e "\n${GREEN}=========================" echo "Authhub 部署完成!" + 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/deploy/scripts/8-install-EulerCopilot/install_eulercopilot.sh b/deploy/scripts/8-install-EulerCopilot/install_eulercopilot.sh index 724d987c8a7e645eba56d9e3639909a797bd5379..005a7645fd51514457274705d386f51850a4ce69 100644 --- a/deploy/scripts/8-install-EulerCopilot/install_eulercopilot.sh +++ b/deploy/scripts/8-install-EulerCopilot/install_eulercopilot.sh @@ -1,6 +1,8 @@ #!/bin/bash +set -eo pipefail + # 颜色定义 RED='\e[31m' GREEN='\e[32m' @@ -9,15 +11,15 @@ BLUE='\e[34m' NC='\e[0m' # 恢复默认颜色 SCRIPTS_DIR=/home/euler-copilot-framework/deploy/scripts/8-install-EulerCopilot -CHART_DIR=/home//euler-copilot-framework/deploy/chart -PLUGINS_DIR="/home/eulercopilot/sematics" +CHART_DIR=/home/euler-copilot-framework/deploy/chart +PLUGINS_DIR="/home/eulercopilot/semantics" get_eth0_ip() { echo -e "${BLUE}获取 eth0 网络接口 IP 地址...${NC}" local timeout=20 local start_time=$(date +%s) local interface="eth0" - + # 检查 eth0 是否存在,并等待其变为可用状态 while [ $(( $(date +%s) - start_time )) -lt $timeout ]; do if ip link show "$interface" > /dev/null 2>&1; then @@ -43,39 +45,65 @@ get_eth0_ip() { echo -e "${GREEN}使用网络接口:${interface},IP 地址:${host}${NC}" } -# 获取用户输入参数 get_user_input() { echo -e "${BLUE}请输入 OAuth 客户端配置:${NC}" read -p "Client ID: " client_id read -s -p "Client Secret: " client_secret + echo - read -p "Web前端域名: " eulercopilot_domain - if ! [[ "${eulercopilot_domain}" =~ ^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$ ]]; then - echo -e "${RED}错误:输入的Copilot域名格式不正确${NC}" - exit 1 + # 检查必填字段 + if [[ -z "$client_id" || -z "$client_secret" ]]; then + echo -e "${RED}错误:Client Secret 存在空行,请重新输入${NC}" + read -s -p "Client Secret: " client_secret + echo + echo -e "${GREEN}Client Secret 已正确输入${NC}" fi - read -p "Authhub的前端域名: " authhub_domain - if ! [[ "${authhub_domain}" =~ ^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$ ]]; then - echo -e "${RED}错误:输入的AuthHub域名格式不正确${NC}" - exit 1 + # 处理Copilot域名 + echo -e "${BLUE}请输入 EulerCopilot 域名(直接回车使用默认值 www.eulercopilot.local):${NC}" + read -p "EulerCopilot 的前端域名: " eulercopilot_domain + + if [[ -z "$eulercopilot_domain" ]]; then + eulercopilot_domain="www.eulercopilot.local" + echo -e "${GREEN}使用默认域名:${eulercopilot_domain}${NC}" + else + if ! [[ "${eulercopilot_domain}" =~ ^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$ ]]; then + echo -e "${RED}错误:输入的EulerCopilot域名格式不正确${NC}" + exit 1 + fi + echo -e "${GREEN}输入域名:${eulercopilot_domain}${NC}" fi - if [[ -z "$client_id" || -z "$client_secret" || -z "$eulercopilot_domain" || -z "$authhub_domain" ]]; then - echo -e "${RED}错误:所有输入字段都不能为空${NC}" - exit 1 + # 处理Authhub域名 + echo -e "${BLUE}请输入 Authhub 的域名配置(直接回车使用默认值 authhub.eulercopilot.local):${NC}" + read -p "Authhub 的前端域名: " authhub_domain + if [[ -z "$authhub_domain" ]]; then + authhub_domain="authhub.eulercopilot.local" + echo -e "${GREEN}使用默认域名:${authhub_domain}${NC}" + else + if ! [[ "${authhub_domain}" =~ ^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$ ]]; then + echo -e "${RED}错误:输入的AuthHub域名格式不正确${NC}" + exit 1 + fi + echo -e "${GREEN}输入域名:${authhub_domain}${NC}" fi + } -# 创建必要目录 -create_directories() { - echo -e "${BLUE}检查并创建数据目录...${NC}" - if ! mkdir -p "${PLUGINS_DIR}"; then - echo -e "${RED}错误:无法创建目录 ${PLUGINS_DIR}${NC}" - exit 1 +# 检查必要目录 +check_directories() { + echo -e "${BLUE}检查语义接口目录是否存在...${NC}" + if [ -d "${PLUGINS_DIR}" ]; then + echo -e "${GREEN}目录已存在:${PLUGINS_DIR}${NC}" + else + if mkdir -p "${PLUGINS_DIR}"; then + echo -e "${GREEN}目录已创建:${PLUGINS_DIR}${NC}" + else + echo -e "${RED}错误:无法创建目录 ${PLUGINS_DIR}${NC}" + exit 1 + fi fi - echo -e "${GREEN}目录已就绪:${PLUGINS_DIR}${NC}" } # 安装前检查并删除已有部署 @@ -111,15 +139,10 @@ modify_yaml() { --set "models.embedding.url=http://$host:11434" \ --set "models.embedding.key=sk-123456" \ --set "models.embedding.name=bge-m3" \ - --set "login.type=authhub" \ --set "login.client.id=${client_id}" \ --set "login.client.secret=${client_secret}" \ - --set "login.oidc.token_url=http://authhub-backend-service-authhub.euler-copilot.svc.cluster.local:11120/oauth2/token" \ - --set "login.oidc.user_url=http://authhub-backend-service-authhub.euler-copilot.svc.cluster.local:11120/oauth2/introspect" \ - --set "login.oidc.refresh_url=http://authhub-backend-service-authhub.euler-copilot.svc.cluster.local:11120/oauth2/refresh-token" \ - --set "login.oidc.redirect=https://${authhub_domain}/oauth2/authorize?client_id=${client_id}&redirect_uri=https://${eulercopilot_domain}/api/auth/login&scope=openid offline_access&access_type=offline&response_type=code&prompt=consent&state=235345&nonce=loser" \ - --set "domain.euler_copilot=${eulercopilot_domain}" \ - --set "domain.authhub=${authhub_domain}" + --set "domain.authhub=${authhub_domain}" \ + --set "domain.euler_copilot=${eulercopilot_domain}" if [ $? -ne 0 ]; then echo -e "${RED}错误:YAML文件修改失败${NC}" @@ -153,22 +176,25 @@ check_pods_status() { echo -e "${BLUE}==> 等待初始化就绪(30秒)...${NC}" sleep 30 - local timeout=300 + local timeout=100 local start_time=$(date +%s) echo -e "${BLUE}开始监控Pod状态(总超时时间300秒)...${NC}" + echo -e "${BLUE}镜像拉取中...${NC}" while true; do local current_time=$(date +%s) local elapsed=$((current_time - start_time)) + # 超时处理逻辑 if [ $elapsed -gt $timeout ]; then - echo -e "${RED}错误:部署超时!${NC}" + echo -e "${YELLOW}警告:部署超时!请检查以下Pod状态:${NC}" kubectl get pods -n euler-copilot + echo -e "${YELLOW}注意:部分Pod可能仍在启动中,可稍后手动检查${NC}" return 1 fi - - # 修改核心检测逻辑:同时检查Phase和Ready状态 + + # 检查所有Pod状态 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}' @@ -180,10 +206,9 @@ check_pods_status() { return 0 else echo "等待Pod就绪(已等待 ${elapsed} 秒)..." - echo "当前异常Pod:" + echo "当前未启动Pod:" echo "$not_running" | awk '{print " - " $1 " (" $2 ")"}' sleep 10 - return 1 fi done } @@ -192,20 +217,33 @@ check_pods_status() { main() { get_eth0_ip get_user_input - create_directories + check_directories check_and_delete_existing_deployment modify_yaml enter_chart_directory execute_helm_install - check_pods_status + # Pod状态检查并处理结果 + if check_pods_status; then + echo -e "${GREEN}所有组件已就绪!${NC}" + else + echo -e "${YELLOW}注意:部分组件尚未就绪,可稍后手动检查${NC}" + fi + + # 最终部署信息输出 echo -e "\n${GREEN}==================================================${NC}" - echo -e "${GREEN} EulerCopilot 部署成功! ${NC}" + echo -e "${GREEN} EulerCopilot 部署完成! ${NC}" echo -e "${GREEN}==================================================${NC}" - echo -e "${YELLOW}插件目录:${PLUGINS_DIR}${NC}" - echo -e "${YELLOW}Chart目录位置:${CHART_DIR}${NC}" - echo -e "${YELLOW}Copilot前端访问地址:https://${eulercopilot_domain}${NC}" - echo -e "${YELLOW}AuthHub前端地址:https://${authhub_domain}${NC}" + echo -e "${YELLOW}EulerCopilot访问地址:\thttps://${eulercopilot_domain}${NC}" + echo -e "${YELLOW}AuthHub管理地址:\thttps://${authhub_domain}${NC}" + echo -e "${YELLOW}插件目录:\t\t${PLUGINS_DIR}${NC}" + echo -e "${YELLOW}Chart目录:\t${CHART_DIR}${NC}" + echo + echo -e "${BLUE}温馨提示:" + echo -e "${BLUE}1. 请确保域名已正确解析到集群Ingress地址${NC}" + echo -e "${BLUE}2. 首次拉取RAG镜像可能需要约1-3分钟,POD会稍后自动启动${NC}" + echo -e "${BLUE}3. 查看实时状态:kubectl get pods -n euler-copilot${NC}" + echo -e "${BLUE}4. 查看镜像:k3s crictl images${NC}" } # 调用主函数 diff --git "a/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/\347\275\221\347\273\234\347\216\257\345\242\203\344\270\213\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/\347\275\221\347\273\234\347\216\257\345\242\203\344\270\213\351\203\250\347\275\262\346\214\207\345\215\227.md" index 35a0be7b3880c00f29221681c58aed8d949dae6e..a45cb297f67142bee5f498b3cd813fc86c8df7d5 100644 --- "a/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/\347\275\221\347\273\234\347\216\257\345\242\203\344\270\213\351\203\250\347\275\262\346\214\207\345\215\227.md" +++ "b/docs/user-guide/\351\203\250\347\275\262\346\214\207\345\215\227/\347\275\221\347\273\234\347\216\257\345\242\203\344\270\213\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -40,7 +40,7 @@ EulerCopilot 是一款智能问答工具,使用 EulerCopilot 可以解决操 |--------------|----------------------------|------------------------------| | CPU | 4 核心 | 16 核心及以上 | | RAM | 4 GB | 64 GB | -| 存储 | 32 GB | 500G | +| 存储 | 32 GB | 64G | | 大模型名称 | deepseek-llm-7b-chat | DeepSeek-R1-Llama-8B | | 显存 (GPU) | 8 GB (NVIDIA RTX A4000, 1个) | 16 GB (NVIDIA A100, 2个) | @@ -62,17 +62,16 @@ EulerCopilot 是一款智能问答工具,使用 EulerCopilot 可以解决操 --- ### 域名要求 -为确保 EulerCopilot 的正确部署和使用,请准备以下四个服务的域名:minio、authhub、eulercopilot。这些子域名需属于同一个主域名下,例如 `minio.test.com`、`authhub.test.com`、`eulercopilot.test.com` +为确保 EulerCopilot 的正确部署和使用,请准备以下两个服务的域名:authhub、eulercopilot。这些子域名需属于同一个主域名下,例如 `www.eulercopilot.local`,`authhub.eulercopilot.local ` 您可以通过两种方式来完成这项准备工作: -- **预先申请域名**:为每个服务(Minio、AuthHub、Euler Copilot)分别注册上述格式的子域名。 +- **预先申请域名**:为每个服务(AuthHub、Euler Copilot)分别注册上述格式的子域名。 - **本地配置**:如果是在开发或测试环境中,您可以直接在本地Windows主机文件中进行配置。打开位于 `C:\Windows\System32\drivers\etc\hosts` 的文件,并添加相应的条目以映射这些子域名到本地或特定的IP地址,例如: ```bash -127.0.0.1 minio.test.com -127.0.0.1 authhub.test.com -127.0.0.1 eulercopilot.test.com +172.0.0.1 authhub.eulercopilot.local +172.0.0.1 www.eulercopilot.local ``` ## 快速开始 ### 一键部署 @@ -138,8 +137,8 @@ sudo ./deploy.sh **注意事项** 1. 全程都需要保持互联网连接 2. 首次模型下载可能耗时较长(约30-60分钟) -3. 在部署过程中,您需要提供 Authhub 域名和 EulerCopilot 域名。 -4. 请先通过浏览器访问 http://authhub.test.com 来手动创建 EulerCopilot 应用,并从生成的凭证中获取 client_id 和 client_secret。随后,请将这两个值准确无误地输入到部署控制台对应的位置。这样确保了在部署 EulerCopilot 之前,已正确配置其所需的认证信息。 +3. 在部署过程中,您需要输入 Authhub 域名和 EulerCopilot 域名, 不输入则使用默认域名`authhub.eulercopilot.local`, `www.eulercopilot.local`。 +4. Authhub部署完成后需要通过浏览器访问 `http://authhub.eulercopilot.local` 来手动创建 EulerCopilot 应用,并从生成的凭证中获取 client_id 和 client_secret。随后,请将这两个值准确无误地输入到部署控制台对应的位置。这样确保了在部署 EulerCopilot 之前,已正确配置其所需的认证信息。 ![部署图](./pictures/authhub登录界面.png) **AuthHub 登录默认账号 `administrator`, 密码 `changeme`** @@ -147,8 +146,8 @@ sudo ./deploy.sh ![部署图](./pictures/创建应用界面.png) 点击**创建应用**后,请按照以下示例填写相关信息: - **应用名称**: EulerCopilot -- **应用主页 URL**: https://eulercopilot.test.com -- **应用回调地址(登录后)**: https://eulercopilot.test.com/api/auth/login +- **应用主页 URL**: https://www.eulercopilot.local +- **应用回调地址(登录后)**: https://www.eulercopilot.local/api/auth/login - 点击**创建**,即可完成应用创建流程,系统将自动生成一个 **Client ID** 和 **Client Secret**。请保存好这对凭据,稍后在 `deploy/chart/euler_copilot/values.yaml` 配置文件中需要添加它们。 ![部署图](./pictures/创建应用成功界面.png) 5. 生产环境建议配置HTTPS证书 @@ -173,7 +172,7 @@ sudo ./deploy.sh ```bash kubectl logs -n euler-copilot ``` -- 重新部署单个组件: +- 修改配置更新单个组件: ```bash # 示例:更新euler-copilot cd /home/euler-copilot-framework/deploy/chart/euler-copilot @@ -192,6 +191,11 @@ helm upgrade euler-copilot -n euler-copilot . ![Web登录界面](./pictures/WEB登录界面.png) ![Web 界面](./pictures/WEB界面.png) +## 构建专有领域智能问答 + +详细信息请参考文档 [本地资产库构建指南](./本地资产库构建指南.md) +**witChaind 登录默认账号 `admin`, 密码 `123456`** + --- ## 附录