> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flashduty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Apps

> Apps 用于管理 AI SRE 已授权的外部应用，包括 GitHub、GitLab 与 Kubernetes App。您可以授权代码仓库，或将 Kubernetes 集群以指定的 namespace 与权限边界接入 AI SRE。

> AI SRE 需在控制台开通，面向 On-call 专业版及以上订阅，按实际用量计费，详见[开通与计费](/zh/ai-sre/overview#开通与计费)。

## 概述

**Apps** 是管理“已授权的外部应用”的地方。每个外部应用以一张**应用卡片**呈现——您在它的卡片上完成授权、管理安装、并随时启停或撤销。

Apps 包含 **GitHub**、**GitLab** 和 **Kubernetes App**。GitHub 与 GitLab 用于授权代码仓库：AI SRE 可以在会话中读代码、调查变更 / 提交 / PR（GitLab 中为 MR），并按需修改缺陷、创建 PR / MR 或 issue。Kubernetes App 则把指定 Kubernetes 集群接入 AI SRE，并通过配置的 namespace 与权限边界限制 Agent 的操作范围。

## 主要场景：让云端沙箱访问您的仓库

AI SRE 的会话默认运行在 **Flashduty 云端沙箱**里。沙箱是干净、隔离的临时环境，**不带您的任何 git 登录凭证**——这正是 App 要解决的问题。授权 GitHub App 或 GitLab App 后，沙箱里的 Agent 才能 clone 您的仓库、读 diff、开 PR / MR，而**您无需向它交出任何密码或 token**；它的访问被限制在您授权的那些仓库，且仅为完成任务所需的最小权限。**这是这两个 App 的主要用途。**

<Note>
  **BYOC（自托管 Runner）一般用不到它。** Runner 跑在您自己的机器上，那台机器通常**已经配好了 `gh` / `glab` / `git` 凭证**（您平时就在上面操作仓库）。这种情况下 Agent 直接用宿主机自带的凭证即可，**不需要再授权对应的 App**。（若宿主机恰好没配相应凭证，授权 App 同样能让 BYOC 会话用上。）运行环境的差异见 [运行环境（BYOC）](/zh/ai-sre/environments)。
</Note>

<Tip>
  RUM 应用也可以记录构建它的代码仓库（可关联多个，第一个为主仓库），让 AI 分析 RUM 问题时直接定位到代码——见[应用管理 · 代码仓库](/zh/rum/quickstart/app-management#代码仓库)。填写关联**不会**因此获得任何仓库访问权限：云端 AI 会话能读到的，仍然只有这里授权给账户的仓库。
</Tip>

## 位置

进入 **AI SRE → 自定义 → 插件 → Apps**。插件分组在自定义侧栏中依次列出 概览 / Apps / Skill / MCP / Agents，点击 **自定义** 时默认打开 **概览**。

<Note>
  查看 Apps 页面需要相应权限；没有权限时侧栏中不显示该入口。授权、断开 / 撤销、启用 / 禁用各自还需对应的操作权限——无权限时对应按钮以禁用态显示。
</Note>

## Kubernetes App

Kubernetes App 将集群中的 Agent 接入 AI SRE。创建后，AI SRE 可以在授权范围内查询集群信息并执行可用的 Kubernetes 工具；它只能访问您在配置中指定的 namespace 和权限级别。

### 创建并安装

<Steps>
  <Step title="创建 Kubernetes App">
    进入 **自定义 → 插件 → Apps → Kubernetes App**，点击 **创建 Kubernetes App**。填写集群名称，并选择范围：**共享** 可供账户内所有会话使用；**团队** 可供该团队会话及该团队成员的个人会话使用。同一范围内的集群名称不能重复。
  </Step>

  <Step title="设置 namespace 与权限">
    选择 **全部 namespace** 或 **指定 namespace**。全部 namespace 会把同一权限应用到当前和未来的 namespace；指定 namespace 可以为每个 namespace 单独选择 **只读**、**读取 + 有限修改** 或 **完全权限**。不填写指定 namespace 时，Agent 只能读取集群基础元数据。**完全权限** 是该 namespace 内的最高权限：指定 namespace 的完全权限仅作用于该 namespace，集群基础元数据仍保持只读；**全部 namespace + 完全权限** 会通过 `ClusterRoleBinding` 授予 `cluster-admin`，包括集群级资源与集群 RBAC（该能力仅“全部 namespace”支持）。各档位的具体能力见下文 [权限说明](#权限说明)，完整 RBAC 规则可在表单中点击“查看 Kubernetes RBAC 详情”核对。
  </Step>

  <Step title="执行安装命令">
    保存后复制控制台生成的安装命令，并在目标集群中执行。安装命令会过期；过期后重新打开安装配置或查看 Manifest 生成新命令，无需轮换 Token。
  </Step>
</Steps>

<Warning>
  修改 namespace 或权限后，必须重新执行安装命令，集群中的 RBAC 才会更新。选择 **读取 + 有限修改** 前，请确认该 namespace 中允许 AI SRE 执行相应操作。**完全权限** 是高风险选项：指定 namespace 的完全权限允许此 App 读取、创建、修改和删除该 namespace 内的全部资源；**全部 namespace + 完全权限** 会升级为集群管理员访问（`cluster-admin`），请谨慎选择。
</Warning>

### 权限说明

以下能力边界适用于所有档位：

* 所有档位都可以读取集群信息、节点、Pod、事件、日志和 ConfigMap 等非敏感资源
* 所有档位都不支持进入容器（exec）、Attach、端口转发，以及 watch 和日志实时跟随（`-f`）。这是接入方式的限制，与权限档位无关

各档位的差异操作如下：

| 操作 | 只读 | 读取 + 有限修改 | 完全权限 |
| - | - | - | - |
| 读取 Secret | 否 | 否 | 是 |
| 驱逐 Pod（用于重启工作负载） | 否 | 是 | 是 |
| 扩缩容 Deployment 和 StatefulSet | 否 | 是 | 是 |
| 调整 HPA 副本数上下限 | 否 | 是 | 是 |
| 回滚工作负载 | 否 | 否（AI SRE 推算出目标 revision 并给出完整命令，由您执行） | 是 |
| 修改工作负载配置（镜像、启动命令、环境变量等） | 否 | 否 | 是 |
| 修改 ConfigMap 和 Secret | 否 | 否 | 是 |
| 创建或删除资源 | 否 | 否 | 是 |
| 修改 namespace 内的 RBAC | 否 | 否 | 是 |
| 操作集群级资源和集群 RBAC | 否 | 否 | 仅“全部 namespace” |

* **只读**：授权 namespace 内的读取权限直接绑定 Kubernetes 内置的 `view` 角色，不再由 Flashduty 自行维护资源清单。它覆盖 Pod、日志、工作负载、事件、ConfigMap 等资源，不含 Secret；集群中的组件如果把自己的 CRD 标记为 view 可读，也会一并包含。此外还会授予 nodes、namespaces、persistentvolumes、storageclasses、ingressclasses 等集群级只读权限
* **读取 + 有限修改**：在只读基础上，额外允许驱逐 Pod（`pods/eviction`）、扩缩容 Deployment 和 StatefulSet（`deployments/scale`、`statefulsets/scale`）以及调整 HPA 副本数上下限（`horizontalpodautoscalers`）。这些规则只能改变已有工作负载运行几个副本、以及用同一份配置重建 Pod，无法改动任何 Pod 的镜像、启动命令、环境变量、身份或挂载——因此 `kubectl rollout restart` 和 `kubectl rollout undo` 都会被拒绝（两者在 Kubernetes 里都是对工作负载的 patch），重启工作负载请改用逐个驱逐 Pod。回滚工作负载时，AI SRE 会从 ReplicaSet 历史推算出目标 revision，给出完整的 `kubectl rollout undo --to-revision=N` 命令，由您在集群中执行
* **完全权限**：可读取 Secret、修改 ConfigMap 和 Secret、修改工作负载配置、创建或删除资源、修改 namespace 内的 RBAC；“全部 namespace + 完全权限”还会通过 `ClusterRoleBinding` 授予 `cluster-admin`，可操作集群级资源和集群 RBAC

### 编辑与撤销

您可以在 Kubernetes App 列表中编辑集群名称、范围和 namespace 权限。将范围改为**共享**与创建共享 App 同门槛：仅限账户 Owner / 管理员操作，普通成员即使编辑自己团队的 App 也不能把它提升为共享，只能把 App 移动到其所属的团队。撤销会立即使连接和 Token 失效，但不会自动删除集群中的 Agent 与 RBAC。控制台会提供卸载命令；请在对应集群执行它。该命令只删除当前 Kubernetes App 的资源，不会删除共享的 `flashduty` namespace。

## GitHub 应用

下面先以 **GitHub** 为例，介绍授权、安装管理与仓库授权的调整；**GitLab** 的流程见下一节。

### 连接 GitHub 组织

授权通过弹窗中的 GitHub 官方安装页完成。

<Steps>
  <Step title="发起授权">
    在 GitHub 卡片上点击 **去授权**（已有安装时为 **更多仓库**），在弹出的 GitHub 安装页中继续。
  </Step>

  <Step title="在 GitHub 上选择组织与仓库">
    选择要安装到的**组织**（或个人账户），并授予仓库范围——**所有仓库（All repositories）**或**仅选定仓库（Only select repositories）**。授予的仓库集合决定了 AI SRE 之后能访问哪些仓库。
  </Step>

  <Step title="确认后自动刷新">
    在 GitHub 上确认后，弹窗自动关闭，新组织出现在安装列表中。
  </Step>
</Steps>

<Note>
  如果您不是该组织的所有者，GitHub 会把请求转交组织所有者审批，审批通过后安装才生效。
</Note>

### 安装管理

每授权一个组织，GitHub 卡片下就多一行安装记录，显示组织名、状态（**已连接**、**已暂停**、**已撤销**）和已授予的仓库数。

<AccordionGroup>
  <Accordion title="启用 / 禁用（暂停 / 恢复）" icon="toggle-on">
    卡片右上角的开关在“启用”与“禁用”之间切换。**禁用 = 暂停**：暂停后 Agent 无法再访问这些仓库，但 **GitHub 上的安装本身保留**，可随时一键重新启用、无需再走一遍 GitHub 授权。一个 App 只要还有至少一个**已连接**的安装，就视为“已启用”。
  </Accordion>

  <Accordion title="撤销" icon="trash">
    在某一行点击 **撤销**，确认后该安装置为 **已撤销**，AI SRE 从此不再能访问该组织的仓库。撤销后该安装从卡片上隐去，重新授权同一组织即可恢复。
  </Accordion>
</AccordionGroup>

<Note>
  **暂停**与**撤销**的区别：暂停是临时关掉、保留 GitHub 安装、可一键恢复；撤销是断开这次授权、需要重新走 GitHub 授权才能再用。
</Note>

### 新增或调整仓库授权

某个组织已经连接好了，但您想让 AI SRE 访问该组织里更多的仓库——不必撤销重连。在 **自定义 → 插件 → Apps** 里，对该组织再次点击 **更多仓库**（或直接打开该 App 在 GitHub 上的 **Configure** 页），GitHub 会展示 **Repository access** 选择界面；勾选您要新增的仓库并保存，AI SRE 会**自动重新同步**已授予的仓库列表，新仓库无需重建连接就能用。

<Note>
  **仍无法访问时**：如果新加的仓库在会话里仍报“无法访问 / 404 / 403”，到 GitHub 上打开该 App 的页面（如 `github.com/apps/flashduty`）→ **Configure** → 选中对应组织 → 滚动到页面底部的 **Danger zone** → **Uninstall** 卸载该安装。然后回到 Flashduty 的 **自定义 → 插件 → Apps** 重新授权该组织，并在这一次里一并勾选您需要的**全部**仓库。
</Note>

## GitLab 应用

**GitLab** 应用可以连接 **GitLab.com**、**极狐 GitLab**（jihulab.com SaaS 或私有化发行版）或其他**自建**实例，方式完全相同：先在该实例上注册一个 OAuth 应用，再完成授权。之后 AI SRE 就能在授权范围内读代码、调查变更 / MR，并按您的要求提 issue 或开 MR。和 GitHub 一样，**无需粘贴个人令牌**，Flashduty 会为您的账户配置专属机器人身份完成访问。

### 连接 GitLab 实例

<Steps>
  <Step title="选择要连接的 GitLab 实例">
    在 GitLab 卡片上点击 **Connect**，三选一：

    * **GitLab.com**——地址固定为 `https://gitlab.com`，无需填写；
    * **极狐 GitLab**——地址固定为 `https://jihulab.com`，无需填写；
    * **自建实例 / Self-managed**——需要填写实例的根地址：浏览器地址栏里群组 / 项目路径**之前**的那部分，例如 `https://gitlab.example.com`；如果实例部署在子路径下，要带上子路径，例如 `https://example.com/gitlab`。
  </Step>

  <Step title="选择连接环境">
    连接和重新授权 GitLab 时的网络请求会从这里选择的环境发出。GitLab.com、极狐 GitLab 等公网实例可使用默认云端环境；只有内网可访问的自建实例，请选择能够访问它的 BYOC Runner。系统不会在 Runner 离线或不可达时自动切换环境，请选择可用环境后重新发起连接或授权。
  </Step>

  <Step title="在该实例上注册一个 OAuth 应用">
    连接向导会展示一个**可复制的 Redirect URI**。带着它去您填写的 GitLab 实例创建一个 OAuth 应用：group **Owner** 在 **Group Settings → Applications** 创建一个归属分组的应用；在 **GitLab.com** 上，如果您不是任何分组的 Owner，也可以在 **User Settings → Applications** 创建一个归属您个人账户的应用；实例管理员也可以在 **Admin Area → Applications** 创建。填入向导给出的 Redirect URI，勾选 **Confidential**，Scopes 只勾 **api**。创建后 GitLab 会给出一个 **Application ID** 和一个 **Secret**，回到连接向导粘贴这两项。
  </Step>

  <Step title="在弹出的窗口中完成 GitLab 授权">
    确认要使用的实例和 OAuth 应用（需要换应用时点击 **更换 OAuth 应用**），然后在弹出的 GitLab 授权页登录并确认。
  </Step>

  <Step title="选择要授权的分组与项目">
    AI SRE 展示一个仓库选择器，列出**您拥有 Owner 角色的分组**和**您拥有 Maintainer 角色的项目**。勾选想让 AI SRE 访问的分组 / 项目并保存——勾选一个分组即覆盖其下的所有项目，包括之后新建的项目。
  </Step>
</Steps>

<Note>
  一个账户同一时间只能连接**一个** GitLab 实例（GitLab.com 或某一个自建实例）。要换成另一个实例，需要先断开当前这个。
</Note>

### 机器人身份与权限

保存仓库选择后，Flashduty 会在这些分组 / 项目下为账户配置一个专属机器人（优先使用服务账号；实例不支持服务账号时，回退为分组 / 项目级的访问令牌），供 AI SRE 会话使用。无论哪种方式，机器人的权限都被限制在 **Developer** 级别，和您在 GitLab 里能授予的最小权限一致。令牌会在到期前**自动轮换**，无需您手动处理。

如果实例不支持服务账号，机器人会改用分组 / 项目级令牌，此时只能选择**一个**分组或一个项目。

<Warning>
  **GitLab.com 上的一条限制**：GitLab 官方规定，分组 / 项目级访问令牌只在**付费（非免费、非试用）命名空间**上可用。连接 GitLab.com 本身不受影响，但如果您要授权的分组 / 项目所在命名空间是免费版或试用版，机器人配置会失败，界面上会展示一条来自 GitLab 的说明（"provisioning\_denied"）。把对应命名空间升级到付费版后重新授权即可。
</Warning>

### 管理已连接的实例

GitLab 卡片下会显示当前连接的实例地址与状态。

<AccordionGroup>
  <Accordion title="Manage repos（管理仓库）" icon="list-check">
    重新打开仓库选择器，勾选新增的分组 / 项目，或取消勾选不再需要的——保存后 AI SRE 的访问范围随即更新。
  </Accordion>

  <Accordion title="Disconnect（断开连接）" icon="trash">
    断开这次连接。Flashduty 会尽力清理为这个账户配置的机器人身份及其名下的令牌；如果某一步清理没有成功，界面会给出提示。断开后该实例的所有访问随即失效，重新连接需要再走一遍 OAuth 授权。
  </Accordion>
</AccordionGroup>

## AI SRE 如何在仓库里工作

授权之后您无需任何额外配置。当您在会话里让 AI SRE 处理某个仓库的任务时，它会像一名加入项目的工程师那样工作——先理解，再动手，最后验证。这套行为分别由内置的 `github` Skill 与 `gitlab` Skill 约束。

**典型动作**

* **进入仓库**：把仓库 clone 进自己的工作区，并优先阅读仓库自带的约定（`CLAUDE.md`、`AGENTS.md`、`README`、`CONTRIBUTING`）。
* **调查变更 / PR / MR**：用 `git log`，以及 GitHub 上的 `gh pr list` / `gh pr view` / `gh pr diff` / `gh search prs`，或 GitLab 上等效的 `glab mr list` / `glab mr view` / `glab mr diff`，追溯故障 / 变更工单里提到的 PR / MR、看某次发布包含了什么、在决策前读懂一段 diff。
* **改动并提交**：新建分支、用最小的 diff 改动，用 `gh pr create` 或 `glab mr create` 开一个可评审的 PR / MR，或用 `gh issue create` / `glab issue create` 提一个 issue，并把链接回报给您。

**硬性护栏**——这些规则 Agent 绝不逾越：

* **绝不强推**（`git push --force`），**绝不直接推默认分支**——一律走“分支 + PR / MR”。
* **一个 PR / MR 只装一处逻辑变更**，保持可评审；改动一旦膨胀超出聚焦的 diff，就停下把分析交回给您。
* 绝不删分支、关闭他人的 issue / PR / MR，或改动仓库设置；绝不提交密钥、凭证或构建产物。

<Note>
  如果在云会话里 Agent 报告无法访问仓库，通常是账户尚未授权对应的 App（GitHub 或 GitLab）、或没有把目标仓库 / 分组纳入授权范围——到 **自定义 → 插件 → Apps** 补充授权即可。Agent **不会**向您索要任何令牌。
</Note>

## 权限与范围

GitHub App 与 GitLab App 的授权、撤销 / 断开都是**账户级**操作：账户内有相应权限的成员都可以操作，成员共享同一套授权，会话使用账户内当前有效的安装访问仓库。团队只用于归属标记，**账户是唯一的安全边界**。

两者的范围模型略有差别：**GitHub App** 允许同一账户安装多个组织，各自独立启停 / 撤销；**GitLab App** 每个账户**同一时间只能连接一个** GitLab 实例——要切换到另一个实例，需要先断开当前这个。

## 相关页面

<CardGroup cols={2}>
  <Card title="MCP（外部工具）" icon="plug" href="/zh/ai-sre/mcp">
    通过 Model Context Protocol 接入外部工具与数据源。
  </Card>

  <Card title="控制台对话" icon="comments" href="/zh/ai-sre/sessions">
    在会话中观察 Agent 如何 clone 仓库、读 diff、开 PR / MR。
  </Card>

  <Card title="运行环境（BYOC）" icon="server" href="/zh/ai-sre/environments">
    BYOC 会话用 Runner 宿主机自带的凭证，一般不需要 GitHub / GitLab App。
  </Card>

  <Card title="Skill" icon="wrench" href="/zh/ai-sre/skills">
    内置的 github / gitlab Skill 约束 Agent 在仓库里的工作方式。
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.