关于 huawei-cloud-ecs-dsh-deploy
此技能用于在 Huawei Cloud Flexus X 实例上部署 DeepSeek Harness(dsh),面向需要云端 Agent 开发环境的开发者。执行前必须取得用户明确确认,并通过 SSH 隧道访问仅绑定本机地址的 Web UI。
主要功能
- 01部署 dsh 并管理云服务器
- 02列出区域与现有服务器
- 03测试 Huawei Cloud 凭证
- 04检查状态或删除服务器
- 05通过 SSH 隧道访问 Web UI
适用场景
- 01搭建云端 Agent 开发环境
- 02部署和运行 dsh Web UI
- 03检查或管理已部署服务器
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-ecs-dsh-deploy安装后在 Claude Code 中输入/huawei-cloud-ecs-dsh-deploy确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/acceptance-criteria.mdcli-installation-guide.mdconversation-examples.mdiam-policies.mdverification-method.mdscripts/coc_deploy.pyconfig.pydeploy_dsh.pyhuawei_cloud_ecs.pypyproject.tomlquery_regions.pyutils.py详细介绍
华为云 Flexus X + DeepSeek Harness(dsh)一键部署
⚠️ 部署前检查清单(最高优先级)
此技能会产生实际费用(创建华为云 Flexus X 实例),执行前必须征得用户确认!
必须确认的选项:
- 区域(默认:cn-north-4)
- 规格(默认:x1.2u.4g,2 核 4GB)
- 计费模式(默认:按需计费)
禁止的操作:
- ❌ 未经用户明确确认,不得执行部署
- ❌ 未询问用户,不得使用默认配置进行部署
- ❌ 不得假设用户接受默认值
- ❌ 不得编造或估算价格(例如“≈ ¥0.2-0.3/小时”);务必引导用户查看官方价格页面
正确流程:
- 向用户展示默认配置(区域、规格、计费模式)
- 告知用户,查询价格请使用官方价格计算器:https://www.huaweicloud.com/pricing/calculator.html#/hecs
- 询问用户是否确认,或是否需要修改
- 只有在用户输入
CONFIRM(大写)后,才能执行部署
概述
此技能可在华为云 Flexus X 实例上一键部署 DeepSeek Harness(dsh)——DeepSeek AI 推出的开源 AI Agent 框架:
| 模块 | 说明 | 命令 |
|---|---|---|
| 列出区域 | 显示可用区域 | python3 scripts/deploy_dsh.py --list-regions |
| 测试连接 | 验证 AK/SK 凭据 | python3 scripts/deploy_dsh.py --test |
| 部署 | 购买 Flexus X 实例并部署 dsh | python3 scripts/deploy_dsh.py |
组件
| 组件 | 说明 | 端口 | 备注 |
|---|---|---|---|
| Node.js | JavaScript 运行时 | - | Node.js 22 LTS,安装到 /opt/nodejs/current |
| @deepseek-ai/dsh | DeepSeek Harness 命令行工具 | 3080(环回地址) | 官方 npm 包,dsh web 仅绑定到 127.0.0.1 |
| Nginx | 反向代理 | 80(环回地址) | 本地服务代理 80 → 127.0.0.1:3080(公共访问不使用此端口,见下方 SSH 隧道) |
| systemd | 服务管理器 | - | dsh.service 管理 dsh 生命周期,故障时自动重启 |
| UFW | 防火墙 | - | 允许 22(SSH)/80/443(80/443 被安全组拦截,无法从公网访问) |
已部署的应用
| 应用 | 说明 | 端口 | 访问 URL |
|---|---|---|---|
| dsh Web UI | AI Agent 框架 Web 界面 | 3080(环回地址) | http://127.0.0.1:3080(**须先建立 SSH 隧道**,见本地访问指南) |
✅ 重要:dsh
web命令特意只绑定到127.0.0.1——CLI 会拒绝--host 0.0.0.0。远程访问须通过 SSH 本地端口转发隧道:在你的机器上运行ssh -L 3080:127.0.0.1:3080 root@{public_ip},然后打开http://127.0.0.1:3080。安全组只需开放 22 端口——dsh 不会暴露给公网,因此更加安全。
使用场景
- AI Agent 开发 - 通过 Web UI 运行和管理 DeepSeek AI Agent 框架
- 自动化与工作流 - 使用“一切皆插件”的架构构建多步骤 Agent 工作流
- 开发与测试 - 快速搭建 AI Agent 开发环境
- 团队协作 - 在团队内共享 Agent 工作区
- 多区域部署 - 为全球用户提供就近访问
重要说明
⚠️ 所有脚本和环境检查脚本都包含在技能包中。必须使用技能 action=exec 执行,不要直接在 shell 中运行。
先决条件
使用此技能前,请确保满足以下条件:
1. 华为云账号
- 有效的华为云账号
- 账号已完成实名认证
- 账号余额充足或已绑定支付方式
2. AK/SK 凭证
- 已创建华为云访问密钥(AK/SK)
- AK/SK 具有以下权限:
ECS:弹性云服务器管理VPC:虚拟私有云管理EIP:弹性公网 IP 管理COC:云运维中心管理
- 获取方式:华为云控制台 → 我的凭证 → 访问密钥 → 创建访问密钥
凭证配置方式:
| 方式 | 说明 | 优先级 |
|---|---|---|
| 环境变量 | HW_ACCESS_KEY、HW_SECRET_KEY、HW_SECURITY_TOKEN | 最高(推荐) |
| 命令行参数 | --ak、--sk、--security-token | 较低(可用但不推荐) |
凭证类型(按推荐顺序):
| 优先级 | 类型 | 参数 | 说明 |
|---|---|---|---|
| 首选 | 临时 AK/SK | 环境变量 + HW_SECURITY_TOKEN | 带安全令牌的临时凭证,安全性更高 |
| 次选 | 永久 AK/SK | 仅环境变量 | 从华为云控制台获取的长期访问密钥 |
**注意:**凭证优先从环境变量读取;系统绝不会要求用户直接输入 AK/SK。不过,如果用户通过其他方式(例如在对话中输入、配置文件)主动提供凭证,仍支持解析这些凭证。
3. IAM 权限
| 服务 | 策略 | 所需操作 |
|---|---|---|
| ECS | ECS FullAccess | ecs:* |
| VPC | VPC FullAccess | vpc:* |
| EIP | VPC FullAccess | vpc:publicIps:* |
| COC | COC FullAccess | coc:* |
📖 最小权限策略详情:IAM 策略
4. 运行环境
- Python 3.8 或更高版本
必需依赖项:
| Package | Version | Description |
|---|---|---|
| requests | ≥2.31.0 | HTTP 请求库 |
| huaweicloudsdkcore | ≥3.1.70 | 华为云 SDK 核心库 |
| huaweicloudsdkecs | ≥3.1.70 | 弹性云服务器 SDK |
| huaweicloudsdkcoc | ≥3.1.70 | 云运维中心 SDK |
安装命令:
pip install requests huaweicloudsdkcore huaweicloudsdkecs huaweicloudsdkcoc
5. 网络环境
- 能够访问华为云 API 终端节点
- 所需终端节点:
ecs.{region}.myhuaweicloud.comvpc.{region}.myhuaweicloud.comiam.myhuaweicloud.comcoc.myhuaweicloud.com
⚠️ 安全注意事项
⚠️ 安全执行规则(最高优先级)
| 规则 | 说明 |
|---|---|
| 1 | 所有脚本都必须通过 skill action=exec 执行,禁止直接在 shell 中运行 |
| 2 | 禁止在对话中打印包含 AK/SK/Token 的脚本内容或命令 |
| 3 | 禁止创建临时脚本文件,优先使用内联执行(python3 -c) |
| 4 | 执行失败时,只返回错误消息,禁止改写脚本或打印完整命令 |
| 5 | AK/SK/Token 必须通过环境变量传递,禁止出现在对话中 |
| 6 | ⚠️ 绝对禁止以任何形式暴露、记录或打印 AK/SK/Token 值 |
⚠️ 安全组策略(关键 — 部署前请阅读)
部署策略 — 简单且安全:
| 设置 | 值 | 说明 |
|---|---|---|
| 安全组状态 | 空(无入站规则) | 脚本只创建安全组,不添加任何规则 |
| 默认访问权限 | 所有端口均被阻止 | 配置规则之前,任何 IP 都无法访问服务器 |
| 需要开放的端口 | 仅 22(SSH) | 通过 SSH 隧道访问 dsh Web UI;无需将 80/443 对公网开放 |
部署后如何配置:
- 访问 华为云控制台 → ECS → 安全组
- 找到名为
sg-dsh的安全组 - 手动添加一条入站规则:协议 TCP,端口 22,源 IP 为你的公网 IP +
/32后缀(例如,203.0.113.10/32) - 不要添加范围过大的 80/443 规则 — 仅通过 SSH 隧道访问 dsh;无需暴露其他端口
💡 为什么使用空安全组? 安全至上 — 你可以完全控制哪些 IP 能访问服务器。仅开放 22 端口 + SSH 隧道 — dsh Web UI 绝不会暴露在公网,因此即使 API 密钥泄露,也无法从互联网访问。
⚠️ AK/SK 安全: 请参阅前置条件 - AK/SK 凭据。严禁以任何形式暴露、记录或打印 AK/SK/Token 值。
⚠️ dsh 安全(关键)
| 规则 | 说明 |
|---|---|
| 1 | dsh 仅绑定到 127.0.0.1 — 切勿强制其监听 0.0.0.0(CLI 按设计会拒绝此操作) |
| 2 | 通过 SSH 本地端口转发进行远程访问:在本地运行 ssh -L 3080:127.0.0.1:3080 root@{public_ip},然后打开 http://127.0.0.1:3080 |
| 3 | DEEPSEEK_API_KEY 通过 systemd drop-in 注入,文件权限为 600 — 绝不写入 unit 文件或日志 |
| 4 | 部署时 可以不设置 API 密钥;用户也可以稍后在 Web UI 中设置(Settings → Models) |
| 5 | dsh 以专用系统用户 dsh(无 shell)运行,而非 root |
| 6 | 在生产环境中使用时,必须启用 HTTPS(例如,通过 Nginx 本地代理使用 Let's Encrypt) |
🔐 SSL/TLS 验证
- 🔒 所有华为云 API 请求默认启用 SSL/TLS 证书验证(
verify=true)。 - 可通过
HW_VERIFY_SSL环境变量覆盖此设置 —HW_VERIFY_SSL=false会禁用验证。 - ⚠️
HW_VERIFY_SSL=false仅供测试使用。 生产环境中切勿禁用 SSL 验证,否则 AK/SK 凭据和 API 流量会暴露于中间人攻击之下。
核心命令和用法
💡 注意:如果未提供操作选项,默认执行部署操作。
命令选项
| 命令/选项 | 功能 | 说明 |
|---|---|---|
python3 scripts/deploy_dsh.py | 部署 | 购买 Flexus X 实例并部署 dsh |
python3 scripts/deploy_dsh.py --list-regions | 显示可用区域 | 显示所有可用区域(19 个区域) |
python3 scripts/deploy_dsh.py --test | 测试连接 | 验证 AK/SK 凭据 |
python3 scripts/deploy_dsh.py --list-servers | 列出服务器 | 显示指定区域中的所有服务器 |
python3 scripts/deploy_dsh.py --delete <ID> | 删除服务器 | 按 ID 或名称删除服务器 |
python3 scripts/deploy_dsh.py --status <ID> | 检查状态 | 按服务器 ID 检查部署状态 |
全局参数
💡 必需参数:
--ak、--sk(或设置HW_ACCESS_KEY、HW_SECRET_KEY环境变量) 💡 建议参数:--security-token(或为临时凭据设置HW_SECURITY_TOKEN)
执行示例
示例 1:列出可用区域
python3 scripts/deploy_dsh.py --list-regions
示例 2:测试 AK/SK 连接
python3 scripts/deploy_dsh.py --test
示例 3:使用默认设置部署(需要用户确认)
python3 scripts/deploy_dsh.py
示例 4:使用自定义区域和规格部署
python3 scripts/deploy_dsh.py --region cn-east-3 --flavor x1.4u.8g
示例 5:列出现有服务器
python3 scripts/deploy_dsh.py --list-servers --region cn-north-4
示例 6:检查部署状态
python3 scripts/deploy_dsh.py --status <server_id>
示例 7:删除服务器
python3 scripts/deploy_dsh.py --delete <server_id_or_name>
| 参数 | 说明 | 默认值 |
|---|---|---|
| --region | 目标区域 | cn-north-4 |
| --flavor | 实例规格 | x1.2u.4g |
| --name | 服务器名称 | 自动生成 |
| --password | 服务器密码 | 自动生成 |
| --charging-mode | 计费模式 | postPaid |
| --bandwidth | EIP 带宽(Mbps) | 100 |
| --volume-size | 系统磁盘(GB) | 40 |
| --coc-region | COC 服务区域 | cn-north-4 |
| --coc-timeout | COC 脚本执行超时时间(秒) | 1800 |
dsh 参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| --dsh-port | dsh 监听端口(仅限环回地址) | 3080 |
| --api-key | 预先写入 dsh 服务的 DEEPSEEK_API_KEY(可选) | 未设置 |
💡 dsh 端口仅绑定到 127.0.0.1 — 通过 SSH 隧道在本地访问(
ssh -L 3080:127.0.0.1:3080 root@{ip})。dsh 端口本身无需配置安全组规则。
高级参数
💡 以下参数面向高级用户,一般场景下无需使用
| 参数 | 说明 | 默认值 |
|---|---|---|
| --project-id | 华为云项目 ID(可选) | 自动获取 |
| --image | 镜像 ID | 默认 Ubuntu 22.04 |
| --zone | 指定可用区 | 自动选择 |
| --random-zone | 随机选择可用区 | 关闭 |
| --no-eip | 不创建弹性公网 IP | 关闭 |
| --auto-confirm | 跳过交互式确认(请谨慎使用!) | 关闭 |
凭证配置示例
方法 1:使用环境变量(首选 — 强烈推荐)
python3 scripts/deploy_dsh.py
方法 2:使用命令行参数(次选 — 可以接受)
# Temporary credentials
python3 scripts/deploy_dsh.py \
--ak <AK> --sk <SK> --security-token <TOKEN> \
--region cn-north-4 \
--flavor x1.2u.4g
# Permanent credentials
python3 scripts/deploy_dsh.py \
--ak <AK> --sk <SK> \
--region cn-north-4 \
--flavor x1.4u.8g
🔒 防止重复部署机制
系统内置锁文件机制,可防止重复部署:
- 部署开始时自动创建锁文件:
dsh_deploy.lock - 锁文件有效期:30 分钟(自动过期)
- 锁文件存在时,自动阻止新的部署
- 锁文件路径:系统临时目录(Linux 上为
/tmp/dsh_deploy.lock,Windows 上为%TEMP%\dsh_deploy.lock)
⚠️ 重要说明:
- ❌ 请勿同时运行多个部署任务
- ❌ 重复部署会创建多台服务器,导致费用翻倍
- 部署失败后,请检查锁文件是否已删除
失败处理: 部署失败时,返回失败原因并引导用户检查控制台;不自动重试或修改参数
🚀 国内镜像加速
内置国内镜像加速功能,可加快部署:
| 镜像类型 | 镜像源 | 说明 |
|---|---|---|
| Ubuntu APT | USTC (mirrors.ustc.edu.cn) | 系统软件包更新 |
| npm registry | npmmirror (registry.npmmirror.com) | 安装 @deepseek-ai/dsh + 下载 Node.js 二进制文件 |
| pip(本地) | 华为云 (repo.huaweicloud.com) | 在操作端安装 Python 依赖 |
镜像配置位置: scripts/coc_deploy.py 中的 COMBINED_INSTALL_SCRIPT
模块详情
部署 DeepSeek Harness (dsh)
⏱️ 部署时间:整个过程约需 10 分钟(创建服务器需 3-5 分钟 + 部署软件需 5-8 分钟),请耐心等待
服务器上的部署阶段(通过 COC 脚本):
| 阶段 | 操作 | 说明 |
|---|---|---|
| 0 | 国内镜像源 | 配置 USTC APT 镜像源 + npmmirror npm registry |
| 1 | Node.js 22 LTS | 通过官方 tarball 安装(npmmirror 镜像源,失败时回退到 nodejs.org) |
| 2 | @deepseek-ai/dsh | npm install -g @deepseek-ai/dsh |
| 3 | 专用用户 | 创建系统用户 dsh,准备 DSH_HOME (/home/dsh/.dsh) |
| 4 | systemd 服务 | 写入 dsh.service (restart=on-failure, ProtectSystem, ReadWritePaths) |
| 5 | Nginx 反向代理 | 80 → 127.0.0.1:3080,WebSocket 升级请求头(仅限环回地址) |
| 6 | 防火墙 | UFW 放行 22/80/443(安全组会阻止 80/443,无法从公网访问) |
| 7 | 启动并验证 | 启动 dsh,等待环回 HTTP 200,打印部署信息 |
可用区域
常用区域(运行 --list-regions 可查看更多区域):
| 区域 ID | 区域名称 | 支持的 Flexus X 实例类型 |
|---|---|---|
| cn-north-4 | 华北-北京 4 | x1, x1e, x1i, x2e |
| cn-east-3 | 华东-上海 1 | x1, x1e, x1i, x2e |
| cn-south-1 | 华南-广州 | x1, x1e, x1i, x2e |
| ap-southeast-1 | 中国-香港 | x1, x2e |
| ap-southeast-3 | 亚太-新加坡 | x1, x1e, x2e |
💡 查看完整的区域列表(共 19 个),运行:
python3 scripts/deploy_dsh.py --list-regions
输出格式规范
⛔ 重要 — 必须原样输出 SSH 隧道命令,绝不能省略、总结或改写:
部署完成后,回复必须包含一行可直接复制粘贴的 SSH 隧道命令,并将
{public_ip}替换为脚本输出中的实际公网 IP。 例如,如果脚本输出Public IP: 121.36.x.x,回复必须包含:ssh -L 3080:127.0.0.1:3080 [email protected]绝不能只写“请建立 SSH 隧道”而不提供完整命令 — 用户需要复制粘贴此命令;缺少该命令会导致无法访问 Web UI。
成功部署后,必须按以下格式返回结果:
🎉 Deployment Successful!
| Item | Value |
|------|-----|
| Server Name | {server_name} |
| Public IP | {public_ip} |
| SSH Password | {password} |
| Region | {region_id} ({region_name}) |
🌐 Access URL (SSH tunnel required first):
- Run on your local machine (Windows PowerShell / macOS Terminal), replacing {public_ip} with the Public IP from the table above:
ssh -L 3080:127.0.0.1:3080 root@{public_ip}
- Enter the SSH password (from the table above), keep the terminal window open
- Then open in your browser: http://127.0.0.1:3080
🔑 SSH Login: `ssh root@{public_ip}` (password: {password})
📦 Installed Components:
- Node.js 22 LTS ({node_version})
- @deepseek-ai/dsh ({dsh_version}, systemd service 'dsh')
- Nginx reverse proxy (80 → 127.0.0.1:{dsh_port}, loopback only)
📋 Post-deployment TODO:
1. Configure security group: Console → ECS → Security Groups → sg-dsh → Add inbound rule (TCP 22, source your_ip/32)
2. Establish SSH tunnel locally (see command above), then open Web UI: http://127.0.0.1:3080
3. In the Web UI: Settings → Models, enter your DeepSeek API key and save
4. Choose a workspace directory, then start a session
📖 [DeepSeek Harness GitHub](https://github.com/deepseek-ai/deepseek-harness) | [Flexus X Docs](https://support.huaweicloud.com/productdesc-flexusx/pd_01_0002.html)
变量:{server_name} 服务器名称 | {public_ip} 公网 IP | {password} SSH 密码 | {region_id}/{region_name} 区域 | {dsh_port} dsh 环回端口 | {node_version} Node.js 版本 | {dsh_version} dsh CLI 版本
🔐 本地访问指南(SSH 端口转发)
⚠️ 部署后必须按照本节操作,否则浏览器无法打开 dsh Web UI。dsh 仅监听服务器的环回地址
127.0.0.1:3080— 你需要在本地计算机上建立 SSH 隧道,将本地端口 3080 转发到服务器的 3080 端口。
工作原理:ssh -L 3080:127.0.0.1:3080 root@{public_ip} 表示 — 通过加密的 SSH 通道,将本地 3080 端口上的所有流量转发到云服务器上的 127.0.0.1:3080(dsh 的运行位置)。数据经过完整加密,dsh Web UI 不会暴露到公网,只有能够通过 SSH 连接的人才能访问。
Windows 用户(PowerShell)
- 打开 PowerShell:按
Win键 → 输入powershell→ 按 Enter(或按Win+X→ 选择“Windows PowerShell”/“Windows Terminal”) - 运行隧道命令(将
{public_ip}替换为部署输出中的公网 IP):ssh -L 3080:127.0.0.1:3080 root@{public_ip} - 首次确认指纹:如果出现提示
Are you sure you want to continue connecting (yes/no)?,输入yes并按 Enter - 输入密码:输入部署输出中的 SSH 密码(输入时不会显示字符,这是正常现象),然后按 Enter
- 保持窗口打开:看到远程 shell 提示符(例如
root@xxx:~#)后,隧道即已建立。请勿关闭此窗口 - 打开浏览器:访问
http://127.0.0.1:3080,打开 dsh Web UI
💡 Windows 10/11 自带 OpenSSH 客户端,无需额外安装。如果出现“无法识别 ‘ssh’”的提示,请前往“设置”→“应用”→“可选功能”→添加“OpenSSH Client”。
macOS 用户(Terminal)
- 打开 Terminal:按
Command + Space→ 输入Terminal→ 按 Enter(或在 Finder → Applications → Utilities → Terminal 中打开) - 运行隧道命令(将
{public_ip}替换为部署输出中的公网 IP):ssh -L 3080:127.0.0.1:3080 root@{public_ip} - 首次确认指纹:如果出现提示
Are you sure you want to continue connecting (yes/no)?,输入yes并按 Enter - 输入密码:输入部署输出中的 SSH 密码(输入时不会显示字符,这是正常现象),然后按 Enter
- 保持窗口打开:看到远程 shell 提示符后,隧道即已建立。请勿关闭此窗口
- 打开浏览器:访问
http://127.0.0.1:3080,打开 dsh Web UI
💡 macOS 自带 OpenSSH 客户端,无需额外安装。
关闭隧道与高级用法
| 场景 | 操作 |
|---|---|
| 关闭隧道 | 在 PowerShell/Terminal 窗口中按 Ctrl+C,或输入 exit 并按 Enter |
| 仅转发,不启动 shell | ssh -N -L 3080:127.0.0.1:3080 root@{public_ip}(-N 表示不运行远程命令;不会显示 shell 提示符,推荐使用) |
| macOS 后台运行 | ssh -f -N -L 3080:127.0.0.1:3080 root@{public_ip}(-f 表示在后台运行;使用 pkill -f "ssh -f -N" 或 killall ssh 停止) |
| 本地端口 3080 已被占用 | 使用其他本地端口:ssh -L 18080:127.0.0.1:3080 root@{public_ip},然后访问 http://127.0.0.1:18080 |
| 免密码登录(推荐) | 运行 ssh-copy-id root@{public_ip}(macOS/Linux),或在 PowerShell 中使用 SSH 密钥,以便之后免密码连接 |
⚠️ 注意:隧道关闭后,
http://127.0.0.1:3080将无法访问,这是正常现象;只需重新运行隧道命令即可。每次机器重启后,都必须重新建立隧道。
dsh 初始设置
建立 SSH 隧道后,打开 dsh Web UI(http://127.0.0.1:3080):
| 设置 | 说明 |
|---|---|
| API Key | 前往 Settings → Models,输入 DeepSeek API key 并保存(如果未通过 --api-key 预先设置) |
| 工作区 | 选择一个工作区目录,用于存储会话和产物 |
| 启动会话 | 在 Web UI 中启动会话,harness 将作出响应 |
⚠️ 重要:dsh 可以读写文件并运行命令——安全组中只应开放端口 22(来源为
your_ip/32);通过 SSH 隧道访问 dsh;切勿向公网开放 80/3080 端口,切勿使用0.0.0.0/0。
部署架构
此技能使用 COC (Cloud Operations Center) 进行安全部署,取代传统 SSH 方式:
┌─────────────────────────────────────────────────────────────┐
│ Flexus Cloud Server X Instance │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Ubuntu 22.04 Server │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ SSH tunnel ──► dsh (127.0.0.1:3080) │ │
│ │ (port 22) (loopback only) │ │
│ │ │ │
│ │ ┌───────────────┐ ┌───────────────┐ │ │
│ │ │ Nginx │ │ systemd │ │ │
│ │ │ (port 80) │ │ dsh.service │ │ │
│ │ │ loopback │ └───────┬───────┘ │ │
│ │ └───────────────┘ │ │ │
│ │ ▼ │ │
│ │ dsh web (Node.js 22) │ │
│ │ user: dsh (no-shell) │ │
│ │ DSH_HOME: /home/dsh/.dsh│ │
│ └───────────┬──────────────────────┬──────────────────┘ │
│ │ │ │
│ │ ┌───────┴───────┐ │
│ │ │ Security Group │ │
│ │ │ sg-dsh │ │
│ │ │ allow 22 /32 │ │
│ │ └───────┬───────┘ │
│ │ │ │
│ └──────────────────────┼──────────────────────┘
│ ▼ │
│ ┌─────────────┐ │
│ │ EIP │ SSH only (22) │
│ └─────────────┘ │
│ ▲ │
│ │ │
│ ┌─────────┴─────────┐ │
│ │ COC (Cloud │ │
│ │ Operations │ │
│ │ Center) │ │
│ │ Secure Script │ │
│ │ Execution │ │
│ └───────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────┐
│ User machine (Windows/macOS) │
│ ssh -L 3080:127.0.0.1:3080 root@{ip} │
│ Browser → http://127.0.0.1:3080 │
└─────────────────────────────┘
部署流程
| 阶段 | 操作 | 描述 |
|---|---|---|
| 1 | 创建服务器 | 通过 Huawei Cloud SDK 创建 Flexus X 实例 |
| 2 | 配置安全组 | 创建 sg-dsh 安全组(规则为空,需手动配置) |
| 3 | 等待 UniAgent | 等待 COC UniAgent 上线 |
| 4 | 创建 COC 脚本 | 在 Cloud Operations Center 中创建安装脚本 |
| 5 | 执行脚本 | 通过 COC 在目标实例上执行脚本 |
| 6 | 验证部署 | 检查 dsh 服务和环回端口状态 |
COC 部署优势
与 SSH 方法相比,COC 部署具有以下优势:
| 特性 | SSH 方法 | COC 方法 |
|---|---|---|
| 安全性 | 需要开放 SSH 端口,存在安全风险 | 通过 Cloud Operations Center 安全执行,无需 SSH 端口 |
| 权限控制 | 需要 SSH 密码或密钥 | 使用 Huawei Cloud IAM 权限控制 |
| 审计日志 | 需要手动记录 | COC 自动记录执行日志 |
| 批量部署 | 需要依次建立 SSH 连接 | 支持批量部署多台服务器 |
| 错误处理 | 需要手动处理 | COC 提供标准化错误处理 |
日志文件
| 文件路径 | 描述 |
|---|---|
| /var/log/dsh-bootstrap.log | 部署脚本执行日志 |
| /home/dsh/.dsh/ | dsh 数据目录(会话、工作区、构件) |
| /etc/systemd/system/dsh.service | dsh systemd 单元文件 |
| /etc/systemd/system/dsh.service.d/10-credentials.conf | DEEPSEEK_API_KEY 配置片段(权限模式为 600,仅在使用 --api-key 时创建) |
| /etc/nginx/conf.d/dsh.conf | Nginx 反向代理配置 |
文件结构
skills/huawei-cloud-ecs-dsh-deploy/
├── SKILL.md # English version
├── scripts/
│ ├── deploy_dsh.py # Main deployment script
│ ├── pyproject.toml # Dependency list
│ ├── huawei_cloud_ecs.py # Huawei Cloud SDK wrapper
│ ├── coc_deploy.py # COC deployment module (includes install script)
│ ├── config.py # Configuration constants
│ ├── utils.py # Utility functions
│ └── query_regions.py # Region query helper
└── references/
├── acceptance-criteria.md # Acceptance criteria
├── cli-installation-guide.md # CLI installation guide (KooCLI & dependencies)
├── iam-policies.md # IAM policies
├── verification-method.md # Verification methods
└── conversation-examples.md # Natural-language conversation examples
错误处理
已知限制
| 限制 | 描述 | 解决方案 |
|---|---|---|
| dsh 仅绑定环回地址 | 按设计,dsh Web 服务拒绝使用 --host 0.0.0.0 | 在本地建立 SSH 隧道:ssh -L 3080:127.0.0.1:3080 root@{ip},然后打开 http://127.0.0.1:3080 |
| 状态检查方法 | --status 检查服务器实例状态;dsh 健康检查需要 SSH 隧道 | 建立隧道后打开 http://127.0.0.1:3080 进行验证,或在服务器上运行 curl http://127.0.0.1:3080 |
常见错误
| 错误代码 | 描述 | 解决方案 |
|---|---|---|
| 401 Unauthorized | AK/SK 无效 | 确认 AK/SK 正确且有效 |
| 403 Forbidden | 权限被拒绝 | 添加所需的 IAM 策略 |
| QuotaExceeded | 资源配额已超限 | 检查 ECS/VPC/EIP 配额 |
| ServerLimitExceeded | 实例数量已达上限 | 释放未使用的实例 |
| FlavorNotFound | Flavor 不可用 | 尝试其他区域或 Flavor |
| Timeout | 创建服务器超时 | 在控制台中检查实际状态 |
| Node.js < 22 | dsh 需要 Node.js >= 22 | 安装脚本会自动安装 Node 22 LTS |
参考资料
Skill 参考文档
外部参考资料
- DeepSeek Harness GitHub - 官方仓库(默认分支:master)
- Flexus Cloud Server X Instance Documentation - Flexus X 实例产品文档
- AK/SK Authentication - IAM 认证指南