Self-Hosted Runner Claude Code: Sesi Cloud di Mesin Anda

Ia adalah tujuan bernama yang bisa disasar sesi cloud Claude Code, berjalan pada runner yang Anda deploy di dalam jaringan sendiri. Sebuah runner mengambil sesi dari antrean, meng-clone repository, dan memunculkan proses anak Claude Code di host Anda. Checkout repository dan artefak build tetap di mesin yang Anda sediakan.
Tidak. Semua koneksi bersifat keluar: runner melakukan polling ke api.anthropic.com untuk mencari pekerjaan, meng-clone dari git host Anda, dan tiap proses anak sesi memegang event stream serta panggilan inference-nya sendiri ke luar. Anthropic tidak pernah menyambung masuk ke jaringan Anda, dan itu membuat tinjauan jaringannya jauh lebih sederhana daripada self-hosted CI runner yang butuh endpoint webhook.
Minimal satu untuk tiap pengguna yang diperkirakan aktif bersamaan. Satu runner melayani satu pengguna pada satu waktu — sesi pertama yang diambilnya mengunci runner itu ke akun tersebut, sehingga kode yang di-checkout tidak pernah bercampur antarpengguna — dan ia lalu menjalankan sesi bersamaan sampai batas kapasitasnya untuk satu akun itu saja.
Tidak. Sesi memakai Anthropic API, dan inference tidak bisa dialihkan lewat Amazon Bedrock, Google Cloud Agent Platform, Microsoft Foundry, maupun LLM gateway. Self-hosting memindahkan eksekusi sesi ke jaringan Anda; ia tidak memindahkan inference model ke cloud provider Anda. Keduanya urusan terpisah.
Tidak. Self-hosted environment tidak tersedia untuk organisasi dengan Zero Data Retention aktif. Fitur ini juga masih public beta yang terbatas pada paket Team dan Enterprise, mati secara default sampai seorang Owner mengaktifkannya di halaman admin cloud environments, yang itu sendiri mensyaratkan Claude Code on the web sudah aktif.

