Skip to main content
Los entornos autohospedados están en versión beta pública en planes Team y Enterprise; un Propietario los habilita activando Allow self-hosted environments en la página de administración Cloud environments. Esta página es la referencia de banderas y métricas; consulte el inicio rápido para la configuración y Implementar en producción para las recetas de flota.
Esta página es la referencia para los dos procesos que ejecuta en un entorno autohospedado: el ejecutor, que ejecuta sesiones en la nube de Claude Code en sus hosts, y el orquestador de escalado automático opcional, que inicia ejecutores a medida que las sesiones se ponen en cola. Cada uno tiene su propia tabla de banderas. Ambos se ejecutan en hosts Linux o macOS, que los valores predeterminados como /workspace y ~/.claude asumen. Ejecute claude self-hosted-runner --help para la lista autorizada en su versión instalada. Las series de métricas y algunos campos de API aún utilizan pool para lo que estas páginas llaman un entorno; ambos términos nombran lo mismo. El ID del entorno es el campo pool_id, con la forma ccpool_...: dondequiera que estas páginas muestren un identificador pool, nombra el entorno. Las banderas CLI y las variables de entorno lo escriben como environment, como --environment-secret-file; los nombres pool obsoletos aún funcionan, como describe la fila --environment-secret-file.

Flags CLI del runner

La mayoría de los flags tienen una variable de entorno correspondiente. Cuando ambos se establecen, el flag tiene precedencia. Los flags de duración toman minutos o segundos en la CLI, pero la variable de entorno emparejada siempre está en milisegundos, indicada por el sufijo _MS, y la columna Default muestra la unidad del flag: --exit-if-unused-min 10 es equivalente a SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000, y un valor de Helm como SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15" significa 15 milisegundos, no los 15 minutos predeterminados. La mayoría de los flags de duración tienen un máximo, elegido para mantener cada timeout dentro del techo del temporizador de 32 bits del runtime de aproximadamente 24,85 días. Los flags --*-min se limitan a 10080 minutos, 7 días; --drain-grace-sec a 604800 segundos, también 7 días; y --drain-wait-sec a 86400 segundos, 24 horas. --session-stop-grace-sec y --post-session-hook-timeout-sec no tienen límite. Exceder un límite se comporta diferente por superficie:
  • Flag: el inicio falla con un error.
  • Variable de entorno: el runner fija el valor al techo del temporizador en lugar de rechazarlo.

Flags CLI del orquestador

El subcomando self-hosted-runner orchestrator, que genera runners bajo demanda, acepta --api-url, --environment-secret-file, --hooks-dir, --health-port, y --log-level con los mismos valores predeterminados que el runner y, donde el flag del runner tiene uno, la misma variable de entorno, excepto que --hooks-dir es requerido y debe contener un hook spawn-runner. También toma sus propios flags:

Flags del conector SCM

El orquestador puede mantener una conexión WebSocket permanente al plano de control de Anthropic para que los flujos previos a la sesión alojados, como el selector de repositorio y el resolutor de rama o ref, puedan alcanzar un host de GitHub Enterprise Server que solo es enrutable desde dentro de su red. El conector permanece apagado a menos que establezca --scm-connector-host. El conector se autentica con el secreto del entorno existente del orquestador y se reconecta automáticamente: con retroceso exponencial en una conexión caída, o un retraso fijo de 30 segundos cuando el plano de control cierra la conexión porque otra réplica del orquestador ya la sostiene.

Configuración solo de variables de entorno

Estas configuraciones del runner se leen solo del entorno y cubren comportamiento que la mayoría de los despliegues dejan en el predeterminado:

Telemetría

