chore: init company-deploy-skills with dokploy-gitea-deploy

This commit is contained in:
deploy-bot
2026-07-31 09:47:16 +08:00
commit 7b56a16fbc
7 changed files with 1125 additions and 0 deletions

View File

@@ -0,0 +1,277 @@
---
name: dokploy-gitea-deploy
description: >
企业项目部署:默认走 company-deploy-mcp飞书身份 + buxi_ Key → 推 Gitea → MCP 建库/多卷/PG·MySQL/域名/HTTPS → 轮询)。
旧路径为直连 Dokploy API.env.deploy仅运维/无 MCP 时使用。触发词部署、上线、Dokploy、Gitea、
redeploy、MCP 部署、buxi_、company-deploy-mcp。Use when /dokploy-gitea-deploy。
metadata:
short-description: "企业部署:优先 MCP兼容 Dokploy 直连"
---
# 企业部署编排Gitea + Dokploy + company-deploy-mcp
业务同学不碰平台细节。Agent 负责:可构建工程 → 推代码 → 调控制面 → 交付 **HTTPS 链接**
**默认路径company-deploy-mcp必须优先。**
直连 Dokploy API 为 **legacy / 运维例外**
参考:
- `references/mcp-deploy.md`**MCP 默认状态机**(工具参数、域名/卷/库)
- `references/domain.md` — 域名与 HTTPSLets Encrypt无需通配符证书
- `references/sequence.md` — 时序
- `references/env-deploy.example` — 仅 legacy 直连用
- `references/stack-profiles.md` — Dockerfile 约定
线上连接中心:`https://company-deploy-mcp.loncode.site/`
MCP endpoint`https://company-deploy-mcp.loncode.site/mcp`
---
## 路径选择
| 条件 | 路径 |
|------|------|
| Agent 已配置 MCP `company-deploy``buxi_` Key | **MCP 默认** |
| 用户已飞书登录拿过 Key | **MCP 默认** |
| 用户明确「不要 MCP / 运维直连 / 改 Dokploy 底层」 | legacy |
| 无 MCP 且无 `.env.deploy` | **先引导连 MCP**,不要伪造部署 |
**禁止**在可用 MCP 时仍让业务填写 `DOKPLOY_API_KEY` / Gitea Token。
---
## 架构(默认)
```text
用户:「部署 / 上线」
→ AgentDockerfile + 本地验证
→ Agentensure_repositoryMCP
→ Agentgit push企业凭据用户无感
→ Agentcreate_deployment_plan + apply_deployment_plan
MCP 内部:挂卷 → PG/MySQL可选→ domainbuxi+5位.根域 + LE HTTPS→ deploy
→ Agentget_deployment_status / list_projects 轮询
→ 交付https://buxi*****.loncode.site + 脱敏说明
```
- **飞书**:身份;**buxi_ Key**:调用 MCP
- **Gitea**:源码;**Dokploy**:构建运行(由 MCP 调用,不直暴露给业务)
- **归属 / 配额 / 审计**:控制面 SQLite`owner_open_id`、运行中数量)
---
## 前置条件
### MCP 路径(默认)
1. 用户已在连接中心飞书登录Agent 已配置:
```json
{
"mcpServers": {
"company-deploy": {
"url": "https://company-deploy-mcp.loncode.site/mcp",
"headers": {
"Authorization": "Bearer buxi_..."
}
}
}
}
```
2. 项目有可构建 **Dockerfile**(进程监听 `spec.port`,状态写 `/data` 等挂载点)
3. Agent 本机可 `git push`(企业 Git 凭据,**不**向用户索要)
4. 企业侧已配:`*.DOMAIN_ROOT` DNS → Dokploy80/443 可达Lets Encrypt
无 Key引导打开连接中心登录**不要**继续直连 Dokploy。
### Legacy 路径(运维)
见文末;需 `.env.deploy` + `DEPLOY_AUTHORIZED=true`
---
## MCP 标准状态机(必须按序)
细节与 JSON 示例见 `references/mcp-deploy.md`
### 0. 身份
- 调用 `whoami`(可选):确认 `role` / `openId`
- 调用 `get_my_quota`:看运行中数量是否达上限
### 1. 工程
- 识别栈;保证 Dockerfile`.gitignore` 排除密钥
- 有状态:默认 `/data`;多目录用 `persistence[]`
- 需要库:`databases: [{ engine: "postgres"|"mysql", ... }]`
### 2. 仓库
```text
ensure_repository({ repo: "owner/name" 或 "name" })
→ git remote / commit / push
→ 记录 commitSha
```
### 3. 计划与发布
```text
create_deployment_plan({
repo, commitSha, branch,
# environment = 控制面「部署标签」,默认 default。禁止擅自 invent production/staging
# 除非用户明确说「再部署一套并行环境」。与 status/redeploy 必须同一标签;不确定 list_projects
environment: "default",
spec: {
buildType: "dockerfile",
dockerfilePath: "Dockerfile",
buildPath: "/",
port: <容器端口>,
healthcheckPath: "/",
persistence: [ /* 可选多卷;缺省自动加 /data */ ],
databases: [ /* 可选 postgres|mysql */ ],
exposeWeb: true
}
})
→ apply_deployment_plan({ planId })
→ 使用返回的 url / domain / databases密码已脱敏
```
**环境概念(易混):**
| 名称 | 是什么 | 谁决定 |
|------|--------|--------|
| Dokploy Environment | 应用建在平台哪个分组(如 preview | 控制面 `DOKPLOY_ENVIRONMENT_ID`(全站统一) |
| MCP `environment` | 部署标签,`repo+标签` 对应一套应用/域名 | Agent 参数,默认 `default`,全公司应统一 |
已有项目若当初用了非 default 标签,重部署/查状态必须继续传该标签,不要擅自改(否则会当成新项目)。
### 部署标签硬规则Agent
1. **默认且优先**:省略 `environment` 或显式 `"default"`
2. **禁止**仅因用户说「上线 / 生产 / 正式」就改成 `production`——那只是业务话术,不是部署标签。
3. **仅当**用户明确要求「第二套环境 / staging / 并行预发」时,才用非 default 标签。
4. 重部署前 `list_projects`,沿用已有 `environment` 字段。
### 4. 轮询与交付
```text
get_deployment_status / list_projects
Webcurl -skI "$url" 或健康路径(证书可能短暂签发中)
```
对用户:
-**HTTPS 链接**`apply``url`
- 不提 Gitea/Dokploy/Token
- 配额满、无权:原文转述 MCP 错误
### 5. 域名与 HTTPS控制面完成Agent 勿重复 domain.create
- 默认 host`buxi` + 5 位随机 `[a-z0-9]` + `.` + `DOMAIN_ROOT`
例:`buxi3k9xa.loncode.site`
- 首次分配后 **固定**(存在控制面 mapping
- HTTPSDokploy Traefik + **Lets Encrypt 按子域签证书****不需要**通配符证书)
- DNS建议 `*.loncode.site` → 服务器(通配 **解析**,不是通配证书)
- 证书失败:查 80/443、DNS可暂 HTTP 仅当控制面 `DOMAIN_HTTPS=false`
Agent **不要**在 MCP 路径下再调 Dokploy `domain.create`(避免双绑/冲突)。
### 6. 卷与数据库
| 能力 | 行为 |
|------|------|
| 默认卷 | Docker named volume → `/data`(避免 bind 目录不存在导致 Swarm 0/1 |
| bind 模式 | 可选;控制面 mkdir 宿主机路径,失败回退 volume |
| 多卷 | `spec.persistence[]`;缺 `/data` 仍自动补 |
| Postgres / MySQL | `spec.databases[]` → Dokploy 建库 + 注入 `DATABASE_URL` 等 |
| 重部署 | 同 repo+env 不占新配额名额;域名与库记录复用 |
应用必须把状态写在挂载路径(如 SQLite → `/data/app.db`)。
---
## 意图路由
| 用户说法 | 动作 |
|----------|------|
| 部署 / 上线 / 第一次发布 | MCP 全链路;交付 `url` |
| 重试 / 再构建 | 新 SHA → 新 plan → apply已有 mapping |
| 查状态 / 我的项目 | `list_projects` / `get_deployment_status` |
| 配额 | `get_my_quota` |
| 只要链接 | `list_projects``url`;无则查 status |
| 运维直连 Dokploy | 仅明确要求时走 legacy |
---
## 对用户话术
**成功:**
- 已发布当前版本
- 访问:`https://buxi….loncode.site/`(以 MCP 返回为准)
- 需要库时:说明已注入数据库连接(**不打印密码**
**失败:**
- 配额满 / 未登录 Key / 构建失败 / 证书签发中
- 给可执行下一步,不暴露平台密钥
---
## 安全红线
1. 永不 commit / 回显:`buxi_` Key、`MCP_AUTH_TOKEN`、Dokploy/Gitea Token、数据库密码全文
2. `apply` 返回的 `connectionUrl` 已脱敏则保持;未脱敏则遮罩
3. 普通用户不可查他人项目(控制面会 403
4. 生产破坏性操作仍受控制面策略约束
---
## Agent 检查清单MCP
- [ ] MCP 可用;`whoami` 正常
- [ ] Dockerfile + 数据写挂载点
- [ ] `ensure_repository` + push + `commitSha`
- [ ] plan 含正确 `port`;需要时 `persistence` / `databases`
- [ ] `apply` 拿到 `url`
- [ ] 轮询至终态;探活
- [ ] 未向用户索要 Dokploy/Gitea 地址或 Token
---
## Legacy直连 Dokploy运维例外
**仅当**用户明确要求或 MCP 不可用且有 `.env.deploy`
1. `set -a && source .env.deploy && set +a``DEPLOY_AUTHORIZED=true`
2. 按旧流程Dockerfile → push → `application.*` / `mounts` / `domain.create` / deploy
3. 域名规则见 `references/domain.md` **Legacy** 段(与 MCP 的 `buxi+5` 规则不同,勿混用)
4. 模板:`references/env-deploy.example`
5. 仍禁止把密钥贴进聊天
**默认对话不要走这条。** 有 MCP 时禁止向业务索要 `DOKPLOY_API_KEY`
---
## 与其它 skill 边界
| 场景 | 用 |
|------|-----|
| 企业 Dockerfile 部署(默认) | **本 skill → MCP** |
| 妙搭云端发布 | `lark-apps` |
| 无 MCP 的运维救火 | 本 skill → legacy |
---
## 故障速查MCP
| 现象 | 处理 |
|------|------|
| 401 / 要 Feishu Key | 引导连接中心登录,配置 `buxi_` |
| 运行中项目达上限 | `get_my_quota`;停/删旧应用后再部署 |
| Forbidden 看他人项目 | 非管理员;加 `ADMIN_OPEN_IDS` 或只查自己的 |
| 有部署无 HTTPS | 等 LE查 DNS/80控制面证书配置 |
| 重部署丢数据 | 确认写 `/data`;控制面默认挂载是否开启 |
| Swarm 0/1 + bind path does not exist | 控制面已默认 volume + mkdir旧应用可 `mkdir -p` 宿主机路径或删 bind 改 volume 后 redeploy |
| 要 PG/MySQL | plan 里带 `databases`,勿手建后不注入 env |