Ringkasan Utama
Self-hosted environment Claude Code menjalankan sesi cloud di infrastruktur yang dioperasikan organisasi Anda. Runner melakukan polling ke control plane Anthropic, mengambil sesi, meng-clone repository, lalu memunculkan proses anak Claude Code di host Anda. Semua koneksi bersifat keluar; Anthropic tidak pernah menyambung masuk ke jaringan Anda. Checkout repository dan artefak build tetap di mesin Anda.
Keberatan yang paling sering saya dengar terhadap sesi coding di cloud bukan soal modelnya. Melainkan bahwa repository-nya harus keluar dari gedung, dan bagi banyak tim itu menutup diskusi sebelum dimulai. Self-hosted environment adalah jawaban untuk keberatan spesifik itu, dan bentuk jawabannya layak dipahami dengan tepat, karena ia menyelesaikan lebih sedikit dari harapan orang dan lebih banyak dari dugaan mereka.
Tulisan ini membahas arsitektur tiga bagiannya, jalur jaringan yang menjadikannya cerita keamanan yang sungguh kuat, aturan siklus hidup runner yang menentukan ukuran armada Anda, dan daftar pengecualian yang menentukan apakah Anda bisa memakainya sama sekali — dan bagian terakhir itu yang perlu dibaca lebih dulu, karena beberapa pengecualiannya bersifat menggugurkan.
Kosakatanya penting di sini karena dokumentasinya memakainya secara konsisten dan konsepnya tidak memetakan intuisi CI dengan rapi:
Ketika seorang developer memulai sesi cloud, picker-nya menampilkan environment milik Anthropic bersama milik Anda. Pilih milik Anda dan control plane menempatkan sesi tersebut di antrean environment Anda, tempat sebuah runner mengambilnya, meng-clone repository, dan memulai pekerjaannya. Control plane tetap berada di Anthropic sepanjang proses — orkestrasi sesi, antrean, dan antarmuka claude.ai bukan hal yang Anda self-host.
Inilah bagian yang membuat tinjauan keamanan jadi lurus. Runner dan sesinya membuat beberapa jenis koneksi keluar dan sama sekali tidak membutuhkan konektivitas masuk. Itu percakapan yang jauh lebih mudah daripada self-hosted CI runner yang butuh endpoint webhook, dan layak Anda kedepankan saat membawa ini ke tim jaringan.
# Every connection is OUTBOUND. Anthropic never connects
# into your network — there is no inbound port to open.
your network
├─ runner ──────────► api.anthropic.com (poll queue, post events)
│ the poll IS the heartbeat
├─ runner ──────────► your git host (clone / push, HTTPS or SSH)
├─ session child ───► api.anthropic.com (event stream + inference)
└─ session child ───► your internal services, databases, registries
# Corporate egress proxies are supported: the runner and the
# autoscaling orchestrator honour HTTPS_PROXY and NO_PROXY, and
# sessions inherit them. Session streaming is server-sent events
# over HTTPS, so a proxy in the path MUST NOT buffer responses.Tunnel SCM connector opsional yang dipakai autoscaling orchestrator adalah satu-satunya koneksi WebSocket dalam seluruh desain ini. Kalau kebijakan egress Anda memperlakukan WebSocket berbeda dari HTTPS biasa — dan cukup banyak yang begitu — itulah satu pengecualian yang perlu direncanakan, dan Anda bisa melewatinya sama sekali dengan menjalankan runner berumur panjang alih-alih on-demand.
Inilah aturan yang menentukan perencanaan kapasitas Anda, dan ia tidak kentara dari luar. Satu runner melayani satu pengguna pada satu waktu: sesi pertama yang diambilnya mengunci runner itu ke akun pengguna tersebut, dan ia lalu hanya menjalankan sesi milik akun itu sampai batas kapasitasnya. Tujuannya isolasi — kode yang di-checkout tidak pernah bercampur antarpengguna, tanpa runner harus membersihkan disk di antara mereka.
# A runner serves ONE USER AT A TIME. The first session it
# claims locks it to that user's account, so checked-out code
# never mixes between users. That single rule sets your fleet
# size: minimum runners = users active at once.
--capacity <N> # concurrent sessions for the locked account
--drain-grace-sec 0 # DEFAULT: exit as soon as active sessions
# finish, so your orchestrator restarts it
# with a fresh disk, ready for any account
--drain-grace-sec 300 # keep polling the locked account for 5 min
--retire-at <epoch-secs> # for hosts destroyed at a known wall-clock
# time with NO signal — spot reclamation, a
# sandbox lifetime cap. Set it a few minutes
# before the kill.
# Without --retire-at, a signal-less host kill is indistinguishable
# from a crash: the control plane records a lost worker rather than
# a clean release, and the session requeues elsewhere.Konsekuensinya, ukuran armada minimum Anda adalah jumlah pengguna yang diperkirakan aktif bersamaan, bukan jumlah sesi bersamaan. Lima developer yang masing-masing menjalankan satu sesi butuh lima runner; satu developer yang menjalankan lima sesi butuh satu runner dengan kapasitas lima. Membalik pemahaman ini adalah cara tercepat menyediakan kapasitas kurang untuk sebuah pilot lalu menyimpulkan fiturnya lambat.
Mengetahui mekanika lease-nya mengubah sebagian besar proses debug runner menjadi aritmetika:
Presisi di sini adalah selisih antara tinjauan keamanan yang lolos dan yang mandek. Batasnya nyata tetapi tidak total, dan melebih-lebihkannya adalah cara tercepat kehilangan kredibilitas di hadapan peninjau yang membaca dokumentasinya.
Di mana tiap hal sebenarnya berada:
| Apa | Di mana ia tinggal | Catatan |
|---|---|---|
| Checkout repository, artefak build, secret | Hanya di mesin Anda | File apa pun yang dibuat atau diubah sesi tetap di host yang Anda sediakan |
| Prompt, respons, hasil tool | Dikirim ke Anthropic API | Dibutuhkan untuk inference; transkrip disimpan agar sesi bisa dilanjutkan di tempat lain |
| Orkestrasi dan antrean sesi | Control plane Anthropic | Bukan sesuatu yang dipindahkan oleh self-hosting |
Baca daftar ini lebih dulu. Beberapa entri bersifat menghentikan, dan salah satunya menggugurkan satu kelas deployment enterprise:
Pengecualian soal inference itulah yang menjegal tim enterprise. Self-hosting memindahkan eksekusi sesi ke jaringan Anda; ia tidak memindahkan inference model ke cloud provider Anda. Keduanya urusan terpisah yang diselesaikan fitur terpisah, dan tim yang mengadopsi self-hosted environment sambil berharap inference lewat Bedrock akan menemukan ketidakcocokan itu setelah membangun image runner, bukan sebelumnya.
Sebagian besar tim lebih terlayani oleh environment milik Anthropic, yang tidak butuh infrastruktur untuk dijalankan atau dirawat. Self-hosting berarti Anda membangun dan merawat image runner, mengoperasikan armadanya, dan mengendalikan jaringannya — kepemilikan operasional yang nyata dan permanen, ditukar dengan tiga hal: sesi yang bisa menjangkau layanan internal tanpa mengeksposnya ke publik, image runner dengan compiler dan CLI internal Anda sudah terpasang, serta checkout yang tetap di mesin yang Anda kendalikan.
Kalau tim Anda sama sekali tidak memakai sesi cloud, tidak ada yang perlu dikonfigurasi di sini — sesi terminal dan IDE selalu berjalan di mesin developer sendiri. Dan kalau yang sebenarnya Anda inginkan adalah menjalankan Claude Code di mesin Anda yang selalu menyala lalu mengemudikannya dari perangkat lain, itu Remote Control, yang tersedia juga di Pro dan Max dan tidak membutuhkan semua ini.
Cara infrastruktur Anda menghentikan runner menentukan apakah Anda butuh flag retire. Penghentian yang mengirim sinyal terminasi tidak butuh tambahan apa pun — runner-nya menguras sendiri. Tetapi host yang dihancurkan pada waktu jam dinding tertentu tanpa sinyal, seperti spot reclamation atau batas umur sandbox, tak bisa dibedakan dari crash: control plane mencatat worker hilang alih-alih pelepasan bersih. Setel waktu retire beberapa menit sebelum penghentian dan sesi akan dilepas dengan rapi.
Self-hosted environment adalah jawaban yang berbentuk baik untuk satu pertanyaan sempit: bisakah sesi cloud berjalan di tempat kode kami sudah berada. Ia menjawabnya dengan meyakinkan, lewat model jaringan serba keluar yang lolos tinjauan keamanan. Ia tidak menjawab di mana inference terjadi, ia tidak bekerja di bawah Zero Data Retention, dan ia membawa biaya berkelanjutan berupa armada yang kini Anda operasikan. Putuskan dulu apakah pertanyaan sempit itu memang pertanyaan Anda sebelum membangun apa pun.
Sumber & bacaan lanjutan