无网络环境下部署指南
介绍
openEuler Copilot System 是一款智能问答工具,使用 openEuler Copilot System 可以解决操作系统知识获取的便捷性,并且为OS领域模型赋能开发者及运维人员。作为获取操作系统知识,使能操作系统生产力工具 (如 A-Ops / A-Tune / x2openEuler / EulerMaker / EulerDevOps / StratoVirt / iSulad 等),颠覆传统命令交付方式,由传统命令交付方式向自然语义进化,并结合智能体任务规划能力,降低开发、使用操作系统特性的门槛。
组件介绍
组件 | 端口 | 说明 |
---|---|---|
euler-copilot-framework | 8002 (内部端口) | 智能体框架服务 |
euler-copilot-web | 8080 | 智能体前端界面 |
euler-copilot-rag | 8005 (内部端口) | 检索增强服务 |
euler-copilot-vectorize-agent | 8001 (内部端口) | 文本向量化服务 |
mysql | 3306 (内部端口) | MySQL数据库 |
redis | 6379 (内部端口) | Redis数据库 |
postgres | 5432 (内部端口) | 向量数据库 |
secret_inject | 无 | 配置文件安全复制工具 |
环境要求
软件要求
类型 | 版本要求 | 说明 |
---|---|---|
操作系统 | openEuler 22.03 LTS 及以上版本 | 无 |
K3s | >= v1.30.2,带有 Traefik Ingress 工具 | K3s 提供轻量级的 Kubernetes 集群,易于部署和管理 |
Helm | >= v3.15.3 | Helm 是一个 Kubernetes 的包管理工具,其目的是快速安装、升级、卸载 openEuler Copilot System 服务 |
python | >=3.9.9 | python3.9.9 以上版本为模型的下载和安装提供运行环境 |
硬件要求
类型 | 硬件要求 |
---|---|
服务器 | 1台 |
CPU | 鲲鹏或x86_64,>= 32 cores |
RAM | >= 64GB |
存储 | >= 500 GB |
GPU | Tesla V100 16GB,4张 |
NPU | 910ProB、910B |
注意:
- 若无 GPU 或 NPU 资源,建议通过调用 OpenAI 接口的方式来实现功能。(接口样例:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions)
- 调用第三方 OpenAI 接口的方式不需要安装高版本的 python (>=3.9.9)
- 英伟达 GPU 对 Docker 的支持必需要新版本 Docker (>= v25.4.0)
部署视图
获取 openEuler Copilot System
从 openEuler Copilot System 的官方Git仓库 euler-copilot-framework 下载最新的部署仓库
如果您正在使用 Kubernetes,则不需要安装 k3s 工具。
# 下载目录以 home 为例 cd /home
git clone https://gitee.com/openeuler/euler-copilot-framework.git
环境准备
如果您的服务器、硬件、驱动等全部就绪,即可启动环境初始化流程,以下部署步骤在无公网环境执行。
1. 环境检查
环境检查主要是对服务器的主机名、DNS、防火墙设置、磁盘剩余空间大小、网络、检查 SELinux 的设置。
主机名设置 在Shell中运行如下命令:
cat /etc/hostname echo "主机名" > /etc/hostname
系统DNS设置:需要给当前主机设置有效的DNS
防火墙设置
# 查看防火墙状态 systemctl status firewalld # 查看防火墙列表 firewall-cmd --list-all # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld
SELinux设置
# 需要关闭selinux,可以临时关闭或永久关闭 # 永久关闭SELinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 临时关闭 setenforce 0
2. 文件下载
模型文件 bge-reranker-large、bge-mixed-model 下载 模型文件下载链接
mkdir -p /home/EulerCopilot/models cd /home/EulerCopilot/models # 将需要下载的bge文件放置在models目录 wget https://repo.oepkgs.net/openEuler/rpm/openEuler-22.03-LTS/contrib/EulerCopilot/bge-mixed-model.tar.gz wget https://repo.oepkgs.net/openEuler/rpm/openEuler-22.03-LTS/contrib/EulerCopilot/bge-reranker-large.tar.gz
下载分词工具 text2vec-base-chinese-paraphrase 分词工具下载链接
mkdir -p /home/EulerCopilot/text2vec cd /home/EulerCopilot/text2vec wget https://repo.oepkgs.net/openEuler/rpm/openEuler-22.03-LTS/contrib/EulerCopilot/text2vec-base-chinese-paraphrase.tar.gz
镜像包下载
- x86或arm架构的EulerCopilot服务的各组件镜像单独提供
3. 安装部署工具
3.1 安装 Docker
如需要基于 GPU/NPU 部署大模型,需要检查 Docker 版本是否满足>= v25.4.0 ,如不满足,请升级 Docker 版本
3.2 安装 K3s 并导入镜像
安装 SELinux 配置文件
yum install -y container-selinux selinux-policy-base # packages里有k3s-selinux-0.1.1-rc1.el7.noarch.rpm的离线包 rpm -i https://rpm.rancher.io/k3s-selinux-0.1.1-rc1.el7.noarch.rpm
x86 架构安装 k3s
# 在有网络的环境上获取k3s相关包,以v1.30.3+k3s1示例 wget https://github.com/k3s-io/k3s/releases/download/v1.30.3%2Bk3s1/k3s wget https://github.com/k3s-io/k3s/releases/download/v1.30.3%2Bk3s1/k3s-airgap-images-amd64.tar.zst cp k3s /usr/local/bin/ cd /var/lib/rancher/k3s/agent mkdir images cp k3s-airgap-images-arm64.tar.zst /var/lib/rancher/k3s/agent/images # packages里有k3s-install.sh的离线包 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh INSTALL_K3S_SKIP_DOWNLOAD=true ./k3s-install.sh export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
arm 架构安装 k3s
# 在有网络的环境上获取k3s相关包,以v1.30.3+k3s1示例 wget https://github.com/k3s-io/k3s/releases/download/v1.30.3%2Bk3s1/k3s-arm64 wget https://github.com/k3s-io/k3s/releases/download/v1.30.3%2Bk3s1/k3s-airgap-images-arm64.tar.zst cp k3s-arm64 /usr/local/bin/k3s cd /var/lib/rancher/k3s/agent mkdir images cp k3s-airgap-images-arm64.tar.zst /var/lib/rancher/k3s/agent/images # packages里有k3s-install.sh的离线包 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh INSTALL_K3S_SKIP_DOWNLOAD=true ./k3s-install.sh export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
导入镜像
# 导入已下载的镜像文件 k3s ctr image import $(镜像文件)
3.3 安装 Helm 工具
x86_64 架构
wget https://get.helm.sh/helm-v3.15.0-linux-amd64.tar.gz tar -xzf helm-v3.15.0-linux-amd64.tar.gz mv linux-amd64/helm /usr/sbin rm -rf linux-amd64
arm64 架构
wget https://get.helm.sh/helm-v3.15.0-linux-arm64.tar.gz tar -xzf helm-v3.15.0-linux-arm64.tar.gz mv linux-arm64/helm /usr/sbin rm -rf linux-arm64
3.4 大模型准备
提供第三方openai接口或基于硬件本都部署大模型,本地部署大模型可参考附录部分。
安装
您的环境现已就绪,接下来即可启动 openEuler Copilot System 的安装流程。
下载目录以home为例,进入 openEuler Copilot System 仓库的 Helm 配置文件目录
cd /home/euler-copilot-framework && ll
total 28 drwxr-xr-x 3 root root 4096 Aug 28 17:45 docs/ drwxr-xr-x 5 root root 4096 Aug 28 17:45 deploy/
查看deploy的目录
tree deploy
deploy/chart ├── databases │ ├── Chart.yaml │ ├── configs │ ├── templates │ └── values.yaml ├── authhub │ ├── Chart.yaml │ ├── configs │ ├── templates │ └── values.yaml └── euler_copilot ├── Chart.yaml ├── configs ├── templates │ ├── NOTES.txt │ ├── rag │ ├── vectorize │ └── web └── values.yaml
1. 安装数据库
编辑 values.yaml
cd deploy/chart/databases
仅需修改镜像tag为对应架构,其余可不进行修改
vim values.yaml
创建命名空间
kubectl create namespace euler-copilot
设置环境变量
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
安装数据库
helm install -n euler-copilot databases .
查看 pod 状态
kubectl -n euler-copilot get pods
pgsql-deploy-databases-86b4dc4899-ppltc 1/1 Running 0 17d redis-deploy-databases-f8866b56-kj9jz 1/1 Running 0 17d mysql-deploy-databases-57f5f94ccf-sbhzp 2/2 Running 0 17d
若服务器之前部署过 mysql,则可预先清除下 pvc,再部署 databases。
# 获取pvc kubectl -n euler-copilot get pvc
# 删除pvc kubectl -n euler-copilot delete pvc mysql-pvc
2. 安装鉴权平台Authhub
编辑 values.yaml
cd deploy/chart/authhub
请结合 YAML 中的注释中的[必填]项进行修改
vim values.yaml
- 注意:
- authHub 需要域名,可预先申请域名或在 'C:\Windows\System32\drivers\etc\hosts' 下配置。 authhub和euler-copilot必须是同一个根域名的两个子域名, 例如authhub.test.com和 eulercopilot.test.com
- 修改tag为对应架构的tag;
安装 AuthHub
helm install -n euler-copilot authhub .
AuthHub 默认账号
administrator
, 密码changeme
查看 pod 状态
kubectl -n euler-copilot get pods
NAME READY STATUS RESTARTS AGE authhub-backend-deploy-authhub-64896f5cdc-m497f 2/2 Running 0 16d authhub-web-deploy-authhub-7c48695966-h8d2p 1/1 Running 0 17d pgsql-deploy-databases-86b4dc4899-ppltc 1/1 Running 0 17d redis-deploy-databases-f8866b56-kj9jz 1/1 Running 0 17d mysql-deploy-databases-57f5f94ccf-sbhzp 2/2 Running 0 17d
登录 AuthHub
AuthHub 的域名以 <authhub.test.com> 为例,浏览器输入
https://authhub.test.com
, 登录界面如下图所示:创建应用eulercopilot
点击创建应用,输入应用名称、应用主页和应用回调地址(登录后回调地址),参考如下:
- 应用名称:eulercopilot
- 应用主页:https://eulercopilot.test.com
- 应用回调地址:https://eulercopilot.test.com/api/auth/login
- 应用创建好后会生成 Client ID 和 Client Secret,将生成的 Client ID 和 Client Secret 配置到应用里,以 eulercopilot 为例,创建应用后在配置文件中添加配置
deploy/chart/euler_copilot/values.yaml
中添加配置
2. 安装 openEuler Copilot System
编辑 values.yaml
cd deploy/chart/euler_copilot
请结合 YAML 中的注释中的[必填]项进行修改
vim values.yaml
- 注意:
- 查看系统架构,并修改values.yaml中的tag;
- 修改values.yaml中的globals的domain为EulerCopilot域名,并配置大模型的相关信息
- 手动创建
docs_dir
、plugin_dir
、models
三个文件挂载目录 - 修改values.yaml中framework章节的web_url和oidc设置
- 如果部署插件,则需要配置用于Function Call的模型,此时必须有GPU环境用于部署sglang,可参考附件
安装 openEuler Copilot System
helm install -n euler-copilot service .
查看 Pod 状态
kubectl -n euler-copilot get pods
镜像拉取过程可能需要大约一分钟的时间,请耐心等待。部署成功后,所有 Pod 的状态应显示为 Running。
NAME READY STATUS RESTARTS AGE authhub-backend-deploy-authhub-64896f5cdc-m497f 2/2 Running 0 16d authhub-web-deploy-authhub-7c48695966-h8d2p 1/1 Running 0 17d pgsql-deploy-databases-86b4dc4899-ppltc 1/1 Running 0 17d redis-deploy-databases-f8866b56-kj9jz 1/1 Running 0 17d mysql-deploy-databases-57f5f94ccf-sbhzp 2/2 Running 0 17d framework-deploy-service-bb5b58678-jxzqr 2/2 Running 0 16d rag-deploy-service-5b7887644c-sm58z 2/2 Running 0 110m vectorize-deploy-service-57f5f94ccf-sbhzp 2/2 Running 0 17d web-deploy-service-74fbf7999f-r46rg 1/1 Running 0 2d
注意:如果 Pod 状态出现失败,建议按照以下步骤进行排查 注意:如果 Pod 状态出现失败,建议按照以下步骤进行排查
查看 Kubernetes 集群的事件 (Events),以获取更多关于 Pod 失败的上下文信息
kubectl -n euler-copilot get events
查看镜像拉取是否成功
k3s crictl images
检查 RAG 的 Pod 日志,以确定是否有错误信息或异常行为。
kubectl logs rag-deploy-service-5b7887644c-sm58z -n euler-copilot
验证 Kubernetes 集群的资源状态,检查服务器资源或配额是否足够,资源不足常导致 Pod 镜像服拉取失败。
df -h
如果未拉取成且镜像大小为0,请检查是否是 k3s 版本未满足要求,低于 v1.30.2
k3s -v
确认 values.yaml 中 framework 的 OIDC 设置是否正确配置,以确保身份验证和授权功能正常工作。
vim /home/euler-copilot-framework/deploy/chart/euler_copilot/values.yaml
验证安装
恭喜您,openEuler Copilot System 的部署已完成!现在,您可以开启智能问答的非凡体验之旅了。 请在浏览器中输入 https://$(host_ip):8080 或 https://域名(其中 port 默认值为8080,若更改则需相应调整)访问 openEuler Copilot System 网页,并尝试进行智能问答体验。
首先请点击下方页面的“立即注册”按钮,完成账号的注册与登录。
安装插件
详细信息请参考文档 插件部署指南
构建专有领域智能问答
1. 构建 openEuler 专业知识领域的智能问答
- 修改 values.yaml 的 pg 的镜像仓为
pg-data
- 修改 values.yaml 的 rag 部分的字段
knowledgebaseID: openEuler_2bb3029f
- 将
vim deploy/chart/databases/templates/pgsql/pgsql-deployment.yaml
的 volumes 相关字段注释 - 进入
cd deploy/chart/databases
,执行更新服务helm upgrade -n euler-copilot databases .
- 进入
cd deploy/chart/euler_copilot
,执行更新服务helm upgrade -n euler-copilot service .
- 进入网页端进行 openEuler 专业知识领域的问答
2. 构建项目专属知识领域智能问答
详细信息请参考文档 本地资产库构建指南
附录
大模型准备
GPU 环境
参考以下方式进行部署
下载模型文件:
huggingface-cli download --resume-download Qwen/Qwen1.5-14B-Chat --local-dir Qwen1.5-14B-Chat
创建终端 control
screen -S control
python3 -m fastchat.serve.controller
- 按 Ctrl A+D 置于后台
创建新终端 api
screen -S api
python3 -m fastchat.serve.openai_api_server --host 0.0.0.0 --port 30000 --api-keys sk-123456
- 按 Ctrl A+D 置于后台
- 如果当前环境的 Python 版本是 3.12 或者 3.9 可以创建 python3.10 的 conda 虚拟环境
mkdir -p /root/py310
conda create --prefix=/root/py310 python==3.10.14
conda activate /root/py310
创建新终端 worker
screen -S worker
screen -r worker
安装 fastchat 和 vllm
pip install fschat vllm
安装依赖:
pip install fschat[model_worker]
python3 -m fastchat.serve.vllm_worker --model-path /root/models/Qwen1.5-14B-Chat/ --model-name qwen1.5 --num-gpus 8 --gpu-memory-utilization=0.7 --dtype=half
- 按 Ctrl A+D 置于后台
按照如下方式配置文件,并更新服务。
vim deploy/chart/euler_copilot/values.yaml
修改如下部分
llm: # 开源大模型,OpenAI兼容接口 openai: url: "http://$(IP):30000" key: "sk-123456" model: qwen1.5 max_tokens: 8192
NPU 环境
NPU 环境部署可参考链接 MindIE安装指南
FAQ
1. huggingface 使用报错?
File "/usr/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.eanconectionError: <urlib3.comnection.Hipscomnection object at exfblab6490>: Failed to establish a new conmection: [Errno 101] Network is unreachable
- 解决办法
pip3 install -U huggingface_hub
export HF_ENDPOINT=https://hf-mirror.com
2. 如何在 RAG 容器中调用获取问答结果的接口?
- 请先进入到 RAG 对应 Pod
curl -k -X POST "http://localhost:8005/kb/get_answer" -H "Content-Type: application/json" -d '{ \
"question": "", \
"kb_sn": "default_test", \
"fetch_source": true }'
3. 执行 helm upgrade
报错?
Error: INSTALLATI0N FAILED: Kubernetes cluster unreachable: Get "http:/localhost:880/version": dial tcp [:1:8089: connect: connection refused
或者
Error: UPGRADE FAILED: Kubernetes cluster unreachable: the server could not find the requested resource
- 解决办法
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
4. 无法查看 Pod 日志?
[root@localhost euler-copilot]# kubectl logs rag-deployservice65c75c48d8-44vcp-n euler-copilotDefaulted container "rag" out of: rag.rag-copy secret (init)Error from server: Get "https://172.21.31.11:10250/containerlogs/euler copilot/rag deploy"service 65c75c48d8-44vcp/rag": Forbidden
- 解决办法 如果设置了代理,需要将本机的网络 IP 从代理中剔除
cat /etc/systemd/system/k3s.service.env
http_proxy="http://172.21.60.51:3128"
https_proxy="http://172.21.60.51:3128"
no_proxy=172.21.31.10 # 代理中剔除本机IP
5. GPU环境部署大模型时出现无法流式回复?
在服务执行 curl 大模型失败,但是将 "stream": true
改为 "stream": false
就可以 curl 通?
curl http://localhost:30000/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer sk-123456" -d '{
"model": "qwen1.5",
"messages": [
{
"role": "system",
"content": "你是情感分析专家,你的任务是xxxx"
},
{
"role": "user",
"content": "你好"
}
],
"stream": true,
"n": 1,
"max_tokens": 32768
}'
- 解决办法:
pip install Pydantic=1.10.13
6. 如何部署 sglang?
# 1. 激活 Conda 环境, 并激活 Python 3.10 的 Conda 环境。假设你的环境名为 `myenv`:
conda activate myenv
# 2. 在激活的环境中,安装 sglang[all] 和 flashinfer
pip install sglang[all]==0.3.0
pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
# 3. 启动服务器
python -m sglang.launch_server --served-model-name Qwen2.5-32B --model-path Qwen2.5-32B-Instruct-AWQ --host 0.0.0.0 --port 8001 --api-key sk-12345 --mem-fraction-static 0.5 --tp 8
验证安装
pip show sglang pip show flashinfer
注意:
- API Key:请确保
--api-key
参数中的 API 密钥是正确的 - 模型路径: 确保
--model-path
参数中的路径是正确的,并且模型文件存在于该路径下。 - CUDA 版本:确保你的系统上安装了 CUDA 12.1 和 PyTorch 2.4,因为
flashinfer
包依赖于这些特定版本。 - 线程池大小:根据你的GPU资源和预期负载调整线程池大小。如果你有 8 个 GPU,那么可以选择 --tp 8 来充分利用这些资源。
- API Key:请确保
7. 如何 curl embedding?
curl -k -X POST http://$IP:8001/embedding \
-H "Content-Type: application/json" \
-d '{"texts": ["sample text 1", "sample text 2"]}'
# $IP为vectorize的Embedding的内网地址
8. 如何生成证书?
下载地址: https://github.com/FiloSottile/mkcert/releases
# 1. 下载 mkcert
# x86_64
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
# arm64
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-arm64
# 2. 执行下面的命令生成秘钥
mkcert -install
# mkcert 可直接接域名或 IP, 生成证书和秘钥
mkcert example.com
# 3. 将证书和秘钥拷贝到 /home/euler-copilot-framework_openeuler/deploy/chart_ssl/traefik-secret.yaml 中, 并执行下面命令使其生效。
kubectl apply -f traefik-secret.yaml
8. Pod状态由runnning变为pending?
在Pod正常运行一段时间后,其状态从“Running”全部转变为 “Pending” 或 “Completed”,
可执行命令df -h
,查看Pod所在宿主机的存储空间,确保可用空间不低于30%,以保证pod的正常运行。