☰
科大讯飞开源 SkillHub 私有化部署:用 Docker 3 分钟搭好你的 AI 技能商店
2026/9/29 20:42:09 网站建设 项目流程

1. 为什么要在内网搭一个 AI 技能商店

SkillHub 是科大讯飞开源的企业级 AI Agent 技能商店,简单说就是把你团队里散落各处的 Skill 包集中管起来,让 Claude Code、OpenClaw 这类 Agent 平台能通过统一入口搜索、安装、调用。它适合谁?适合那些 Skill 文件已经多到用文件夹管不过来、又不想把内部业务逻辑放到公网的中小团队。

我见过太多团队的做法是:每个人本地一个skills目录,靠微信传压缩包,版本号写不写全看心情。等到某个技能要修 bug,没人知道线上跑的是哪一版。SkillHub 解决的正是这个——私有化部署、命名空间隔离、发布审核、全文搜索,一套下来把技能当软件制品来管。

这篇不聊概念,直接给可复制的 Docker 部署路径:目录结构、环境变量、启动命令骨架,最后演示一次技能上架和调用的完整验证。目标是把开源仓库变成你内网能访问的私有技能市场。

2. 部署前把 TaoToken 这条链路准备好

SkillHub 本身是技能仓库,但技能最终要跑在 Agent 上,Agent 要调模型。如果你在内网做私有化,模型调用这一环同样需要可控的入口。我自己的做法是:SkillHub 管技能,TaoToken 管模型接入,两者分开,互不耦合。

TaoToken 在这里的角色是统一的模型 API 入口,支持 Claude Code、Coding Plan 等场景。你可以在官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 了解整体能力,API 地址是 https://taotoken.net/api(这个不加 UTM,直接配到环境变量里)。

具体到操作,先去控制台生成一个 API Key:

  • 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
  • API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite

生成后先别急着写进 SkillHub,先单独验证 Key 能用。模型对话页面可以快速试一次:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite

如果你后面要长期跑编码类 Agent,建议直接看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite

Claude Code 的接入文档在这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

这一步的意义是:等 SkillHub 部署完,你上架的第一个技能就可以是一个「调用模型做代码审查」的 Skill,链路是通的,不会卡在鉴权上。

3. Docker 部署 SkillHub 的目录与环境变量

先把仓库拉下来。SkillHub 的 GitHub 地址是https://github.com/iflytek/SkillHub,克隆命令:

git clone https://github.com/iflytek/SkillHub.git cd SkillHub

官方给的极速部署是make dev-all,一条命令拉起。但生产或内网环境我建议不要直接用 dev 模式,而是拆开看它到底起了什么。下面是我整理的一份可复制的目录结构,放在宿主机上:

/opt/skillhub/ ├── docker-compose.yml ├── .env ├── data/ │ ├── postgres/ │ ├── redis/ │ └── uploads/ └── logs/ └── app/

data/uploads用来存技能包文件,data/postgres和data/redis是持久化卷,logs/app挂应用日志。这样做的目的是:容器删了重建,数据还在。

环境变量写在.env里,核心几项如下:

# 数据库 POSTGRES_USER=skillhub POSTGRES_PASSWORD=换成你自己的强密码 POSTGRES_DB=skillhub # Redis REDIS_PASSWORD=换成你自己的强密码 # 应用 APP_PORT=3000 APP_BASE_URL=http://你的内网IP:3000 UPLOAD_DIR=/app/data/uploads # 模型接入(可选,用于技能内调用) TAOTOKEN_API_BASE=https://taotoken.net/api TAOTOKEN_API_KEY=你在控制台生成的Key

注意:APP_BASE_URL一定要写成内网可访问的地址,不然后面技能详情页里的下载链接会指向 localhost,别的同事点开就是 404。

docker-compose.yml的骨架大致是这样,我按官方结构做了精简,保留关键部分:

version: "3.8" services: postgres: image: postgres:15-alpine restart: always environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - ./data/postgres:/var/lib/postgresql/data redis: image: redis:7-alpine restart: always command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - ./data/redis:/data skillhub: image: skillhub:latest restart: always depends_on: - postgres - redis ports: - "${APP_PORT}:3000" environment: DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379/0 APP_BASE_URL: ${APP_BASE_URL} UPLOAD_DIR: ${UPLOAD_DIR} TAOTOKEN_API_BASE: ${TAOTOKEN_API_BASE} TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY} volumes: - ./data/uploads:/app/data/uploads - ./logs/app:/app/logs