Los hijos de sesión envían telemetría operacional a Anthropic a menos que la desactive. No se envía código ni contenido del repositorio. Establezca variables de telemetría en el proceso del runner; el runner las reafirma después de aplicar variables de entorno proporcionadas por el servidor, por lo que la configuración del operador siempre tiene precedencia. Un control es específico para entornos autohospedados: CLAUDE_CODE_BYOC_ENABLE_DATADOG=1 se suscribe a métricas operacionales de Datadog, que están desactivadas de forma predeterminada en entornos autohospedados. Los controles generales de telemetría de Claude Code, DISABLE_TELEMETRY, DO_NOT_TRACK, DISABLE_ERROR_REPORTING, y CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, se aplican a hijos de sesión como se documenta en la referencia de variables de entorno. DISABLE_GROWTHBOOK está relacionado pero es diferente: establecer DISABLE_GROWTHBOOK=1 desactiva la búsqueda de banderas de características, y la telemetría permanece activada a menos que DISABLE_TELEMETRY también esté establecido. CLAUDE_CODE_ENABLE_TELEMETRY no está relacionado: habilita la exportación de OpenTelemetry a su propio recopilador, como se describe en Monitoring, y no controla la analítica de Anthropic.

Punto final de salud

El runner sirve GET /healthz en el puerto de salud configurado. La respuesta es 200 OK siempre que el proceso esté vivo, sea cual sea el estado del bucle de sondeo, por lo que un sondeo HTTP en este punto final detecta solo un proceso muerto. El cuerpo JSON describe el estado actual:
Use last_poll_age_ms como una señal de vivacidad en sondeos personalizados; un valor que crece sin límites indica que el bucle de sondeo está atascado. Tanto last_poll_at como last_poll_age_ms son null hasta que se completa el primer sondeo. El orquestador sirve su propio /healthz en su puerto de salud. Su punto final siempre devuelve 200, y el cuerpo lleva un campo connected reportando si el sondeo más reciente tuvo éxito, más conteos de cola de generación por estado en queue_counts. Cierre la preparación y alertas en connected en lugar del código de estado. Cuando el conector SCM está configurado, el cuerpo /healthz del orquestador también lleva scm_connector_connected y un objeto scm_connector con connected, last_connected_at, last_error, reconnects, y requests_forwarded. Ambos campos son null cuando --scm-connector-host no está establecido.

Métricas de Prometheus

Cada runner sirve métricas de Prometheus en GET /metrics en el mismo puerto que /healthz. Series clave: El orquestador sirve sus propias series en GET /metrics en el mismo puerto que su /healthz: Para escalado automático, elija la serie que coincida con su estilo de escalado y ciérrela antes de que se alimente al escalador:
  • Escalado de profundidad de cola: alimente claude_code_self_hosted_orchestrator_pool_pending_sessions en su escalador HPA o KEDA, no queue_pending_sessions.
  • Escalado de capacidad: escale en la relación de active_sessions del runner a capacity.
  • Cierre en connected: filtre la consulta con claude_code_self_hosted_orchestrator_connected == 1 por instancia, para que el valor obsoleto de una réplica desconectada no se alimente al escalador.
Durante una interrupción de sondeo completa, cada réplica desconectada, la consulta cerrada no devuelve datos. HPA mantiene el recuento de réplica actual en una métrica faltante, pero el escalador de Prometheus de KEDA en su ignoreNullValues: "true" predeterminado lee el resultado vacío como cero y escala hacia adentro; establezca ignoreNullValues: "false" en ScaledObject, opcionalmente con un piso de réplica fallback. El siguiente PodMonitor del Operador de Prometheus cubre ambos procesos. Selecciona pods por la etiqueta app.kubernetes.io/part-of: claude-code-self-hosted-runner y el puerto health nombrado que la receta de Kubernetes establece; ajuste los espacios de nombres para que coincidan con su despliegue:
Estas reglas de alerta de ejemplo son un punto de partida; ajuste los umbrales para el tamaño de su flota:

Pasar a través de métricas de hijo de sesión

Cada sesión se ejecuta en su propio proceso hijo con sus propias métricas de OpenTelemetry; en --capacity superior a uno, el runner reescribe cómo se exponen esas métricas del hijo. Establecer OTEL_METRICS_EXPORTER=prometheus en el host del runner y CLAUDE_CODE_ENABLE_TELEMETRY=1 en el entorno de la sesión, por ejemplo desde su script de envoltura o el entorno propio del runner, que las sesiones heredan, re-expone los instrumentos de contador y indicador de cada hijo en el punto final /metrics propio del runner, junto con la serie del runner. El runner reescribe el exportador del hijo para empujar sobre OTLP a un receptor solo de loopback en el puerto de salud, etiqueta cada serie con etiquetas session_id y client_platform, y desaloja la serie de una sesión cuando esa sesión termina. Los histogramas no pasan, y una métrica del hijo cuyo nombre entraría en conflicto con el prefijo propio del runner se descarta. En el --capacity 1 predeterminado, la reescritura no se aplica: el hijo de la sesión vincula su propio punto final de Prometheus en el puerto 9464 como de costumbre.

