Selbstgehostete Umgebungen befinden sich in der öffentlichen Beta auf Team- und Enterprise-Plänen; ein Inhaber aktiviert sie, indem er Selbstgehostete Umgebungen zulassen auf der Cloud-Umgebungen Admin-Seite einschaltet. Diese Seite ist die Flag- und Metrik-Referenz; siehe den Schnellstart für die Einrichtung und In Produktion bereitstellen für die Fleet-Rezepte.
/workspace und ~/.claude angenommen werden. Führen Sie claude self-hosted-runner --help aus, um die autoritative Liste in Ihrer installierten Version zu erhalten.
Metrische Reihen und einige wenige API-Felder verwenden immer noch pool für das, was diese Seiten eine Umgebung nennen; beide Begriffe bezeichnen dasselbe. Die Umgebungs-ID ist das Feld pool_id mit der Form ccpool_...: Überall dort, wo diese Seiten einen pool-Bezeichner anzeigen, benennt er die Umgebung. CLI-Flags und Umgebungsvariablen schreiben es als environment, wie z. B. --environment-secret-file; die veralteten pool-Schreibweisen funktionieren immer noch, wie die Zeile --environment-secret-file beschreibt.
Runner-CLI-Flags
Die meisten Flags haben eine entsprechende Umgebungsvariable. Wenn beide gesetzt sind, hat das Flag Vorrang. Duration-Flags nehmen Minuten oder Sekunden in der CLI, aber die gepaarte Umgebungsvariable ist immer in Millisekunden, angezeigt durch das Suffix_MS, und die Spalte Standard zeigt die Einheit des Flags: --exit-if-unused-min 10 entspricht SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000, und ein Helm-Wert wie SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15" bedeutet 15 Millisekunden, nicht die 15-Minuten-Standard.
Die meisten Duration-Flags haben ein Maximum, das gewählt wurde, um jeden Timeout unter der 32-Bit-Timer-Obergrenze der Laufzeit von ungefähr 24,85 Tagen zu halten. Die
--*-min Flags sind auf 10080 Minuten, 7 Tage begrenzt; --drain-grace-sec auf 604800 Sekunden, auch 7 Tage; und --drain-wait-sec auf 86400 Sekunden, 24 Stunden. --session-stop-grace-sec und --post-session-hook-timeout-sec sind unbegrenzt. Das Überschreiten einer Obergrenze verhält sich je nach Oberfläche unterschiedlich:
- Flag: Der Start schlägt mit einem Fehler fehl.
- Umgebungsvariable: Der Runner begrenzt den Wert auf die Timer-Obergrenze, anstatt ihn abzulehnen.
Orchestrator-CLI-Flags
Der Unterbefehlself-hosted-runner orchestrator, der On-Demand-Runner erzeugt, akzeptiert --api-url, --environment-secret-file, --hooks-dir, --health-port und --log-level mit denselben Standardwerten wie der Runner und, wo das Flag des Runners einen hat, dieselbe Umgebungsvariable, außer dass --hooks-dir erforderlich ist und einen spawn-runner Hook enthalten muss. Es nimmt auch seine eigenen Flags:
SCM-Connector-Flags
Der Orchestrator kann eine stehende WebSocket-Verbindung zur Anthropic-Kontrolleben halten, sodass gehostete Pre-Session-Flows, wie der Repository-Picker und der Branch- oder Ref-Resolver, einen GitHub Enterprise Server-Host erreichen können, der nur von innerhalb Ihres Netzwerks erreichbar ist. Der Connector bleibt aus, es sei denn, Sie setzen--scm-connector-host.
Der Connector authentifiziert sich mit dem bestehenden Umgebungsgeheimnis des Orchestrators und verbindet sich automatisch erneut: mit exponentiellem Backoff bei einer unterbrochenen Verbindung oder einer festen 30-Sekunden-Verzögerung, wenn die Kontrolleben die Verbindung schließt, weil ein anderes Orchestrator-Replikat sie bereits hält.
Nur-Umgebungsvariablen-Einstellungen
Diese Runner-Einstellungen werden nur aus der Umgebung gelesen und decken Verhalten ab, das die meisten Bereitstellungen bei der Standardeinstellung belassen:Telemetrie
Session-Kinder senden operative Telemetrie an Anthropic, es sei denn, Sie schalten sie aus. Kein Code oder Repository-Inhalt wird gesendet. Setzen Sie Telemetrie-Variablen auf dem Runner-Prozess; der Runner bekräftigt sie erneut, nachdem er von der Kontrolleben bereitgestellte Umgebungsvariablen angewendet hat, sodass die Einstellung des Operators immer Vorrang hat. Ein Steuerelement ist spezifisch für selbstgehostete Umgebungen:CLAUDE_CODE_BYOC_ENABLE_DATADOG=1 meldet sich für Datadog-Operationsmetriken an, die in selbstgehosteten Umgebungen standardmäßig aus sind. Die allgemeinen Claude Code-Telemetrie-Steuerelemente, DISABLE_TELEMETRY, DO_NOT_TRACK, DISABLE_ERROR_REPORTING und CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, gelten für Session-Kinder wie in der Umgebungsvariablen-Referenz dokumentiert. DISABLE_GROWTHBOOK ist verwandt, aber anders: Das Setzen von DISABLE_GROWTHBOOK=1 deaktiviert das Abrufen von Feature-Flags, und die Telemetrie bleibt an, es sei denn, DISABLE_TELEMETRY ist auch gesetzt.
CLAUDE_CODE_ENABLE_TELEMETRY ist nicht verwandt: Es aktiviert OpenTelemetry-Export zu Ihrem eigenen Collector, wie in Überwachung beschrieben, und steuert nicht Anthropics Analytik.
Health-Endpunkt
Der Runner bedientGET /healthz auf dem konfigurierten Health-Port. Die Antwort ist 200 OK, wann immer der Prozess am Leben ist, unabhängig davon, in welchem Zustand sich die Abfrageschleife befindet, sodass ein HTTP-Probe auf diesem Endpunkt nur einen toten Prozess erkennt. Der JSON-Body beschreibt den aktuellen Zustand:
last_poll_age_ms als Lebendigkeitssignal in benutzerdefinierten Proben; ein Wert, der unbegrenzt wächst, zeigt an, dass die Abfrageschleife steckt. Sowohl last_poll_at als auch last_poll_age_ms sind null, bis die erste Abfrage abgeschlossen ist.
Der Orchestrator bedient sein eigenes /healthz auf seinem Health-Port. Sein Endpunkt gibt immer 200 zurück, und der Body trägt ein Feld connected, das meldet, ob die letzte Abfrage erfolgreich war, plus Pro-Status-Spawn-Queue-Zählungen in queue_counts. Gate-Bereitschaft und Warnungen auf connected statt auf dem Statuscode.
Wenn der SCM-Connector konfiguriert ist, trägt der Body des /healthz des Orchestrators auch scm_connector_connected und ein Objekt scm_connector mit connected, last_connected_at, last_error, reconnects und requests_forwarded. Beide Felder sind null, wenn --scm-connector-host nicht gesetzt ist.
Prometheus-Metriken
Jeder Runner bedient Prometheus-Metriken beiGET /metrics auf demselben Port wie /healthz. Wichtige Reihen:
Der Orchestrator bedient seine eigenen Reihen bei
GET /metrics auf demselben Port wie sein /healthz:
Für Autoscaling wählen Sie die Reihe, die zu Ihrem Skalierungsstil passt, und gaten Sie sie, bevor sie den Scaler speist:
- Queue-Tiefe-Skalierung: Speisen Sie
claude_code_self_hosted_orchestrator_pool_pending_sessionsin Ihren HPA- oder KEDA-Scaler, nichtqueue_pending_sessions. - Kapazitäts-Skalierung: Skalieren Sie auf das Verhältnis der
active_sessionsdes Runners zucapacity. - Gate auf
connected: Filtern Sie die Abfrage mitclaude_code_self_hosted_orchestrator_connected == 1pro Instanz, sodass der veraltete Wert eines getrennten Replikas nicht den Scaler speist.
ignoreNullValues: "true" liest das leere Ergebnis als Null und skaliert ein; setzen Sie ignoreNullValues: "false" auf dem ScaledObject, optional mit einem fallback Replikafloor.
Der folgende Prometheus Operator PodMonitor deckt beide Prozesse ab. Er wählt Pods nach dem Label app.kubernetes.io/part-of: claude-code-self-hosted-runner und dem benannten Port health, den das Kubernetes-Rezept setzt; passen Sie die Namespaces an Ihre Bereitstellung an:
Durchlauf-Session-Kind-Metriken
Jede Sitzung läuft in ihrem eigenen Kind-Prozess mit ihren eigenen OpenTelemetry-Metriken; bei--capacity über eins schreibt der Runner um, wie diese Kind-Metriken verfügbar gemacht werden. Das Setzen von OTEL_METRICS_EXPORTER=prometheus auf dem Runner-Host und CLAUDE_CODE_ENABLE_TELEMETRY=1 in der Umgebung der Sitzung, zum Beispiel aus Ihrem Wrapper-Skript oder der Umgebung des Runners selbst, die Sitzungen erben, macht die Zähler- und Gauge-Instrumente jedes Kindes auf dem /metrics Endpunkt des Runners erneut verfügbar, neben den Reihen des Runners. Der Runner schreibt den Exporter des Kindes um, um über OTLP zu einem Loopback-only-Receiver auf dem Health-Port zu pushen, markiert jede Reihe mit session_id- und client_platform-Labels und entfernt die Reihen einer Sitzung, wenn diese Sitzung endet. Histogramme gehen nicht durch, und eine Kind-Metrik, deren Name mit dem eigenen Präfix des Runners kollidieren würde, wird gelöscht.
Bei der Standard --capacity 1 gilt die Umschreibung nicht: Das Kind des Kindes bindet seinen eigenen Prometheus-Endpunkt auf Port 9464 wie üblich.
Session-Lebenszyklus-Zähler-Semantik
Die Zählersessions_started_total, sessions_completed_total, sessions_failed_total und sessions_interrupted_total klassifizieren jede Sitzung danach, wie sie endete. Jedes erzeugte Session-Kind erhöht sessions_started_total zum Spawn-Zeitpunkt, und genau einer der anderen drei erhöht sich beim Beenden, sodass sessions_started_total minus die Summe der anderen drei der Anzahl der derzeit laufenden Session-Kinder entspricht.
completed: Die Sitzung endete sauber. Dies deckt das Kind ab, das auf eigene Faust mit Code0beendet wird, die Sitzung wird archiviert oder gelöscht, während das Kind noch verbunden war, und der Runner gibt den Slot sauber zurück: Freigabe der Sitzung beim Idle-Timeout, zur Retire-Zeit oder am--kill-session-after-minLimit; ein Startup-Timeout; oder ein serverseitiges Deassign, das die Abfrageschleife bemerkte, bevor das Kind beendet wurde. Erhöhtsessions_completed_total.failed: Das Kind beendete sich auf eigene Faust mit einem Nicht-Null-Code, entweder ein Crash oder ein Setup-Fehler nach dem Erzeugen. Erhöhtsessions_failed_total.interrupted: Der Runner beendete das Kind aus operativen Gründen, die weder ein Session-Erfolg noch ein Runner-Fehler sind, wie eine Entleerung oder die Beendigung einer Sitzung, die sich noch auf dem Runner befand, wenn dasSELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MSKulanzfenster nach seinem--kill-session-after-minLimit endete. Ein Kubernetes-Rolling-Restart, derSIGTERMsendet, ist ein Beispiel für eine Entleerung. Erhöhtsessions_interrupted_total.
--kill-session-after-min Limit erreichte, und zählte sie in sessions_interrupted_total.
Der post-session Hook CLAUDE_RUNNER_EXIT_REASON klassifiziert saubere Übergaben unterschiedlich. Der Hook meldet eine Freigabe, ein Startup-Timeout und eine Server-Deassign als interrupted, da der Runner das Kind stoppte. Diese Zähler zeichnen die gleichen Ereignisse als completed auf, da der Slot sauber zurückgegeben wurde.
Wenn Sie Hook-Quittungen direkt gegen sessions_completed_total abstimmen, unterzählen Sie Abschlüsse. Verwenden Sie den Hook für Pro-Session-Garantien und die Zähler für Aggregatraten.
In einer One-Shot-Umgebung, --capacity 1 mit dem Standard --drain-grace-sec 0, beendet sich jeder Runner-Prozess Momente nach seiner einen Sitzung endet. sessions_completed_total, sessions_failed_total und sessions_interrupted_total erhöhen sich nur beim Session-Ende, direkt bevor dieser Ausstieg, sodass ein Prometheus-Scrape alle 15 bis 60 Sekunden die Erhöhung selten erfasst, bevor die Reihen des Runners verschwinden; diese drei End-of-Session-Zähler sind die Terminal-Zähler, auf die sich der Rest dieses Abschnitts bezieht. sessions_started_total erhöht sich beim Erzeugen und bleibt für die Lebensdauer der Sitzung sichtbar, sodass es zuverlässig angezeigt wird, aber in einer One-Shot-Umgebung liest es näher an “Sitzungen, die derzeit laufen” als an einer kumulativen Anzahl.
Verwenden Sie die Reihe in dieser Tabelle für das entsprechende Ziel statt der Terminal-Zähler:
Die
orchestrator_* Zeilen existieren nur auf Umgebungen, die den On-Demand-Orchestrator ausführen. In einer festen Fleet, deren Runner ihre Sitzungen mit --drain-grace-sec über 0 überleben, verwenden Sie sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m])) für Durchsatz; in einer One-Shot-Fleet hat diese Reihe das gleiche Scrape-Fenster-Problem wie die Terminal-Zähler, also verlassen Sie sich stattdessen auf die Zählung der Sitzungen in der Warteschlange. Überprüfen Sie den Rückstand auf der Registerkarte Aktivität der Umgebung, auf der Cloud-Umgebungen-Administratorseite: Die Runner exportieren keine Queue-Tiefe-Reihe.
Für Pro-Session-Ergebnis-Berichterstattung verwenden Sie stattdessen den post-session Hook: Er wird bei jedem Session-Ende ausgelöst, wo ein Kind-Prozess erzeugt wurde, abgesehen von abruptem Runner-Beendigung wie eine VM-Preemption, pro dem eigenen Vertrag des Hooks.
Nächste Schritte
- Selbstgehostete Umgebungen: die Umgebung, den Runner und das Session-Modell; der Schnellstart und In die Produktion bereitstellen enthalten Einrichtung und Betrieb
- Passen Sie Sitzungen an: Wrapper-Skripte, Lifecycle-Hooks und On-Demand-Runner
- Überprüfen Sie die Session-Identität: das Session-Token, seine Ansprüche und wie man es überprüft