启动命令:

docker compose up -d

首次拉镜像会慢一点,取决于你的网络。起来之后用docker compose ps看三个容器是不是都 healthy。

4. 验证部署:上架一个技能并调用它

容器起来后,浏览器打开http://你的内网IP:3000,应该能看到 SkillHub 的界面。第一次进去先注册管理员账号,然后创建一个命名空间,比如dev-team。

接下来准备一个最小技能包。SkillHub 读取的是Skill.md里的标准化协议和语义化版本号,所以目录结构要规范:

hello-skill/ ├── Skill.md └── index.js

Skill.md内容示例:

# Hello Skill ## 描述 一个用于验证 SkillHub 链路的示例技能。 ## 版本 1.0.0 ## 入口 index.js ## 权限 无

index.js就写个最简单的导出:

module.exports = async function handler(input) { return { ok: true, message: `收到输入: ${JSON.stringify(input)}` }; };

把这个目录打成 zip,在 Web 界面点「上传技能」,选dev-team命名空间。系统会自动读取版本号并触发安全扫描。扫描通过后,管理员在审核列表里点通过,技能就正式上架了。

验证调用有两种方式。第一种是在 Web 界面点技能详情,看版本历史和 README 是否正常渲染。第二种是用命令行,SkillHub 支持通过注册中心地址让 Agent 平台搜索安装:

# 假设 SkillHub 暴露了 CLI 接口 skillhub search hello-skill --registry http://你的内网IP:3000 skillhub install hello-skill --registry http://你的内网IP:3000

如果 CLI 还没配好,最直接的验证是调 API。SkillHub 支持生成作用域 Token,在后台「API Token」页面创建一个,然后:

curl -H "Authorization: Bearer 你的Token" \ http://你的内网IP:3000/api/skills?namespace=dev-team

返回 JSON 里能看到hello-skill和它的版本号,说明上架和检索链路都通了。这一步过了,你的私有技能市场就算真正跑起来了。

5. 部署与调用中的常见报错排查

容器起来了但页面打不开:先docker compose logs skillhub看应用日志。八成是数据库连不上,检查.env里的密码有没有特殊字符没转义,或者depends_on虽然写了但 postgres 还没初始化完。加个healthcheck或者等 30 秒再访问。

上传技能报 413:这是 Nginx 或应用层的 body 大小限制。如果你前面挂了反向代理,改client_max_body_size 50m;。如果没挂代理,检查应用自身的上传限制配置。

技能详情页下载链接指向 localhost:就是前面说的APP_BASE_URL没配对。改成内网 IP 后重启容器即可。

安全扫描一直 pending:扫描是异步任务,依赖 Redis 队列。docker compose logs redis看有没有报错,确认REDIS_URL里的密码和redis-server --requirepass一致。

API 调用返回 401:Token 作用域不对。SkillHub 的 Token 分命名空间级别和全局级别,创建时看清楚权限范围。另外 Token 有有效期,过期了重新生成。

Agent 平台搜不到私有技能:注册中心地址填的是公网地址或者 localhost。Agent 和 SkillHub 如果在不同机器,必须填 SkillHub 所在机器的内网 IP 或域名。

6. 把技能管起来之后,模型入口也别散着

SkillHub 解决的是技能制品的集中管理,但技能跑起来最终还是要调模型。如果你的团队同时用 Claude Code、OpenClaw 和其他 Agent 平台,模型入口散在各人本地配置里,排查问题会很痛苦。

我的建议是:SkillHub 管技能,TaoToken 管模型接入,两边都收敛到内网可控的入口。API Key 统一在控制台生成,接入文档看这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

如果你主要跑编码类 Agent,Coding Plan 的配置方式可以直接参考:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite

Claude Code 的接入细节在:https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite

先把 SkillHub 跑通,再把你最常用的那个技能改成调用统一模型入口,整条链路就闭环了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询