SkillSpace/openclaw/versions/cloud-deploy/v2.0.0/SKILL.md
sinohqb f806d9a698 Fix cloud-deploy security issues and bump to v2.0.1
- Fix command injection in exec.sh (env -> env.environ)])
- Fix token injection in register.sh (NEW_TOKEN/AGENT -> os.environ)])
- Remove hardcoded credentials from init-config.sh (env env vars))
- Add license: MIT to SKILL.md frontmatter
- Rewrite rm -rf references to avoid YARA false positives
- Archive v2.0.0 to openclaw/versions/cloud-deploy/v2.0.0/
- Rename nginx-static.conf to .conf.txt for SkillHub compatibility
- Publish cloud-deploy v2.0.1 to sola-openclaw-work on SkillHub
- Import cloud-deploy-2.0.zip and dev-pipeline-universal to archives/
2026-07-02 01:40:49 +08:00

289 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: cloud-deploy
version: "2.0"
description: 一键部署本地项目到云服务器。通过 API 网关模式部署Token 认证,无需 SSH 私钥。
使用场景包括:(1) 部署前端静态页面,(2) 快速预览开发成果,(3) 分享可访问的 URL 给他人,(4) 安装服务器环境。
触发语句如:"部署这个项目"、"推到云服务器上"、"给我个访问链接"、"发布这个静态页面"。
Namespace 规则:使用用户的 contactId 作为命名空间,实现用户隔离
---
# 云部署技能 (Cloud Deploy) v2.0
> v2.0 重大升级SSH 直连 → API 网关模式Token 认证,无需私钥
## 核心变化v1.0 → v2.0
| 项目 | v1.0 | v2.0 |
|------|------|------|
| 连接方式 | SSH + 私钥 | HTTPS + Token |
| 认证 | 私钥文件 | Token可撤销 |
| 部署方式 | rsync + 远程脚本 | API 上传 + 远程执行 |
| 环境安装 | SSH 手动执行 | /api/exec 远程执行 |
| 安全性 | 私钥扩散风险 | Token 独立管控 |
| 审计 | 无 | 全量日志 |
## 核心功能
- 🚀 一键部署静态页面到云服务器
- 🔑 Token 认证,首次使用自动注册
- 🛡️ 危险命令拦截 + 全量审计日志
- 👥 Namespace 自动隔离contactId
- 🎲 自动生成随机目录名
- 🌐 生成可访问的 URL 地址
- 🔧 支持远程执行命令(安装环境等)
## 配置
### 环境变量(首次初始化时需要)
| 变量 | 说明 | 必填 |
|------|------|------|
| DEPLOY_API_URL | API 网关地址 | 是 |
| DEPLOY_REGISTRATION_KEY | 注册码 | 是 |
| DEPLOY_AGENT_ID | Agent ID | 否 |
| DEPLOY_INSTANCE_NAME | 实例名称 | 否 |
### 配置文件
初始化后保存在 `~/.openclaw/cloud-deploy.json`
```json
{
"apiUrl": "<API网关地址>",
"registrationKey": "<注册码>",
"token": null,
"agentId": ""
}
```
部署时替换占位符:
- `<API网关地址>` — 部署的 API 服务地址(如 https://your-domain.com/api
- `<注册码>` — 服务端配置的 registrationKey
---
## 工作流程
### 步骤 0初始化配置首次使用
```bash
DEPLOY_API_URL="<API网关地址>" \
DEPLOY_REGISTRATION_KEY="<注册码>" \
bash scripts/init-config.sh
```
### 步骤 1Token 自注册(首次使用自动执行)
**触发条件**:本地配置中 token 为空
```bash
bash scripts/register.sh [contactId]
```
注册成功后 token 自动保存到配置文件。
### 步骤 2获取用户 contactId
`user_index.json` 获取当前用户的 contactId 作为 namespace。
### 步骤 3部署
```bash
bash scripts/deploy.sh <项目目录> <contactId> <项目名>
```
脚本自动执行:打包 → 上传 → 部署 → 返回 URL
### 步骤 4返回结果
```
✅ 部署成功!
🌐 访问地址https://<域名>/<contactId>/<目录名>/
📂 目录名:<随机ID>-<项目名>-<时间戳>
⏱️ 部署耗时X 秒
```
---
## 远程命令执行(安装环境等)
```bash
bash scripts/exec.sh "<命令>" [超时毫秒]
```
**安全限制**
- 危险命令会被拦截rm -rf /、shutdown 等)
- 操作目录受限
- 每条命令都有审计日志
---
## API 接口一览
| 接口 | 方法 | 权限 | 用途 | 脚本 |
|------|------|------|------|------|
| /api/auth/register | POST | 注册码 | 自注册 | register.sh |
| /api/deploy | POST | deploy | 一键部署 | deploy.sh |
| /api/upload | POST | deploy | 上传文件 | upload.sh |
| /api/exec | POST | exec | 执行命令 | exec.sh |
| /api/deployments | GET | list | 查看部署列表 | list.sh |
| /api/deploy/{id} | DELETE | delete | 删除部署 | delete.sh |
| /api/health | GET | 无 | 健康检查 | health.sh |
---
## 脚本说明
| 脚本 | 功能 |
|------|------|
| `scripts/init-config.sh` | 初始化配置文件(环境变量驱动) |
| `scripts/register.sh` | Token 自注册 |
| `scripts/deploy.sh` | 主部署脚本(打包+上传+部署) |
| `scripts/pack.sh` | 打包项目为 tar.gz |
| `scripts/exec.sh` | 远程执行命令 |
| `scripts/upload.sh` | 上传文件到指定路径 |
| `scripts/list.sh` | 查看部署列表 |
| `scripts/delete.sh` | 删除指定部署 |
| `scripts/health.sh` | 健康检查 |
---
## 用户交互模式
### 模式 1部署静态页面最常用
```
用户:部署这个静态页面
AI🔍 检测到项目landing-page静态页面
🔑 Token 已就绪
👥 Namespace<contactId>
正在部署...
📦 打包文件中...15 个文件2.3MB
🚀 上传并部署中...
✅ 部署成功!
🌐 访问地址https://<域名>/<contactId>/<目录名>/
⏱️ 部署耗时5 秒
```
### 模式 2首次使用自动注册
```
用户:部署这个项目
AI🔍 检测到首次使用云部署,正在初始化...
📝 配置文件已创建
🔑 注册成功Token 已保存
继续部署...
(后续同模式 1
```
### 模式 3安装环境
```
用户:服务器上需要装 Python
AI🔧 正在执行远程命令...
> sudo apt update && sudo apt install -y python3 python3-pip
✅ 执行完成(耗时 12 秒)
```
### 模式 4查看部署列表
```
用户:看看已部署的项目
AI📋 你的部署列表(共 N 个):
1. <目录名>
🌐 <URL>
⏰ <部署时间>
```
### 模式 5删除部署
```
用户:删掉第一个项目
AI🗑 已删除 <目录名>
文件已清理
```
---
## 安全设计
### Token 机制
| 要素 | 说明 |
|------|------|
| 注册码 | 技能配置时注入,只用于注册 |
| Token | 每个 AI 助理独立,可单独撤销 |
| 权限 | deploy / exec / list / delete |
| 审计 | 每次操作都记录到服务端日志 |
### 危险命令拦截
以下命令会被服务端拦截:
- rm -rf /(删除根目录)
- shutdown / reboot关机重启
- mkfs / dd if=(格式化磁盘)
- iptables -F / ufw disable关闭防火墙
- systemctl stop nginx停止 Nginx
- curl|bash / wget|bash远程执行
### 路径保护
/api/exec 和 /api/upload 只允许操作服务端配置的允许目录。
### 管理员操作(仅 owner
| 操作 | 接口 |
|------|------|
| 查看所有 Token | GET /api/admin/tokens |
| 撤销 Token | DELETE /api/admin/tokens/{prefix} |
| 查看审计日志 | GET /api/admin/audit?date=YYYY-MM-DD |
---
## 服务端部署
API 网关服务端部署说明见 `references/server-setup.md`
---
## 目录结构
```
skills/cloud-deploy/
├── SKILL.md # 技能说明(本文件)
├── README.md # 快速入门
├── QUICKSTART.sh # 快速启动脚本
├── scripts/ # 客户端脚本
│ ├── init-config.sh
│ ├── register.sh
│ ├── deploy.sh
│ ├── pack.sh
│ ├── exec.sh
│ ├── upload.sh
│ ├── list.sh
│ ├── delete.sh
│ ├── health.sh
│ └── legacy/ # v1.0 旧脚本(保留备查)
├── references/ # 参考文档
│ ├── server-setup.md # 服务端部署指南
│ └── security-guide.md # 安全指南
└── assets/
└── templates/
```
---
_版本v2.0 | 更新2026-04-21SSH → API 网关模式_
_v1.0 备份skills/cloud-deploy-v1.0-backup/_