diff --git a/dokploy-gitea-deploy/SKILL.md b/dokploy-gitea-deploy/SKILL.md index 90efbf0..90f4969 100644 --- a/dokploy-gitea-deploy/SKILL.md +++ b/dokploy-gitea-deploy/SKILL.md @@ -22,7 +22,7 @@ metadata: | 调 MCP 工具部署 | 让用户打开 Dokploy 管理面板 | | 401 → 引导连接中心重拿 Key | 说「权限配置无法通过,去找管理员要 Dokploy 权限」 | | 交付 `https://buxi….loncode.site` | 索要 `DOKPLOY_API_KEY` / Gitea Token / 面板账号 | -| 环境变量靠 plan(`databases[]` 等)或代码默认 | 让用户去 Dokploy 改某个应用的 env | +| 业务密钥用 `set_application_env` 写入容器 env | 让用户去 Dokploy 改 env,或把 `.env` 推进 Git | **连接中心** `https://company-deploy-mcp.loncode.site/` = 飞书身份 + MCP 授权,**不是** Dokploy 面板。 **Dokploy** 只被控制面服务端调用,**业务用户与业务 Agent 默认不可见、不需要、不引导**。 @@ -147,12 +147,36 @@ list_projects - ❌「企业部署连接中心不是 Dokploy,所以你没法配 env——去找管理员开 Dokploy」 - ❌ 凭空编造 Dokploy URL -若用户要的是 **业务应用自定义密钥**(如第三方 API Key),而 plan 又注入不了: +### 3.5 业务环境变量 / 密钥(容器 env) -> 当前 MCP 会自动注入数据库连接(`databases[]`)和运行所需基础变量; -> **不提供**业务同学自助打开 Dokploy 改 env。 -> 可选:① 非密钥配置进代码/配置文件;② 密钥由平台管理员走运维通道注入(不经过业务 Dokploy 账号);③ 应用支持启动后自助配置页。 -> **我不会让你去申请 Dokploy 面板权限。** +**正确路径(MCP):** 写入 Dokploy 应用配置 → **容器进程环境变量**(不是 Git 里的 `.env` 文件)。 + +```text +# 项目须已 apply 过至少一次(有 mapping) +list_application_env_keys({ repo, environment: "default" }) +→ 只返回键名,永不返回值 + +set_application_env({ + repo, + environment: "default", + vars: { "FEISHU_APP_ID": "...", "OPENAI_API_KEY": "..." }, + # removeKeys: ["OLD_KEY"], # 可选删除 + redeploy: true # 建议 true,否则运行中容器可能仍用旧 env +}) +→ 返回 updatedKeys / keys(仅名称);**响应永不包含 secret 值** +``` + +| 规则 | | +|------|--| +| `.env` 文件 | **禁止** push 进企业 Git;本地可留,但密钥用 `set_application_env` 注入 | +| 数据库连接 | 仍用 plan `databases[]` 自动注入;普通用户 **不能** 覆盖 `DATABASE_URL` 等受保护键 | +| 受保护键(非 admin) | `DATABASE_URL`、`SUDA_DATABASE_URL`、`SERVER_*`、`PORT`、`FORCE_*`、`COMPANY_DEPLOY_SELF_HOST` | +| Dokploy 面板 | **禁止**引导用户打开改 env | +| 审计 | 控制面记录写入了哪些 **键名**,不记 value | + +话术示例: + +> 密钥不会进代码仓库。我会用企业部署 MCP 的 `set_application_env` 写到运行环境(容器 env),并触发重新部署。请把需要的 KEY 和值发我(或确认本机已配置好后由我读取本地 `.env` **仅用于调用 MCP,不 commit**)。 --- @@ -256,6 +280,8 @@ Web:curl -skI "$url"(证书首次可能 1–3 分钟) | `apply_deployment_plan` | 真正发布 | | `get_deployment_status` | 轮询 | | `get_sanitized_logs` | 脱敏诊断 | +| `list_application_env_keys` | 列出容器 env **键名**(无值) | +| `set_application_env` | 合并/删除业务密钥到容器 env;`redeploy:true` 使生效 | | `reset_project_mapping` | 仅 mapping 脏了且用户/admin 确认(不删 Dokploy/Gitea 实体) | --- @@ -312,7 +338,8 @@ Web:curl -skI "$url"(证书首次可能 1–3 分钟) | 重部署丢数据 | 确认写 `/data`;同 repo+env 卷会复用 | | Swarm 0/1 bind path | 控制面默认 volume;见 status/logs | | 要 PG/MySQL | plan `databases[]`,应用读 `DATABASE_URL` | -| 业务要自定义密钥 | §3.4 末段;**禁止**引导 Dokploy 改 env | +| 业务要自定义密钥 / 配环境变量 | **`set_application_env`**(§3.5);禁止 `.env` 进 Git、禁止 Dokploy 面板 | +| 密钥写了但应用仍像没配 | `redeploy:true` 或再 apply;`list_application_env_keys` 确认键名 | | 妙搭模板白屏/平台 API | 非主路径;`stack-profiles`;勿堆网关适配 | | `FORCE_AUTHN_*` 启动失败 | apply 会注入 boot env;不等于业务可用 | @@ -327,6 +354,7 @@ Web:curl -skI "$url"(证书首次可能 1–3 分钟) | 我的项目 / 链接 | `list_projects` / `get_deployment_status` | | 配额 | `get_my_quota` | | 连不上 / 没权限 | **只**走 §2–§3(连接中心),**禁止** Dokploy | +| 配密钥 / 环境变量 / API Key | §3.5 `set_application_env`(`redeploy:true`) | | 运维直连 Dokploy | 仅用户**明确**要求且本机有 `.env.deploy` → §8 | | 妙搭应用 | 先边界说明;优先 `lark-apps`;自托管实验见 stack-profiles | @@ -354,8 +382,8 @@ Web:curl -skI "$url"(证书首次可能 1–3 分钟) | 自管登录与 DB 的 API | **支持** | | 飞书妙搭 / `@lark-apaas/*` | **实验性**;不承诺登录/平台 API;见 `stack-profiles.md` | -主路径承诺:Dockerfile + 端口 + `/data` + 可选库 → **HTTPS 链接**。 -不承诺:模拟妙搭网关、业务自定义 env 面板、用户进入 Dokploy。 +主路径承诺:Dockerfile + 端口 + `/data` + 可选库 → **HTTPS 链接**;业务密钥经 `set_application_env` 进容器 env。 +不承诺:模拟妙搭网关、用户进入 Dokploy 面板。 --- diff --git a/dokploy-gitea-deploy/references/mcp-deploy.md b/dokploy-gitea-deploy/references/mcp-deploy.md index db65f58..2051997 100644 --- a/dokploy-gitea-deploy/references/mcp-deploy.md +++ b/dokploy-gitea-deploy/references/mcp-deploy.md @@ -8,7 +8,8 @@ | 禁止 | 正确 | |------|------| | 让用户打开 Dokploy 面板 / 要面板地址 | 业务路径 **永不** 需要 Dokploy UI | -| 要 Dokploy 账号、某应用「环境变量编辑权限」 | 库用 `databases[]`;自定义密钥见 SKILL §3.4,不导向 Dokploy | +| 要 Dokploy 账号、「环境变量编辑权限」 | 库用 `databases[]`;业务密钥用 **`set_application_env`** | +| 把 `.env` 推进企业 Git | 密钥用 `set_application_env` 写容器 env;`.gitignore` 排除 `.env` | | 「权限配置无法通过」却未调用 `whoami` | 先 `whoami`;401 才引导 **连接中心** 重拿 `buxi_` | | 索要 `DOKPLOY_API_KEY` / Gitea Token / 用户 SSH | 只用 MCP + `ensure_repository.pushUrl` | | 编造 Dokploy URL | 不要猜 | @@ -66,6 +67,8 @@ Agent 配置示例(用户从连接中心复制,**不要**写进业务仓库 | `apply_deployment_plan` | 写 | 挂卷 → PG/MySQL → 域名/HTTPS → deploy | | `get_deployment_status` | 读 | 应用与部署摘要(脱敏) | | `get_sanitized_logs` | 读 | 脱敏诊断摘要 | +| `list_application_env_keys` | 读 | 容器/应用 env **键名**列表(永不返回值) | +| `set_application_env` | 写 | 合并/删除业务 env → 容器环境变量;可选 `redeploy` | `repo` 格式: @@ -283,6 +286,40 @@ Agent **不要**再直连 Dokploy 做 `domain.create` / `mounts.create` / 手建 --- +## 业务环境变量(容器 env) + +项目 **至少 apply 成功一次** 后: + +```json +// 仅键名 +{ "repo": "my-app", "environment": "default" } +// → list_application_env_keys + +// 写入 / 覆盖 / 删除 +{ + "repo": "my-app", + "environment": "default", + "vars": { + "FEISHU_APP_ID": "cli_xxx", + "FEISHU_APP_SECRET": "secret" + }, + "removeKeys": [], + "redeploy": true +} +// → set_application_env +``` + +| 规则 | | +|------|--| +| 落点 | Dokploy 应用 env → **容器进程环境变量** | +| 不进 Git | 禁止 commit `.env` | +| 响应 | 只含 `updatedKeys` / `keys` 等名称;**永不回显 value** | +| 受保护键(非 admin) | `DATABASE_URL`、`SUDA_DATABASE_URL`、`SERVER_*`、`PORT`、`FORCE_*`、`COMPANY_DEPLOY_SELF_HOST` | +| `redeploy: true` | 建议;否则旧容器可能仍用旧 env | +| 权限 | 项目 owner 或 admin | + +--- + ## 配额与归属 | 概念 | 行为 |