63 63
64| 主機 | 連接埠 | 何時需要 |64| 主機 | 連接埠 | 何時需要 |
65| :- | :- | :- |65| :- | :- | :- |
66| `api.github.com` | 443 | 無論是否使用 `--use-anthropic-git-proxy`,當執行器映像包含 [GitHub CLI](#github-api-access-with-the-github-cli) 且您為工作階段提供 github.com 憑證(例如 `GH_TOKEN`)時 |
66| `downloads.claude.ai` | 443 | 在安裝時,當您使用原生安裝程式在主機上安裝或更新 Claude Code 時;`install.sh` 指令碼本身是從 `claude.ai` 提供的。在工作階段執行時,僅當工作階段從官方 Anthropic 市場安裝外掛程式時。 |67| `downloads.claude.ai` | 443 | 在安裝時,當您使用原生安裝程式在主機上安裝或更新 Claude Code 時;`install.sh` 指令碼本身是從 `claude.ai` 提供的。在工作階段執行時,僅當工作階段從官方 Anthropic 市場安裝外掛程式時。 |
67| `storage.googleapis.com` | 443 | 在工作階段執行時,用於 `/plugin` 中顯示的外掛程式安裝計數和中繼資料。 |68| `storage.googleapis.com` | 443 | 在工作階段執行時,用於 `/plugin` 中顯示的外掛程式安裝計數和中繼資料。 |
68| `code.claude.com` 和 `claude.com` | 443 | 內置 claude-code-guide 代理的文件查詢和工作階段期間預先批准的 WebFetch 請求。阻止這些主機只會影響文件查詢。 |69| `code.claude.com` 和 `claude.com` | 443 | 內置 claude-code-guide 代理的文件查詢和工作階段期間預先批准的 WebFetch 請求。阻止這些主機只會影響文件查詢。 |
167 168
168* 執行器設定 `GIT_TERMINAL_PROMPT=0`,因此 Git 不會要求使用者名稱或密碼。169* 執行器設定 `GIT_TERMINAL_PROMPT=0`,因此 Git 不會要求使用者名稱或密碼。
169* 執行器使用 `BatchMode=yes` 執行 SSH,附加到您的 `GIT_SSH_COMMAND`(如果您設定了),因此 SSH 不會要求密碼短語或主機確認。170* 執行器使用 `BatchMode=yes` 執行 SSH,附加到您的 `GIT_SSH_COMMAND`(如果您設定了),因此 SSH 不會要求密碼短語或主機確認。
170* 執行器設定 `GCM_INTERACTIVE=never`,因此 Git Credential Manager 不會打開登入對話框。171* 執行器設定 `GCM_INTERACTIVE=never`,因此 Git Credential Manager 不會打開登入對話框。在 v2.1.229 之前,儲存庫準備可能會卡在 Git Credential Manager 的提示上。
171* 執行器清除 `core.askPass`,因此如果您使用 askpass 幫助程式,請改為通過 `GIT_ASKPASS` 環境變數設定它。172* 執行器清除 `core.askPass`,因此如果您使用 askpass 幫助程式,請改為通過 `GIT_ASKPASS` 環境變數設定它。
172 173
173如果您的 Git 主機拒絕認證,或您沒有配置認證,執行器會重試幾次,然後失敗儲存庫準備當儲存庫是工作階段推送結果的儲存庫時。對於工作階段僅從中讀取的儲存庫,[Troubleshooting](#troubleshooting) 涵蓋執行器何時改為跳過它。執行器不會將這些設定傳遞到工作階段的環境中。174如果您的 Git 主機拒絕認證,或您沒有配置認證,執行器會重試幾次,然後失敗儲存庫準備當儲存庫是工作階段推送結果的儲存庫時。對於工作階段僅從中讀取的儲存庫,[Troubleshooting](#troubleshooting) 涵蓋執行器何時改為跳過它。執行器不會將這些設定傳遞到工作階段的環境中。
287* **`jq`**:如果您希望 `--jq` 能運作,請在映像中安裝 `jq`288* **`jq`**:如果您希望 `--jq` 能運作,請在映像中安裝 `jq`
288* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-TW/env-vars)**:如果工作階段環境設定了它,Claude Code 不會提供內建的 `gh`,該工作階段就沒有 `gh`289* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-TW/env-vars)**:如果工作階段環境設定了它,Claude Code 不會提供內建的 `gh`,該工作階段就沒有 `gh`
289 290
290當映像包含 GitHub CLI 時,工作階段會使用它。291#### 使用 GitHub CLI 存取 GitHub API
292
293如果您的執行器映像包含供工作階段使用的 GitHub CLI,請讓您的[包裝指令碼](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration.md#provision-credentials-scoped-to-the-session-creator)為每個工作階段替工作階段建立者產生短期、最小範圍的 `GH_TOKEN`。當 `gh` 位於 Claude Code 啟動時的 `PATH` 上,工作階段會使用該 `gh`,而不會有[內建的 `gh`](#github-api-access-without-the-github-cli)。有了該 token,該 `gh` 會以 token 授予的任何存取權連線到 GitHub,且不經過 Anthropic 管理的 Git,因此請允許 [`api.github.com`](#network-requirements)。
294
295使用 Anthropic 管理的 Git 時,請將 GitHub CLI 排除在映像之外,以改用內建的 `gh`。
291 296
292#### 使用 Anthropic 管理的 Git 信任私有憑證授權單位297#### 使用 Anthropic 管理的 Git 信任私有憑證授權單位
293 298
343 348
344主機重寫首先執行,因此如果您需要兩者,請在 `--git-ssh-rewrite` 中列出內部主機名。為了完全控制簽出,使用 [`checkout` 生命週期鉤子](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout)。349主機重寫首先執行,因此如果您需要兩者,請在 `--git-ssh-rewrite` 中列出內部主機名。為了完全控制簽出,使用 [`checkout` 生命週期鉤子](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout)。
345 350
351### 在 GitHub 以外的儲存庫上啟動工作階段
352
353若要在 GitHub 以外 Git 主機的儲存庫上執行工作階段,請從您的終端機,在該儲存庫的簽出中啟動工作階段。首先請檢查執行器的 Git 憑證、網路和 Git 代理伺服器、儲存庫的位址,以及您的分支:
354
355* **Git 憑證和網路**:為 `https://<host>/<owner>/<name>`(執行器複製的位址)[提供](#ship-git-config-in-your-image)[無需提示即可運作](#git-must-work-without-a-prompt)的憑證,並讓執行器能夠連線到您的 Git 主機,如[網路需求](#network-requirements)所列。對於僅接受 SSH 的 Git 主機,請參閱 [`--git-ssh-rewrite`](#rewrite-git-urls-for-private-networks)。
356* **Git 代理伺服器**:如果該環境的執行器使用 Anthropic Git 代理伺服器,請[將其關閉](#turn-the-anthropic-git-proxy-off)。
357* **儲存庫位址**:檢查簽出的 `origin` remote。其主機必須是網域名稱,例如 `git.example.com`,且其路徑必須為 `<owner>/<name>` 的形式。巢狀路徑(例如 `group/subgroup/name`)無法通過。
358* **分支**:將您目前所在的分支推送到您的 Git 主機,因為執行器會複製該分支。
359
360在簽出中,依照[從 CI 進行身分驗證](https://code.claude.com/docs/zh-TW/self-hosted-environments-testing.md#authenticate-from-ci)所述登入 claude.ai 後,使用 [`--environment`](https://code.claude.com/docs/zh-TW/self-hosted-environments-testing#run-the-test-loop) 和您環境的 `ccpool_...` ID 執行 `claude -p`:
361
362```bash theme={null}
363claude -p "Fix the login bug" --environment ccpool_abc123 --output-format json
364```
365
366建立工作階段後,命令會列印一行以 `{"ok":true` 開頭的 JSON。如果 `origin` remote 不符合要求,命令會失敗並顯示 `requires a git source, but no GitHub remote was detected`。
367
368請在您的 Git 主機上審查並合併工作階段所[推送](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)的分支。
369
346## 構建執行器映像370## 構建執行器映像
347 371
348Anthropic 不發佈預構建的執行器映像。在 `claude` 二進位檔案周圍構建您自己的,分層您的儲存庫需要的任何工具鏈:語言執行時、編譯器、套件管理器和 [MCP](https://code.claude.com/docs/zh-TW/mcp.md) 邊車。372Anthropic 不發佈預構建的執行器映像。在 `claude` 二進位檔案周圍構建您自己的,分層您的儲存庫需要的任何工具鏈:語言執行時、編譯器、套件管理器和 [MCP](https://code.claude.com/docs/zh-TW/mcp.md) 邊車。
617 641
618### 在重新啟動前讓執行中的回合完成642### 在重新啟動前讓執行中的回合完成
619 643
620若要在滾動重新啟動前讓執行中的回合完成,請設定 `--drain-wait-sec`,並將停止逾時提高至至少該等待時間加 80 秒。在預設等待時間 `0` 下,重新啟動會中斷任何仍在執行的回合,而工作階段會在另一個執行器上恢復,但不包含其[未推送的工作](#additional-limitations)。644若要在滾動重新啟動前讓執行中的回合完成,請設定 `--drain-wait-sec`,並將停止逾時提高至至少該等待時間加 80 秒。在預設等待時間 `0` 下,重新啟動會中斷任何仍在執行的回合,而工作階段會在另一個執行器上恢復,但不包含其[未推送的工作](#resumed-sessions-lose-unpushed-work)。
621 645
622* **`--drain-wait-sec`**:大約設為您想讓其完成的回合與背景任務所需的時間。這是上限:若它們提前完成,等待就會提早結束。646* **`--drain-wait-sec`**:大約設為您想讓其完成的回合與背景任務所需的時間。這是上限:若它們提前完成,等待就會提早結束。
623* **您的停止逾時**:Kubernetes 中的 `terminationGracePeriodSeconds`、Docker Compose 中的 `stop_grace_period`。例如,使用 `--drain-wait-sec 120` 時,請將 [Kubernetes](#kubernetes) 或 [Docker Compose](#docker-compose) 配方中的 `90` 替換為 `200`。647* **您的停止逾時**:Kubernetes 中的 `terminationGracePeriodSeconds`、Docker Compose 中的 `stop_grace_period`。例如,使用 `--drain-wait-sec 120` 時,請將 [Kubernetes](#kubernetes) 或 [Docker Compose](#docker-compose) 配方中的 `90` 替換為 `200`。
735 759
736若要釋放閒置工作階段,請使用 [`--release-idle-session-min`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 並搭配以分鐘為單位的該時間來啟動每個執行器,例如 `--release-idle-session-min 30`。執行器隨後會釋放任何閒置達該時間的工作階段,無論是由排程任務還是由人員啟動的,除非您[為其留下仍在執行的程序而保留它](#keep-an-idle-session-while-its-processes-run)。760若要釋放閒置工作階段,請使用 [`--release-idle-session-min`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 並搭配以分鐘為單位的該時間來啟動每個執行器,例如 `--release-idle-session-min 30`。執行器隨後會釋放任何閒置達該時間的工作階段,無論是由排程任務還是由人員啟動的,除非您[為其留下仍在執行的程序而保留它](#keep-an-idle-session-while-its-processes-run)。
737 761
738* **未推送的工作**:已釋放的工作階段會在其下一則訊息時恢復,但不包含其尚未推送的工作。若要保留其提交,請參閱[恢復的工作階段會遺失未推送的工作](#additional-limitations)。762* **未推送的工作**:已釋放的工作階段會在其下一則訊息時恢復,但不包含其尚未推送的工作。若要保留其提交,請參閱[恢復的工作階段會遺失未推送的工作](#resumed-sessions-lose-unpushed-work)。
739* **執行器結束**:釋放其最後一個工作階段的執行器會開始[正常結束](#when-the-runner-exits)。請讓您的監督程式在全新的檔案系統上重新啟動它,如[強化您的部署](#harden-your-deployment)所述。763* **執行器結束**:釋放其最後一個工作階段的執行器會開始[正常結束](#when-the-runner-exits)。請讓您的監督程式在全新的檔案系統上重新啟動它,如[強化您的部署](#harden-your-deployment)所述。
740* **從不進入閒置狀態的工作階段**:也請設定 [`--kill-session-after-min`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags),因為[某些工作階段不被視為閒置](#some-sessions-don’t-count-as-idle)764* **從不進入閒置狀態的工作階段**:也請設定 [`--kill-session-after-min`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags),因為[某些工作階段不被視為閒置](#some-sessions-don’t-count-as-idle)
741 765
811* 如果轉向仍在執行,執行器等待轉向完成,或工作階段下一次等待其使用者,然後釋放它。835* 如果轉向仍在執行,執行器等待轉向完成,或工作階段下一次等待其使用者,然後釋放它。
812* 如果工作階段在寬限窗口結束時仍在執行器上,執行器終止它,任何執行中轉向的工作都會丟失。等待從執行中工具呼叫內部請求的批准的轉向是工作階段超過窗口的一種方式。836* 如果工作階段在寬限窗口結束時仍在執行器上,執行器終止它,任何執行中轉向的工作都會丟失。等待從執行中工具呼叫內部請求的批准的轉向是工作階段超過窗口的一種方式。
813 837
814釋放的工作階段從新複製恢復,因此它未推送的工作無論如何都消失了;請參閱[恢復的工作階段丟失未推送的工作](#additional-limitations)。在 v2.1.260 之前,執行器在限制處終止每個工作階段,最多等待寬限窗口以完成執行中的轉向。838釋放的工作階段從新複製恢復,因此它未推送的工作無論如何都消失了;請參閱[恢復的工作階段遺失未推送的工作](#resumed-sessions-lose-unpushed-work)。在 v2.1.260 之前,執行器在限制處終止每個工作階段,最多等待寬限窗口以完成執行中的回合。
815 839
816將該旗標設定為高於您預期的最長工作階段時間,例如 `--kill-session-after-min 480` 為 8 小時。要從進入閒置的對話中釋放插槽,改用 `--release-idle-session-min`。840將該旗標設定為高於您預期的最長工作階段時間,例如 `--kill-session-after-min 480` 為 8 小時。要從進入閒置的對話中釋放插槽,改用 `--release-idle-session-min`。
817 841
842### 恢復的工作階段遺失未推送的工作
843
844在新的執行器上恢復的工作階段會遺失其尚未推送的工作,因為該執行器會從其起始分支再次複製儲存庫。
845
846若要保留已提交的工作,請在環境中的每個執行器上設定 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags)。具有此旗標的執行器會在釋放之前盡力推送工作階段的結果分支,恢復的工作階段便會從這些提交開始。沒有此旗標的執行器會從其起始分支恢復工作階段。推送會使用執行器主機本身的 git 憑證,包括在使用 [Anthropic 管理的 git](#use-the-anthropic-git-proxy) 的執行器上。
847
848> [!WARNING]
849>
850> 設定此旗標之前,請限制誰可以推送到來源遠端上的 `claude/*` refs。在恢復時,執行器會提取先前推送的分支,而不驗證是誰推送的。
851
852即使已設定此旗標,仍請以其他方式保存以下工作:
853
854* **未提交的變更**:這些仍會遺失。請參閱[提示工作階段推送其工作](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)。
855* **透過 [`checkout` 生命週期 hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout) 簽出的儲存庫**:這些不會被推送。請從 [`post-session` hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#post-session) 建立它們的快照。
856* **有人封存或刪除的工作階段中的提交,或有人從工作階段選單釋放其執行器的工作階段中的提交**:不要依賴此旗標的推送。若要保存它們,請從 [`post-session` hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#post-session) 將 `HEAD` 推送到救援分支。該處的範例只會在建立快照提交之後才推送,因此請讓您的版本在沒有任何未提交變更時也進行推送。
857
818### 其他限制858### 其他限制
819 859
820* **恢復的工作階段丟失未推送的工作**:新的執行器會從其起始分支再次複製儲存庫,因此工作階段未推送的工作會消失。
821 * **若要保留已提交的工作**:在環境中的每個執行器上設定 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags),因為沒有此旗標的執行器會從其起始分支恢復工作階段。具有此旗標的執行器會在釋放之前盡力推送工作階段的結果分支,恢復的工作階段便會從這些提交開始。推送會使用執行器主機本身的 git 憑證,包括在使用 [Anthropic 管理的 git](#use-the-anthropic-git-proxy) 的執行器上。
822 * **使用 `checkout` hook 時**:透過 [`checkout` 生命週期 hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout) 簽出的儲存庫不會被推送。請改為從 [`post-session` hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#post-session) 建立這些儲存庫的快照。
823 * **啟用旗標之前**:限制誰可以推送到來源遠端上的 `claude/*` refs。在恢復時,執行器會提取先前推送的分支,而不驗證是誰推送的。
824 * **未提交的變更仍會遺失**:若要提示 Claude 在完成回應時提交並推送,請參閱[提示工作階段推送其工作](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)
825* **因執行器遺失而中斷的命令可能會再次執行**:當工作階段在另一個執行器上恢復時,Claude 會看到被中斷的工具呼叫,其結果表示該呼叫的結果未知。860* **因執行器遺失而中斷的命令可能會再次執行**:當工作階段在另一個執行器上恢復時,Claude 會看到被中斷的工具呼叫,其結果表示該呼叫的結果未知。
826* **工作階段中途新增的儲存庫可能無法複製**:Claude 透過 HTTPS 使用 `git clone` 複製它。在未使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的執行器上,如果主機上沒有任何項目能讀取該儲存庫,複製會因 git 身分驗證錯誤而失敗。在可行的情況下,請在建立工作階段時選擇工作階段需要的每個儲存庫。861* **工作階段中途新增的儲存庫可能無法複製**:Claude 透過 HTTPS 使用 `git clone` 複製它。在未使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的執行器上,如果主機上沒有任何項目能讀取該儲存庫,複製會因 git 身分驗證錯誤而失敗。在可行的情況下,請在建立工作階段時選擇工作階段需要的每個儲存庫。
827 * **工作階段恢復時**:[`checkout` hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout) 也會針對新增的儲存庫執行,且 [`CLAUDE_RUNNER_REPO_REF`](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout) 為空,因此請讓您的 hook 能處理此情況。862 * **工作階段恢復時**:[`checkout` hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout) 也會針對新增的儲存庫執行,且 [`CLAUDE_RUNNER_REPO_REF`](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#checkout) 為空,因此請讓您的 hook 能處理此情況。
828* **某些連接器不出現在自託管工作階段中**:您在 claude.ai Settings 中尚未連接的連接器不在自託管工作階段中列出,工作階段不會提示您連接它。首先在 Settings 中連接它,然後啟動新工作階段。將連接器添加到已執行的工作階段也不會使其工具可用於 Claude;啟動新工作階段以拾取新添加的連接器。863* **某些連接器不出現在自託管工作階段中**:您在 claude.ai Settings 中尚未連接的連接器不在自託管工作階段中列出,工作階段不會提示您連接它。首先在 Settings 中連接它,然後啟動新工作階段。將連接器添加到已執行的工作階段也不會使其工具可用於 Claude;啟動新工作階段以拾取新添加的連接器。
829* **當有人封存或刪除工作階段,或從工作階段的選單釋放其執行器時**:不要依賴 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 的推送。若要在這些情況下保存提交,請從 [`post-session` hook](https://code.claude.com/docs/zh-TW/self-hosted-environments-configuration#post-session) 將 `HEAD` 推送到救援分支。如果您以該處的範例為起點,請讓它在沒有任何未提交變更時也進行推送,因為該範例只會在建立快照提交之後才推送。
830 864
831### 報告問題865### 報告問題
832 866