6 6
7> 设置您的第一个自托管环境:安装 Claude Code、创建环境、启动运行器,并将会话路由到该环境。7> 设置您的第一个自托管环境:安装 Claude Code、创建环境、启动运行器,并将会话路由到该环境。
8 8
9<Note>9> [!NOTE]
10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[可用性和限制](/docs/zh-CN/self-hosted-environments#availability-and-limitations)涵盖了启用路径。本页面让您的第一个会话运行;有关它们是什么,请参阅[自托管环境](/docs/zh-CN/self-hosted-environments),有关强化和部队配方,请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)。10>
11</Note>11> 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[可用性和限制](/docs/zh-CN/self-hosted-environments#availability-and-limitations)涵盖了启用路径。本页面让您的第一个会话运行;有关它们是什么,请参阅[自托管环境](/docs/zh-CN/self-hosted-environments),有关强化和部队配方,请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)。
12 12
13[自托管环境](/docs/zh-CN/self-hosted-environments)在您的组织运营的基础设施上运行 Claude Code [云会话](/docs/zh-CN/claude-code-on-the-web),由您部署的运行器进程执行。本快速入门建立您的第一个环境,这是最小的可行配置:一个主机上的一个运行器,运行一个测试会话。有两个步骤:[创建环境、启动运行器并将会话路由到该环境](#set-up-an-environment-and-runner),然后[从您的终端向该会话发送后续消息](#send-a-follow-up-message-to-a-running-session)。您将在两个界面之间切换:claude.ai 用于创建环境、检查其状态和路由会话,以及主机上的终端用于运行器执行的所有操作。13[自托管环境](/docs/zh-CN/self-hosted-environments)在您的组织运营的基础设施上运行 Claude Code [云会话](/docs/zh-CN/claude-code-on-the-web),由您部署的运行器进程执行。本快速入门建立您的第一个环境,这是最小的可行配置:一个主机上的一个运行器,运行一个测试会话。有两个步骤:[创建环境、启动运行器并将会话路由到该环境](#set-up-an-environment-and-runner),然后[从您的终端向该会话发送后续消息](#send-a-follow-up-message-to-a-running-session)。您将在两个界面之间切换:claude.ai 用于创建环境、检查其状态和路由会话,以及主机上的终端用于运行器执行的所有操作。
14 14
15完成后,您将在[**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)上拥有一个环境、一个轮询工作的运行器,以及在您的主机上运行的会话。在连接真实存储库或内部系统之前,请完成[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy),其中涵盖了安全态势、出口控制、git 凭证和编排。15完成后,您将在[**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)上拥有一个环境、一个轮询工作的运行器,以及在您的主机上运行的会话。在连接真实存储库或内部系统之前,请完成[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy),其中涵盖了安全态势、出口控制、git 凭证和编排。
16 16
17<h2 id="prerequisites">17## 前置条件
18 前置条件
19</h2>
20 18
21<h3 id="organization-and-roles">19### 组织和角色
22 组织和角色
23</h3>
24 20
25claude.ai 端需要:21claude.ai 端需要:
26 22
27* **Allow self-hosted environments** 由[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)在[**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)上启用;在启用之前,**New** 按钮不会出现。如果您不拥有该角色,拥有该角色的人可以创建环境并将其密钥交给您;本页面上的运行器和终端步骤不需要 claude.ai 角色,当步骤在管理 UI 中检查状态时,运行器自己的日志行会给您相同的信号。23* **Allow self-hosted environments** 由[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)在[**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)上启用;在启用之前,**New** 按钮不会出现。如果您不拥有该角色,拥有该角色的人可以创建环境并将其密钥交给您;本页面上的运行器和终端步骤不需要 claude.ai 角色,当步骤在管理 UI 中检查状态时,运行器自己的日志行会给您相同的信号。
28* 由所有者启用的 [GitHub 连接器](https://claude.ai/admin-settings/connectors),以及每位开发人员自己的 [GitHub 连接](/docs/zh-CN/web-quickstart#connect-github),以便他们在启动会话时可以选择 github.com 仓库。24* 由所有者启用的 [GitHub 连接器](https://claude.ai/admin-settings/connectors),以及每位开发人员自己的 [GitHub 连接](/docs/zh-CN/web-quickstart#connect-github),以便他们在启动会话时可以选择 github.com 仓库。
29 25
30<h3 id="host-and-network">26### 主机和网络
31 主机和网络
32</h3>
33 27
34运行器主机需要:28运行器主机需要:
35 29
37* 一个用于测试会话的仓库:可以是公共仓库,也可以是此主机已能通过其 HTTPS URL 克隆且无需提供凭据的仓库。仅有 SSH 密钥是不够的,因为运行器克隆的是仓库的 `https://` URL。要改为通过 SSH 克隆,请参阅[为私有网络重写 git URL](/docs/zh-CN/self-hosted-environments-deploy#rewrite-git-urls-for-private-networks)。31* 一个用于测试会话的仓库:可以是公共仓库,也可以是此主机已能通过其 HTTPS URL 克隆且无需提供凭据的仓库。仅有 SSH 密钥是不够的,因为运行器克隆的是仓库的 `https://` URL。要改为通过 SSH 克隆,请参阅[为私有网络重写 git URL](/docs/zh-CN/self-hosted-environments-deploy#rewrite-git-urls-for-private-networks)。
38* 与实时同步的时钟,例如使用 NTP。当时钟偏离超过五分钟时,身份验证失败;请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。32* 与实时同步的时钟,例如使用 NTP。当时钟偏离超过五分钟时,身份验证失败;请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。
39 33
40<h3 id="software-on-the-runner-host">34### 运行器主机上的软件
41 运行器主机上的软件
42</h3>
43 35
44在启动之前在主机上安装:36在启动之前在主机上安装:
45 37
54 46
55准备好的主机打印运行器的使用文本,列出诸如 `--environment-secret-file` 之类的标志。在 2.1.224 之前的版本上,该命令改为打印常规 `claude --help` 输出;使用 `claude update` 升级或从 `latest` 频道重新安装。47准备好的主机打印运行器的使用文本,列出诸如 `--environment-secret-file` 之类的标志。在 2.1.224 之前的版本上,该命令改为打印常规 `claude --help` 输出;使用 `claude update` 升级或从 `latest` 频道重新安装。
56 48
57<h2 id="set-up-an-environment-and-runner">49## 设置环境和运行器
58 设置环境和运行器
59</h2>
60 50
61使用[引导式设置](#run-the-guided-setup)或[手动步骤](#set-up-manually)。引导式设置只需一条命令,它会启动一个交互式 Claude Code 会话,并引导您完成其余步骤。在无法进行交互式会话的主机上,请改用手动步骤。如果拥有所有者角色的人员已创建环境并将其密钥交给您,也请使用手动步骤,因为引导式设置需要以所有者身份登录。51使用[引导式设置](#run-the-guided-setup)或[手动步骤](#set-up-manually)。引导式设置只需一条命令,它会启动一个交互式 Claude Code 会话,并引导您完成其余步骤。在无法进行交互式会话的主机上,请改用手动步骤。如果拥有所有者角色的人员已创建环境并将其密钥交给您,也请使用手动步骤,因为引导式设置需要以所有者身份登录。
62 52
63<h3 id="run-the-guided-setup">53### 运行引导式设置
64 运行引导式设置
65</h3>
66 54
67引导式设置会引导您在管理 UI 中创建环境、使用您保存的密钥文件启动本地运行器、确认运行器已注册,并将速查表写入 `./runner-setup/CHEAT-SHEET.md`。运行之前,请确认您的登录状态和版本:55引导式设置会引导您在管理 UI 中创建环境、使用您保存的密钥文件启动本地运行器、确认运行器已注册,并将速查表写入 `./runner-setup/CHEAT-SHEET.md`。运行之前,请确认您的登录状态和版本:
68 56
77 65
78设置本身不会启动测试会话:它会提示您在 claude.ai/code 启动一个。设置的最后一步会停止它所启动的运行器。如果您在该步骤之前退出设置,运行器将继续运行。要在最后一步之后继续,请在 shell 中使用 `./runner-setup/CHEAT-SHEET.md` 中的命令再次启动运行器,然后[将会话路由到环境](#route-a-session)。66设置本身不会启动测试会话:它会提示您在 claude.ai/code 启动一个。设置的最后一步会停止它所启动的运行器。如果您在该步骤之前退出设置,运行器将继续运行。要在最后一步之后继续,请在 shell 中使用 `./runner-setup/CHEAT-SHEET.md` 中的命令再次启动运行器,然后[将会话路由到环境](#route-a-session)。
79 67
80<h3 id="set-up-manually">68### 手动设置
81 手动设置
82</h3>
83 69
84在 claude.ai 上创建环境,从主机上的终端启动运行器,然后返回 claude.ai 确认运行器出现并将会话路由到它。如果拥有所有者角色的人员已创建环境并将其密钥交给您,请从第 2 步开始。70在 claude.ai 上创建环境,从主机上的终端启动运行器,然后返回 claude.ai 确认运行器出现并将会话路由到它。如果拥有所有者角色的人员已创建环境并将其密钥交给您,请从第 2 步开始。
85 71
86<Steps>72**1. 创建环境**
87 <Step title="创建环境">
88 转到管理设置中的[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。在 **Self-hosted environments** 下,选择 **New**,命名环境,然后选择 **Create**。在向导的第二步,选择 **Copy environment key** 以复制环境密钥,管理 UI 将其标记为环境密钥。claude.ai 仅显示一次密钥,您之后无法检索它;它在创建后 365 天过期。环境的 `ccpool_...` ID 在其详细信息对话框中保持可见;您需要它用于[令牌验证](/docs/zh-CN/self-hosted-environments-identity)中的 `aud` 检查,以及用于从 CI [分派测试会话](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop)。
89 73
90 如果您丢失了密钥或需要轮换它,请从环境的 **Configuration** 选项卡创建新密钥,将新密钥推出到您的运行器,然后撤销旧密钥。持有已撤销密钥的运行器在其下一次经过身份验证的轮询时失败并退出,记录 `poll auth failed`,您的编排器使用新密钥重新启动它们。74转到管理设置中的[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。在 **Self-hosted environments** 下,选择 **New**,命名环境,然后选择 **Create**。在向导的第二步,选择 **Copy environment key** 以复制环境密钥,管理 UI 将其标记为环境密钥。claude.ai 仅显示一次密钥,您之后无法检索它;它在创建后 365 天过期。环境的 `ccpool_...` ID 在其详细信息对话框中保持可见;您需要它用于[令牌验证](/docs/zh-CN/self-hosted-environments-identity)中的 `aud` 检查,以及用于从 CI [分派测试会话](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop)。
91 </Step>
92 75
93 <Step title="启动运行器">76如果您丢失了密钥或需要轮换它,请从环境的 **Configuration** 选项卡创建新密钥,将新密钥推出到您的运行器,然后撤销旧密钥。持有已撤销密钥的运行器在其下一次经过身份验证的轮询时失败并退出,记录 `poll auth failed`,您的编排器使用新密钥重新启动它们。
94 创建密钥目录。此命令和下一条命令使用 `/etc/claude`,这需要 root 权限,并且它们创建的密钥文件仅可由运行这些命令的用户读取。如果运行器将以其他用户身份运行,它会退出并显示 `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`。在这种情况下,请以运行器的用户身份运行这两条命令,并使用该用户可写入的目录代替 `/etc/claude`,同时将相同的路径传递给 `--environment-secret-file`。运行器进程可以读取的任何路径都有效。
95 77
96 ```bash theme={null}78**2. 启动运行器**
97 mkdir -p /etc/claude
98 ```
99 79
100 将环境密钥写入文件。下面的命令从您的终端读取,以便密钥保持在 shell 历史记录之外:粘贴您复制的值,按 Enter,然后按 Ctrl-D,子 shell 的 `umask` 使文件仅可由其所有者读取。80创建密钥目录。此命令和下一条命令使用 `/etc/claude`,这需要 root 权限,并且它们创建的密钥文件仅可由运行这些命令的用户读取。如果运行器将以其他用户身份运行,它会退出并显示 `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`。在这种情况下,请以运行器的用户身份运行这两条命令,并使用该用户可写入的目录代替 `/etc/claude`,同时将相同的路径传递给 `--environment-secret-file`。运行器进程可以读取的任何路径都有效。
101 81
102 ```bash theme={null}82```bash theme={null}
103 (umask 077 && cat > /etc/claude/environment-secret)83mkdir -p /etc/claude
104 ```84```
85
86将环境密钥写入文件。下面的命令从您的终端读取,以便密钥保持在 shell 历史记录之外:粘贴您复制的值,按 Enter,然后按 Ctrl-D,子 shell 的 `umask` 使文件仅可由其所有者读取。
87
88```bash theme={null}
89(umask 077 && cat > /etc/claude/environment-secret)
90```
91
92选择一个基目录,将下面运行器命令中的 `<writable-dir>` 替换为运行器可以写入或创建的绝对路径。运行器在启动时创建目录,然后检查存储库并在其下创建每个会话的目录。没有 `--base-dir`,它使用 `/workspace`,这仅在该目录已存在且可写或您以 root 身份启动运行器时有效。
93
94> [!WARNING]
95>
96> 请使用专供运行器使用的目录,而不是您的主目录或存放您自己克隆的目录。运行器会将它在 `<writable-dir>/<repo-owner>/<repo>` 处找到的任何内容视为它自己的克隆,并可能重置它以及覆盖或删除其中的文件。
105 97
106 选择一个基目录,将下面运行器命令中的 `<writable-dir>` 替换为运行器可以写入或创建的绝对路径。运行器在启动时创建目录,然后检查存储库并在其下创建每个会话的目录。没有 `--base-dir`,它使用 `/workspace`,这仅在该目录已存在且可写或您以 root 身份启动运行器时有效。98如果运行器无法创建或写入基目录,它会在启动时退出并显示指明该目录的错误,而不是进行注册。请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。
107 99
108 <Warning>100然后使用 `--environment-secret-file` 和 `--base-dir` 启动运行器:
109 请使用专供运行器使用的目录,而不是您的主目录或存放您自己克隆的目录。运行器会将它在 `<writable-dir>/<repo-owner>/<repo>` 处找到的任何内容视为它自己的克隆,并可能重置它以及覆盖或删除其中的文件。
110 </Warning>
111 101
112 如果运行器无法创建或写入基目录,它会在启动时退出并显示指明该目录的错误,而不是进行注册。请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。102```bash theme={null}
103claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>'
104```
113 105
114 然后使用 `--environment-secret-file` 和 `--base-dir` 启动运行器:106运行器向您的环境注册后会记录 `Registered: runner_id=<runner-id>`,然后开始轮询工作。使用此命令启动时,运行器按设计会在服务完一个会话后退出,而不是在每个轮次之后退出。要服务更多会话,请在每次运行器退出时再次启动它。有关何时会发生这种情况以及运行器会记录什么,请参阅[如果运行器退出](#if-the-runner-exits)。
115 107
116 ```bash theme={null}108**3. 验证运行器出现**
117 claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>'
118 ```
119 109
120 运行器向您的环境注册后会记录 `Registered: runner_id=<runner-id>`,然后开始轮询工作。使用此命令启动时,运行器按设计会在服务完一个会话后退出,而不是在每个轮次之后退出。要服务更多会话,请在每次运行器退出时再次启动它。有关何时会发生这种情况以及运行器会记录什么,请参阅[如果运行器退出](#if-the-runner-exits)。110返回[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。您的环境状态在运行器启动后几秒内从 **No runners deployed** 更改为 **Healthy**;打开环境并选择 **Activity** 以查看运行器本身。如果您无权访问管理页面,上一步运行器日志中的 `Registered: runner_id=<runner-id>` 行可提供相同的信号。
121 </Step>
122 111
123 <Step title="验证运行器出现">112**4. 将会话路由到环境**
124 返回[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。您的环境状态在运行器启动后几秒内从 **No runners deployed** 更改为 **Healthy**;打开环境并选择 **Activity** 以查看运行器本身。如果您无权访问管理页面,上一步运行器日志中的 `Registered: runner_id=<runner-id>` 行可提供相同的信号。
125 </Step>
126 113
127 <Step title="将会话路由到环境">114在 claude.ai/code 启动会话,并从环境选择器中选择您的环境,其中自托管环境与 Anthropic 托管的环境一起出现。对于仓库,请选择[前提条件](#host-and-network)中的仓库:公共仓库,或此主机已可以通过其 HTTPS URL 克隆且不会被要求提供凭据的仓库。
128 <span id="route-a-session" />在 claude.ai/code 启动会话,并从环境选择器中选择您的环境,其中自托管环境与 Anthropic 托管的环境一起出现。对于仓库,请选择[前提条件](#host-and-network)中的仓库:公共仓库,或此主机已可以通过其 HTTPS URL 克隆且不会被要求提供凭据的仓库。
129 115
130 下一个可用的运行器拾取排队的会话并记录 `Picked up session <session-id>` 以及其活跃计数和容量,因此您可以从运行器自己的输出中确认哪个主机接收了会话。在 [claude.ai/code](https://claude.ai/code) 观看会话工作并阅读 Claude 的回复。116下一个可用的运行器拾取排队的会话并记录 `Picked up session <session-id>` 以及其活跃计数和容量,因此您可以从运行器自己的输出中确认哪个主机接收了会话。在 [claude.ai/code](https://claude.ai/code) 观看会话工作并阅读 Claude 的回复。
131 117
132 <span id="session-doesnt-start" />如果会话没有开始工作,请对照您看到的情况:118如果会话没有开始工作,请对照您看到的情况:
133 119
134 * **会话保持排队状态**:请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。120* **会话保持排队状态**:请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。
135 * **会话因 git 错误而无法启动**:如果错误包含 git 的 `could not read Username for`,后跟您的 git 主机的 URL,则说明运行器没有该主机的 HTTPS 凭据。121* **会话因 git 错误而无法启动**:如果错误包含 git 的 `could not read Username for`,后跟您的 git 主机的 URL,则说明运行器没有该主机的 HTTPS 凭据。
136 * **提供 HTTPS 凭据**:请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)122 * **提供 HTTPS 凭据**:请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)
137 * **改为通过 SSH 克隆**:如果运行器主机已有 SSH 密钥,请参阅[为私有网络重写 git URL](/docs/zh-CN/self-hosted-environments-deploy#rewrite-git-urls-for-private-networks)123 * **改为通过 SSH 克隆**:如果运行器主机已有 SSH 密钥,请参阅[为私有网络重写 git URL](/docs/zh-CN/self-hosted-environments-deploy#rewrite-git-urls-for-private-networks)
138 </Step>
139</Steps>
140 124
141<h3 id="if-the-runner-exits">125### 如果运行器退出
142 如果运行器退出
143</h3>
144 126
145如果运行器在本快速入门期间退出,请再次启动它。运行器可能会自行退出:127如果运行器在本快速入门期间退出,请再次启动它。运行器可能会自行退出:
146 128
153 135
154对于生产,在编排器下部署运行器,该编排器在退出时重新启动它,并在运行器启动后立即继续退出时等待更长的时间再重新启动。请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)和[当运行器退出时](/docs/zh-CN/self-hosted-environments-deploy#when-the-runner-exits)。136对于生产,在编排器下部署运行器,该编排器在退出时重新启动它,并在运行器启动后立即继续退出时等待更长的时间再重新启动。请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)和[当运行器退出时](/docs/zh-CN/self-hosted-environments-deploy#when-the-runner-exits)。
155 137
156<h2 id="send-a-follow-up-message-to-a-running-session">138## 向运行中的会话发送后续消息
157 向运行中的会话发送后续消息
158</h2>
159 139
160一旦会话在您的环境上运行,从任何您使用 `claude auth login` 登录的机器上的 `claude` CLI 向其发送后续消息;该命令不需要从启动会话的机器运行。该命令发布一条消息:140一旦会话在您的环境上运行,从任何您使用 `claude auth login` 登录的机器上的 `claude` CLI 向其发送后续消息;该命令不需要从启动会话的机器运行。该命令发布一条消息:
161 141
165 145
166对于 `<session-id>`,传递裸 `session_...` 或 `cse_...` ID 或会话的 claude.ai/code URL。成功发送打印 `Sent to cloud session.` 以及会话 ID 和查看链接。接受的 ID 形式、JSON 输出以及帐户和策略要求在[从 CLI 发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)上,因为该命令对 Anthropic 托管的会话的工作方式相同。146对于 `<session-id>`,传递裸 `session_...` 或 `cse_...` ID 或会话的 claude.ai/code URL。成功发送打印 `Sent to cloud session.` 以及会话 ID 和查看链接。接受的 ID 形式、JSON 输出以及帐户和策略要求在[从 CLI 发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)上,因为该命令对 Anthropic 托管的会话的工作方式相同。
167 147
168<h2 id="what’s-next">148## 接下来的步骤
169 接下来的步骤
170</h2>
171 149
172* [部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy):强化部署、控制出口、配置 git 凭证,并在 Kubernetes 或 Compose 下运行部队150* [部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy):强化部署、控制出口、配置 git 凭证,并在 Kubernetes 或 Compose 下运行部队
173* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限151* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限