8 8
9> [!NOTE]9> [!NOTE]
10>10>
11> 자체 호스팅 환경은 Team 및 Enterprise 플랜에서 공개 베타 상태이며, [Owner](/docs/ko/cloud-environments#organization-shared-environments)가 [**Cloud environments** 관리자 페이지](https://claude.ai/admin-settings/cloud-environments)에서 **Allow self-hosted environments**를 켜서 활성화합니다. 이 페이지는 플래그 및 메트릭 참조이며, 설정은 [빠른 시작](/docs/ko/self-hosted-environments-quickstart)을 참조하고 프로덕션 배포는 [Deploy to production](/docs/ko/self-hosted-environments-deploy)에서 플릿 레시피를 참조하세요.11> 자체 호스팅 환경은 Team 및 Enterprise 플랜에서 공개 베타 상태이며, [Owner](/docs/ko/cloud-environments.md#organization-shared-environments)가 [**Cloud environments** 관리자 페이지](https://claude.ai/admin-settings/cloud-environments)에서 **Allow self-hosted environments**를 켜서 활성화합니다. 이 페이지는 플래그 및 메트릭 참조이며, 설정은 [빠른 시작](/docs/ko/self-hosted-environments-quickstart.md)을 참조하고 프로덕션 배포는 [Deploy to production](/docs/ko/self-hosted-environments-deploy.md)에서 플릿 레시피를 참조하세요.
12 12
13이 페이지는 [자체 호스팅 환경](/docs/ko/self-hosted-environments)에서 실행하는 두 가지 프로세스에 대한 참조입니다: 호스트에서 Claude Code [클라우드 세션](/docs/ko/claude-code-on-the-web)을 실행하는 러너와 세션이 대기열에 있을 때 러너를 시작하는 선택적 자동 스케일링 오케스트레이터입니다. 각각 자체 플래그 테이블이 있습니다. 둘 다 Linux 또는 macOS 호스트에서 실행되며, `/workspace` 및 `~/.claude`와 같은 기본값을 가정합니다. 설치된 버전에서 권한 있는 목록을 보려면 `claude self-hosted-runner --help`를 실행하세요.13이 페이지는 [자체 호스팅 환경](/docs/ko/self-hosted-environments)에서 실행하는 두 가지 프로세스에 대한 참조입니다: 호스트에서 Claude Code [클라우드 세션](/docs/ko/claude-code-on-the-web.md)을 실행하는 러너와 세션이 대기열에 있을 때 러너를 시작하는 선택적 자동 스케일링 오케스트레이터입니다. 각각 자체 플래그 테이블이 있습니다. 둘 다 Linux 또는 macOS 호스트에서 실행되며, `/workspace` 및 `~/.claude`와 같은 기본값을 가정합니다. 설치된 버전에서 권한 있는 목록을 보려면 `claude self-hosted-runner --help`를 실행하세요.
14 14
15메트릭 시리즈 및 일부 API 필드는 여전히 이 페이지에서 환경이라고 부르는 것을 `pool`이라고 사용합니다. 두 용어 모두 동일한 것을 나타냅니다. 환경 ID는 `pool_id` 필드이며, `ccpool_...` 형식입니다: 이 페이지에서 `pool` 식별자를 표시하는 곳마다 환경을 나타냅니다. CLI 플래그 및 환경 변수는 `--environment-secret-file`과 같이 `environment`로 표기합니다. 더 이상 사용되지 않는 `pool` 표기법은 여전히 작동하며, [`--environment-secret-file` 행](#runner-cli-flags)에서 설명합니다.15메트릭 시리즈 및 일부 API 필드는 여전히 이 페이지에서 환경이라고 부르는 것을 `pool`이라고 사용합니다. 두 용어 모두 동일한 것을 나타냅니다. 환경 ID는 `pool_id` 필드이며, `ccpool_...` 형식입니다: 이 페이지에서 `pool` 식별자를 표시하는 곳마다 환경을 나타냅니다. CLI 플래그 및 환경 변수는 `--environment-secret-file`과 같이 `environment`로 표기합니다. 더 이상 사용되지 않는 `pool` 표기법은 여전히 작동하며, [`--environment-secret-file` 행](#runner-cli-flags)에서 설명합니다.
16 16
17## Runner CLI 플래그17## 러너 CLI 플래그
18 18
19대부분의 플래그에는 해당하는 환경 변수가 있습니다. 둘 다 설정된 경우 플래그가 우선합니다. 기간 플래그는 CLI에서 분 또는 초를 사용하지만, 쌍을 이루는 환경 변수는 항상 밀리초 단위이며 `_MS` 접미사로 표시되고, 기본값 열은 플래그의 단위를 표시합니다: `--exit-if-unused-min 10`은 `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000`과 동일하며, `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15"`와 같은 Helm 값은 15분 기본값이 아닌 15밀리초를 의미합니다.19대부분의 플래그에는 대응하는 환경 변수가 있습니다. 둘 다 설정되면 플래그가 우선합니다. 기간 플래그는 CLI에서 분 또는 초 단위 값을 받지만, 짝을 이루는 환경 변수는 `_MS` 접미사가 나타내듯 항상 밀리초 단위이며, 기본값 열은 플래그의 단위를 표시합니다. `--exit-if-unused-min 10`은 `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000`과 같으며, `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15"`와 같은 Helm 값은 기본값인 15분이 아니라 15밀리초를 의미합니다.
20 20
21| 플래그 | 환경 변수 | 기본값 | 설명 |21| 플래그 | 환경 변수 | 기본값 | 설명 |
22| :- | :- | :- | :- |22| :- | :- | :- | :- |
23| `--api-url <url>` | 없음 | `https://api.anthropic.com` | API 기본 URL입니다. 테스트 목적으로만 재정의하십시오. |23| `--api-url <url>` | 없음 | `https://api.anthropic.com` | API 기본 URL입니다. 테스트 목적으로만 재정의합니다. |
24| `--base-dir <path>` | `SELF_HOSTED_RUNNER_BASE_DIR` | `/workspace`; Windows에서는 없음 | 저장소 체크아웃 및 세션별 작업 디렉터리용 디렉터리입니다. 러너는 이 경로 또는 상위 경로에 대한 쓰기 액세스 권한이 필요합니다. 러너는 시작 시 디렉터리를 생성하고 생성하거나 쓸 수 없을 때 `cannot create or write to base directory`로 종료됩니다. v2.1.225 이전에는 러너가 첫 번째 세션이 시작될 때 디렉터리를 생성했으므로 사용할 수 없는 경로로 인해 시작이 아닌 세션이 실패했습니다. Windows는 지원되지 않는 러너 호스트이므로 기본값이 없습니다: 플래그를 전달하거나 변수를 설정하지 않으면 러너가 시작 시 종료됩니다. 환경의 모든 러너에서 동일한 값을 사용하십시오. [러너 간 기본 디렉터리 및 용량 동일하게 유지](/docs/ko/self-hosted-environments-deploy#keep-the-base-directory-and-capacity-identical-across-runners)를 참조하십시오. |24| `--base-dir <path>` | `SELF_HOSTED_RUNNER_BASE_DIR` | `/workspace`; Windows에서는 없음 | 저장소 체크아웃과 세션별 작업 디렉터리를 위한 디렉터리입니다. 러너에는 이 경로 또는 그 상위 경로에 대한 쓰기 권한이 필요합니다. 러너는 시작 시 디렉터리를 생성하며, 디렉터리를 생성하거나 쓸 수 없으면 `cannot create or write to base directory`와 함께 종료됩니다. v2.1.225 이전에는 첫 번째 세션이 시작될 때 러너가 디렉터리를 생성했기 때문에, 사용할 수 없는 경로는 시작이 아니라 세션을 실패시켰습니다. 지원되는 러너 호스트가 아닌 Windows에서는 기본값이 없으므로, 플래그를 전달하거나 변수를 설정하지 않으면 러너가 시작 시 종료됩니다. 환경 내 모든 러너에서 동일한 값을 사용하십시오. [러너 간 기본 디렉터리와 용량을 동일하게 유지하기](/docs/ko/self-hosted-environments-deploy.md#keep-the-base-directory-and-capacity-identical-across-runners)를 참조하십시오. |
25| `--capacity <n>` | 없음 | `1` | 이 러너가 처리하는 최대 동시 세션 수입니다. 모든 세션은 동일한 잠금된 [소유자](/docs/ko/self-hosted-environments#key-concepts)에 속합니다. 환경의 모든 러너에서 동일한 값을 사용하십시오. [러너 간 기본 디렉터리 및 용량 동일하게 유지](/docs/ko/self-hosted-environments-deploy#keep-the-base-directory-and-capacity-identical-across-runners)를 참조하십시오. |25| `--capacity <n>` | 없음 | `1` | 이 러너가 처리하는 최대 동시 세션 수입니다. 모든 세션은 잠긴 동일한 [소유자](/docs/ko/self-hosted-environments#key-concepts)에 속합니다. 환경 내 모든 러너에서 동일한 값을 사용하십시오. [러너 간 기본 디렉터리와 용량을 동일하게 유지하기](/docs/ko/self-hosted-environments-deploy.md#keep-the-base-directory-and-capacity-identical-across-runners)를 참조하십시오. |
26| `--client-label <label>` | `SELF_HOSTED_RUNNER_CLIENT_LABEL` | 호스트의 호스트명 | 러너가 등록할 때 전송하는 레이블입니다. 러너는 또한 이를 [`claude_code_self_hosted_runner_info`](#prometheus-metrics)의 `client_label` 레이블로 보고합니다. Claude Code v2.1.248 이상이 필요합니다. |26| `--client-label <label>` | `SELF_HOSTED_RUNNER_CLIENT_LABEL` | 호스트의 호스트 이름 | 러너가 등록할 때 전송하는 레이블입니다. 러너는 이 값을 [`claude_code_self_hosted_runner_info`](#prometheus-metrics)의 `client_label` 레이블로도 보고합니다. Claude Code v2.1.248 이상이 필요합니다. |
27| `--configure-git` | `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1` | 꺼짐 | 시작 시 전역 git 신원을 작성하고, Anthropic 커밋 서명을 활성화하고, git push 협상을 켜고, `Co-authored-by:` 트레일러를 추가하는 커밋 훅을 설치합니다. Push 협상에는 Claude Code v2.1.257 이상이 필요합니다. [git 구성](/docs/ko/self-hosted-environments-deploy#configure-git)을 참조하십시오. |27| `--configure-git` | `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1` | 꺼짐 | 시작 시 전역 git ID를 기록하고, Anthropic 커밋 서명을 활성화하고, git push 협상을 켜고, `Co-authored-by:` 트레일러를 추가하는 커밋 훅을 설치합니다. push 협상에는 Claude Code v2.1.257 이상이 필요합니다. [git 구성하기](/docs/ko/self-hosted-environments-deploy.md#configure-git)를 참조하십시오. |
28| `--confine-repo-settings <mode>` | `SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS` | `warn` | 저장소의 커밋된 설정이 해당 세션의 자체 작업 공간 외부에 대한 쓰기 또는 읽기 액세스 권한을 부여하거나, 환경 변수를 설정하거나, 운영자의 샌드박스 또는 훅 상태를 재정의하려고 할 때 세션에 플래그를 지정하는 가드의 모드를 설정합니다(예: `sandbox.enabled: false` 또는 `disableAllHooks`). 기본값 `warn`은 위반을 기록하고 여전히 세션을 시작하고, `enforce`는 세션을 거부하며, `off`는 스캔을 비활성화합니다. [배포 강화](/docs/ko/self-hosted-environments-deploy#harden-your-deployment)를 참조하십시오. |28| `--confine-repo-settings <mode>` | `SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS` | `warn` | 저장소에 커밋된 설정이 해당 세션 자체의 워크스페이스 외부에 대한 쓰기 또는 읽기 접근 권한을 부여하거나, 환경 변수를 설정하거나, `sandbox.enabled: false` 또는 `disableAllHooks`와 같이 운영자의 샌드박스 또는 훅 정책을 재정의하려 할 때 세션을 표시하는 가드의 모드를 설정합니다. 기본값 `warn`은 위반 사항을 로그에 기록하고 세션을 그대로 시작하며, `enforce`는 세션을 거부하고, `off`는 검사를 비활성화합니다. [배포 강화하기](/docs/ko/self-hosted-environments-deploy.md#harden-your-deployment)를 참조하십시오. |
29| `--debug-token-dir <path>` | `SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR` | 설정되지 않음 | 검사를 위해 라이브 토큰을 디스크에 씁니다. 디버그 전용이며 프로덕션에서 사용하지 마십시오. |29| `--debug-token-dir <path>` | `SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR` | 설정 안 됨 | 검사를 위해 활성 토큰을 디스크에 기록합니다. 디버그 전용이므로 프로덕션에서는 사용하지 마십시오. |
30| `--defer-shutdown-max-min <n>` | `SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS` | `0` | 첫 번째 `SIGTERM` 또는 `SIGINT`에서 드레인하는 대신 이미 연결된 세션을 계속 제공한 다음 N분 후에 여전히 연결된 모든 것을 해제하고 종료합니다. 이를 설정하기 전에 호스트의 중지 타임아웃을 높이십시오. [첫 번째 신호 이후 드레인 연기](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)를 참조하십시오. `0`은 비활성화합니다. Claude Code v2.1.238 이상이 필요합니다. |30| `--defer-shutdown-max-min <n>` | `SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS` | `0` | 첫 번째 `SIGTERM` 또는 `SIGINT`를 받으면 이미 연결된 세션을 드레인하지 않고 계속 처리한 다음, N분 후에 여전히 연결된 세션을 해제하고 종료합니다. 이 값을 설정하기 전에 호스트의 중지 타임아웃을 늘리십시오. [첫 번째 신호 이후로 드레인 연기하기](/docs/ko/self-hosted-environments-deploy.md#defer-the-drain-past-the-first-signal)를 참조하십시오. `0`은 비활성화합니다. Claude Code v2.1.238 이상이 필요합니다. |
31| `--drain-grace-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_GRACE_MS` | `0` | 러너가 종료 신호를 받거나 은퇴 시간에 도달할 때까지, 활성 세션이 완료된 후 러너가 종료되는 시기를 제어합니다: `0`은 더 이상 폴링하지 않고 즉시 종료되고, 양수 값은 러너를 활성 상태로 유지하고 잠금된 소유자의 큐를 그 많은 초 동안 다시 폴링하며, 이는 [강화 섹션](/docs/ko/self-hosted-environments-deploy#harden-your-deployment)에 설명된 세션별 컨테이너 격리의 비용이 발생합니다. [`--defer-shutdown-max-min`](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)으로 연기한 첫 번째 신호 이후, 러너는 세션을 보유하지 않는 즉시 종료되며, 여기서 설정한 내용과 관계없이 종료됩니다. |31| `--drain-grace-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_GRACE_MS` | `0` | 러너가 종료 신호를 받거나 은퇴 시간에 도달하기 전까지, 활성 세션이 끝난 후 러너가 언제 종료할지를 제어합니다. `0`은 추가 작업을 폴링하지 않고 즉시 종료하며, 양수 값은 러너를 먼저 해당 초 동안 유지하면서 잠긴 소유자의 큐를 다시 폴링합니다. 이 경우 [강화 섹션](/docs/ko/self-hosted-environments-deploy.md#harden-your-deployment)에 설명된 세션별 컨테이너 격리를 포기하게 됩니다. [`--defer-shutdown-max-min`](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)으로 연기한 첫 번째 신호 이후에는 여기서 설정한 값과 관계없이 러너가 보유한 세션이 없어지는 즉시 종료합니다. |
32| `--drain-marker-file <path>` | `SELF_HOSTED_RUNNER_DRAIN_MARKER_FILE` | 설정되지 않음 | 호스트가 `SIGTERM`을 보내기 전에 우아한 드레인을 알리기 위해 작성하는 마커 파일입니다. 드레인이 시작될 때 파일이 존재하면 러너는 종료를 일반 종료 신호가 아닌 호스트 드레인으로 Anthropic에 보고합니다. 드레인 자체(플래그 없이 `--drain-wait-sec` 보유 포함)는 동일하게 실행됩니다. 세션이 쓸 수 없는 로컬 파일 시스템의 경로를 지정하십시오. Claude Code v2.1.271 이상이 필요합니다. |32| `--drain-marker-file <path>` | `SELF_HOSTED_RUNNER_DRAIN_MARKER_FILE` | 설정 안 됨 | 호스트가 `SIGTERM`을 보내기 전에 정상적인 드레인을 알리기 위해 기록하는 마커 파일입니다. 드레인이 시작될 때 파일이 존재하면, 러너는 자신의 종료를 일반 종료 신호가 아닌 호스트 드레인으로 Anthropic에 보고합니다. `--drain-wait-sec` 대기를 포함한 드레인 자체는 플래그가 없을 때와 동일하게 실행됩니다. 세션이 쓸 수 없는 로컬 파일 시스템의 경로를 지정하십시오. Claude Code v2.1.271 이상이 필요합니다. |
33| `--drain-wait-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_WAIT_MS` | `0` | 드레인이 시작되면([`--defer-shutdown-max-min`](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)을 설정하지 않은 경우 `SIGTERM` 수신 시), 각 세션의 진행 중인 턴과 백그라운드 작업이 완료될 때까지 최대 N초를 기다린 후 자식을 종료합니다. 이 대기 중에 러너는 방금 완료된 백그라운드 작업을 여전히 실행 중인 것으로 계산하며, 최대 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 윈도우 동안 결과를 읽는 후속 턴이 시작될 때까지입니다. |33| `--drain-wait-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_WAIT_MS` | `0` | 드레인이 시작되면(설정에서 [`--defer-shutdown-max-min`](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)을 지정하지 않은 경우 `SIGTERM` 시점), 자식 프로세스를 종료하기 전에 각 세션의 진행 중인 턴과 백그라운드 작업이 끝날 때까지 최대 N초 동안 기다립니다. 이 대기 중에 러너는 방금 끝난 백그라운드 작업을, 그 결과를 읽는 후속 턴이 시작될 때까지 최대 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 기간 동안 여전히 실행 중인 것으로 간주합니다. [중지 타임아웃도 늘리십시오](/docs/ko/self-hosted-environments-deploy.md#let-running-turns-finish-before-a-restart). |
34| `--environment-secret-file <path>` | `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` | 필수 | 환경 비밀을 포함하는 파일의 경로이거나, [오케스트레이터](/docs/ko/self-hosted-environments-configuration#on-demand-runners)에 의해 생성된 러너의 경우 일회용 작업 주문 JWT입니다. `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET`은 파일 경로가 아닌 비밀 값을 직접 전달합니다. 더 이상 사용되지 않는 `--pool-secret-file` 플래그 및 `SELF_HOSTED_RUNNER_POOL_SECRET` 변수는 여전히 작동하며 stderr에 지원 중단 알림을 인쇄합니다. 2.1.216보다 오래된 미리보기 프로그램 러너 빌드는 이러한 더 이상 사용되지 않는 이름만 인식합니다. |34| `--environment-secret-file <path>` | `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` | 필수 | 환경 시크릿이 담긴 파일의 경로이며, [오케스트레이터](/docs/ko/self-hosted-environments-configuration.md#on-demand-runners)가 생성한 러너의 경우 일회용 작업 주문 JWT가 담긴 파일의 경로입니다. `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET`은 파일 경로가 아니라 시크릿 값을 직접 전달합니다. 이전의 `--pool-secret-file` 플래그와 `SELF_HOSTED_RUNNER_POOL_SECRET` 변수도 여전히 작동하며 stderr에 지원 중단 알림을 출력합니다. 2.1.216보다 오래된 프리뷰 프로그램 러너 빌드는 이러한 이전 이름만 인식합니다. |
35| `--exec-path <path>` | `SELF_HOSTED_RUNNER_EXEC_PATH` | 자체 바이너리 | 각 세션에 대해 생성할 바이너리 또는 래퍼 스크립트입니다. [래퍼 스크립트](/docs/ko/self-hosted-environments-configuration#wrapper-scripts)를 참조하십시오. |35| `--exec-path <path>` | `SELF_HOSTED_RUNNER_EXEC_PATH` | 자체 바이너리 | 각 세션마다 실행할 바이너리 또는 래퍼 스크립트입니다. [래퍼 스크립트](/docs/ko/self-hosted-environments-configuration.md#wrapper-scripts)를 참조하십시오. |
36| `--exit-if-unused-min <n>` | `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS` | `0` | 작업이 할당되지 않은 N분 동안 폴링한 후 종료합니다(자동 스케일러 축소용). `0`은 비활성화합니다. |36| `--exit-if-unused-min <n>` | `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS` | `0` | 오토스케일러 축소를 위해, 작업이 한 번도 할당되지 않은 채 N분 동안 폴링한 후 종료합니다. `0`은 비활성화합니다. |
37| `--git-host-rewrite <from>=<to>` | 없음 | 설정되지 않음 | 분할 수평 DNS를 위해 복제하기 전에 `https://<from>/...` 소스 URL을 `https://<to>/...`로 다시 작성합니다. 반복 가능; 플래그만 해당. |37| `--git-host-rewrite <from>=<to>` | 없음 | 설정 안 됨 | 분할 수평 DNS를 위해 클론하기 전에 `https://<from>/...` 소스 URL을 `https://<to>/...`로 다시 씁니다. 반복 지정할 수 있으며 플래그 전용입니다. |
38| `--git-ssh-rewrite <host>` | 없음 | 설정되지 않음 | SSH 전용 git 호스트를 위해 복제하기 전에 `https://<host>/...` 소스 URL을 `git@<host>:...`로 다시 작성합니다. 반복 가능; 플래그만 해당. |38| `--git-ssh-rewrite <host>` | 없음 | 설정 안 됨 | SSH 전용 git 호스트를 위해 클론하기 전에 `https://<host>/...` 소스 URL을 `git@<host>:...`로 다시 씁니다. 반복 지정할 수 있으며 플래그 전용입니다. |
39| `--health-port <port>` | `SELF_HOSTED_RUNNER_HEALTH_PORT` | `8080` | `/healthz` 및 `/metrics` 리스너용 포트입니다. 비활성화하려면 `0`으로 설정하십시오. |39| `--health-port <port>` | `SELF_HOSTED_RUNNER_HEALTH_PORT` | `8080` | `/healthz` 및 `/metrics` 리스너용 포트입니다. 비활성화하려면 `0`으로 설정합니다. |
40| `--hooks-dir <path>` | `SELF_HOSTED_RUNNER_HOOKS_DIR` | 설정되지 않음 | 라이프사이클 훅 스크립트의 디렉터리입니다. [라이프사이클 훅](/docs/ko/self-hosted-environments-configuration#lifecycle-hooks)을 참조하십시오. |40| `--hooks-dir <path>` | `SELF_HOSTED_RUNNER_HOOKS_DIR` | 설정 안 됨 | 라이프사이클 훅 스크립트가 있는 디렉터리입니다. [라이프사이클 훅](/docs/ko/self-hosted-environments-configuration.md#lifecycle-hooks)을 참조하십시오. |
41| `--host-config-snapshot <mode>` | `SELF_HOSTED_RUNNER_HOST_CONFIG_SNAPSHOT` | `disk` | 러너가 각 세션을 시드하는 [호스트 구성 디렉터리](#environment-variable-only-settings)의 시작 스냅샷을 유지하는 위치입니다. `disk`는 스냅샷을 `--base-dir` 아래의 러너 소유 디렉터리로 복사하고, 각 세션 시작 시 모든 파일을 메모리 내 다이제스트에 대해 확인합니다. 복사본의 파일이 수정되었으면 세션이 실패하고 러너는 재시작할 때까지 세션을 거부합니다. `memory`는 전체 스냅샷을 힙에 보유하며, 64 MiB로 제한됩니다. 상한을 초과하면 세션이 호스트 구성 없이 시작되고 그렇게 함을 나타내는 알림을 표시합니다. 러너가 디스크 스냅샷을 쓸 수 없으면 실패를 기록하고 해당 실행에 `memory`를 사용합니다. Claude Code v2.1.271 이상이 필요합니다. |41| `--host-config-snapshot <mode>` | `SELF_HOSTED_RUNNER_HOST_CONFIG_SNAPSHOT` | `disk` | 러너가 각 세션의 초기값으로 사용하는 [호스트 구성 디렉터리](#environment-variable-only-settings)의 시작 시점 스냅샷을 보관하는 위치입니다. `disk`는 스냅샷을 `--base-dir` 아래의 러너 소유 디렉터리에 복사하고, 각 세션 시작 시 모든 파일을 인메모리 다이제스트와 대조해 검증합니다. 복사본의 파일이 수정된 경우 세션이 실패하며, 러너를 다시 시작할 때까지 러너는 세션을 거부합니다. `memory`는 전체 스냅샷을 최대 64 MiB까지 힙에 보관합니다. 한도를 초과하면 세션이 호스트 구성 없이 시작되며 그 사실을 알리는 안내가 표시됩니다. 러너가 디스크 스냅샷을 쓸 수 없으면 실패를 로그에 기록하고 해당 실행에서는 `memory`를 사용합니다. Claude Code v2.1.271 이상이 필요합니다. |
42| `--kill-session-after-min <n>` | `SELF_HOSTED_RUNNER_MAX_LIFETIME_MS` | `0` | 세션을 N분 벽시계 시간으로 제한합니다(고착된 세션의 안전 제한). v2.1.260 이상에서 러너는 제한에 도달한 세션을 해제하여 사용자의 다음 메시지에서 재개할 수 있으며, [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 유예 윈도우가 끝날 때 여전히 러너에 있는 경우에만 종료합니다. v2.1.260 이전에는 러너가 제한에서 세션을 종료했습니다. 세부 정보 및 값을 선택하는 방법은 [일부 세션은 유휴로 계산되지 않음](/docs/ko/self-hosted-environments-deploy#some-sessions-don%E2%80%99t-count-as-idle)을 참조하십시오. `0`은 비활성화합니다. |42| `--kill-session-after-min <n>` | `SELF_HOSTED_RUNNER_MAX_LIFETIME_MS` | `0` | 멈춘 세션에 대한 안전 한도로, 세션을 실제 경과 시간 기준 N분으로 제한합니다. v2.1.260 이상에서는 러너가 한도에 도달한 세션을 해제하여 사용자의 다음 메시지에서 재개할 수 있게 하며, [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 유예 기간이 끝날 때 여전히 러너에 있는 경우에만 종료합니다. v2.1.260 이전에는 러너가 한도에서 세션을 종료했습니다. 자세한 내용과 값 선택 방법은 [일부 세션은 유휴 상태로 간주되지 않음](/docs/ko/self-hosted-environments-deploy.md#some-sessions-don’t-count-as-idle)을 참조하십시오. `0`은 비활성화합니다. |
43| `--lock-to-account <id>` | `SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT` | 설정되지 않음 | 첫 번째 세션에서 잠금하는 대신 시작 시 러너를 특정 계정으로 사전 잠금합니다. 환경의 조직에서 이메일 주소 또는 `user_...` ID를 허용합니다. 사전 잠금된 러너는 계정이 없는 Claude Tag 채널 세션을 절대 선택하지 않습니다. |43| `--lock-to-account <id>` | `SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT` | 설정 안 됨 | 첫 번째 세션에서 잠그는 대신 시작 시 러너를 특정 계정에 미리 잠급니다. 환경의 조직에 속한 이메일 주소 또는 `user_...` ID를 받습니다. 미리 잠긴 러너는 계정이 없는 Claude Tag 채널 세션을 절대 가져가지 않습니다. |
44| `--log-file <path>` | `SELF_HOSTED_RUNNER_LOG_FILE` | 설정되지 않음 | 러너 로그를 stdout 및 stderr 외에도 파일로 미러링하며, `0600` 권한으로 생성됩니다. `self-hosted-runner doctor`가 로그를 로컬로 추적하는 데 필요합니다. |44| `--log-file <path>` | `SELF_HOSTED_RUNNER_LOG_FILE` | 설정 안 됨 | stdout 및 stderr 외에 러너 로그를 `0600` 권한으로 생성된 파일에도 미러링합니다. `self-hosted-runner doctor`가 로컬에서 로그를 tail하는 데 필요합니다. |
45| `--log-level <level>` | 없음 | `info` | `info` 또는 `debug` |45| `--log-level <level>` | 없음 | `info` | `info` 또는 `debug` |
46| `--post-session-hook-timeout-sec <n>` | `SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS` | `60` | 러너 종료를 포함한 모든 세션 종료 시 [`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)의 예산입니다. |46| `--post-session-hook-timeout-sec <n>` | `SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS` | `60` | 러너 종료를 포함한 모든 세션 종료 시 [`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)에 주어지는 시간입니다 |
47| `--proxy-authorization-command <command>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND` | 설정되지 않음 | 러너가 이그레스 프록시에 대한 모든 연결에 대해 실행하는 셸 명령이며, 트리밍된 stdout을 `Proxy-Authorization` 헤더 값으로 사용합니다. `HTTPS_PROXY` 또는 `HTTP_PROXY`가 필요하며, `--proxy-authorization-file`과 결합할 수 없습니다. [이그레스 프록시에 인증](/docs/ko/self-hosted-environments-deploy#authenticate-to-an-egress-proxy)을 참조하십시오. Claude Code v2.1.238 이상이 필요합니다. |47| `--proxy-authorization-command <command>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND` | 설정 안 됨 | 러너가 이그레스 프록시에 연결할 때마다 실행하는 셸 명령으로, 앞뒤 공백을 제거한 stdout을 `Proxy-Authorization` 헤더 값으로 사용합니다. `HTTPS_PROXY` 또는 `HTTP_PROXY`가 필요하며, `--proxy-authorization-file`과 함께 사용할 수 없습니다. [이그레스 프록시에 인증하기](/docs/ko/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)를 참조하십시오. Claude Code v2.1.238 이상이 필요합니다. |
48| `--proxy-authorization-file <path>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE` | 설정되지 않음 | 러너가 이그레스 프록시에 대한 모든 연결에 대해 읽는 파일이며, 트리밍된 내용을 `Proxy-Authorization` 헤더 값으로 사용합니다. 다른 프로세스가 제자리에서 회전하는 토큰에 이 플래그를 사용하십시오. `--proxy-authorization-command`와 동일한 요구 사항을 전달하며, 이와 결합할 수 없습니다. [이그레스 프록시에 인증](/docs/ko/self-hosted-environments-deploy#authenticate-to-an-egress-proxy)을 참조하십시오. Claude Code v2.1.238 이상이 필요합니다. |48| `--proxy-authorization-file <path>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE` | 설정 안 됨 | 러너가 이그레스 프록시에 연결할 때마다 읽는 파일로, 앞뒤 공백을 제거한 내용을 `Proxy-Authorization` 헤더 값으로 사용합니다. 다른 프로세스가 제자리에서 교체하는 토큰에 이 플래그를 사용하십시오. `--proxy-authorization-command`와 동일한 요구 사항이 적용되며, 함께 사용할 수 없습니다. [이그레스 프록시에 인증하기](/docs/ko/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)를 참조하십시오. Claude Code v2.1.238 이상이 필요합니다. |
49| `--push-outcome-on-release` | `SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE` | 꺼짐 | 드레인 또는 유휴 해제와 같은 러너 시작 세션 종료 시 추적된 결과 분기를 `origin`으로 푸시한 후 작업 공간을 삭제하여 진행 중인 커밋이 재시작을 생존하도록 합니다. 최선의 노력; 종료 예산에 30초를 추가하며, 푸시된 분기에서 재개하려면 git 2.29 이상이 필요합니다. 활성화하기 전에 `claude/*` refs에 대한 푸시 액세스를 제한하십시오. [재개된 세션이 푸시되지 않은 작업을 잃음](/docs/ko/self-hosted-environments-deploy#additional-limitations)을 참조하십시오. `checkout` 라이프사이클 훅을 통해 체크아웃된 저장소는 푸시되지 않습니다. [`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)에서 이를 스냅샷하십시오. |49| `--push-outcome-on-release` | `SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE` | 꺼짐 | 드레인이나 유휴 해제와 같이 러너가 시작한 세션 종료 시, 워크스페이스를 삭제하기 전에 추적 중인 결과 브랜치를 `origin`에 push하여 진행 중인 커밋이 재시작 후에도 유지되도록 합니다. 최선의 노력으로 수행되며, 종료 시간에 30초가 추가되고, push된 브랜치에서 재개하려면 git 2.29 이상이 필요합니다. 활성화하기 전에 push 접근을 `claude/*` 참조로 제한하십시오. [재개된 세션은 push되지 않은 작업을 잃음](/docs/ko/self-hosted-environments-deploy.md#additional-limitations)을 참조하십시오. `checkout` 라이프사이클 훅으로 체크아웃한 저장소는 push되지 않으므로, 대신 [`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)에서 스냅샷을 만드십시오. |
50| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 턴이 완료되거나 세션이 사용자의 작업을 기다린 후 N분의 비활성 상태 후 세션 슬롯을 해제합니다. 여전히 턴 중간에 있는 세션(절대 완료되지 않는 백그라운드 작업을 보유하거나 실행 중인 도구 호출 내에서 요청된 승인을 포함)은 유휴로 계산되지 않습니다. `--kill-session-after-min`과 쌍을 이루어 하드 백스톱으로 사용하십시오. 세션의 백그라운드 작업이 완료된 후, 러너는 최대 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 윈도우 동안 결과를 읽는 후속 턴이 시작될 때까지 세션을 바쁜 것으로 간주합니다. 러너가 종료 신호를 받거나 은퇴 시간에 도달할 때까지, 러너를 활성 세션 없이 남겨두는 해제는 `--drain-grace-sec`에 의해 관리되는 정상 드레인과 동일한 종료 경로를 시작합니다. [`--defer-shutdown-max-min`](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)으로 연기한 첫 번째 신호 이후, 러너는 해제로 인해 세션을 보유하지 않는 즉시 종료됩니다. `0`은 비활성화합니다. |50| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 턴이 끝나거나 세션이 사용자의 조치를 기다리는 상태에서 N분 동안 활동이 없으면 세션 슬롯을 해제합니다. 끝나지 않는 백그라운드 작업을 보유하거나 실행 중인 도구 호출 내부에서 승인을 요청한 세션을 포함하여 아직 턴 진행 중인 세션은 유휴 상태로 간주되지 않으므로, 강제 안전장치로 `--kill-session-after-min`과 함께 사용하십시오. 세션의 백그라운드 작업이 끝난 후, 러너는 그 결과를 읽는 후속 턴이 시작될 때까지 최대 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 기간 동안 세션을 사용 중인 것으로 간주합니다. 러너가 종료 신호를 받거나 은퇴 시간에 도달하기 전까지, 해제로 인해 러너에 활성 세션이 하나도 남지 않으면 일반 드레인과 동일한 종료 경로가 시작되며 `--drain-grace-sec`의 적용을 받습니다. [`--defer-shutdown-max-min`](/docs/ko/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)으로 연기한 첫 번째 신호 이후에는 해제로 인해 보유한 세션이 없어지는 즉시 러너가 종료합니다. `0`은 비활성화합니다. |
51| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 꺼짐 | 세션이 이 러너에서 종료될 때 결과와 관계없이 `<base-dir>/_sessions/` 아래의 세션별 디렉터리를 제거합니다. [사전 준비된 체크아웃 재사용](/docs/ko/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)은 이들이 보유한 내용과 유지될 때 이를 읽을 수 있는 사람을 설명합니다. 제거는 최선의 노력입니다: 러너가 종료되거나 정리가 실행되기 전에 드레인 마감에 도달하면 세션별 디렉터리가 제자리에 남아 있습니다. 플래그가 켜져 있으면 실패하거나 중단된 세션의 디버그 로그가 디스크에 유지되지 않습니다. Claude Code v2.1.268 이상이 필요합니다. |51| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 꺼짐 | 세션이 이 러너에서 종료되면 결과와 관계없이 `<base-dir>/_sessions/` 아래의 세션별 디렉터리를 제거합니다. 이러한 디렉터리에 무엇이 담기며 남아 있을 때 누가 읽을 수 있는지는 [미리 준비된 체크아웃 재사용하기](/docs/ko/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout)에 설명되어 있습니다. 제거는 최선의 노력으로 수행됩니다. 정리가 실행되기 전에 러너가 강제 종료되거나 드레인 기한에 도달하면 세션별 디렉터리가 그대로 남습니다. 플래그를 켜면 실패하거나 중단된 세션의 디버그 로그가 디스크에 보관되지 않습니다. Claude Code v2.1.268 이상이 필요합니다. |
52| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 설정되지 않음 | 러너가 알려진 시간에 종료되는 인프라를 위해 절대 Unix 타임스탬프(초)에서 러너를 은퇴시킵니다. [러너 라이프사이클](/docs/ko/self-hosted-environments#runner-lifecycle)은 해제 시퀀스 및 여유를 크기 조정하는 방법을 설명합니다. 2001 이전 또는 5138년 이후의 값은 플래그에 의해 거부되고 환경 변수에 의해 무시됩니다. |52| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 설정 안 됨 | 알려진 시간에 러너를 종료하는 인프라를 위해, 초 단위의 절대 Unix 타임스탬프에 러너를 은퇴시킵니다. 해제 순서와 여유 시간 설정 방법은 [러너 라이프사이클](/docs/ko/self-hosted-environments#runner-lifecycle)에 설명되어 있습니다. 2001년 이전 또는 5138년 이후의 값은 플래그에서는 거부되고 환경 변수에서는 무시됩니다. |
53| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | 컨트롤 플레인이 세션과 함께 보내는 [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode) 분류기 규칙 목록 중 어떤 것이 해당 세션에 도달할 수 있는지 지정합니다: `all`, `no-allow` 또는 `none`. 각 값이 적용하는 내용은 [자동 모드 규칙 목록](#auto-mode-rule-lists)을 참조하십시오. 잘못된 값은 시작 시 러너를 중지시킵니다. Claude Code v2.1.295 이상이 필요합니다. |53| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | 컨트롤 플레인이 세션과 함께 보내는 [자동 모드](/docs/ko/permission-modes.md#eliminate-prompts-with-auto-mode) 분류기 규칙 목록 중 어떤 목록이 해당 세션에 도달할 수 있는지를 지정합니다: `all`, `no-allow`, 또는 `none`. 각 값이 무엇을 적용하는지는 [자동 모드 규칙 목록](#auto-mode-rule-lists)을 참조하십시오. 잘못된 값을 지정하면 시작 시 러너가 중지됩니다. Claude Code v2.1.295 이상이 필요합니다. |
54| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 세션이 종료된 후 Claude 프로세스가 깔끔하게 종료될 때까지 기다린 후 강제 종료하기 전까지 기다리는 시간입니다. 자식의 자체 `SessionEnd` 훅에 더 많은 시간이 필요한 경우 값을 높이십시오. |54| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 세션이 끝난 후 Claude 프로세스를 강제 종료하기 전에 정상적으로 종료되기를 기다리는 시간입니다. 자식 프로세스 자체의 `SessionEnd` 훅에 더 많은 시간이 필요하면 값을 늘리십시오. |
55| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 자식이 N분 이내에 [활동 채널](/docs/ko/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached)에서 초기화되었음을 신호하지 않은 경우 세션 슬롯을 해제합니다. N분은 복제 이후 생성 시점에 시작되며, 자식이 초기화되거나 상태를 보고하기 전에 내보내는 각 `user` 또는 `assistant` 메시지마다 다시 시작됩니다. v2.1.299 이전에는 세션의 첫 번째 해당 메시지에서 이 타임아웃이 더 이상 적용되지 않았습니다. 초기화 신호 이후의 해제는 `--release-idle-session-min`을 참조하십시오. `0`은 비활성화합니다. |55| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 자식 프로세스가 N분 이내에 [활동 채널](/docs/ko/self-hosted-environments-configuration.md#keep-stdin-and-file-descriptor-3-attached)에서 초기화되었음을 알리지 않으면 세션 슬롯을 해제합니다. N분은 클론 이후 프로세스 생성 시점부터 시작되며, 자식 프로세스가 초기화되거나 상태를 보고하기 전에 `user` 또는 `assistant` 메시지를 내보낼 때마다 다시 시작됩니다. v2.1.299 이전에는 이 타임아웃이 세션의 첫 번째 그러한 메시지에서 더 이상 적용되지 않았습니다. 초기화 신호 이후의 해제에 대해서는 `--release-idle-session-min`을 참조하십시오. `0`은 비활성화합니다. |
56| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 켜짐 | 각 세션의 저장소 경로에 대해 지속된 신뢰를 시드하여 저장소 커밋된 `permissions.allow` 및 `additionalDirectories`가 준수되도록 합니다. 저장소 커밋된 권한 부여를 삭제하고 대신 호스트 구성의 `settings.json`에서 허용 규칙을 구성하려면 `false`로 설정하십시오. 저장소 커밋된 `sandbox.*` 설정은 여전히 어느 쪽이든 적용되며, 이것이 [저장소 설정 가드](/docs/ko/self-hosted-environments-deploy#harden-your-deployment)가 이 플래그와 관계없이 이를 스캔하는 이유입니다. |56| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 켜짐 | 각 세션의 저장소 경로에 대한 영구 신뢰를 미리 설정하여 저장소에 커밋된 `permissions.allow` 및 `additionalDirectories`가 적용되도록 합니다. 저장소에 커밋된 권한 부여를 제외하고 대신 호스트 구성의 `settings.json`에서 허용 규칙을 구성하려면 `false`로 설정하십시오. 저장소에 커밋된 `sandbox.*` 설정은 어느 경우든 여전히 적용되며, 이 때문에 [저장소 설정 가드](/docs/ko/self-hosted-environments-deploy.md#harden-your-deployment)는 이 플래그와 관계없이 해당 설정을 검사합니다. |
57| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 꺼짐 | 고객 관리 git 인증 대신 [Anthropic git 프록시](/docs/ko/self-hosted-environments-deploy#use-the-anthropic-git-proxy)를 통해 github.com의 저장소를 복제합니다. `--capacity 1` 및 git 2.32 이상이 필요합니다. 러너는 그렇지 않으면 시작을 거부합니다. 다시 작성 플래그를 대체합니다. |57| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 꺼짐 | 고객이 관리하는 git 인증 대신 [Anthropic git 프록시](/docs/ko/self-hosted-environments-deploy.md#use-the-anthropic-git-proxy)를 통해 github.com의 저장소를 클론합니다. `--capacity 1`과 git 2.32 이상이 필요하며, 그렇지 않으면 러너가 시작을 거부합니다. 다시 쓰기 플래그보다 우선합니다. |
58 58
59대부분의 기간 플래그에는 최대값이 있으며, 각 타임아웃을 런타임의 32비트 타이머 상한인 약 24.85일 이내로 유지하도록 선택됩니다. `--*-min` 플래그는 10080분(7일)에서 상한선을 설정합니다. `--drain-grace-sec`는 604800초(역시 7일)에서 상한선을 설정합니다. `--drain-wait-sec`는 86400초(24시간)에서 상한선을 설정합니다. `--session-stop-grace-sec` 및 `--post-session-hook-timeout-sec`는 상한선이 없습니다. 상한선을 초과하는 동작은 표면별로 다릅니다:59대부분의 기간 플래그에는 최댓값이 있으며, 이는 각 타임아웃을 런타임의 32비트 타이머 상한인 약 24.85일 이내로 유지하기 위해 정해졌습니다. `--*-min` 플래그는 10080분(7일), `--drain-grace-sec`는 604800초(역시 7일), `--drain-wait-sec`는 86400초(24시간)가 상한입니다. `--session-stop-grace-sec`와 `--post-session-hook-timeout-sec`에는 상한이 없습니다. 상한을 초과했을 때의 동작은 사용 환경에 따라 다릅니다.
60 60
61* **플래그**: 시작이 오류로 실패합니다.61* **플래그**: 오류와 함께 시작이 실패합니다.
62* **환경 변수**: 러너는 값을 거부하는 대신 타이머 상한선으로 고정합니다.62* **환경 변수**: 러너가 값을 거부하지 않고 타이머 상한으로 제한합니다.
63 63
64### 자동 모드 규칙 목록64### 자동 모드 규칙 목록
65 65
66`--server-auto-mode-lists`를 사용하면 러너 외부에서 오는 [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode) 분류기 규칙 중 어떤 것이 러너의 세션에 도달할지 결정할 수 있습니다. Anthropic의 컨트롤 플레인은 세션과 함께 규칙 목록을 보내고 러너에 이를 적용하도록 요청할 수 있습니다. 일부 항목은 조직의 관리자가 작성한 규칙일 수 있습니다. 목록은 `environment`, `soft_deny`, `allow`입니다:66`--server-auto-mode-lists`를 사용하면 러너 외부에서 오는 [자동 모드](/docs/ko/permission-modes.md#eliminate-prompts-with-auto-mode) 분류기 규칙 중 어떤 것이 러너의 세션에 도달할지 결정할 수 있습니다. Anthropic의 컨트롤 플레인은 세션과 함께 규칙 목록을 보내고 러너에 이를 적용하도록 요청할 수 있습니다. 일부 항목은 조직의 관리자가 작성한 규칙일 수 있습니다. 목록은 `environment`, `soft_deny`, `allow`입니다.
67 67
68* **`environment`**: 항목이 분류기가 더 많이 허용하도록 만들 수도 있고, 더 적게 허용하도록 만들 수도 있습니다.68* **`environment`**: 항목은 분류기가 더 많이 허용하게 할 수도 있고 더 적게 허용하게 할 수도 있습니다.
69* **`soft_deny`**: 사용자가 명시적으로 요청했거나 `allow` 예외가 적용되지 않는 한 항목이 작업을 차단합니다.69* **`soft_deny`**: 항목은 사용자가 명시적으로 요청했거나 `allow` 예외가 적용되는 경우를 제외하고 작업을 차단합니다.
70* **`allow`**: `soft_deny` 항목에 대한 예외입니다.70* **`allow`**: `soft_deny` 항목에 대한 예외입니다.
71 71
72플래그의 값은 러너가 적용할 목록을 선택합니다:72플래그의 값에 따라 러너가 적용하는 목록이 결정됩니다.
73 73
74* **`no-allow`**: 기본값입니다. `environment`와 `soft_deny`를 적용하고 `allow`는 보류합니다. `environment` 항목은 여전히 분류기가 더 많이 허용하도록 만들 수 있으므로, 기본값이 모든 완화를 배제하지는 않습니다.74* **`no-allow`**: 기본값입니다. `environment`와 `soft_deny`를 적용하고 `allow`는 보류합니다. `environment` 항목은 여전히 분류기가 더 많이 허용하게 할 수 있으므로, 기본값이 모든 완화를 배제하지는 않습니다.
75* **`all`**: 세 목록을 모두 적용합니다.75* **`all`**: 세 가지 목록을 모두 적용합니다.
76* **`none`**: 어떤 목록도 적용하지 않습니다. 이러한 목록에서 오는 모든 완화를 배제하려면 `none`을 선택하십시오. 이 경우 `soft_deny` 제한도 함께 제외됩니다.76* **`none`**: 어떤 목록도 적용하지 않습니다. 이러한 목록으로 인한 모든 완화를 배제하려면 `none`을 선택하십시오. 이 경우 `soft_deny` 제한도 함께 제외됩니다.
77 77
78컨트롤 플레인이 러너에 목록 적용을 요청하도록 만드는 러너 설정은 없습니다. 요청하지 않으면 어떤 값을 설정하든 세션은 목록을 받지 않습니다. 어느 쪽이었는지 확인하려면 `--log-level debug`로 러너를 시작하십시오. 그러면 러너는 각 세션에 대해 `the server asked this runner to apply`가 포함된 줄 또는 `the server did not ask this runner to apply the auto mode lists it sends`가 포함된 줄을 로그에 기록합니다.78컨트롤 플레인이 러너에 목록 적용을 요청하도록 만드는 러너 설정은 없습니다. 요청하지 않으면 설정한 값과 관계없이 세션은 어떤 목록도 받지 않습니다. 어떤 경우였는지 확인하려면 `--log-level debug`로 러너를 시작하십시오. 그러면 러너는 각 세션에 대해 `the server asked this runner to apply`가 포함된 줄 또는 `the server did not ask this runner to apply the auto mode lists it sends`가 포함된 줄을 로그에 기록합니다.
79 79
80## 오케스트레이터 CLI 플래그80## 오케스트레이터 CLI 플래그
81 81
82`self-hosted-runner orchestrator` 서브명령은 [on-demand runners](/docs/ko/self-hosted-environments-configuration#on-demand-runners)를 생성하며, `--api-url`, `--environment-secret-file`, `--hooks-dir`, `--health-port` 및 `--log-level`을 러너와 동일한 기본값으로 허용하며, 러너의 플래그에 하나가 있는 경우 동일한 환경 변수를 허용합니다. 단, `--hooks-dir`은 필수이며 `spawn-runner` 훅을 포함해야 합니다. 또한 자체 플래그를 사용합니다:82`self-hosted-runner orchestrator` 서브명령은 [on-demand runners](/docs/ko/self-hosted-environments-configuration.md#on-demand-runners)를 생성하며, `--api-url`, `--environment-secret-file`, `--hooks-dir`, `--health-port` 및 `--log-level`을 러너와 동일한 기본값으로 허용하며, 러너의 플래그에 하나가 있는 경우 동일한 환경 변수를 허용합니다. 단, `--hooks-dir`은 필수이며 `spawn-runner` 훅을 포함해야 합니다. 또한 자체 플래그를 사용합니다:
83 83
84| 플래그 | 기본값 | 설명 |84| 플래그 | 기본값 | 설명 |
85| :- | :- | :- |85| :- | :- | :- |
93 93
94SCM 커넥터를 사용할 수 없으므로 이 섹션의 플래그를 설정하지 않은 상태로 두세요. `--scm-connector-host`를 설정하면 연결이 열리지 않으며 오케스트레이터는 계속 재시도합니다. 러너는 여전히 세션 큐로 시작합니다.94SCM 커넥터를 사용할 수 없으므로 이 섹션의 플래그를 설정하지 않은 상태로 두세요. `--scm-connector-host`를 설정하면 연결이 열리지 않으며 오케스트레이터는 계속 재시도합니다. 러너는 여전히 세션 큐로 시작합니다.
95 95
96커넥터는 오케스트레이터에서 Anthropic의 제어 평면으로의 상시 WebSocket 연결입니다. 저장소 선택기 및 분기 또는 ref 리졸버와 같은 호스팅된 사전 세션 흐름이 네트워크 내부에서만 라우팅 가능한 GitHub Enterprise Server 호스트에 도달할 수 있도록 설계되었습니다. GitHub Enterprise Server 페이지의 [네트워크 요구 사항](/docs/ko/github-enterprise-server#network-requirements)을 참조하여 이러한 흐름에 필요한 사항을 확인하세요.96커넥터는 오케스트레이터에서 Anthropic의 제어 평면으로의 상시 WebSocket 연결입니다. 저장소 선택기 및 분기 또는 ref 리졸버와 같은 호스팅된 사전 세션 흐름이 네트워크 내부에서만 라우팅 가능한 GitHub Enterprise Server 호스트에 도달할 수 있도록 설계되었습니다. GitHub Enterprise Server 페이지의 [네트워크 요구 사항](/docs/ko/github-enterprise-server.md#network-requirements)을 참조하여 이러한 흐름에 필요한 사항을 확인하세요.
97 97
98| 플래그 | 기본값 | 설명 |98| 플래그 | 기본값 | 설명 |
99| :- | :- | :- |99| :- | :- | :- |
112| 환경 변수 | 기본값 | 설명 |112| 환경 변수 | 기본값 | 설명 |
113| :- | :- | :- |113| :- | :- | :- |
114| `SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS` | `30000` | 러너가 백그라운드 작업이 완료된 후 결과를 읽는 후속 턴이 시작되지 않은 동안 세션을 바쁜 것으로 간주하는 시간입니다. [`--drain-wait-sec` 및 `--release-idle-session-min` 행](#runner-cli-flags)은 드레인 및 유휴 해제에서 보유가 적용되는 위치를 설명하며, [Runner lifecycle](/docs/ko/self-hosted-environments#runner-lifecycle)은 `--retire-at` 은퇴에서 적용되는 위치를 설명합니다. `0` 또는 사용할 수 없는 값은 기본값으로 폴백되므로 보유를 끌 수 없습니다. Claude Code v2.1.228 이상이 필요합니다. |114| `SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS` | `30000` | 러너가 백그라운드 작업이 완료된 후 결과를 읽는 후속 턴이 시작되지 않은 동안 세션을 바쁜 것으로 간주하는 시간입니다. [`--drain-wait-sec` 및 `--release-idle-session-min` 행](#runner-cli-flags)은 드레인 및 유휴 해제에서 보유가 적용되는 위치를 설명하며, [Runner lifecycle](/docs/ko/self-hosted-environments#runner-lifecycle)은 `--retire-at` 은퇴에서 적용되는 위치를 설명합니다. `0` 또는 사용할 수 없는 값은 기본값으로 폴백되므로 보유를 끌 수 없습니다. Claude Code v2.1.228 이상이 필요합니다. |
115| `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` | `~/.claude` | 러너의 시작 스냅샷으로 캡처되고 각 세션의 `CLAUDE_CONFIG_DIR`로 시드되는 디렉토리입니다. 디스크의 변경 사항은 러너 재시작 후 적용됩니다. 변수를 설정하면 러너가 [MCP seeding](/docs/ko/self-hosted-environments-configuration#mcp-servers)을 위해 `.claude.json`을 읽는 위치도 이동하므로 설정하면 자체 기본값을 포함하여 해당 조회를 재배치합니다. 빈 디렉토리를 가리켜 시딩을 완전히 비활성화하세요. |115| `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` | `~/.claude` | 러너의 시작 스냅샷으로 캡처되고 각 세션의 `CLAUDE_CONFIG_DIR`로 시드되는 디렉토리입니다. 디스크의 변경 사항은 러너 재시작 후 적용됩니다. 변수를 설정하면 러너가 [MCP seeding](/docs/ko/self-hosted-environments-configuration.md#mcp-servers)을 위해 `.claude.json`을 읽는 위치도 이동하므로 설정하면 자체 기본값을 포함하여 해당 조회를 재배치합니다. 빈 디렉토리를 가리켜 시딩을 완전히 비활성화하세요. |
116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | 세션이 `--kill-session-after-min` 제한에 도달한 후, 러너가 세션을 종료하기 전에 실행 중인 턴이 완료되거나 해제가 완료될 때까지 대기하는 시간입니다. |116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | 세션이 `--kill-session-after-min` 제한에 도달한 후, 러너가 세션을 종료하기 전에 실행 중인 턴이 완료되거나 해제가 완료될 때까지 대기하는 시간입니다. |
117| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 턴이 완료된 후 세션의 프로세스가 턴의 끝을 Anthropic에 보고하는 동안 러너가 `--drain-wait-sec` 드레인에 대해 세션을 바쁜 것으로 계산하는 시간의 상한입니다. `0` 또는 사용할 수 없는 값은 기본값으로 폴백되므로 보유를 끌 수 없습니다. Claude Code v2.1.275 이상이 필요합니다. |117| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 턴이 완료된 후 세션의 프로세스가 턴의 끝을 Anthropic에 보고하는 동안 러너가 `--drain-wait-sec` 드레인에 대해 세션을 바쁜 것으로 계산하는 시간의 상한입니다. `0` 또는 사용할 수 없는 값은 기본값으로 폴백되므로 보유를 끌 수 없습니다. Claude Code v2.1.275 이상이 필요합니다. |
118| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 러너가 중단 불가능한 I/O에 갇혀 있는 자식에게 OS가 `SIGKILL`을 전달할 때까지 기다린 후 자신을 종료하기 전까지 기다리는 시간입니다. `--post-session-hook-timeout-sec` 더하기 15초로 바닥이 정해지며, `--push-outcome-on-release`가 설정되면 30초 더 추가되므로 효과적인 최소값은 기본값에서 75초입니다. |118| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 러너가 중단 불가능한 I/O에 갇혀 있는 자식에게 OS가 `SIGKILL`을 전달할 때까지 기다린 후 자신을 종료하기 전까지 기다리는 시간입니다. `--post-session-hook-timeout-sec` 더하기 15초로 바닥이 정해지며, `--push-outcome-on-release`가 설정되면 30초 더 추가되므로 효과적인 최소값은 기본값에서 75초입니다. |
126 126
127세션 자식은 끄지 않으면 Anthropic에 운영 텔레메트리를 전송합니다. 코드 또는 저장소 내용은 전송되지 않습니다. 러너 프로세스에서 텔레메트리 변수를 설정하세요. 러너는 서버 제공 환경 변수를 적용한 후 다시 주장하므로 운영자의 설정이 항상 우선합니다.127세션 자식은 끄지 않으면 Anthropic에 운영 텔레메트리를 전송합니다. 코드 또는 저장소 내용은 전송되지 않습니다. 러너 프로세스에서 텔레메트리 변수를 설정하세요. 러너는 서버 제공 환경 변수를 적용한 후 다시 주장하므로 운영자의 설정이 항상 우선합니다.
128 128
129한 가지 제어는 자체 호스팅 환경에만 해당됩니다: `CLAUDE_CODE_BYOC_ENABLE_DATADOG=1`은 Datadog 운영 메트릭을 옵트인하며, 이는 자체 호스팅 환경에서 기본적으로 꺼져 있습니다. 일반 Claude Code 텔레메트리 제어인 `DISABLE_TELEMETRY`, `DO_NOT_TRACK`, `DISABLE_ERROR_REPORTING` 및 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`은 [environment variable reference](/docs/ko/env-vars)에서 문서화된 대로 세션 자식에 적용됩니다. `DISABLE_GROWTHBOOK`은 관련이 있지만 다릅니다: `DISABLE_GROWTHBOOK=1`을 설정하면 기능 플래그 페칭이 비활성화되고, `DISABLE_TELEMETRY`도 설정되지 않으면 텔레메트리가 켜져 있습니다.129한 가지 제어는 자체 호스팅 환경에만 해당됩니다: `CLAUDE_CODE_BYOC_ENABLE_DATADOG=1`은 Datadog 운영 메트릭을 옵트인하며, 이는 자체 호스팅 환경에서 기본적으로 꺼져 있습니다. 일반 Claude Code 텔레메트리 제어인 `DISABLE_TELEMETRY`, `DO_NOT_TRACK`, `DISABLE_ERROR_REPORTING` 및 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`은 [environment variable reference](/docs/ko/env-vars.md)에서 문서화된 대로 세션 자식에 적용됩니다. `DISABLE_GROWTHBOOK`은 관련이 있지만 다릅니다: `DISABLE_GROWTHBOOK=1`을 설정하면 기능 플래그 페칭이 비활성화되고, `DISABLE_TELEMETRY`도 설정되지 않으면 텔레메트리가 켜져 있습니다.
130 130
131`CLAUDE_CODE_ENABLE_TELEMETRY`는 관련이 없습니다: [Monitoring](/docs/ko/monitoring-usage)에서 설명한 대로 자신의 수집기로 OpenTelemetry 내보내기를 활성화하며, Anthropic의 분석을 제어하지 않습니다.131`CLAUDE_CODE_ENABLE_TELEMETRY`는 관련이 없습니다: [Monitoring](/docs/ko/monitoring-usage.md)에서 설명한 대로 자신의 수집기로 OpenTelemetry 내보내기를 활성화하며, Anthropic의 분석을 제어하지 않습니다.
132 132
133## 상태 엔드포인트133## 상태 엔드포인트
134 134
152 152
153## Prometheus 메트릭153## Prometheus 메트릭
154 154
155각 러너는 `/healthz`와 동일한 포트에서 `GET /metrics`에서 Prometheus 메트릭을 제공합니다. 주요 시리즈:155각 러너는 `/healthz`와 같은 포트의 `GET /metrics`에서 Prometheus 메트릭을 제공합니다. 주요 시리즈는 다음과 같습니다.
156 156
157| 시리즈 | 참고 |157| 시리즈 | 참고 |
158| :- | :- |158| :- | :- |
159| `claude_code_self_hosted_runner_info{runner_id,version,client_label}` | 항상 `1`입니다. 플릿 인벤토리 및 버전 드리프트 감지에 유용합니다. |159| `claude_code_self_hosted_runner_info{runner_id,version,client_label}` | 항상 `1`이며, 플릿 인벤토리 파악과 버전 불일치 감지에 유용합니다 |
160| `claude_code_self_hosted_runner_capacity` | 구성된 `--capacity` |160| `claude_code_self_hosted_runner_capacity` | 구성된 `--capacity` |
161| `claude_code_self_hosted_runner_active_sessions` | 현재 실행 중인 세션 |161| `claude_code_self_hosted_runner_active_sessions` | 현재 실행 중인 세션 |
162| `claude_code_self_hosted_runner_locked_account{email}` | 러너가 사용자에게 잠금되고 `act.email` 클레임을 전달하는 세션 토큰이 발급된 후 존재합니다. 시리즈는 세션 토큰이 `act.email`을 전달하지 않는 Claude Tag 에이전트에 잠긴 러너에 없습니다. 레이블 값은 계정 이메일입니다. 메트릭 저장소를 광범위하게 읽을 수 있으면 스크래핑 시간에 레이블을 삭제하거나 해시하세요(예: Prometheus `metric_relabel_configs`). |162| `claude_code_self_hosted_runner_locked_account{email}` | 러너가 사용자에게 잠기고 `act.email` 클레임을 포함한 세션 토큰이 발급된 후에 나타납니다. Claude Tag 에이전트에 잠긴 러너에서는 세션 토큰에 `act.email`이 없으므로 이 시리즈가 없습니다. 레이블 값은 계정 이메일입니다. 메트릭 저장소를 폭넓게 읽을 수 있다면 스크레이프 시점에 레이블을 삭제하거나 해시 처리하십시오. 예를 들어 Prometheus `metric_relabel_configs`를 사용할 수 있습니다. |
163| `claude_code_self_hosted_runner_last_poll_age_seconds` | 마지막 성공적인 폴 이후 초입니다. 60 이상이면 경고하세요. |163| `claude_code_self_hosted_runner_last_poll_age_seconds` | 마지막으로 폴링에 성공한 이후 경과한 초입니다. 60을 초과하면 알림을 보내십시오. |
164| `claude_code_self_hosted_runner_poll_errors_total{error_kind}` | 종류별 누적 PollWork 실패: `transport`, `timeout`, `5xx`, `429` 또는 `4xx`. 모든 5개 시리즈는 프로세스 시작부터 존재합니다. `rate(...[5m]) > 0`에서 경고하세요. |164| `claude_code_self_hosted_runner_poll_errors_total{error_kind}` | 종류별 누적 PollWork 실패 수입니다: `transport`, `timeout`, `5xx`, `429`, `4xx`. 다섯 개 시리즈 모두 프로세스 시작 시점부터 존재하며, `rate(...[5m]) > 0`일 때 알림을 보내십시오. |
165| `claude_code_self_hosted_runner_sessions_started_total{client_platform}` | 러너의 수명 동안 생성된 세션 자식 프로세스이며, `web_claude_ai`, `ios`, `android`, `desktop_app` 또는 `claude_code_cli`와 같은 세션 원점당 하나의 시리즈 또는 서버가 하나를 전송하지 않을 때 `unknown`입니다. Slack 세션은 Slack 통합을 생성한 것에 따라 `claude_in_slack` 또는 `claude-in-slack`을 전달하므로 `{client_platform=~"claude[-_]in[-_]slack"}`과 같은 정규식 선택기로 둘 다 일치시키세요. 플릿 총계에 `sum()`을 사용하세요. |165| `claude_code_self_hosted_runner_sessions_started_total{client_platform}` | 러너 수명 동안 생성된 세션 자식 프로세스 수로, `web_claude_ai`, `ios`, `android`, `desktop_app`, `claude_code_cli` 같은 세션 출처마다 하나의 시리즈가 있으며, 서버가 출처를 보내지 않은 경우에는 `unknown`입니다. Slack 세션은 어떤 Slack 통합이 생성했는지에 따라 `claude_in_slack` 또는 `claude-in-slack` 중 하나를 가지므로, `{client_platform=~"claude[-_]in[-_]slack"}` 같은 정규식 셀렉터로 둘 다 매칭하십시오. 플릿 전체 합계는 `sum()`을 사용하십시오. |
166| `claude_code_self_hosted_runner_sessions_completed_total{client_platform}` | 깔끔하게 종료된 세션이며, 동일한 방식으로 레이블이 지정됩니다. 일반 깔끔한 종료보다 광범위합니다: [session lifecycle counter semantics](#session-lifecycle-counter-semantics)에서 계산되는 것을 참조하세요. |166| `claude_code_self_hosted_runner_sessions_completed_total{client_platform}` | 정상적으로 종료된 세션으로, 레이블은 동일합니다. 단순한 정상 종료보다 범위가 넓습니다. 무엇이 집계되는지는 [세션 수명 주기 카운터 의미](#session-lifecycle-counter-semantics)를 참조하십시오. |
167| `claude_code_self_hosted_runner_sessions_failed_total{client_platform}` | 실패로 종료된 세션이며, 동일한 방식으로 레이블이 지정됩니다. 동일한 주의: [session lifecycle counter semantics](#session-lifecycle-counter-semantics)를 참조하세요. |167| `claude_code_self_hosted_runner_sessions_failed_total{client_platform}` | 실패로 종료된 세션으로, 레이블은 동일합니다. 같은 주의 사항이 적용됩니다. [세션 수명 주기 카운터 의미](#session-lifecycle-counter-semantics)를 참조하십시오. |
168| `claude_code_self_hosted_runner_sessions_interrupted_total{client_platform}` | 러너가 세션 결과가 아닌 운영 이유로 종료한 세션이며, 동일한 방식으로 레이블이 지정됩니다. [session lifecycle counter semantics](#session-lifecycle-counter-semantics)를 참조하세요. |168| `claude_code_self_hosted_runner_sessions_interrupted_total{client_platform}` | 세션 결과가 아닌 운영상의 이유로 러너가 종료시킨 세션으로, 레이블은 동일합니다. [세션 수명 주기 카운터 의미](#session-lifecycle-counter-semantics)를 참조하십시오. |
169| `claude_code_self_hosted_runner_initializing_sessions` | 초기화 단계의 세션이며, 할당부터 자식의 초기화 이벤트까지입니다. |169| `claude_code_self_hosted_runner_initializing_sessions` | 할당 시점부터 자식의 init 이벤트까지, 현재 초기화 단계에 있는 세션 |
170| `claude_code_self_hosted_runner_session_init_duration_seconds` | 세션 초기화 기간의 히스토그램 |170| `claude_code_self_hosted_runner_session_init_duration_seconds` | 세션 초기화 소요 시간 히스토그램 |
171| `claude_code_self_hosted_runner_session_init_errors_total` | 초기화에 도달하기 전에 실패한 세션: 체크아웃 훅 실패, git 준비, 토큰 문제 또는 사전 초기화 자식 충돌 |171| `claude_code_self_hosted_runner_session_init_errors_total` | init에 도달하기 전에 실패한 세션: checkout 훅 실패, git 준비, 토큰 문제 또는 init 이전 자식 크래시 |
172| `claude_code_self_hosted_runner_session_start_hook_errors_total` | 오류 결과를 보고한 `SessionStart` 훅이며, 실패한 훅 실행당 하나입니다. |172| `claude_code_self_hosted_runner_session_start_hook_errors_total` | 오류 결과를 보고한 `SessionStart` 훅으로, 실패한 훅 실행마다 하나씩 집계됩니다 |
173| `claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform}` | 세션이 유휴 상태가 된 이후 초의 세션별 게이지입니다. 응답 없는 권한 프롬프트에 고착된 세션을 종료하는 데 유용합니다. |173| `claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform}` | 세션이 유휴 상태가 된 이후 경과한 초를 나타내는 세션별 게이지입니다. 응답되지 않은 권한 프롬프트에서 멈춘 세션을 종료하는 데 유용합니다. |
174 174
175오케스트레이터는 `/healthz`와 동일한 포트에서 `GET /metrics`에서 자체 시리즈를 제공합니다:175오케스트레이터는 자체 `/healthz`와 같은 포트의 `GET /metrics`에서 자체 시리즈를 제공합니다.
176 176
177| 시리즈 | 참고 |177| 시리즈 | 참고 |
178| :- | :- |178| :- | :- |
179| `claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname}` | 항상 `1` |179| `claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname}` | 항상 `1` |
180| `claude_code_self_hosted_orchestrator_connected` | 가장 최근 폴이 성공했을 때 `1`입니다. 실패 종류와 관계없이 실패한 폴 후 `0`으로 떨어집니다. |180| `claude_code_self_hosted_orchestrator_connected` | 가장 최근 폴링이 성공하면 `1`이며, 실패 종류와 관계없이 폴링이 한 번이라도 실패하면 `0`으로 떨어집니다 |
181| `claude_code_self_hosted_orchestrator_last_poll_age_seconds` | 마지막 폴 시도 이후 초이며, 성공 또는 실패이며, 마지막 성공 이후를 측정하는 러너의 동일한 이름의 메트릭과 달리 `connected`와 쌍을 이루어 실패한 폴을 포착합니다. 오케스트레이터의 폴 루프는 훅 실행을 기다리므로 기본값에서 약 90초인 `--hook-timeout` 더하기 여백 위에 경고하세요. 평면 60이 아닙니다. |181| `claude_code_self_hosted_orchestrator_last_poll_age_seconds` | 성공 여부와 관계없이 마지막 폴링 시도 이후 경과한 초입니다. 이름이 같은 러너의 메트릭은 마지막 성공 이후를 측정하는 것과 다릅니다. 실패하는 폴링을 잡아내려면 `connected`와 함께 사용하십시오. 오케스트레이터의 폴링 루프는 훅 실행을 기다리므로, 고정값 60 대신 `--hook-timeout`에 여유를 더한 값, 기본값 기준 약 90초를 초과할 때 알림을 보내십시오. |
182| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 종류별 누적 PollSpawnHints 실패: `transport`, `timeout`, `5xx`, `429` 또는 `4xx`. 모든 5개 시리즈는 프로세스 시작부터 존재합니다. `rate(...[5m]) > 0`에서 경고하세요. |182| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 종류별 누적 PollSpawnHints 실패 수입니다: `transport`, `timeout`, `5xx`, `429`, `4xx`. 다섯 개 시리즈 모두 프로세스 시작 시점부터 존재하며, `rate(...[5m]) > 0`일 때 알림을 보내십시오. |
183| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 지금 청구 가능한 스폰 요청 |183| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 지금 바로 가져갈 수 있는 생성 요청 |
184| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 재시도 가능한 훅 실패 후 재시도 백오프의 스폰 요청 |184| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 재시도 가능한 훅 실패 후 재시도 백오프 중인 생성 요청 |
185| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 스폰이 차단된 세션입니다. 각 세션은 사용자가 새 메시지를 보내거나 Owner가 환경의 **Activity** 탭에서 재시도할 때까지 차단된 상태로 유지됩니다. 원인을 수정한 후에도 수가 0보다 크게 유지될 수 있습니다. 0 이상이면 경고하세요. |185| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 생성이 차단된 세션입니다. 각 세션은 사용자가 새 메시지를 보내거나 Owner가 환경의 **Activity** 탭에서 재시도할 때까지 차단 상태로 유지됩니다. 원인을 해결한 후에도 값이 0보다 큰 상태로 남아 있을 수 있습니다. 0보다 크면 알림을 보내십시오. |
186| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 이 환경의 러너를 기다리는 총 세션입니다. 환경 전체 집계이며, 모든 오케스트레이터 인스턴스에서 동일합니다: 인스턴스 전체에서 `SUM` 대신 `MAX`를 사용하세요. |186| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 이 환경에서 러너를 기다리는 전체 세션 수입니다. 환경 전체의 집계값이며 모든 오케스트레이터 인스턴스에서 동일하므로, 인스턴스 간에는 `SUM` 대신 `MAX`를 사용하십시오. |
187| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 현재 이 환경의 살아있는 러너에 할당된 세션입니다. 환경 전체 집계이며, 모든 오케스트레이터 인스턴스에서 동일합니다: 인스턴스 전체에서 `SUM` 대신 `MAX`를 사용하세요. |187| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 현재 이 환경에서 살아 있는 러너에 할당된 세션입니다. 환경 전체의 집계값이며 모든 오케스트레이터 인스턴스에서 동일하므로, 인스턴스 간에는 `SUM` 대신 `MAX`를 사용하십시오. |
188| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 누적 `spawn-runner` 훅 결과: `ok`, `retryable`, `non_retryable`. 오케스트레이터 훅 호출을 계산하며, 러너가 생성하는 세션 자식이 아닙니다: 용량이 1 이상, 웜 풀 및 동일한 세션에 대해 다시 생성된 러너가 둘을 분산시키므로 `sessions_started_total`과 비교할 수 없습니다. |188| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 누적 `spawn-runner` 훅 결과: `ok`, `retryable`, `non_retryable`. 러너가 생성하는 세션 자식이 아니라 오케스트레이터의 훅 호출을 집계합니다. 1보다 큰 capacity, 웜 풀, 같은 세션에 대해 다시 생성된 러너로 인해 두 값이 달라지므로 `sessions_started_total`과 비교할 수 없습니다. |
189| `claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds` | 훅 기간의 히스토그램 |189| `claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds` | 훅 소요 시간 히스토그램 |
190| `claude_code_self_hosted_orchestrator_warm_hints_dispatched_total` | 프로세스 시작 이후 발송된 대기 중인 스폰 요청 |190| `claude_code_self_hosted_orchestrator_warm_hints_dispatched_total` | 프로세스 시작 이후 디스패치된 대기(standby) 생성 요청 수 |
191| `claude_code_self_hosted_orchestrator_session_queue_wait_seconds` | 오케스트레이터가 스폰을 위해 청구하기 전에 각 세션이 대기열에서 기다린 초의 히스토그램이며, 제어 평면이 각 세션의 스폰 요청과 함께 전송하는 큐 대기 타임스탬프에서 기록됩니다. p50/p99 큐 시간 경고에 사용하세요. 사전 워밍 스폰은 샘플링되지 않습니다. |191| `claude_code_self_hosted_orchestrator_session_queue_wait_seconds` | 오케스트레이터가 생성을 위해 가져가기 전까지 각 세션이 큐에서 대기한 시간(초)의 히스토그램으로, 컨트롤 플레인이 각 세션의 생성 요청과 함께 보내는 큐 대기 타임스탬프를 기준으로 기록됩니다. p50/p99 큐 시간 알림에 사용하십시오. 사전 워밍 생성은 샘플링되지 않습니다. |
192| `claude_code_self_hosted_orchestrator_clock_skew_seconds` | 로컬 빼기 서버 클록 스큐입니다. 진단이며, 측정되면 존재합니다. |192| `claude_code_self_hosted_orchestrator_clock_skew_seconds` | 로컬 시각에서 서버 시각을 뺀 시계 오차로, 진단용이며 측정된 후에 나타납니다 |
193| `claude_code_self_hosted_orchestrator_scm_connector_connected` | [SCM connector](#scm-connector-flags)의 WebSocket이 열려 있을 때 `1`입니다. 다이얼링 또는 백오프 중일 때 `0`입니다. `--scm-connector-host`가 설정되지 않으면 없습니다. |193| `claude_code_self_hosted_orchestrator_scm_connector_connected` | [SCM 커넥터](#scm-connector-flags)의 WebSocket이 열려 있으면 `1`, 연결 시도 중이거나 백오프 중이면 `0`입니다. `--scm-connector-host`가 설정되지 않은 경우에는 없습니다. |
194| `claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total` | 프로세스 시작 이후 구성된 SCM 호스트로 프록시된 누적 HTTP 요청입니다. `--scm-connector-host`가 설정되지 않으면 없습니다. |194| `claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total` | 프로세스 시작 이후 구성된 SCM 호스트로 프록시된 누적 HTTP 요청 수입니다. `--scm-connector-host`가 설정되지 않은 경우에는 없습니다. |
195 195
196자동 스케일링의 경우 스케일링 스타일과 일치하는 시리즈를 선택하고 스케일러에 공급하기 전에 게이트하세요:196오토스케일링에는 스케일링 방식에 맞는 시리즈를 선택하고, 스케일러에 전달하기 전에 게이트를 적용하십시오.
197 197
198* **큐 깊이 스케일링**: `queue_pending_sessions`이 아닌 `claude_code_self_hosted_orchestrator_pool_pending_sessions`을 HPA 또는 KEDA 스케일러에 공급하세요.198* **큐 깊이 기반 스케일링**: `queue_pending_sessions`가 아니라 `claude_code_self_hosted_orchestrator_pool_pending_sessions`를 HPA 또는 KEDA 스케일러에 전달하십시오.
199* **용량 스케일링**: 러너의 `active_sessions`과 `capacity`의 비율에 따라 스케일하세요.199* **용량 기반 스케일링**: 러너의 `active_sessions` 대 `capacity` 비율을 기준으로 스케일링하십시오.
200* **`connected`에 게이트**: 쿼리를 인스턴스당 `claude_code_self_hosted_orchestrator_connected == 1`로 필터링하여 연결이 끊긴 복제본의 오래된 값이 스케일러에 공급되지 않도록 하세요.200* **`connected`로 게이트 적용**: 인스턴스별로 `claude_code_self_hosted_orchestrator_connected == 1`로 쿼리를 필터링하여, 연결이 끊긴 레플리카의 오래된 값이 스케일러에 전달되지 않도록 하십시오.
201 201
202전체 폴 중단 중에 모든 복제본이 연결이 끊어지면 게이트된 쿼리는 데이터를 반환하지 않습니다. HPA는 누락된 메트릭에서 현재 복제본 수를 유지하지만, KEDA의 Prometheus 스케일러는 기본 `ignoreNullValues: "true"`에서 빈 결과를 0으로 읽고 축소합니다. ScaledObject에서 `ignoreNullValues: "false"`를 설정하고, 선택적으로 `fallback` 복제본 바닥으로 설정하세요.202모든 레플리카의 연결이 끊긴 전면적인 폴링 장애 중에는 게이트가 적용된 쿼리가 데이터를 반환하지 않습니다. HPA는 메트릭이 없으면 현재 레플리카 수를 유지하지만, KEDA의 Prometheus 스케일러는 기본값 `ignoreNullValues: "true"`에서 빈 결과를 0으로 읽고 스케일 인합니다. ScaledObject에 `ignoreNullValues: "false"`를 설정하고, 필요하면 `fallback` 레플리카 하한을 함께 설정하십시오.
203 203
204다음 Prometheus Operator `PodMonitor`는 두 프로세스를 모두 다룹니다. `app.kubernetes.io/part-of: claude-code-self-hosted-runner` 레이블 및 [Kubernetes recipe](/docs/ko/self-hosted-environments-deploy#kubernetes)가 설정하는 명명된 `health` 포트로 포드를 선택합니다. 배포와 일치하도록 네임스페이스를 조정하세요:204다음 Prometheus Operator `PodMonitor`는 두 프로세스를 모두 다룹니다. [Kubernetes 레시피](/docs/ko/self-hosted-environments-deploy.md#kubernetes)에서 설정하는 `app.kubernetes.io/part-of: claude-code-self-hosted-runner` 레이블과 이름이 지정된 `health` 포트로 파드를 선택합니다. 배포에 맞게 네임스페이스를 조정하십시오.
205 205
206```yaml theme={null}206```yaml theme={null}
207# Claude Code 자체 호스팅 러너 + 오케스트레이터용 Prometheus Operator PodMonitor 예제입니다.207# Example Prometheus Operator PodMonitor for the Claude Code self-hosted
208# 배포와 일치하도록 네임스페이스 및 레이블 선택기를 조정하세요. 러너와 오케스트레이터 모두208# runner + orchestrator. Adjust the namespace and label selectors to match
209# --health-port(기본값 8080)에서 /metrics를 제공합니다.209# your deployment. Both the runner and the orchestrator serve /metrics on
210# their --health-port (default 8080).
210apiVersion: monitoring.coreos.com/v1211apiVersion: monitoring.coreos.com/v1
211kind: PodMonitor212kind: PodMonitor
212metadata:213metadata:
218 - claude-runners219 - claude-runners
219 selector:220 selector:
220 matchExpressions:221 matchExpressions:
221 # Kubernetes 레시피의 러너 배포와 동일한 방식으로 레이블이 지정되고222 # Matches the runner Deployment from the Kubernetes recipe, plus any
222 # 명명된 'health' containerPort를 제공하는 모든 온디맨드 러너 작업 및 오케스트레이터 포드와 일치합니다.223 # on-demand runner Jobs and orchestrator pods you label the same way
224 # and give a named 'health' containerPort.
223 - key: app.kubernetes.io/part-of225 - key: app.kubernetes.io/part-of
224 operator: In226 operator: In
225 values: [claude-code-self-hosted-runner]227 values: [claude-code-self-hosted-runner]
229 interval: 30s231 interval: 30s
230```232```
231 233
232이러한 샘플 경고 규칙은 시작점입니다. 플릿 크기에 맞게 임계값을 조정하세요:234다음 샘플 알림 규칙은 출발점입니다. 플릿 규모에 맞게 임계값을 조정하십시오.
233 235
234```yaml theme={null}236```yaml theme={null}
235# Claude Code 자체 호스팅 러너 + 오케스트레이터용 Prometheus 경고 규칙 예제입니다.237# Example Prometheus alert rules for the Claude Code self-hosted runner
236# 플릿 크기 및 SLO에 맞게 임계값을 조정하세요.238# + orchestrator. Tune thresholds for your fleet size and SLOs.
237groups:239groups:
238 - name: claude-code-self-hosted-runner240 - name: claude-code-self-hosted-runner
239 rules:241 rules:
242 for: 2m244 for: 2m
243 labels: {severity: warning}245 labels: {severity: warning}
244 annotations:246 annotations:
245 summary: "러너 {{ $labels.pod }}이(가) 60초 이상 폴링하지 않았습니다."247 summary: "Runner {{ $labels.pod }} has not polled in >60s"
246 - alert: ClaudeRunnerVersionDrift248 - alert: ClaudeRunnerVersionDrift
247 expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1249 expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1
248 for: 30m250 for: 30m
249 labels: {severity: info}251 labels: {severity: info}
250 annotations:252 annotations:
251 summary: "러너가 혼합 버전을 실행 중입니다."253 summary: "Runners are running mixed versions"
252 - alert: ClaudeRunnerInitErrorsHigh254 - alert: ClaudeRunnerInitErrorsHigh
253 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3255 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3
254 for: 5m256 for: 5m
255 labels: {severity: warning}257 labels: {severity: warning}
256 annotations:258 annotations:
257 summary: "러너 {{ $labels.pod }}: 10분 내 >3개 세션 초기화 실패(체크아웃 훅 / git / 토큰 / 사전 초기화 충돌)"259 summary: "Runner {{ $labels.pod }}: >3 session init failures in 10m (checkout hook / git / token / pre-init crash)"
258 - alert: ClaudeRunnerPollErrors260 - alert: ClaudeRunnerPollErrors
259 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0261 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0
260 for: 2m262 for: 2m
261 labels: {severity: warning}263 labels: {severity: warning}
262 annotations:264 annotations:
263 summary: "러너 {{ $labels.pod }}: PollWork 실패(5분 이상 {{ $value | humanize }}/s)"265 summary: "Runner {{ $labels.pod }}: PollWork failing ({{ $value | humanize }}/s over 5m)"
264 - alert: ClaudeRunnerSessionStartHookErrors266 - alert: ClaudeRunnerSessionStartHookErrors
265 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3267 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3
266 for: 5m268 for: 5m
267 labels: {severity: warning}269 labels: {severity: warning}
268 annotations:270 annotations:
269 summary: "러너 {{ $labels.pod }}: 10분 내 >3개 SessionStart 훅 실패"271 summary: "Runner {{ $labels.pod }}: >3 SessionStart hook failures in 10m"
270 272
271 - name: claude-code-self-hosted-orchestrator273 - name: claude-code-self-hosted-orchestrator
272 rules:274 rules:
275 for: 2m277 for: 2m
276 labels: {severity: critical}278 labels: {severity: critical}
277 annotations:279 annotations:
278 summary: "오케스트레이터 {{ $labels.pod }}이(가) Anthropic 제어 평면에 도달할 수 없습니다."280 summary: "Orchestrator {{ $labels.pod }} cannot reach the Anthropic control plane"
279 - alert: ClaudeOrchestratorPollStale281 - alert: ClaudeOrchestratorPollStale
280 expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90282 expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90
281 for: 2m283 for: 2m
282 labels: {severity: warning}284 labels: {severity: warning}
283 annotations:285 annotations:
284 summary: "오케스트레이터 {{ $labels.pod }}이(가) 90초 이상 폴링하지 않았습니다(폴 루프는 훅 실행을 기다립니다)."286 summary: "Orchestrator {{ $labels.pod }} has not polled in >90s (poll loop waits on hook execution)"
285 - alert: ClaudeOrchestratorCircuitBroken287 - alert: ClaudeOrchestratorCircuitBroken
286 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0288 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0
287 for: 1m289 for: 1m
288 labels: {severity: critical}290 labels: {severity: critical}
289 annotations:291 annotations:
290 summary: "스폰이 차단된 세션: {{ $value }}개. Activity 탭에서 각 세션의 오류를 확인하고 원인을 수정한 후 Retry를 선택하세요."292 summary: "Sessions blocked from spawning: {{ $value }}. Read each one's error in the Activity tab, fix the cause, then select Retry"
291 - alert: ClaudeOrchestratorPollErrors293 - alert: ClaudeOrchestratorPollErrors
292 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0294 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0
293 for: 2m295 for: 2m
294 labels: {severity: warning}296 labels: {severity: warning}
295 annotations:297 annotations:
296 summary: "오케스트레이터 {{ $labels.pod }}: PollSpawnHints 실패(5분 이상 {{ $value | humanize }}/s)"298 summary: "Orchestrator {{ $labels.pod }}: PollSpawnHints failing ({{ $value | humanize }}/s over 5m)"
297 - alert: ClaudeOrchestratorSpawnHookFailing299 - alert: ClaudeOrchestratorSpawnHookFailing
298 expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3300 expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3
299 for: 5m301 for: 5m
300 labels: {severity: warning}302 labels: {severity: warning}
301 annotations:303 annotations:
302 summary: "오케스트레이터 {{ $labels.pod }}: 5분 내 >3개 spawn-runner 훅 실패"304 summary: "Orchestrator {{ $labels.pod }}: >3 spawn-runner hook failures in 5m"
303```305```
304 306
305### 세션 자식 메트릭 통과307### 세션 자식 메트릭 전달
306 308
307각 세션은 자체 자식 프로세스에서 자체 OpenTelemetry 메트릭으로 실행됩니다. `--capacity`가 1 이상일 때, 러너는 이러한 자식 메트릭이 노출되는 방식을 다시 작성합니다. 러너 호스트에서 `OTEL_METRICS_EXPORTER=prometheus`를 설정하고 세션의 환경에서 `CLAUDE_CODE_ENABLE_TELEMETRY=1`을 설정하면(예: [wrapper script](/docs/ko/self-hosted-environments-configuration#wrapper-scripts) 또는 러너의 자체 환경에서, 세션이 상속함), 각 자식의 카운터 및 게이지 도구를 러너의 자체 `/metrics` 엔드포인트에 다시 노출하며, 러너의 시리즈와 함께 노출합니다. 러너는 자식의 내보내기를 루프백 전용 수신기로 OTLP를 통해 상태 포트로 푸시하도록 다시 작성하고, 각 시리즈에 `session_id` 및 `client_platform` 레이블을 태그하며, 해당 세션이 종료될 때 세션의 시리즈를 제거합니다. 히스토그램은 통과하지 않으며, 러너의 자체 접두사와 충돌하는 자식 메트릭은 삭제됩니다.309각 세션은 자체 OpenTelemetry 메트릭을 가진 별도의 자식 프로세스에서 실행됩니다. `--capacity`가 1보다 크면 러너는 이러한 자식 메트릭이 노출되는 방식을 재작성합니다. 러너 호스트에 `OTEL_METRICS_EXPORTER=prometheus`를 설정하고, 예를 들어 [래퍼 스크립트](/docs/ko/self-hosted-environments-configuration.md#wrapper-scripts)나 세션이 상속하는 러너 자체 환경에서 세션 환경에 `CLAUDE_CODE_ENABLE_TELEMETRY=1`을 설정하면, 각 자식의 카운터 및 게이지 계측값이 러너 자체의 `/metrics` 엔드포인트에서 러너의 시리즈와 함께 다시 노출됩니다. 러너는 자식의 익스포터를 재작성하여 health 포트의 루프백 전용 수신기로 OTLP를 통해 푸시하도록 하고, 각 시리즈에 `session_id` 및 `client_platform` 레이블을 붙이며, 세션이 종료되면 해당 세션의 시리즈를 제거합니다. 히스토그램은 전달되지 않으며, 이름이 러너 자체의 접두사와 충돌하는 자식 메트릭은 삭제됩니다.
308 310
309기본 `--capacity 1`에서 다시 작성이 적용되지 않습니다: 세션의 자식은 일반적으로 포트 9464에서 자체 Prometheus 엔드포인트를 바인딩합니다.311기본값인 `--capacity 1`에서는 재작성이 적용되지 않습니다. 세션의 자식은 평소처럼 포트 9464에 자체 Prometheus 엔드포인트를 바인딩합니다.
310 312
311### 세션 라이프사이클 카운터 의미론313#### 세션 메트릭을 러너 메트릭과 조인하기
312 314
313`sessions_started_total`, `sessions_completed_total`, `sessions_failed_total` 및 `sessions_interrupted_total` 카운터는 각 세션을 종료 방식으로 분류합니다. 생성된 모든 세션 자식은 생성 시 `sessions_started_total`을 증가시키고, 정확히 하나의 다른 세 개가 종료 시 증가하므로, `sessions_started_total` 빼기 다른 세 개의 합은 현재 실행 중인 세션 자식의 수와 같습니다.315세션 자체의 메트릭을 `claude_code_self_hosted_runner_session_idle_seconds` 옆에 나란히 두려면 러너의 `session_id`를 기준으로 조인하십시오.
314 316
315* `completed`: 세션이 깔끔하게 종료되었습니다. 이는 자식이 코드 `0`으로 자체 종료, 자식이 여전히 연결된 동안 세션이 보관되거나 삭제됨, 그리고 러너가 슬롯을 깔끔하게 반환하는 경우(유휴 타임아웃, 은퇴 시간 또는 `--kill-session-after-min` 제한에서 세션을 해제하는 경우, 시작 타임아웃, 또는 자식이 종료되기 전에 폴 루프가 알아챈 서버 측 할당 해제)를 다룹니다. `sessions_completed_total`을 증가시킵니다.317* **`--capacity`가 1보다 큰 경우**: 직접 조인합니다. 러너의 `/metrics`에서 세션의 시리즈는 해당 메트릭과 동일한 `session_id`를 `session_...` 형식으로 가집니다.
316* `failed`: 자식이 자체적으로 0이 아닌 코드로 종료되었으며, 충돌 또는 생성 후 설정 실패입니다. `sessions_failed_total`을 증가시킵니다.318* **`--capacity 1`인 경우**: 변환된 `ccr_session_id`를 기준으로 조인합니다. 기본적으로 포트 9464의 각 Claude Code 메트릭에는 이 레이블이 있으며, 여기에는 `cse_...` 형식의 세션 ID가 들어 있습니다. 새 레이블에서 `cse_` 접두사를 `session_`으로 바꾸면 러너의 `session_id`를 얻을 수 있습니다. 메트릭 자체의 `session_id`에는 Claude Code 자체의 [`session.id`](/docs/ko/monitoring-usage#standard-attributes)가 들어 있으며, 이는 어떤 러너 시리즈와도 일치하지 않습니다.
317* `interrupted`: 러너가 세션 성공도 러너 결함도 아닌 운영 이유로 자식을 종료했습니다(예: 드레인 또는 `--kill-session-after-min` 한계 후 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 유예 기간이 끝날 때 여전히 러너에 남아 있던 세션을 종료함). Kubernetes 롤링 재시작이 `SIGTERM`을 전송하는 것은 드레인의 한 예입니다. `sessions_interrupted_total`을 증가시킵니다.
318 319
319v2.1.260 이전에는 러너가 `--kill-session-after-min` 한계에 도달한 모든 세션을 종료하고 `sessions_interrupted_total`에서 계산했습니다.320### 세션 수명 주기 카운터 의미
320 321
321[`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)의 `CLAUDE_RUNNER_EXIT_REASON`은 깔끔한 슬롯 반환을 다르게 분류합니다. 훅은 해제, 시작 타임아웃, 서버 할당 해제, 그리고 폴이 먼저 알아챈 보관 또는 삭제를 `interrupted`로 보고합니다. 러너가 자식을 중지했기 때문입니다. 이러한 카운터는 동일한 이벤트를 `completed`로 기록합니다. 슬롯이 깔끔하게 반환되었기 때문입니다.322`sessions_started_total`, `sessions_completed_total`, `sessions_failed_total`, `sessions_interrupted_total` 카운터는 각 세션을 종료 방식에 따라 분류합니다. 생성된 모든 세션 자식은 생성 시점에 `sessions_started_total`을 증가시키고, 종료 시점에 나머지 세 개 중 정확히 하나를 증가시킵니다. 따라서 `sessions_started_total`에서 나머지 세 개의 합을 빼면 현재 실행 중인 세션 자식의 수와 같습니다.
322 323
323훅 수신을 `sessions_completed_total`에 직접 조정하면 완료를 과소 계산합니다. 세션별 보장을 위해 훅을 사용하고 집계 비율을 위해 카운터를 사용하세요.324* `completed`: 세션이 정상적으로 종료되었습니다. 여기에는 자식이 코드 `0`으로 스스로 종료한 경우, 자식이 아직 연결되어 있는 동안 세션이 아카이브되거나 삭제된 경우, 그리고 러너가 슬롯을 정상적으로 반환한 경우가 포함됩니다. 슬롯 반환에는 유휴 타임아웃, 은퇴 시간 또는 `--kill-session-after-min` 한도에서 세션을 해제하는 경우, 시작 타임아웃, 자식이 종료되기 전에 폴링 루프가 감지한 서버 측 할당 해제가 해당합니다. `sessions_completed_total`을 증가시킵니다.
325* `failed`: 자식이 0이 아닌 코드로 스스로 종료되었으며, 이는 크래시이거나 생성 후 설정 실패입니다. `sessions_failed_total`을 증가시킵니다.
326* `interrupted`: 러너가 세션 성공도 러너 오류도 아닌 운영상의 이유로 자식을 종료했습니다. 예를 들어 드레인이나, `--kill-session-after-min` 한도 이후의 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 유예 기간이 끝났을 때 여전히 러너에 남아 있던 세션을 종료하는 경우가 해당합니다. `SIGTERM`을 보내는 Kubernetes 롤링 재시작은 드레인의 한 예입니다. `sessions_interrupted_total`을 증가시킵니다.
324 327
325원샷 환경에서 `--capacity 1`과 기본 `--drain-grace-sec 0`을 사용하면, 각 러너 프로세스는 하나의 세션이 종료된 후 잠시 후 종료됩니다. `sessions_completed_total`, `sessions_failed_total` 및 `sessions_interrupted_total`은 세션 종료 시에만 증가하며, 그 종료 직전이므로, 15\~60초마다 Prometheus 스크래핑은 러너의 시리즈가 사라지기 전에 증가를 거의 포착하지 못합니다. 이 세 개의 세션 종료 카운터는 이 섹션의 나머지 부분이 참조하는 터미널 카운터입니다. `sessions_started_total`은 생성 시 증가하고 세션의 수명 동안 표시되므로 안정적으로 표시되지만, 원샷 환경에서는 누적 수보다 "현재 실행 중인 세션"에 더 가깝게 읽힙니다.328v2.1.260 이전에는 러너가 `--kill-session-after-min` 한도에 도달한 모든 세션을 종료하고 이를 `sessions_interrupted_total`에 집계했습니다.
326 329
327대신 해당 목표에 대해 이 표의 시리즈를 사용하세요:330[`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)의 `CLAUDE_RUNNER_EXIT_REASON`은 정상적인 슬롯 반환을 다르게 분류합니다. 러너가 자식을 중지했기 때문에 훅은 해제, 시작 타임아웃, 서버 할당 해제, 폴링이 먼저 감지한 아카이브 또는 삭제를 `interrupted`로 보고합니다. 이 카운터들은 슬롯이 정상적으로 반환되었기 때문에 같은 이벤트를 `completed`로 기록합니다.
328 331
329| 목표 | 사용 |332훅 수신 기록을 `sessions_completed_total`과 직접 대조하면 완료 수를 적게 집계하게 됩니다. 세션별 보장에는 훅을, 집계 비율에는 카운터를 사용하십시오.
333
334기본값 `--drain-grace-sec 0`과 함께 `--capacity 1`을 사용하는 일회성 환경에서는 각 러너 프로세스가 하나의 세션이 끝난 직후 종료됩니다. `sessions_completed_total`, `sessions_failed_total`, `sessions_interrupted_total`은 세션 종료 시점, 즉 그 프로세스 종료 직전에만 증가하므로, 15\~60초마다 수행되는 Prometheus 스크레이프가 러너의 시리즈가 사라지기 전에 증가분을 포착하는 경우는 드뭅니다. 이 세 개의 세션 종료 카운터가 이 섹션의 나머지 부분에서 말하는 종료 카운터입니다. `sessions_started_total`은 생성 시점에 증가하고 세션이 유지되는 동안 계속 보이므로 안정적으로 나타나지만, 일회성 환경에서는 누적 수라기보다는 "현재 실행 중인 세션"에 가까운 값을 나타냅니다.
335
336종료 카운터 대신, 해당 목표에 맞게 다음 표의 시리즈를 사용하십시오.
337
338| 목표 | 사용할 시리즈 |
330| :- | :- |339| :- | :- |
331| 처리량 | `claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"}`, 성공한 `spawn-runner` 훅당 한 번 증가하고 `rate()` 아래에서 의미 있는 장기 오케스트레이터의 카운터입니다. 훅 호출을 계산하며, 세션이 아니므로 사전 워밍 및 동일한 세션에 대한 반복 스폰이 세션 수에서 분산됩니다. |340| 처리량 | `claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"}`: 오래 유지되는 오케스트레이터의 카운터로, `spawn-runner` 훅이 성공할 때마다 한 번씩 증가하며 `rate()`에서도 의미 있는 값을 유지합니다. 세션이 아니라 훅 호출을 집계하므로, 사전 워밍과 같은 세션에 대한 반복 생성으로 인해 세션 수와 달라집니다. |
332| 사용률 | `sum(claude_code_self_hosted_runner_active_sessions)` 대 `sum(claude_code_self_hosted_runner_capacity)`, 러너 수명과 관계없이 모든 스크래핑에서 유효한 게이지 |341| 사용률 | `sum(claude_code_self_hosted_runner_active_sessions)` 대 `sum(claude_code_self_hosted_runner_capacity)`: 두 게이지 모두 러너 수명과 관계없이 모든 스크레이프에서 유효합니다 |
333| 백로그 | 큐 깊이를 위한 `claude_code_self_hosted_orchestrator_pool_pending_sessions` 및 `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions`, 0 이상이면 경고 |342| 백로그 | 큐 깊이에는 `claude_code_self_hosted_orchestrator_pool_pending_sessions`를 사용하고, `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions`는 0보다 크면 알림을 보내도록 사용합니다 |
334| 실패 | `claude_code_self_hosted_runner_sessions_failed_total`, 최선의 노력: 생성 후 실제 충돌은 증가시키며, `rate()`은 `--drain-grace-sec` 이상 `0`으로 세션을 능가하는 러너에서 의미 있습니다. 원샷 환경은 다른 터미널 카운터와 동일한 스크래핑 윈도우 문제를 가지므로 표시되는 0이 아닌 값을 조사할 가치가 있는 것으로 취급하세요. 체크아웃 훅 실패, git 준비 또는 토큰 문제와 같은 생성 전 실패는 `session_init_errors_total`에만 나타납니다. |343| 실패 | `claude_code_self_hosted_runner_sessions_failed_total`, 최선의 노력 기준: 생성 후 발생한 실제 크래시는 이 값을 증가시키며, `--drain-grace-sec`가 `0`보다 커서 러너가 세션보다 오래 유지되는 경우에는 `rate()`가 의미 있는 값을 냅니다. 일회성 환경에서는 다른 종료 카운터와 동일한 스크레이프 구간 문제가 있으므로, 0이 아닌 값이 보이면 조사할 가치가 있는 것으로 간주하십시오. checkout 훅 실패, git 준비, 토큰 문제 같은 생성 이전의 실패는 `session_init_errors_total`에만 나타납니다. |
335 344
336`orchestrator_*` 행은 [on-demand orchestrator](/docs/ko/self-hosted-environments-configuration#on-demand-runners)를 실행하는 환경에만 존재합니다. 세션을 능가하는 러너가 있는 고정 플릿에서 `--drain-grace-sec` 이상 `0`을 사용하면 처리량을 위해 `sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m]))`을 사용하세요. 원샷 플릿에서 해당 시리즈는 터미널 카운터와 동일한 스크래핑 윈도우 문제를 가지므로 대신 대기 중인 세션 수에 의존하세요. 환경의 **Activity** 탭, [**Cloud environments** 관리자 페이지](https://claude.ai/admin-settings/cloud-environments)에서 백로그를 확인하세요: 러너는 큐 깊이 시리즈를 내보내지 않습니다.345`orchestrator_*` 행은 [온디맨드 오케스트레이터](/docs/ko/self-hosted-environments-configuration.md#on-demand-runners)를 실행하는 환경에만 존재합니다. `--drain-grace-sec`가 `0`보다 커서 러너가 세션보다 오래 유지되는 고정 플릿에서는 처리량에 `sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m]))`를 사용하십시오. 일회성 플릿에서는 이 시리즈도 종료 카운터와 동일한 스크레이프 구간 문제가 있으므로, 대신 대기 중인 세션 수에 의존하십시오. 백로그는 [**Cloud environments** 관리자 페이지](https://claude.ai/admin-settings/cloud-environments)에 있는 환경의 **Activity** 탭에서 확인하십시오. 러너는 큐 깊이 시리즈를 내보내지 않습니다.
337 346
338세션별 결과 보고의 경우 대신 [`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)을 사용하세요: VM 선점과 같은 갑작스러운 러너 종료를 제외하고 자식 프로세스가 생성된 모든 세션 종료에서 실행됩니다([훅의 자체 계약](/docs/ko/self-hosted-environments-configuration#post-session)에 따름).347세션별 결과 보고에는 대신 [`post-session` 훅](/docs/ko/self-hosted-environments-configuration#post-session)을 사용하십시오. [훅 자체의 계약](/docs/ko/self-hosted-environments-configuration.md#post-session)에 따라, 이 훅은 VM 선점 같은 갑작스러운 러너 종료를 제외하고 자식 프로세스가 생성된 모든 세션 종료 시점에 실행됩니다.
339 348
340## 다음 단계349## 다음 단계
341 350
342* [Self-hosted environments](/docs/ko/self-hosted-environments): 환경, 러너 및 세션 모델입니다. [quickstart](/docs/ko/self-hosted-environments-quickstart) 및 [Deploy to production](/docs/ko/self-hosted-environments-deploy)은 설정 및 운영을 보유합니다.351* [Self-hosted environments](/docs/ko/self-hosted-environments): 환경, 러너 및 세션 모델입니다. [quickstart](/docs/ko/self-hosted-environments-quickstart.md) 및 [Deploy to production](/docs/ko/self-hosted-environments-deploy.md)은 설정 및 운영을 보유합니다.
343* [Customize sessions](/docs/ko/self-hosted-environments-configuration): 래퍼 스크립트, 라이프사이클 훅 및 온디맨드 러너352* [Customize sessions](/docs/ko/self-hosted-environments-configuration.md): 래퍼 스크립트, 라이프사이클 훅 및 온디맨드 러너
344* [Verify session identity](/docs/ko/self-hosted-environments-identity): 세션 토큰, 해당 클레임 및 확인 방법353* [Verify session identity](/docs/ko/self-hosted-environments-identity.md): 세션 토큰, 해당 클레임 및 확인 방법