Files
company-deploy-skills/dokploy-gitea-deploy/SKILL.md

390 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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: dokploy-gitea-deploy
description: >
企业 Dockerfile 项目部署唯一默认路径company-deploy-mcp
飞书登录拿 buxi_ Key → 配置 MCP → whoami 联通 → ensure_repository + pushUrl 推代码
→ create/apply plan → 轮询 → 交付 HTTPS 链接。用户永不进 Dokploy/Gitea。
触发部署、上线、重部署、redeploy、查项目、配额、buxi_、company-deploy、企业部署。
禁止引导用户打开 Dokploy 面板或索要 DOKPLOY_API_KEY。Use when /dokploy-gitea-deploy。
metadata:
short-description: "企业部署MCP 全流程(用户不进 Dokploy"
---
# 企业部署 Skillcompany-deploy-mcp
## 0. 一句话
**用户只做两件事:① 连接中心飞书登录拿 `buxi_` Key 配到 Agent② 说「部署」。**
其余建库、推代码凭据、挂卷、数据库、域名、HTTPS、构建全部由 **Agent + MCP** 完成。
| 正确 | 错误(禁止) |
|------|----------------|
| 调 MCP 工具部署 | 让用户打开 Dokploy 管理面板 |
| 401 → 引导连接中心重拿 Key | 说「权限配置无法通过,去找管理员要 Dokploy 权限」 |
| 交付 `https://buxi….loncode.site` | 索要 `DOKPLOY_API_KEY` / Gitea Token / 面板账号 |
| 环境变量靠 plan`databases[]` 等)或代码默认 | 让用户去 Dokploy 改某个应用的 env |
**连接中心** `https://company-deploy-mcp.loncode.site/` = 飞书身份 + MCP 授权,**不是** Dokploy 面板。
**Dokploy** 只被控制面服务端调用,**业务用户与业务 Agent 默认不可见、不需要、不引导**。
---
## 1. 安装本 Skill一次性
```bash
curl -fsSL https://company-deploy-mcp.loncode.site/install-skill.sh | bash
# 或
npx skills add http://git.loncode.site/Buxi/company-deploy-skills.git --skill dokploy-gitea-deploy -g -y
```
Skill 只定义流程;**没有配置 MCP + `buxi_` Key 则无法部署**。
---
## 2. 联通性检测(每次部署前必做)
按顺序,**先测再部署**。任一步失败:按 §6 处理,**禁止**改口去要 Dokploy。
### 2.1 MCP 是否挂上
Agent 能否调用 `company-deploy` 的工具(至少 `whoami`)。
| 结果 | 含义 | 下一步 |
|------|------|--------|
| 工具列表里有 `whoami` / `apply_deployment_plan` | 已配置 MCP | → 2.2 |
| 没有这些工具 / 调用直接失败 | 未配置或 Key 错误 | → §3 鉴权 |
### 2.2 身份
```text
whoami
```
期望字段示例:`role``user`|`admin`)、`openId``name``isAdmin`
| 结果 | 处理 |
|------|------|
| 返回身份 JSON | 联通成功 |
| 401 / Unauthorized / invalid token | Key 无效 → §3 |
| 超时 / 连接失败 | 网络或控制面宕机 → 告之稍后重试,可 `curl -sS https://company-deploy-mcp.loncode.site/health` |
### 2.3 配额
```text
get_my_quota
```
看运行中项目数是否达上限。满了:先 `list_projects`,让用户停/删不用的,**不要**绕过 MCP。
### 2.4(可选)已有项目
```text
list_projects
```
重部署时记下已有 `repo` + `environment`(部署标签,默认多为 `default`**必须沿用**,禁止擅自改成 `production`
---
## 3. 鉴权与获取授权
### 3.1 用户怎么拿 Key业务同学
1. 浏览器打开:**https://company-deploy-mcp.loncode.site/**
2. **飞书登录**
3. 复制页面上的 **`buxi_…` Key** 与 MCP 配置片段
4. 粘贴到 Agent 的 MCP 配置(见下)
5. 回到对话说「已配置」或直接「部署」
### 3.2 Agent / 客户端怎么配
```json
{
"mcpServers": {
"company-deploy": {
"url": "https://company-deploy-mcp.loncode.site/mcp",
"headers": {
"Authorization": "Bearer buxi_用户从连接中心复制的Key"
}
}
}
}
```
- 前缀:`buxi_`(旧 `cdp_` 可能仍可用,新发一律 `buxi_`
- **禁止**把 Key 写进业务 Git 仓库
- **禁止**把 Key 完整打印在对用户的回复里(可确认「已配置」)
### 3.3 权限模型Agent 必须理解)
| 能力 | 谁有 | 说明 |
|------|------|------|
| 部署自己的项目 | 任意有效 `buxi_` | 首次 `apply` 建立归属 |
| 看自己的项目列表/状态 | 自己 | `list_projects` / `get_deployment_status` |
| 看别人的项目 | 仅 admin | `ADMIN_OPEN_IDS` 或平台 `MCP_AUTH_TOKEN` |
| 进 Dokploy 面板 | **不在本产品路径** | **禁止**当作用户解决办法 |
| 手改 Gitea 权限 / SSH | **不需要** | 推送只用 `ensure_repository``pushUrl` |
### 3.4 鉴权失败怎么说(固定话术)
**401 / 未配置 MCP**
> 还不能部署:需要先完成企业部署授权。
> 1. 打开 https://company-deploy-mcp.loncode.site/
> 2. 飞书登录,复制 `buxi_` Key
> 3. 按页面说明粘贴到当前 Agent 的 MCP 配置
> 4. 配置好后回复「已配置」,我再继续部署。
> (连接中心只负责身份和 MCP不需要 Dokploy 账号。)
**403 看别人的项目:**
> 当前账号只能管理自己名下的项目。如需管理员视角,请联系平台管理员把你的飞书 open_id 加入白名单。
**禁止话术(截图类错误):**
- ❌「你不能通过项目网页进入 Dokploy」
- ❌「向管理员索取 Dokploy 面板地址 / 登录账号 / 某应用环境变量编辑权限」
- ❌「企业部署连接中心不是 Dokploy所以你没法配 env——去找管理员开 Dokploy」
- ❌ 凭空编造 Dokploy URL
若用户要的是 **业务应用自定义密钥**(如第三方 API Key而 plan 又注入不了:
> 当前 MCP 会自动注入数据库连接(`databases[]`)和运行所需基础变量;
> **不提供**业务同学自助打开 Dokploy 改 env。
> 可选:① 非密钥配置进代码/配置文件;② 密钥由平台管理员走运维通道注入(不经过业务 Dokploy 账号);③ 应用支持启动后自助配置页。
> **我不会让你去申请 Dokploy 面板权限。**
---
## 4. 部署操作流程(默认全链路)
**前提:** §2 联通、§3 有有效 Key。工程为 **普通 Dockerfile** 服务Python/Node/静态站等)。
妙搭/`@lark-apaas`:非主路径,见 `references/stack-profiles.md`;勿承诺与妙搭线上一致。
```text
┌─────────────────────────────────────────────────────────────┐
│ A. 工程准备(本地) │
│ B. ensure_repository → pushUrl 推送Agent禁止用户 SSH
│ C. create_deployment_plan │
│ D. apply_deployment_plan ← 卷/库/域名/构建全在这里 │
│ E. 轮询 get_deployment_status / list_projects │
│ F. 探活 URL → 按 §5 回复用户 │
└─────────────────────────────────────────────────────────────┘
```
细节参数见 `references/mcp-deploy.md`;时序见 `references/sequence.md`
### 4.1 工程准备Agent
- [ ]`Dockerfile`,进程监听 **`0.0.0.0` + 容器端口**(与 plan `spec.port` 一致)
- [ ] 有状态写 **`/data`**(或 `persistence[]` 声明的路径)
- [ ] `.gitignore` 排除 `.env`、密钥、本地 db
- [ ] 需要 PG/MySQL → plan 里 `databases: [{ "engine": "postgres", "envVar": "DATABASE_URL" }]`
- [ ] Node 大前端:见 `stack-profiles.md`(禁止 install 前 `NODE_ENV=production`;堆内存;串行 multi-stage
### 4.2 仓库与推送
```text
ensure_repository({ repo: "项目名" 或 "Buxi/项目名" })
→ 使用返回的 agentHint.pushUrl内含企业机器人 Token
→ git add / commit
→ git push --set-upstream "<pushUrl>" HEAD:<defaultBranch>
→ 记录 commitShagit rev-parse HEAD
```
| 硬规则 | |
|--------|--|
| 必须用 `pushUrl` 推 | 不要用无 Token 的 `origin` |
| 禁止要用户配 SSH / 加公钥到 Gitea | 失败则重取 `ensure_repository`,查网络 |
| 禁止把 `pushUrl` 全文贴给用户 | |
### 4.3 建计划
```text
create_deployment_plan({
repo,
commitSha, # 已在 Gitea 上
branch: "main",
environment: "default", # 除非用户明确要第二套并行环境
spec: {
buildType: "dockerfile",
dockerfilePath: "Dockerfile",
buildPath: "/",
port: <容器端口>,
healthcheckPath: "/",
exposeWeb: true
# persistence / databases 按需
}
})
→ 记下 planId
```
**部署标签 `environment`** 控制面 mapping 键,**不是** Dokploy 的 preview/production 分组。
默认 **`default`**。禁止因用户说「上线/生产」就改成 `production`
### 4.4 发布
```text
apply_deployment_plan({ planId })
```
控制面内部Agent **不要**再做):挂卷 → 可选数据库 → 域名 `buxi`+5位+`DOMAIN_ROOT` + LE HTTPS → deploy。
从返回中取:`url` / `domain` / `applicationId` / `isNewProject`**勿回显**数据库密码)。
### 4.5 轮询与探活
```text
每 1530sget_deployment_status({ repo, environment }) 或 list_projects
终态:构建成功且运行中
Webcurl -skI "$url"(证书首次可能 13 分钟)
失败get_sanitized_logs → 修代码/Dockerfile → 新 SHA → 新 plan → apply
```
同一 `repo`+`environment` 重部署:**复用**域名与卷,**不占**新配额名额。
### 4.6 工具速查
| 工具 | 何时 |
|------|------|
| `whoami` | 联通 / 身份 |
| `get_my_quota` | 部署前配额 |
| `list_projects` | 我的项目、重部署标签 |
| `inspect_project` | 单项目映射与策略 |
| `ensure_repository` | 建库 + `pushUrl` |
| `create_deployment_plan` | 已 push 的 SHA |
| `apply_deployment_plan` | 真正发布 |
| `get_deployment_status` | 轮询 |
| `get_sanitized_logs` | 脱敏诊断 |
| `reset_project_mapping` | 仅 mapping 脏了且用户/admin 确认(不删 Dokploy/Gitea 实体) |
---
## 5. 返回给用户的内容(必须遵守)
### 5.1 成功
```text
已发布当前版本。
访问https://buxi*****.loncode.site/ (以 apply 返回的 url 为准)
(如有数据库)已配置托管数据库连接(不展示密码)。
```
可选:构建约 X 分钟、证书刚签发时可稍等再打开。
**不要**提 Gitea、Dokploy、Token、`pushUrl`、内部 applicationId除非用户是运维且明确要
### 5.2 进行中
```text
正在构建/启动,大约需要几分钟。我会继续检查状态。
```
### 5.3 失败(可执行下一步)
| 场景 | 回复要点 |
|------|----------|
| 未授权 | §3.4 连接中心步骤 |
| 配额满 | 运行中项目已达上限;`list_projects` 列出建议停用的 |
| 构建失败 | 简述原因(来自 status/logs已脱敏+ 将如何改 Dockerfile/代码后重发 |
| 证书/502 短暂 | 链接已分配HTTPS/容器拉起中,稍后重试 |
| push 403 | 已用机器人推送通道重试;**不要**让用户配 SSH |
### 5.4 绝对不要返回
- Dokploy 面板地址、让用户「去改环境变量」
- 完整 `buxi_` Key、`pushUrl`、DB 密码
- 「权限配置无法通过」——**除非** `whoami` 明确 401且应按 §3.4 引导连接中心,而不是 Dokploy
---
## 6. 常见问题与解决办法
| 现象 | 正确处理 |
|------|----------|
| Agent 没有 MCP 工具 | 引导用户按 §3 配置连接中心 Key |
| `whoami` 401 | 重新登录连接中心、换新 Key、检查 Bearer 格式 |
| 用户问「Dokploy 地址/权限」 | 说明业务路径不需要;部署走 MCP连接中心只发 Key |
| git push Permission denied / 要 SSH | **错误路径**`ensure_repository``pushUrl` 再推 |
| `nest`/`vite` not found | Dockerfile先全量 `npm ci``NODE_ENV=production` |
| JS heap OOM | `NODE_OPTIONS=--max-old-space-size=3072`;避免并行双 npm ci |
| 查不到项目 | `list_projects`;确认 `environment` 与首次 apply 一致(默认 `default` |
| 403 看他人项目 | 非 admin不要猜 Dokploy |
| 重部署丢数据 | 确认写 `/data`;同 repo+env 卷会复用 |
| Swarm 0/1 bind path | 控制面默认 volume见 status/logs |
| 要 PG/MySQL | plan `databases[]`,应用读 `DATABASE_URL` |
| 业务要自定义密钥 | §3.4 末段;**禁止**引导 Dokploy 改 env |
| 妙搭模板白屏/平台 API | 非主路径;`stack-profiles`;勿堆网关适配 |
| `FORCE_AUTHN_*` 启动失败 | apply 会注入 boot env不等于业务可用 |
---
## 7. 意图路由(用户一句话 → 动作)
| 用户说法 | Agent 动作 |
|----------|------------|
| 部署 / 上线 / 发布 | §2 → §4 全链路 → §5 交付 URL |
| 再发一版 / 重试 | push 新 SHA → create+apply同 environment→ 轮询 |
| 我的项目 / 链接 | `list_projects` / `get_deployment_status` |
| 配额 | `get_my_quota` |
| 连不上 / 没权限 | **只**走 §2§3连接中心**禁止** Dokploy |
| 运维直连 Dokploy | 仅用户**明确**要求且本机有 `.env.deploy` → §8 |
| 妙搭应用 | 先边界说明;优先 `lark-apps`;自托管实验见 stack-profiles |
---
## 8. Legacy直连 Dokploy运维例外 · 默认关闭)
**仅当**同时满足:
1. 用户明确说「不要 MCP / 运维直连 Dokploy」
2. 本机有 `.env.deploy` + `DEPLOY_AUTHORIZED=true`
才可直连 Dokploy API。模板见 `references/env-deploy.example`
**有 MCP 时禁止向业务要 `DOKPLOY_API_KEY`。**
默认对话 **不要** 提 Dokploy 面板。
---
## 9. 支持范围(产品收口)
| 栈 | 状态 |
|----|------|
| 普通 Python / Node / 静态站 + Dockerfile | **支持**(主路径) |
| 自管登录与 DB 的 API | **支持** |
| 飞书妙搭 / `@lark-apaas/*` | **实验性**;不承诺登录/平台 API`stack-profiles.md` |
主路径承诺Dockerfile + 端口 + `/data` + 可选库 → **HTTPS 链接**
不承诺:模拟妙搭网关、业务自定义 env 面板、用户进入 Dokploy。
---
## 10. 参考文件
| 文件 | 内容 |
|------|------|
| `references/mcp-deploy.md` | 工具参数、JSON 示例、apply 内部顺序 |
| `references/sequence.md` | 时序图 |
| `references/domain.md` | 域名与 HTTPS |
| `references/stack-profiles.md` | Dockerfile 约定 + 支持矩阵 |
| `references/env-deploy.example` | 仅 legacy |
线上:
- 连接中心https://company-deploy-mcp.loncode.site/
- MCPhttps://company-deploy-mcp.loncode.site/mcp
- 技能仓http://git.loncode.site/Buxi/company-deploy-skills
---
## 11. Agent 出发前检查清单
- [ ]`whoami` 成功(不是假设有权限)
- [ ] 未要求用户打开 Dokploy / 提供面板账号
- [ ] 未索要 `DOKPLOY_API_KEY` / 用户 SSH
- [ ] Dockerfile + port + `/data`(及可选 databases
- [ ] `ensure_repository` + **pushUrl** 推送 + `commitSha`
- [ ] `environment` 默认 `default` 或与历史一致
- [ ] `apply` 后轮询并交付 **HTTPS url**
- [ ] 回复符合 §5无密钥、无 Dokploy 推诿)