SpyBara
Go Premium

self-hosted-environments-reference.md 2026-10-09 23:02 UTC to 2026-10-10 11:01 UTC

This page contains 88 additions and 68 deletions.

2026
Sat 10 12:58

Справочник самостоятельно размещаемых окружений

Полный справочник по самостоятельно размещаемому runner и orchestrator: флаги CLI, переменные окружения и метрики Prometheus.

Эта страница является справочником для двух процессов, которые вы запускаете в самостоятельно размещаемом окружении: runner, который выполняет Claude Code cloud sessions на ваших хостах, и опциональный orchestrator автомасштабирования, который запускает runners по мере поступления sessions в очередь. Каждый имеет свою таблицу флагов. Оба работают на хостах Linux или macOS, для которых значения по умолчанию, такие как /workspace и ~/.claude, предполагаются. Запустите claude self-hosted-runner --help для авторитетного списка на вашей установленной версии.

Серии метрик и несколько полей API по-прежнему используют pool для того, что эти страницы называют окружением; оба термина обозначают одно и то же. ID окружения — это поле pool_id с формой ccpool_...: везде, где эти страницы показывают идентификатор pool, он обозначает окружение. Флаги CLI и переменные окружения пишут его как environment, например --environment-secret-file; устаревшие написания pool по-прежнему работают, как описывает строка --environment-secret-file.

Флаги CLI Runner

Большинство флагов имеют соответствующую переменную окружения. Когда установлены оба, флаг имеет приоритет. Флаги длительности принимают минуты или секунды в CLI, но связанная переменная окружения всегда в миллисекундах, обозначаемая суффиксом _MS, и столбец Default показывает единицу флага: --exit-if-unused-min 10 эквивалентно SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000, а значение Helm вроде SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15" означает 15 миллисекунд, а не 15-минутное значение по умолчанию.