Semántica del contador del ciclo de vida de la sesión

Los contadores sessions_started_total, sessions_completed_total, sessions_failed_total, y sessions_interrupted_total clasifican cada sesión por cómo terminó. Cada hijo de sesión generado incrementa sessions_started_total en el tiempo de generación, y exactamente uno de los otros tres incrementa al salir, por lo que sessions_started_total menos la suma de los otros tres es igual al número de hijos de sesión actualmente en ejecución.
  • completed: la sesión terminó limpiamente. Esto cubre el hijo saliendo por su cuenta con código 0, la sesión siendo archivada o eliminada mientras el hijo aún estaba conectado, y el runner devolviendo el slot limpiamente: liberar la sesión en el timeout de inactividad, en el tiempo de retiro o en el límite --kill-session-after-min; un timeout de inicio; o una desasignación del lado del servidor que el bucle de sondeo notó antes de que el hijo saliera. Incrementa sessions_completed_total.
  • failed: el hijo salió por su cuenta con un código distinto de cero, ya sea un bloqueo o una falla de configuración después de la generación. Incrementa sessions_failed_total.
  • interrupted: el runner terminó el hijo por una razón operacional que no es ni un éxito de sesión ni una falla del runner, como un drenaje, o terminar una sesión que aún estaba en el runner cuando la ventana de gracia SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS después de su límite --kill-session-after-min terminó. Un reinicio rodante de Kubernetes enviando SIGTERM es un ejemplo de un drenaje. Incrementa sessions_interrupted_total.
Antes de v2.1.260, el runner terminaba cada sesión que alcanzaba su límite --kill-session-after-min y la contaba en sessions_interrupted_total. El CLAUDE_RUNNER_EXIT_REASON del hook post-session clasifica traspasos limpios de manera diferente. El hook reporta una liberación, un timeout de inicio, y una desasignación del servidor como interrupted, porque el runner detuvo el hijo. Estos contadores registran esos mismos eventos como completed, porque el slot fue devuelto limpiamente. Si reconcilia recibos de hook contra sessions_completed_total directamente, subestima completaciones. Use el hook para garantías por sesión y los contadores para tasas agregadas. En un entorno de un solo disparo, --capacity 1 con el --drain-grace-sec 0 predeterminado, cada proceso del runner sale momentos después de que su única sesión termina. sessions_completed_total, sessions_failed_total, y sessions_interrupted_total incrementan solo al final de la sesión, justo antes de esa salida, por lo que un raspado de Prometheus cada 15 a 60 segundos rara vez detecta el incremento antes de que la serie del runner desaparezca; estos tres contadores de final de sesión son los contadores terminales a los que se refiere el resto de esta sección. sessions_started_total incrementa en la generación y permanece visible durante la vida de la sesión, por lo que se muestra de forma confiable, pero en un entorno de un solo disparo se lee más cerca de “sesiones actualmente en ejecución” que un recuento acumulativo. Use la serie en esta tabla para el objetivo correspondiente en lugar de los contadores terminales: Las filas orchestrator_* existen solo en entornos que ejecutan el orquestador bajo demanda. En una flota fija cuyos runners sobreviven a sus sesiones, con --drain-grace-sec superior a 0, use sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m])) para throughput; en una flota de un solo disparo esa serie tiene el mismo problema de ventana de raspado que los contadores terminales, así que confíe en el recuento de sesiones en cola en su lugar. Verifique el backlog en la pestaña Activity del entorno, en la página de administración Cloud environments: los runners no exportan una serie de profundidad de cola. Para reportes de resultado por sesión, use el hook post-session en su lugar: se dispara en cada final de sesión donde se generó un proceso hijo, aparte de la terminación abrupta del runner como una preemción de VM, según el contrato propio del hook.

Qué sigue