
1. 纯 CPU 云主机跑 openEuler Intelligence 智能助手到底卡在哪openEuler Intelligence 智能助手是 openEuler 社区推出的智能化平台简单说就是把大模型问答、本地知识库检索、工作流编排打包成一套能自己部署的服务。它适合谁适合手里只有普通云主机、没有 GPU 预算又想在内网搭一套知识问答系统的运维和开发同学。我这次拿到的是一台华为云通用计算增强型 c6s.8xlarge.232 核 Intel Xeon Gold 6278C、64GB 内存、100GB SSD系统是 openEuler 22.03 LTS SP3全程纯 CPU不挂任何加速卡。很多人第一反应是没 GPU 能跑得动吗实测下来7B 级别的模型在 32 核 CPU 上做短问答是能用的首字延迟大概几秒长文生成会慢一些但作为内部知识助手完全够。真正让人头疼的不是算力而是部署链路上的坑K3s 起不来、Ollama 用户创建失败、模型下载卡住、容器镜像拉取超时。这篇就把华为云纯 CPU 环境从零到能对话的完整过程拆开讲包括后面怎么用 TaoToken 把外部模型通道统一接进来省得每个模型都单独配 Key。先说清楚这套东西的组成。openEuler Intelligence 底层是 K3s 轻量 Kubernetes上面跑 Ollama 做本地推理再叠 MinIO 对象存储、OpenGauss 数据库、Redis 缓存、AuthHub 认证最后是 web 前端和 rag 检索服务。整个部署脚本在 euler-copilot-framework 仓库里一键脚本会按阶段把环境检查、K3s 安装、Ollama 部署、模型拉取、数据库集群、认证服务、核心服务依次拉起来。你要做的是提前把系统层和网络层的地基打平否则脚本跑到一半就会因为 SELinux、swap、内核模块这些小事挂掉。我踩过的坑里最典型的是防火墙和 SELinux 没关干净K3s 的 6443 端口通信被拦Pod 一直 Pending。另一个是 Ollama 安装时脚本想创建 ollama 用户却报 invalid user name原因是系统里已经有同名残留。这些都会在下面章节给出具体命令和排查方法。整篇的目标很明确让你在一台纯 CPU 华为云 ECS 上复制粘贴就能把 openEuler Intelligence 跑起来并且知道每一步在干什么、错了怎么救。2. 华为云 ECS 环境准备与 openEuler Intelligence 部署前置条件这一章把地基打完。你登录华为云控制台开一台 ECS镜像选 openEuler 22.03 LTS SP3规格按 c6s.8xlarge.2 来内存至少 32GB因为后面要同时跑 Ollama、数据库和一堆容器。安全组入方向放行 TCP 80、443、6443、30080、30081出方向全放不然模型和镜像下不来。登录机器后先确认系统信息这几条命令建议原样跑一遍cat /etc/os-release uname -r lscpu | grep Model name lscpu | grep ^CPU(s): free -h df -h正常输出里VERSION_ID22.03内核5.10.0-60.139.0.166.oe2203.x86_64CPU 32 核内存 62Gi 左右根分区 99G。如果内存低于 32G建议先升配否则 OpenGauss 加 Ollama 会把内存吃满触发 OOM。接着配本地域名解析。openEuler Intelligence 的 AuthHub 和前端用固定域名访问直接在/etc/hosts里指到本机vim /etc/hosts加入两行127.0.0.1 authhub.eulercopilot.local 127.0.0.1 www.eulercopilot.local防火墙这块测试环境直接停掉最省事生产环境请改成精细放行systemctl stop firewalld systemctl disable firewalld如果你坚持用 firewalld至少要放这些端口firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port443/tcp firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port30080/tcp firewall-cmd --permanent --add-port30081/tcp firewall-cmd --reload系统优化是重头戏。SELinux 会拦容器挂载先关setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configK3s 官方建议禁用 swap否则调度会出问题swapoff -a sed -i /swap/d /etc/fstab加载内核模块并写进开机加载modprobe br_netfilter modprobe overlay cat /etc/modules-load.d/k3s.conf EOF br_netfilter overlay EOF配置网桥转发参数cat /etc/sysctl.d/k3s.conf EOF net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --system最后抬高文件描述符和进程数限制容器多了默认值不够用cat /etc/security/limits.conf EOF * soft nofile 65536 * hard nofile 65536 * soft nproc 65536 * hard nproc 65536 EOF ulimit -n 65536做完这些sysctl --system应该没有报错ulimit -n返回 65536。到这一步系统层就干净了可以进部署脚本。这里提醒一句华为云安全组和系统防火墙是两层别只关了一层就以为通了我见过有人 firewalld 停了但安全组没放 6443K3s 照样起不来。3. 一键部署脚本与 Ollama、DeepSeek 模型配置实战环境干净后开始拉代码。先装 git然后克隆部署仓库dnf install -y git cd /home git clone https://gitee.com/openEuler/euler-copilot-framework.git -b dev cd euler-copilot-framework/deploy/scripts chmod x ./* chmod x ./0-one-click-deploy/one-click-deploy_zh.sh ls -lh脚本目录里能看到deploy.sh、check_env.sh、install_k3s.sh等文件。直接跑主脚本bash deploy.sh会出现菜单选 0 走一键自动部署 主部署菜单 0) 一键自动部署 1) 手动分步部署 2) 重启服务 3) 卸载所有组件并清除数据 4) 退出程序 请输入选项编号0-4: 0脚本会分阶段执行。阶段 1 环境检查确认 SELinux 和防火墙已关。阶段 2 装 K3s v1.30.2 和 Helm v3.15.0装完systemctl status k3s应该是 active。阶段 3 部署 Ollama 0.6.5这一步可能报invalid user name: ollama或group ollama does not exist脚本会自动补建用户如果卡住就手动来groupadd ollama useradd -r -g ollama -s /sbin/nologin ollama阶段 4 拉 DeepSeek 模型。脚本默认拉deepseek-llm-7b-chat你也可以手动确认ollama pull deepseek-llm-7b-chat ollama list拉完测试一下ollama run deepseek-llm-7b-chat 用一句话介绍 openEuler能返回诗句或正常回答就说明推理通了。Ollama 的 API 默认在http://localhost:11434OpenAI 兼容接口是http://localhost:11434/v1/chat/completions流式把stream设成true即可。阶段 5 部署 bge-m3 嵌入模型418MB 的 GGUF 格式从 ModelScope 下载CPU 模式跑上下文 4096。验证ollama run bge-m3 测试阶段 6 到 8 依次起 MinIO、OpenGauss、Redis、AuthHub 和核心服务。全部完成后kubectl get pod -n euler-copilot应该看到一堆 Running。访问地址EulerCopilot UI: http://authhub.eulercopilot.local:30080 AuthHub 管理界面: http://www.eulercopilot.local:30081 默认账号: administrator 默认密码: changeme现在讲怎么把外部模型通道统一接进来。openEuler Intelligence 支持 OpenAI 兼容接口TaoToken 提供统一 Key 通道Base URL 是https://taotoken.net/api。在平台设置里新增模型时填三项Base URL、API Key、Model ID。如果你用 Claude Code 或 Cline 这类工具配置片段长这样注意路径和字段名要对齐{ models: [ { name: taotoken-deepseek, provider: openai, baseUrl: https://taotoken.net/api, apiKey: sk-你的Key, modelId: deepseek-chat } ] }Codex 的auth.json写法{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: deepseek-chat }Cline MCP 场景下在 MCP 配置里同样填 Base URL、Key、Model ID 三件套。这样本地 Ollama 跑内网知识库外部模型走统一通道不用每个模型单独维护 Key。Key 在控制台创建地址是https://taotoken.net/api-keys模型对话入口在https://taotoken.net/chat长期编码或 Agent 任务可以看https://taotoken.net/coding-plan。4. 验证请求与 CPU 推理性能实测结果部署完不能只看 Pod Running 就完事得真发请求验证。先看集群状态kubectl get pod -n euler-copilot kubectl top node kubectl top pod -n euler-copilotkubectl top需要 metrics-server如果报错就先跳过用kubectl describe pod看资源。正常情况 Ollama 那个 Pod 的 CPU 占用会比较高因为纯 CPU 推理全靠它。直接打 Ollama 接口验证curl http://localhost:11434/v1/chat/completions \ -H Content-Type: application/json \ -d { model: deepseek-llm-7b-chat, messages: [{role: user, content: 你好介绍一下你自己}], stream: false }返回 JSON 里有choices[0].message.content就说明推理链路通。如果返回reading choices相关报错多半是模型名写错或模型没拉下来ollama list确认一下。再验证 TaoToken 通道。用 curl 打统一接口curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: deepseek-chat, messages: [{role: user, content: 回复 OK}], stream: false }返回正常内容说明 Key 和 Base URL 都对。如果 401检查 Key 有没有复制全、有没有多余空格。性能方面纯 CPU 32 核跑 7B 模型短问答首字延迟 3 到 8 秒生成速度大概每秒 3 到 6 个 token长文会明显慢。bge-m3 嵌入模型很快几百毫秒出结果。内存占用上Ollama 加载 7B 模型大概吃 8 到 12GB加上数据库和容器64GB 内存余量充足。如果你只有 32GB建议把模型换成更小的量化版本。平台功能验证登录 EulerCopilot UI左下角设置进模型配置页上传一个 PDF 或 Markdown 文档等向量化完成然后针对文件提问。能基于文档内容回答说明 RAG 检索链路正常。这一步是 openEuler Intelligence 的核心价值本地知识库不上传外网适合企业内部资料问答。5. 部署常见报错排查401、local proxy failed 与 OAuth 问题部署和使用过程中报错集中在几类。第一类是 401出现在调 TaoToken 或平台模型配置时。原因通常是 Key 无效、Base URL 写错、或者请求头格式不对。检查Authorization: Bearer sk-xxx有没有漏 BearerBase URL 是不是https://taotoken.net/api注意不要多加/v1重复路径。平台里配置模型时Base URL 和 Model ID 要分开填别把模型名塞进 URL。第二类是local proxy failed一般出现在容器内访问外部接口时。纯 CPU 环境里 Ollama 在宿主机容器要访问它得用宿主机 IP 或host.docker.internal不能写localhost因为容器里的 localhost 是容器自己。检查平台模型配置里的 Ollama 地址改成http://172.31.8.150:11434这种内网 IP。如果还是失败kubectl exec进容器 curl 一下确认网络通不通。第三类是reading choices报错说明请求发出去了但响应结构不对。常见于模型名不匹配比如你拉的是deepseek-llm-7b-chat请求里写了deepseek-chat。用ollama list看准确名字请求里原样填。另外流式和非流式返回结构不同解析代码要对应。第四类是 OAuth 相关报错出现在 AuthHub 登录或 token 刷新时。默认账号administrator/changeme首次登录后建议改密码。如果 OAuth 回调失败检查/etc/hosts里两个域名有没有配端口 30080 和 30081 有没有放行。AuthHub 的 token 过期后重新登录即可别去手动改数据库。第五类是 K3s 相关。kubectl get pod一直 Pending先看kubectl describe pod的事件多半是资源不足或镜像拉不下来。镜像拉取超时的话检查出方向网络华为云 ECS 默认能出公网但如果你绑了弹性公网 IP 且带宽小拉大镜像会慢。kubectl top报 metrics 不可用是 metrics-server 没装不影响功能。第六类是 Ollama 用户问题。前面提过invalid user name: ollama手动groupadd和useradd补上然后systemctl restart ollama。如果 Ollama 服务起不来journalctl -u ollama -n 50看日志常见是端口 11434 被占或模型目录权限不对。排查顺序建议先kubectl get pod -n euler-copilot看谁没起来再kubectl logs看具体容器日志最后回到系统层查网络和资源。别一上来就重装大部分问题改个配置重启就好。6. 统一 Key 通道接入与长期使用建议把 openEuler Intelligence 跑起来只是第一步长期用下去要考虑模型通道的维护。本地 Ollama 适合内网知识库和敏感数据外部模型适合需要更强推理或更大上下文的场景。TaoToken 的统一 Key 通道好处是一个 Key 管多个模型Base URL 固定https://taotoken.net/api换模型只改 Model ID不用动其他配置。接入文档在https://taotoken.net/doc里面有各语言的调用示例。API Key 管理在https://taotoken.net/api-keys建议按项目建不同 Key方便排查和回收。模型对话可以直接在https://taotoken.net/chat试确认模型可用再写进配置。如果你要长期跑编码或 Agent 任务https://taotoken.net/coding-plan有对应的方案Claude Code 接入看https://taotoken.net/claude-code-anthropic。日常维护上Ollama 模型目录会越来越大定期ollama list清理不用的模型。K3s 的镜像和日志也占空间crictl rmi --prune可以清无用镜像。数据库和 MinIO 的数据在/var/lib/eulercopilot附近备份就备这个目录。AuthHub 默认密码一定要改别裸奔在公网。最后给个实用技巧把常用模型的配置写成一份 JSON 放版本管理里换机器时直接导入省得重新填。纯 CPU 环境别追求大模型7B 量化版是甜点再大延迟就影响体验了。整套跑通后你就有了一套内网可用的智能助手本地知识库加统一外部通道成本和可控性都握在自己手里。