Флаг Переменная окружения По умолчанию Описание
--api-url <url> none https://api.anthropic.com URL базы API. Переопределяйте только для тестирования.
--base-dir <path> SELF_HOSTED_RUNNER_BASE_DIR /workspace; none на Windows Каталог для проверок репозитория и рабочих каталогов для каждого сеанса. Runner должен иметь доступ на запись к этому пути или его родительскому каталогу. Runner создает каталог при запуске и выходит с cannot create or write to base directory когда не может создать или записать в него. До v2.1.225 runner создавал каталог при запуске первого сеанса, поэтому неиспользуемый путь приводил к сбою сеансов, а не запуска. На Windows, который не является поддерживаемым хостом runner, нет значения по умолчанию: runner выходит при запуске, если вы не передадите флаг или не установите переменную. Используйте одно и то же значение на каждом runner в среде. См. Keep the base directory and capacity identical across runners.
--capacity <n> none 1 Максимальное количество одновременных сеансов, которые обрабатывает этот runner. Все сеансы принадлежат одному заблокированному owner. Используйте одно и то же значение на каждом runner в среде; см. Keep the base directory and capacity identical across runners.
--client-label <label> SELF_HOSTED_RUNNER_CLIENT_LABEL имя хоста хоста Метка, которую runner отправляет при регистрации. Runner также сообщает её как метку client_label claude_code_self_hosted_runner_info. Требует Claude Code v2.1.248 или позже.
--configure-git SELF_HOSTED_RUNNER_CONFIGURE_GIT=1 off При запуске запишите глобальную идентификацию git, включите подписание коммитов Anthropic, включите переговоры git push и установите hooks коммитов, которые добавляют трейлер Co-authored-by:. Переговоры push требуют Claude Code v2.1.257 или позже. См. Configure git.
--confine-repo-settings <mode> SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS warn Устанавливает режим защиты, которая помечает сеанс, когда параметры репозитория, зафиксированные в коммите, пытаются предоставить доступ на запись или чтение вне собственного рабочего пространства этого сеанса, установить переменные окружения или переопределить позицию sandbox или hooks оператора, например sandbox.enabled: false или disableAllHooks. По умолчанию warn регистрирует нарушение и все еще запускает сеанс, enforce отказывает в сеансе, а off отключает сканирование. См. Harden your deployment.
--debug-token-dir <path> SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR unset Запишите живые токены на диск для проверки. Только для отладки; не используйте в production.
--defer-shutdown-max-min <n> SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS 0 При первом SIGTERM или SIGINT продолжайте обслуживать уже подключенные сеансы вместо их осушения, затем отпустите все еще подключенное через N минут и выйдите. Повысьте timeout остановки вашего хоста перед установкой этого. См. Defer the drain past the first signal. 0 отключает. Требует Claude Code v2.1.238 или позже.
--drain-grace-sec <n> SELF_HOSTED_RUNNER_DRAIN_GRACE_MS 0 До тех пор, пока runner не получит сигнал завершения или не достигнет времени выхода на пенсию, контролирует, когда runner выходит после завершения активных сеансов: 0 выходит немедленно без опроса на дополнительные, а положительное значение держит runner живым и повторно опрашивает очередь заблокированного owner в течение этого количества секунд, за счет изоляции контейнера для каждого сеанса, описанной в разделе hardening. После первого сигнала, который вы отложили с помощью --defer-shutdown-max-min, runner выходит, как только он не содержит сеансов, независимо от того, что вы установили здесь.
--drain-marker-file <path> SELF_HOSTED_RUNNER_DRAIN_MARKER_FILE unset Файл маркера, который ваш хост записывает для объявления корректного осушения перед отправкой SIGTERM. Когда файл существует в начале осушения, runner сообщает о своем выходе в Anthropic как об осушении хоста, а не как о простом сигнале завершения. Само осушение, включая удержание --drain-wait-sec, работает так же, как без флага. Назовите путь на локальной файловой системе, в которую сеансы не могут писать. Требует Claude Code v2.1.271 или позже.
--drain-wait-sec <n> SELF_HOSTED_RUNNER_DRAIN_WAIT_MS 0 После начала осушения, которое происходит на SIGTERM, если вы не установили --defer-shutdown-max-min, ждите до N секунд для завершения текущего хода каждого сеанса и фоновых задач перед завершением дочернего процесса. Во время этого ожидания runner считает фоновую задачу, которая только что завершилась, все еще работающей до тех пор, пока не начнется следующий ход, который читает её результат, в течение максимум окна SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS.
--environment-secret-file <path> SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET required Путь к файлу, содержащему секрет среды, или, для runner, порожденных orchestrator, одноразовый JWT работного заказа. SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET несет значение секрета напрямую, а не путь к файлу. Старый флаг --pool-secret-file и переменная SELF_HOSTED_RUNNER_POOL_SECRET по-прежнему работают и выводят уведомление об устаревании в stderr; сборки runner программы предварительного просмотра старше 2.1.216 распознают только эти старые имена.
--exec-path <path> SELF_HOSTED_RUNNER_EXEC_PATH собственный бинарный файл Бинарный файл или скрипт-обертка для порождения для каждого сеанса. См. Wrapper scripts.
--exit-if-unused-min <n> SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS 0 Выйдите после N минут опроса без назначенной работы, для масштабирования автомасштабера. 0 отключает.
--git-host-rewrite <from>=<to> none unset Переписать URL источников https://<from>/... на https://<to>/... перед клонированием для разделенного DNS горизонта. Повторяемо; только флаг.
--git-ssh-rewrite <host> none unset Переписать URL источников https://<host>/... на git@<host>:... перед клонированием для хостов git только с SSH. Повторяемо; только флаг.
--health-port <port> SELF_HOSTED_RUNNER_HEALTH_PORT 8080 Порт для слушателя /healthz и /metrics. Установите 0 для отключения.
--hooks-dir <path> SELF_HOSTED_RUNNER_HOOKS_DIR unset Каталог скриптов hooks жизненного цикла. См. Lifecycle hooks.
--host-config-snapshot <mode> SELF_HOSTED_RUNNER_HOST_CONFIG_SNAPSHOT disk Где runner хранит снимок при запуске каталога конфигурации хоста, который он засевает каждый сеанс. disk копирует снимок в каталог, принадлежащий runner, под --base-dir и при каждом запуске сеанса проверяет каждый файл по дайджесту в памяти. Если файл в копии был изменен, сеанс не удается и runner отказывает в сеансах, пока вы не перезагрузите его. memory держит весь снимок на куче, ограниченный 64 МиБ; сверх лимита сеансы запускаются без конфигурации хоста и показывают уведомление об этом. Когда runner не может записать снимок на диск, он регистрирует сбой и использует memory для этого запуска. Требует Claude Code v2.1.271 или позже.
--kill-session-after-min <n> SELF_HOSTED_RUNNER_MAX_LIFETIME_MS 0 Ограничьте сеанс N минутами настенного времени как предел безопасности для зависших сеансов. На v2.1.260 или позже runner отпускает сеанс, который достигает лимита, чтобы он мог возобновиться при следующем сообщении пользователя, и завершает его только если он все еще на runner, когда окончится окно благодати SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS. До v2.1.260 runner завершал сеанс на лимите. См. Some sessions don't count as idle для деталей и как выбрать значение. 0 отключает.
--lock-to-account <id> SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT unset Предварительно заблокируйте runner на конкретный аккаунт при запуске вместо блокировки при первом сеансе. Принимает адрес электронной почты или ID user_... в организации среды. Предварительно заблокированный runner никогда не подхватывает сеансы канала Claude Tag, у которых нет аккаунта.
--log-file <path> SELF_HOSTED_RUNNER_LOG_FILE unset Зеркалируйте логи runner в файл в дополнение к stdout и stderr, созданный с разрешениями 0600. Требуется для self-hosted-runner doctor для локального отслеживания логов.
--log-level <level> none info info или debug
--post-session-hook-timeout-sec <n> SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS 60 Бюджет для post-session hook при завершении каждого сеанса, включая завершение runner
--proxy-authorization-command <command> SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND unset Команда shell, которую runner запускает для каждого подключения к вашему прокси выхода, используя его обрезанный stdout как значение заголовка Proxy-Authorization. Требует HTTPS_PROXY или HTTP_PROXY, и не может быть объединен с --proxy-authorization-file. См. Authenticate to an egress proxy. Требует Claude Code v2.1.238 или позже.
--proxy-authorization-file <path> SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE unset Файл, который runner читает для каждого подключения к вашему прокси выхода, используя его обрезанное содержимое как значение заголовка Proxy-Authorization. Используйте этот флаг для токена, который другой процесс ротирует на месте. Несет те же требования, что и --proxy-authorization-command, и не может быть объединен с ним. См. Authenticate to an egress proxy. Требует Claude Code v2.1.238 или позже.
--push-outcome-on-release SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE off При инициированном runner завершении сеанса, таком как осушение или отпуск при простое, отправьте отслеживаемые ветви результатов в origin перед удалением рабочего пространства, чтобы текущие коммиты пережили перезагрузку. Лучшее усилие; добавляет 30 секунд к бюджету завершения и требует git 2.29 или новее для возобновления с отправленной ветви. Ограничьте доступ на отправку к ссылкам claude/* перед включением; см. Resumed sessions lose unpushed work. Репозитории, проверенные через hook checkout жизненного цикла, не отправляются; снимите их с помощью post-session hook вместо этого.
--release-idle-session-min <n> SELF_HOSTED_RUNNER_SESSION_IDLE_MS 0 Отпустите слот сеанса после N минут неактивности после завершения хода или ожидания сеансом действия пользователя. Сеанс, который все еще находится в процессе хода, включая тот, который держит никогда не заканчивающуюся фоновую задачу или одобрение, запрошенное изнутри работающего вызова инструмента, не считается неактивным; объедините с --kill-session-after-min как жесткий упор. После завершения фоновой задачи сеанса runner считает сеанс занятым до тех пор, пока не начнется следующий ход, который читает результат, в течение максимум окна SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS. До тех пор, пока runner не получит сигнал завершения или не достигнет времени выхода на пенсию, отпуск, который оставляет runner без активных сеансов, запускает тот же путь выхода, что и нормальное осушение, управляемое --drain-grace-sec. После первого сигнала, который вы отложили с помощью --defer-shutdown-max-min, runner выходит, как только отпуск оставляет его без сеансов. 0 отключает.
--remove-session-state [bool] SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE off Удалите каталоги сеанса для каждого сеанса под <base-dir>/_sessions/ когда сеанс заканчивается на этом runner, независимо от результата. Reuse a pre-warmed checkout описывает, что они содержат и кто может их читать, когда они остаются. Удаление является лучшим усилием: каталоги для каждого сеанса остаются на месте, когда runner убивается или достигает крайнего срока осушения перед запуском очистки. С флагом включенным, логи отладки неудачного или прерванного сеанса не сохраняются на диск. Требует Claude Code v2.1.268 или позже.
--retire-at <epoch-seconds> SELF_HOSTED_RUNNER_RETIRE_AT unset Выведите runner на пенсию в абсолютный временной штамп Unix в секундах для инфраструктуры, которая убивает runner в известное время; Runner lifecycle описывает последовательность отпуска и как определить размер маржи. Значения до 2001 или после года 5138 отклоняются флагом и игнорируются переменной окружения.
--server-auto-mode-lists <mode> SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS no-allow Какие из списков правил классификатора авторежима, которые управляющий уровень отправляет вместе с сессией, могут применяться к этой сессии: all, no-allow или none. Что применяет каждое значение, см. в разделе Списки правил авторежима. Недопустимое значение останавливает runner при запуске. Требуется Claude Code v2.1.295 или новее.
--session-stop-grace-sec <n> SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS 5 Как долго ждать чистого выхода процесса Claude после завершения сеанса перед принудительным завершением. Повысьте значение, если собственные hooks SessionEnd дочернего процесса нуждаются в большем времени.
--startup-timeout-min <n> SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS 15 Освобождает слот сессии, если дочерний процесс не сообщил об инициализации в течение N минут после запуска. Клонирование выполняется до запуска, поэтому время клонирования не учитывается. Сбрасывается сигналом инициализации дочернего процесса в канале активности, а не обычным выводом, после чего в действие вступает --release-idle-session-min. 0 отключает.
--trust-workspace [bool] SELF_HOSTED_RUNNER_TRUST_WORKSPACE on Посейте сохраняемое доверие для путей репозитория каждого сеанса, чтобы зафиксированные в репо permissions.allow и additionalDirectories были соблюдены. Установите false для отпуска зафиксированных в репо грантов разрешений и вместо этого настройте правила разрешения в settings.json конфигурации хоста; параметры sandbox.* зафиксированные в репо все еще применяются в любом случае, поэтому защита repo-settings сканирует их независимо от этого флага.
--use-anthropic-git-proxy CLAUDE_RUNNER_USE_GIT_PROXY=1 off Клонирует репозитории на github.com через прокси git Anthropic вместо управляемой клиентом аутентификации git. Требует --capacity 1 и git 2.32 или новее; в противном случае runner отказывается запускаться. Заменяет флаги перезаписи.

Большинство флагов длительности имеют максимум, выбранный для сохранения каждого timeout в потолке 32-битного таймера runtime примерно 24,85 дня. Флаги --*-min ограничены 10080 минутами, 7 дней; --drain-grace-sec на 604800 секунд, также 7 дней; и --drain-wait-sec на 86400 секунд, 24 часа. --session-stop-grace-sec и --post-session-hook-timeout-sec не ограничены. Превышение лимита ведет себя по-разному в зависимости от поверхности:

  • Флаг: запуск не удается с ошибкой.
  • Переменная окружения: runner зажимает значение до потолка таймера вместо его отклонения.

Списки правил авторежима

--server-auto-mode-lists позволяет решить, какие правила классификатора авторежима, поступающие извне runner, применяются к сессиям на ваших runner. Управляющий уровень Anthropic может отправлять списки правил вместе с сессией и просить runner применить их. Некоторые записи могут быть правилами, написанными администратором вашей организации. Списки называются environment, soft_deny и allow:

  • environment: запись может заставить классификатор разрешать как больше, так и меньше.
  • soft_deny: запись блокирует действие, если только пользователь явно не попросил о нём или не применяется исключение allow.
  • allow: исключения для записей soft_deny.

Значение флага определяет, какие списки применяет runner:

  • no-allow: значение по умолчанию. Применяет environment и soft_deny и не применяет allow. Запись environment по-прежнему может заставить классификатор разрешать больше, поэтому значение по умолчанию не исключает всех ослаблений.
  • all: применяет все три списка.
  • none: не применяет ни один из них. Выберите none, чтобы исключить любые ослабления из этих списков. При этом также отбрасываются ограничения soft_deny.

Никакая настройка runner не заставляет управляющий уровень просить runner применить списки. Если он не просит, сессии не получают ни одного списка, что бы вы ни установили. Чтобы узнать, что произошло, запустите runner с --log-level debug. Тогда для каждой сессии runner записывает в лог строку, содержащую the server asked this runner to apply, или строку, содержащую the server did not ask this runner to apply the auto mode lists it sends.

Флаги CLI Orchestrator

Подкоманда self-hosted-runner orchestrator, которая порождает on-demand runners, принимает --api-url, --environment-secret-file, --hooks-dir, --health-port и --log-level с теми же значениями по умолчанию, что и runner и, где флаг runner имеет один, ту же переменную окружения, за исключением того, что --hooks-dir требуется и должен содержать hook spawn-runner. Он также принимает свои собственные флаги:

Флаг По умолчанию Описание
--hook-concurrency <n> 4 Максимум hooks spawn-runner, работающих параллельно. Также ограничивает, сколько запросов на порождение претендуют на опрос.
--hook-timeout <sec> 60 Завершите дерево процессов hook после этого количества секунд. Timeout плюс его 5-секундная благодать убийства должны оставаться ниже --expected-spawn-seconds; orchestrator обеспечивает это при запуске.
--expected-spawn-seconds <sec> 120 Ожидаемое время p99 с момента получения orchestrator запроса на порождение до регистрации runner, включая любое ожидание свободных ресурсов на вашей платформе. Сервер допускает диапазон от 10 до 3600. Отправляется при каждом опросе как аренда на стороне сервера: если ни один runner не зарегистрируется до её истечения, сессия предлагается повторно с новым ID заказа. Все реплики должны использовать одно и то же значение.
--min-idle <n> 0 Держите по крайней мере N свободных слотов сеанса в режиме ожидания, активно порождая резервные runner. 0 отключает предварительное прогревание. Объедините с --exit-if-unused-min runner, чтобы избыточные резервные runner восстановили себя.
--debug-dir <path> unset Запишите рабочий заказ каждого запроса на порождение и stderr hook на диск. Только для отладки; никогда не устанавливайте в production.

Флаги SCM connector

Соединитель SCM недоступен, поэтому оставьте флаги в этом разделе неустановленными. Если вы установите --scm-connector-host, соединение не открывается, и orchestrator продолжает его переподключать. Runners по-прежнему запускаются по мере поступления сеансов в очередь.

Соединитель — это постоянное подключение WebSocket от orchestrator к плоскости управления Anthropic. Он разработан для того, чтобы позволить размещенным предсеансовым потокам, таким как средство выбора репозитория и средство разрешения ветви или ссылки, достичь хоста GitHub Enterprise Server, который маршрутизируется только изнутри вашей сети. См. Network requirements на странице GitHub Enterprise Server для получения информации о том, что требуется этим потокам.

Флаг По умолчанию Описание
--scm-connector-host <host[:port]> unset Имя хоста GitHub Enterprise Server для перенаправления запросов. Порт по умолчанию 443.
--scm-connector-id <n> required with --scm-connector-host Числовой ID подключения GitHub Enterprise Server вашей организации.
--scm-connector-provider <slug> ghe Сегмент пути, идентифицирующий поставщика, соответствующий ^[a-z0-9-]{1,32}$.
--scm-connector-ca-file <path> unset Дополнительный пакет CA в формате PEM для подключений TLS к хосту GitHub Enterprise Server.
--scm-connector-host-rewrite <from>=<to_host:to_port> unset Только для сквозного тестирования: перенаправляет подключение TCP, сохраняя заголовок Host и TLS SNI как --scm-connector-host.

При каждой попытке подключения orchestrator отправляет свой существующий секрет окружения, и он автоматически переподключается с экспоненциальной задержкой, ограниченной 30 секундами плюс jitter.

Параметры только для переменных окружения

Эти параметры runner читаются только из окружения и охватывают поведение, которое большинство развертываний оставляют по умолчанию:

Переменная окружения По умолчанию Описание
SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS 30000 Как долго runner считает сеанс занятым после завершения фоновой задачи, пока не начнется следующий ход, который читает результат. Строки --drain-wait-sec и --release-idle-session-min описывают, где применяется удержание при осушении и отпуске при простое, и Runner lifecycle описывает, где оно применяется при выходе на пенсию --retire-at. 0 или неиспользуемое значение возвращается к значению по умолчанию, поэтому удержание не может быть отключено. Требует Claude Code v2.1.228 или позже.
SELF_HOSTED_RUNNER_HOST_CONFIG_DIR ~/.claude Каталог, захваченный в снимок запуска runner и посеянный в CLAUDE_CONFIG_DIR каждого сеанса; изменения на диске применяются после перезагрузки runner. Установка переменной также перемещает, где runner читает .claude.json для MCP seeding, поэтому установка её, включая её собственное значение по умолчанию, перемещает этот поиск; укажите на пустой каталог для полного отключения посева.
SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS 900000 Как долго runner ждет после того, как сеанс достигает своего лимита --kill-session-after-min, чтобы текущий ход завершился или отпуск завершился, перед завершением сеанса
SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS 7000 Ограничение на то, как долго runner считает сеанс занятым для осушения --drain-wait-sec после завершения хода, пока процесс сеанса сообщает об окончании хода в Anthropic. 0 или неиспользуемое значение возвращается к значению по умолчанию, поэтому удержание не может быть отключено. Требует Claude Code v2.1.275 или позже.
SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS 30000 Как долго runner ждет, пока ОС доставит SIGKILL дочернему процессу, застрявшему в неперерываемом I/O, перед выходом самого себя. Минимум --post-session-hook-timeout-sec плюс 15 секунд, и 30 больше, когда установлен --push-outcome-on-release, поэтому эффективный минимум составляет 75 секунд при значениях по умолчанию.
CLAUDE_RUNNER_FETCH_DEPTH 50 Глубина выборки Git для свежих клонов. Установите положительное целое число или full или 0 для полной выборки. Репозитории, уже присутствующие в рабочем пространстве, сохраняют свою существующую глубину.
CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS 600000 Как долго в миллисекундах, в рамках одной попытки, выборка git может ждать первых данных, пока собственные показатели прогресса сервера git продолжают расти, например когда сервер подготавливает pack для большого репозитория. 0 или off отключает ожидание: тогда такая выборка прерывается через две минуты без данных. Любое другое целое число ограничивается диапазоном от 120000 до 1800000, то есть от 2 до 30 минут. Требует Claude Code v2.1.295 или позже.
CLAUDE_RUNNER_SKIP_GIT_VERIFY unset Когда 1, пропустите проверку наличия .git после запуска hook checkout. Установите это, когда ваш hook материализует источник, не являющийся git.
FORCE_AUTOUPDATE_PLUGINS unset Когда 1, позвольте маркетплейсам плагинов автоматически обновляться, несмотря на то, что бинарный файл закреплен
CLAUDE_CODE_DISABLE_ARTIFACT unset Когда 1, отключите инструмент Artifact в сеансах независимо от параметра администратора организации и отпустите требование выхода *.frame.claudeusercontent.com

Телеметрия

Дочерние процессы сеанса отправляют операционную телеметрию в Anthropic, если вы её не отключите. Никакой код или содержимое репозитория не отправляется. Установите переменные телеметрии на процесс runner; runner переустанавливает их после применения переменных окружения, предоставленных сервером, поэтому параметр оператора всегда имеет приоритет.

Один элемент управления специфичен для самостоятельно размещаемых сред: CLAUDE_CODE_BYOC_ENABLE_DATADOG=1 выбирает метрики операционной деятельности Datadog, которые по умолчанию отключены в самостоятельно размещаемых средах. Общие элементы управления телеметрией Claude Code, DISABLE_TELEMETRY, DO_NOT_TRACK, DISABLE_ERROR_REPORTING и CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, применяются к дочерним процессам сеанса, как задокументировано в справочнике переменных окружения. DISABLE_GROWTHBOOK связан, но отличается: установка DISABLE_GROWTHBOOK=1 отключает выборку флагов функций, и телеметрия остается включенной, если также не установлен DISABLE_TELEMETRY.

CLAUDE_CODE_ENABLE_TELEMETRY не связан: он включает экспорт OpenTelemetry на ваш собственный сборщик, как описано в Monitoring, и не контролирует аналитику Anthropic.

Конечная точка здоровья

Runner служит GET /healthz на настроенном порту здоровья. Ответ 200 OK всякий раз, когда процесс живой, независимо от состояния цикла опроса, поэтому зонд HTTP на этой конечной точке обнаруживает только мертвый процесс. Тело JSON описывает текущее состояние:

{
  "status": "ok",
  "runner_id": "ccrunner_...",
  "active_sessions": 2,
  "last_poll_at": "2026-03-31T18:04:11.220Z",
  "last_poll_age_ms": 842
}

Используйте last_poll_age_ms как сигнал живости в пользовательских зондах; значение, которое растет без ограничений, указывает на то, что цикл опроса застрял. Оба last_poll_at и last_poll_age_ms равны null до завершения первого опроса.

Orchestrator служит своему собственному /healthz на его порту здоровья. Его конечная точка всегда возвращает 200, и тело несет поле connected, сообщающее, успешен ли последний опрос, плюс количество очереди порождения для каждого состояния в queue_counts. Ограничьте готовность и оповещение на connected вместо кода состояния.

Когда SCM connector настроен, тело /healthz orchestrator также несет scm_connector_connected и объект scm_connector с connected, last_connected_at, last_error, reconnects и requests_forwarded. Оба поля равны null, когда --scm-connector-host не установлен.

Метрики Prometheus

Каждый runner отдаёт метрики Prometheus по GET /metrics на том же порту, что и /healthz. Основные серии:

Серия Примечания
claude_code_self_hosted_runner_info{runner_id,version,client_label} Всегда 1; полезна для инвентаризации парка и обнаружения расхождения версий
claude_code_self_hosted_runner_capacity Настроенное значение --capacity
claude_code_self_hosted_runner_active_sessions Сессии, выполняющиеся в данный момент
claude_code_self_hosted_runner_locked_account{email} Появляется, как только runner закреплён за пользователем и выдан токен сессии с утверждением act.email. Серия отсутствует на runner, закреплённом за агентом Claude Tag, поскольку его токены сессий не содержат act.email. Значение метки — email учётной записи; если ваше хранилище метрик доступно для чтения широкому кругу лиц, удаляйте или хешируйте метку при сборе, например с помощью metric_relabel_configs в Prometheus.
claude_code_self_hosted_runner_last_poll_age_seconds Секунды с момента последнего успешного опроса. Настройте оповещение, если значение превышает 60.
claude_code_self_hosted_runner_poll_errors_total{error_kind} Накопительное число сбоев PollWork по типам: transport, timeout, 5xx, 429 или 4xx. Все пять серий присутствуют с момента запуска процесса; настройте оповещение на rate(...[5m]) > 0.
claude_code_self_hosted_runner_sessions_started_total{client_platform} Дочерние процессы сессий, запущенные за время жизни runner, по одной серии на источник сессии, например web_claude_ai, ios, android, desktop_app или claude_code_cli, либо unknown, если сервер его не передал. Сессии Slack помечаются либо claude_in_slack, либо claude-in-slack в зависимости от того, какая интеграция Slack их создала, поэтому сопоставляйте оба варианта селектором с регулярным выражением, например {client_platform=~"claude[-_]in[-_]slack"}. Используйте sum() для получения общего значения по парку.
claude_code_self_hosted_runner_sessions_completed_total{client_platform} Сессии, завершившиеся штатно, с такими же метками. Понятие шире, чем просто штатный выход: что именно учитывается, см. в разделе семантика счётчиков жизненного цикла сессий.
claude_code_self_hosted_runner_sessions_failed_total{client_platform} Сессии, завершившиеся сбоем, с такими же метками. Та же оговорка: см. семантика счётчиков жизненного цикла сессий.
claude_code_self_hosted_runner_sessions_interrupted_total{client_platform} Сессии, которые runner завершил по эксплуатационной причине, а не по итогу самой сессии, с такими же метками. См. семантика счётчиков жизненного цикла сессий.
claude_code_self_hosted_runner_initializing_sessions Сессии, находящиеся в фазе инициализации: от назначения до события init дочернего процесса
claude_code_self_hosted_runner_session_init_duration_seconds Гистограмма длительности инициализации сессий
claude_code_self_hosted_runner_session_init_errors_total Сессии, завершившиеся сбоем до достижения init: сбой хука checkout, подготовки git, выдачи токена или падение дочернего процесса до init
claude_code_self_hosted_runner_session_start_hook_errors_total Хуки SessionStart, сообщившие об ошибке, по одному на каждое неудачное выполнение хука
claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform} Gauge для каждой сессии: секунды с момента перехода сессии в режим простоя. Полезна для завершения сессий, зависших на неотвеченном запросе разрешения.

Оркестратор отдаёт собственные серии по GET /metrics на том же порту, что и его /healthz:

Серия Примечания
claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname} Всегда 1
claude_code_self_hosted_orchestrator_connected 1, если последний опрос завершился успешно; падает до 0 после любого неудачного опроса, независимо от типа сбоя
claude_code_self_hosted_orchestrator_last_poll_age_seconds Секунды с момента последней попытки опроса, успешной или нет, в отличие от одноимённой метрики runner, которая отсчитывается от последнего успешного опроса; используйте вместе с connected, чтобы отлавливать неудачные опросы. Цикл опроса оркестратора ожидает выполнения хуков, поэтому настраивайте оповещение на значение выше --hook-timeout плюс запас, около 90 секунд при значениях по умолчанию, а не на фиксированные 60.
claude_code_self_hosted_orchestrator_poll_errors_total{error_kind} Накопительное число сбоев PollSpawnHints по типам: transport, timeout, 5xx, 429 или 4xx. Все пять серий присутствуют с момента запуска процесса; настройте оповещение на rate(...[5m]) > 0.
claude_code_self_hosted_orchestrator_queue_pending_sessions Запросы на запуск, которые можно забрать прямо сейчас
claude_code_self_hosted_orchestrator_queue_backing_off_sessions Запросы на запуск, находящиеся в задержке перед повторной попыткой после сбоя хука, допускающего повторную попытку
claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions Сессии, запуск которых заблокирован. Каждая остаётся заблокированной, пока пользователь не отправит ей новое сообщение или Owner не повторит попытку на вкладке Activity окружения. Значение может оставаться выше нуля после устранения причины. Настройте оповещение, если значение выше нуля.
claude_code_self_hosted_orchestrator_pool_pending_sessions Общее число сессий, ожидающих runner для этого окружения. Агрегат по всему окружению, одинаковый на каждом экземпляре оркестратора: используйте MAX, а не SUM по экземплярам.
claude_code_self_hosted_orchestrator_pool_active_sessions Сессии, в данный момент назначенные работающему runner в этом окружении. Агрегат по всему окружению, одинаковый на каждом экземпляре оркестратора: используйте MAX, а не SUM по экземплярам.
claude_code_self_hosted_orchestrator_spawn_hooks_total{result} Накопительные результаты хука spawn-runner: ok, retryable, non_retryable. Учитывает вызовы хука оркестратором, а не дочерние процессы сессий, которые запускают runner: несопоставима с sessions_started_total, поскольку ёмкость больше единицы, тёплые пулы и повторный запуск runner для той же сессии приводят к расхождению этих значений.
claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds Гистограмма длительности выполнения хука
claude_code_self_hosted_orchestrator_warm_hints_dispatched_total Резервные запросы на запуск, отправленные с момента запуска процесса
claude_code_self_hosted_orchestrator_session_queue_wait_seconds Гистограмма времени в секундах, которое каждая сессия провела в очереди, прежде чем оркестратор забрал её для запуска; записывается по метке времени ожидания в очереди, которую плоскость управления передаёт с запросом на запуск каждой сессии. Используйте для оповещений по p50/p99 времени в очереди. Запуски для предварительного прогрева не учитываются.
claude_code_self_hosted_orchestrator_clock_skew_seconds Расхождение часов (локальное минус серверное); диагностическая метрика, появляется после измерения
claude_code_self_hosted_orchestrator_scm_connector_connected 1, когда WebSocket коннектора SCM открыт; 0 во время подключения или задержки перед повторной попыткой. Отсутствует, если --scm-connector-host не задан.
claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total Накопительное число HTTP-запросов, проксированных на настроенный хост SCM с момента запуска процесса. Отсутствует, если --scm-connector-host не задан.

Для автомасштабирования выберите серию, соответствующую вашему подходу к масштабированию, и отфильтруйте её, прежде чем передавать в механизм масштабирования:

  • Масштабирование по глубине очереди: передавайте в HPA или KEDA claude_code_self_hosted_orchestrator_pool_pending_sessions, а не queue_pending_sessions.
  • Масштабирование по ёмкости: масштабируйте по отношению active_sessions runner к capacity.
  • Фильтрация по connected: фильтруйте запрос условием claude_code_self_hosted_orchestrator_connected == 1 для каждого экземпляра, чтобы устаревшее значение отключённой реплики не попадало в механизм масштабирования.

Во время полного сбоя опроса, когда все реплики отключены, отфильтрованный запрос не возвращает данных. HPA сохраняет текущее число реплик при отсутствии метрики, однако Prometheus scaler в KEDA со значением по умолчанию ignoreNullValues: "true" интерпретирует пустой результат как ноль и уменьшает число реплик; задайте ignoreNullValues: "false" в ScaledObject, при необходимости вместе с минимальным числом реплик fallback.

Следующий PodMonitor для Prometheus Operator охватывает оба процесса. Он выбирает поды по метке app.kubernetes.io/part-of: claude-code-self-hosted-runner и именованному порту health, которые задаёт рецепт для Kubernetes; скорректируйте пространства имён в соответствии с вашим развёртыванием:

# Example Prometheus Operator PodMonitor for the Claude Code self-hosted
# runner + orchestrator. Adjust the namespace and label selectors to match
# your deployment. Both the runner and the orchestrator serve /metrics on
# their --health-port (default 8080).
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: claude-code-self-hosted-runner
  namespace: monitoring
spec:
  namespaceSelector:
    matchNames:
      - claude-runners
  selector:
    matchExpressions:
      # Matches the runner Deployment from the Kubernetes recipe, plus any
      # on-demand runner Jobs and orchestrator pods you label the same way
      # and give a named 'health' containerPort.
      - key: app.kubernetes.io/part-of
        operator: In
        values: [claude-code-self-hosted-runner]
  podMetricsEndpoints:
    - port: health
      path: /metrics
      interval: 30s

Эти примеры правил оповещений — отправная точка; настройте пороговые значения под размер вашего парка:

# Example Prometheus alert rules for the Claude Code self-hosted runner
# + orchestrator. Tune thresholds for your fleet size and SLOs.
groups:
  - name: claude-code-self-hosted-runner
    rules:
      - alert: ClaudeRunnerPollStale
        expr: claude_code_self_hosted_runner_last_poll_age_seconds > 60
        for: 2m
        labels: {severity: warning}
        annotations:
          summary: "Runner {{ $labels.pod }} has not polled in >60s"
      - alert: ClaudeRunnerVersionDrift
        expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1
        for: 30m
        labels: {severity: info}
        annotations:
          summary: "Runners are running mixed versions"
      - alert: ClaudeRunnerInitErrorsHigh
        expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3
        for: 5m
        labels: {severity: warning}
        annotations:
          summary: "Runner {{ $labels.pod }}: >3 session init failures in 10m (checkout hook / git / token / pre-init crash)"
      - alert: ClaudeRunnerPollErrors
        expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0
        for: 2m
        labels: {severity: warning}
        annotations:
          summary: "Runner {{ $labels.pod }}: PollWork failing ({{ $value | humanize }}/s over 5m)"
      - alert: ClaudeRunnerSessionStartHookErrors
        expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3
        for: 5m
        labels: {severity: warning}
        annotations:
          summary: "Runner {{ $labels.pod }}: >3 SessionStart hook failures in 10m"

  - name: claude-code-self-hosted-orchestrator
    rules:
      - alert: ClaudeOrchestratorDisconnected
        expr: claude_code_self_hosted_orchestrator_connected == 0
        for: 2m
        labels: {severity: critical}
        annotations:
          summary: "Orchestrator {{ $labels.pod }} cannot reach the Anthropic control plane"
      - alert: ClaudeOrchestratorPollStale
        expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90
        for: 2m
        labels: {severity: warning}
        annotations:
          summary: "Orchestrator {{ $labels.pod }} has not polled in >90s (poll loop waits on hook execution)"
      - alert: ClaudeOrchestratorCircuitBroken
        expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0
        for: 1m
        labels: {severity: critical}
        annotations:
          summary: "Sessions blocked from spawning: {{ $value }}. Read each one's error in the Activity tab, fix the cause, then select Retry"
      - alert: ClaudeOrchestratorPollErrors
        expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0
        for: 2m
        labels: {severity: warning}
        annotations:
          summary: "Orchestrator {{ $labels.pod }}: PollSpawnHints failing ({{ $value | humanize }}/s over 5m)"
      - alert: ClaudeOrchestratorSpawnHookFailing
        expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3
        for: 5m
        labels: {severity: warning}
        annotations:
          summary: "Orchestrator {{ $labels.pod }}: >3 spawn-runner hook failures in 5m"

Проброс метрик дочерних процессов сессий

Каждая сессия выполняется в собственном дочернем процессе со своими метриками OpenTelemetry; при --capacity больше единицы runner изменяет способ публикации этих дочерних метрик. Если задать OTEL_METRICS_EXPORTER=prometheus на хосте runner и CLAUDE_CODE_ENABLE_TELEMETRY=1 в окружении сессии, например из вашего скрипта-обёртки или в собственном окружении runner, которое наследуют сессии, то инструменты типа counter и gauge каждого дочернего процесса будут повторно опубликованы на собственном эндпоинте /metrics runner рядом с сериями самого runner. Runner перенастраивает экспортёр дочернего процесса на отправку по OTLP в приёмник на порту health, доступный только через loopback, помечает каждую серию метками session_id и client_platform и удаляет серии сессии, когда эта сессия завершается. Гистограммы не пробрасываются, а дочерняя метрика, имя которой конфликтовало бы с собственным префиксом runner, отбрасывается.

При значении по умолчанию --capacity 1 эта перенастройка не применяется: дочерний процесс сессии, как обычно, открывает собственный эндпоинт Prometheus на порту 9464.

Семантика счётчиков жизненного цикла сессий

Счётчики sessions_started_total, sessions_completed_total, sessions_failed_total и sessions_interrupted_total классифицируют каждую сессию по тому, как она завершилась. Каждый запущенный дочерний процесс сессии увеличивает sessions_started_total в момент запуска, и ровно один из остальных трёх счётчиков увеличивается при выходе, поэтому sessions_started_total минус сумма остальных трёх равна числу дочерних процессов сессий, выполняющихся в данный момент.

  • completed: сессия завершилась штатно. Сюда относятся: самостоятельный выход дочернего процесса с кодом 0; архивация или удаление сессии, пока дочерний процесс ещё был подключён; штатное освобождение слота runner: освобождение сессии по таймауту простоя, по времени вывода из эксплуатации или по лимиту --kill-session-after-min; таймаут запуска; либо снятие назначения на стороне сервера, которое цикл опроса заметил до выхода дочернего процесса. Увеличивает sessions_completed_total.
  • failed: дочерний процесс самостоятельно завершился с ненулевым кодом — из-за падения или сбоя настройки после запуска. Увеличивает sessions_failed_total.
  • interrupted: runner завершил дочерний процесс по эксплуатационной причине, которая не является ни успехом сессии, ни ошибкой runner, например при выводе из работы (drain) или при завершении сессии, которая всё ещё находилась на runner по истечении окна отсрочки SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS после её лимита --kill-session-after-min. Поэтапный перезапуск в Kubernetes с отправкой SIGTERM — один из примеров вывода из работы. Увеличивает sessions_interrupted_total.

До версии v2.1.260 runner завершал каждую сессию, достигшую лимита --kill-session-after-min, и учитывал её в sessions_interrupted_total.

Переменная CLAUDE_RUNNER_EXIT_REASON хука post-session классифицирует штатные передачи иначе. Хук сообщает о них как об interrupted, поскольку runner остановил дочерний процесс: это освобождение, таймаут запуска, снятие назначения сервером, а также архивация или удаление, которые первым заметил опрос. Эти счётчики записывают те же события как completed, поскольку слот был освобождён штатно.

Если сверять получение хуков непосредственно с sessions_completed_total, число завершений окажется заниженным. Используйте хук для гарантий на уровне отдельных сессий, а счётчики — для агрегированных показателей.

В одноразовом окружении, с --capacity 1 и значением по умолчанию --drain-grace-sec 0, каждый процесс runner завершается через мгновение после окончания его единственной сессии. sessions_completed_total, sessions_failed_total и sessions_interrupted_total увеличиваются только в конце сессии, непосредственно перед этим выходом, поэтому сбор метрик Prometheus каждые 15–60 секунд редко успевает зафиксировать приращение до того, как серии runner исчезнут; именно эти три счётчика окончания сессии далее в этом разделе называются терминальными. sessions_started_total увеличивается при запуске и остаётся видимым на протяжении всей сессии, поэтому он надёжно появляется, однако в одноразовом окружении он скорее отражает «сессии, выполняющиеся в данный момент», чем накопительное значение.

Для соответствующей цели используйте серии из этой таблицы вместо терминальных счётчиков:

Цель Что использовать
Пропускная способность claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"} — счётчик на долгоживущем оркестраторе, который увеличивается один раз на каждое успешное выполнение хука spawn-runner и сохраняет смысл при использовании rate(). Он учитывает вызовы хука, а не сессии, поэтому предварительный прогрев и повторные запуски для одной и той же сессии приводят к расхождению с числом сессий.
Загрузка sum(claude_code_self_hosted_runner_active_sessions) относительно sum(claude_code_self_hosted_runner_capacity); обе метрики — gauge, корректные при каждом сборе независимо от времени жизни runner
Очередь claude_code_self_hosted_orchestrator_pool_pending_sessions для глубины очереди и claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions с оповещением, если значение выше нуля
Сбои claude_code_self_hosted_runner_sessions_failed_total, по мере возможности: реальные падения после запуска его увеличивают, а rate() имеет смысл на runner, которые переживают свои сессии при --drain-grace-sec больше 0. В одноразовом окружении существует та же проблема окна сбора, что и у остальных терминальных счётчиков, поэтому любое ненулевое значение, которое вы всё же увидите, стоит расследовать. Сбои до запуска, например сбой хука checkout, подготовки git или выдачи токена, отражаются только в session_init_errors_total.

Строки orchestrator_* существуют только в окружениях, использующих оркестратор по требованию. В фиксированном парке, runner которого переживают свои сессии при --drain-grace-sec больше 0, используйте sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m])) для пропускной способности; в одноразовом парке у этой серии та же проблема окна сбора, что и у терминальных счётчиков, поэтому полагайтесь на число сессий в очереди. Проверяйте очередь на вкладке Activity окружения на странице администрирования Cloud environments: runner не экспортируют серию глубины очереди.

Для отчётности по итогам отдельных сессий используйте хук post-session: он срабатывает при каждом завершении сессии, для которой был запущен дочерний процесс, за исключением внезапного завершения runner, например при вытеснении VM, в соответствии с собственным контрактом хука.

Что дальше