Sandboxes
Güvenilmeyen kodu — özellikle LLM’in ürettiği kodu — izole bir Linux ortamında çalıştırır.
- DurumGenel kullanımda
- FiyatAyrı fiyatı yok — Containers, Workers ve Durable Objects üzerinden faturalanır
- Doğrulama
Sandboxes nedir?
Bir yapay zekâ ajanı kod üretiyor ve o kodun çalıştırılması gerekiyor. Ya da kullanıcıların gönderdiği kodu çalıştıran bir platform kuruyorsun. Her iki durumda da temel soru aynı: güvenilmeyen kodu nereye koyacaksın?
Bir Worker bunu yapamaz — pip install çalıştıramaz, python3 süreci başlatamaz, kabuğu yoktur.
Ham bir Container yapabilir ama Dockerfile’ı, içindeki HTTP sunucusunu ve yaşam döngüsünü sen
yazmak zorundasın.
Sandbox SDK ikisinin arasını doldurur: Cloudflare hazır bir Ubuntu image’ı ve içinde çalışan bir sunucu verir, sen Worker’ından TypeScript API’siyle sürersin.
Cloudflare’in kendi tanımı:
“The Sandbox SDK enables you to run untrusted code securely in isolated environments. Built on Containers, Sandbox SDK provides a simple API for executing commands, managing files, running background processes, and exposing services — all from your Workers applications.”
Üç katmanlı mimari
| Katman | Görevi |
|---|---|
| Workers | Sandbox SDK’yı çağıran uygulama mantığın |
| Durable Objects | Sandbox’ın kalıcı kimliği ve adreslenmesi |
| Containers | Kodun gerçekten çalıştığı izole Linux ortamı |
Bu yüzden Sandboxes’ın ayrı bir fiyatı yoktur — üç katmanın toplamı faturalanır.
Nasıl çalışır?
İzolasyon modeli
Her sandbox kendi sanal makinesinde çalışır. Cloudflare sorumluluğu açıkça ikiye ayırıyor:
SDK’nın koruduğu şeyler:
“Sandbox-to-sandbox access (VM isolation) / Resource exhaustion (enforced quotas) / Container escapes (VM-based isolation)”
Senin uygulaman gereken şeyler:
“Authentication and authorization / Input validation and sanitization / Rate limiting / Application-level security (SQL injection, XSS, etc.)”
Yaşam döngüsü
| Durum | Ne olur |
|---|---|
| Oluşturma | Bir kimliğe ilk kez referans verildiğinde sandbox yaratılır |
| Aktif | Dosyalar, süreçler, kabuk oturumları ve ortam değişkenleri korunur |
| Boşta | 10 dakika hareketsizlikten sonra container durur, tüm state kaybolur |
| Yok etme | await sandbox.destroy() — her şey kalıcı olarak silinir |
keepAlive: true verilirse container 30 saniyede bir heartbeat gönderir ve hiç zaman aşımına
uğramaz. Ama resmî uyarı: “Containers with keepAlive: true require explicit management since
they do not timeout automatically.” — yani faturayı sen durdurmak zorundasın.
Session’lar güvenlik sınırı değildir
Bir sandbox içindeki session’lar, aynı bilgisayardaki terminal sekmeleri gibidir. Session’a özel olan: kabuk ortamı, çalışma dizini, ortam değişkenleri. Paylaşılan: dosya sistemi ve süreçler.
@next sürümünde session kavramı tamamen kaldırıldı.
Subrequest tuzağı
Bu, Sandboxes’ta en sık karşılaşılan çalışma zamanı hatasıdır.
Ne zaman kullanılır, ne zaman kullanılmaz
Uygun olduğu işler
- LLM’in ürettiği kodu çalıştırma
- Kod yorumlayıcı / notebook semantiği
- Kullanıcı gönderimi kod çalıştıran platformlar
- CI benzeri işler: klonla, kur, test et
- Yapay zekâ kodlama ajanlarına çalışma ortamı verme
Uygun olmadığı işler
- Düz bir Worker yeterliyse. Sandbox, container maliyeti ve 1–3 saniyelik cold start ekler.
- Kalıcı state gerekiyorsa. Container durduğunda her şey silinir.
- Tek sandbox içinde çok kiracılı sınır kurmak. Session’lar bunu sağlamaz.
- Kendi üretim runtime’ını tam kontrol etmek istiyorsan. Ham Containers kullan — Dockerfile senin olur, SDK/image sürüm bağımlılığını miras almazsın.
- Ücretsiz plan. Kullanılamaz.
- Masaüstü / bilgisayar kullanımı otomasyonu.
desktopözelliği 0.10.2’de kaldırıldı.
Somut örnekler
Ortak yapılandırma:
{
"name": "sandbox-worker",
"main": "src/index.ts",
"compatibility_date": "2026-08-31",
"compatibility_flags": ["nodejs_compat"],
"vars": { "SANDBOX_TRANSPORT": "rpc" },
"containers": [{ "class_name": "Sandbox", "image": "./Dockerfile" }],
"durable_objects": { "bindings": [{ "class_name": "Sandbox", "name": "Sandbox" }] },
"migrations": [{ "new_sqlite_classes": ["Sandbox"], "tag": "v1" }]
}
# Etiketi kurduğun npm sürümüyle eşleştir — doküman örneklerindeki sürümü kopyalama
FROM docker.io/cloudflare/sandbox:0.12.9-python
RUN pip install --no-cache-dir scikit-learn
1. LLM’in ürettiği kodu çalıştırma
import { getSandbox, proxyToSandbox } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
export default {
async fetch(request, env) {
// proxyToSandbox HER ZAMAN ilk satır olmalı, yoksa preview URL'ler bozulur
const proxy = await proxyToSandbox(request, env);
if (proxy) return proxy;
const kullaniciId = await kimlikDogrula(request);
if (!kullaniciId) return new Response("Yetkisiz", { status: 401 });
const { kod } = await request.json();
// Kullanıcı başına AYRI sandbox — tek gerçek izolasyon sınırı bu
const sandbox = getSandbox(env.Sandbox, `kullanici-${kullaniciId}`, {
enableDefaultSession: false,
normalizeId: true, // büyük harfli kimlikleri küçültür
});
const ctx = await sandbox.createCodeContext({ language: "python" });
const sonuc = await sandbox.runCode(kod, { context: ctx, timeout: 30_000 });
return Response.json({
stdout: sonuc.logs.stdout,
stderr: sonuc.logs.stderr,
deger: sonuc.results?.[0]?.text,
hata: sonuc.error ?? null,
});
},
};
2. Kod yorumlayıcı — notebook semantiği
const ctx = await sandbox.createCodeContext({ language: "python" });
await sandbox.runCode("import math; yaricap = 5", { context: ctx });
const sonuc = await sandbox.runCode("math.pi * yaricap ** 2", { context: ctx });
console.log(sonuc.results[0].text); // "78.53981633974483"
Resmî ifade: “Contexts maintain state (variables, imports, functions) across executions.” Üretimde bağlamı açıkça oluşturmak öneriliyor — böylece state öngörülebilir kalır.
3. CI benzeri iş
import { getSandbox, parseSSEStream } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
// Çalışma başına tek kullanımlık sandbox
const sandbox = getSandbox(env.Sandbox, `test-${Date.now()}`);
try {
await sandbox.gitCheckout(depoUrl, { branch, depth: 1, targetDir: "depo" });
const akis = await sandbox.execStream("cd /workspace/depo && npm test");
let cikisKodu = 0;
for await (const olay of parseSSEStream(akis)) {
if (olay.type === "stdout" || olay.type === "stderr") console.log(olay.data);
else if (olay.type === "complete") cikisKodu = olay.exitCode;
}
return Response.json({ basarili: cikisKodu === 0, cikisKodu });
} finally {
await sandbox.destroy(); // tek kullanımlık sandbox'ı MUTLAKA temizle
}
4. Uzun süren geliştirme sunucusu ve genel URL
const sandbox = getSandbox(env.Sandbox, `onizleme-${projeId}`, { keepAlive: true });
await sandbox.writeFile("/workspace/app.py", uretilenUygulama);
await sandbox.startProcess("python -m http.server 8080 --directory /workspace");
const tunel = await sandbox.tunnels.get(8080);
return Response.json({ url: tunel.url }); // https://<rastgele>.trycloudflare.com
Resmî güvenlik notu: “the hostname itself is the access control: anyone who knows the URL can
reach the service.” Erişimi kesmek için await sandbox.tunnels.destroy(8080).
5. Sandbox’a sır vermeden dış API çağırma
export class Sandbox extends BaseSandbox {
// Sandbox içindeki kod token'ı asla göremez
}
Sandbox.outbound = async (request, env) => {
const url = new URL(request.url);
if (url.hostname === "api.ornek.com") {
const headers = new Headers(request.headers);
headers.set("Authorization", `Bearer ${env.API_TOKEN}`);
return fetch(new Request(request, { headers }));
}
return new Response("Engellendi", { status: 403 });
};
Demo 1: LLM kodunu güvenle çalıştırma
Adım 1 — Kurulum
docker info
npm create cloudflare@latest -- my-sandbox --template=cloudflare/sandbox-sdk/examples/minimal
cd my-sandbox
npm run dev # ilk çalıştırma image'ı derler, 2-3 dakika sürer
Adım 2 — Python kodu çalıştır
curl -X POST http://localhost:8787/calistir \
-H 'content-type: application/json' \
-d '{"kod": "import pandas as pd; print(pd.DataFrame({\"a\":[1,2,3]}).sum())"}'
Adım 3 — Bağlam kalıcılığını doğrula
Adım 4 — Yayına al
npx wrangler deploy
npx wrangler containers list
Demo 2: İzolasyon ve subrequest tuzağı
Adım 1 — Paylaşılan sandbox’ın tehlikesini göster
İki farklı kullanıcı olarak aynı sandbox kimliğine yaz ve oku.
Adım 2 — Kullanıcı başına sandbox’a geç
Adım 3 — Subrequest sınırına çarp
SANDBOX_TRANSPORT ayarını kaldırıp ardışık 60 SDK çağrısı yap.
Adım 4 — RPC taşımasına geç
Adım 5 — Uyku sonrası state kaybını doğrula
Ölçüm
| Ölçüt | Değer |
|---|---|
| Cold start süresi | — |
| HTTP taşımasında subrequest sınırına çarpma noktası | — |
| RPC taşımasında subrequest tüketimi | — |
| Uyku sonrası korunan dosya sayısı | — |
| Paylaşılan sandbox’ta veri sızdı mı | — |
Fiyatlandırma
Resmî ifade: “Sandbox SDK pricing is determined by the underlying Containers platform it’s built on.” Ayrı bir Sandbox fiyat listesi yoktur.
Fatura üç kalemden oluşur:
| Kalem | Detay |
|---|---|
| Containers | Bellek, CPU, disk ve egress — Containers sayfasındaki tüm rakamlar aynen geçerli |
| Workers | İstek ve CPU süresi |
| Durable Objects | İstek ve süre (her sandbox’ın kendi DO’su var) |
Instance tipleri, hesap limitleri (6 TiB bellek, 1.500 vCPU, 50 GB image deposu) ve cold start süreleri de Containers ile birebir aynıdır.
Sandbox’a özel sınırlar
| Öğe | Değer |
|---|---|
| İstek başına subrequest (Ücretsiz Workers) | 50 |
| İstek başına subrequest (Ücretli Workers) | 1.000 |
| RPC taşımasıyla | Kalıcı bağlantı tek subrequest sayılır |
Varsayılan sleepAfter | 10 dakika |
keepAlive heartbeat aralığı | 30 saniye |
runCode varsayılan zaman aşımı | 60.000 ms |
createCodeContext varsayılan zaman aşımı | 30.000 ms |
| Preview URL token | 1–16 karakter, a-z0-9_ |
| Tünel port aralığı | 1024–65535 |
Lisanslama ve hukuki çerçeve
Sandbox hizmeti tescillidir;
Cloudflare Hizmet Şartları kapsamındadır. SDK npm üzerinden
@cloudflare/sandbox olarak dağıtılır.
Güvenilmeyen kod çalıştırmanın hukuki boyutu: Sandbox içinde kullanıcıların veya bir LLM’in ürettiği kodu çalıştırıyorsan, o kodun ne yaptığından sen sorumlusun. Cloudflare’in Kabul Edilebilir Kullanım Politikası sandbox içinden yapılan işlemleri de kapsar. Egress’i kilitlemek yalnızca güvenlik değil, sorumluluk yönetimi açısından da anlamlıdır.
Veri konumu: Containers ile aynı — bölge kısıtları constraints.regions ile verilir,
Türkiye tanımlı bir bölge değildir.
Sık yapılan hatalar
Tüm kullanıcılar için tek sandbox. Cloudflare’in kendi etiketlediği anti-desen. Kullanıcılar birbirinin dosyalarını okur.
Session’ları izolasyon sanmak. Session’lar dosya sistemini ve süreç uzayını paylaşır.
npm sürümü ile Docker image etiketinin uyuşmaması. En sık karşılaşılan tuzak; doküman örnekleri bayat sürüm pinliyor.
Büyük harfli sandbox kimliği. Preview URL’ler hostname’i küçültür, yani "Proje-123" var
olmayan bir Durable Object’e yönlenir. Küçük harf kullan veya normalizeId: true ver.
proxyToSandbox()’ı ilk satıra koymamak. Preview URL’ler sessizce bozulur.
Kullanıcı girdisini kabuğa enterpolasyon yapmak. Doküman örneği:
await sandbox.exec(`cat ${dosyaAdi}`) → kullanıcı dosya.txt; rm -rf / yazabilir.
Doğrusu writeFile + sabit komut.
Sandbox’a dış API anahtarı vermek. İçerideki her kod onu okuyabilir. Outbound handler kullan.
Tek kullanımlık sandbox’larda destroy() çağırmamak. Uyuyana kadar provision edilmiş bellek
ve disk için ödemeye devam edersin.
keepAlive: true verip unutmak. Otomatik zaman aşımı olmadığı için fatura durmaz.
Kullanımdan kalkan API’lerle yeni kod yazmak. Resmî ifade: “Do not build new work on them.”
Sıkça sorulan sorular
- Sandboxes GA mi?
- Ürün GA — 13 Nisan 2026’da Containers ile birlikte: “Containers and Sandboxes are now generally available.” Ama dikkat: SDK 1.0 hâlâ önizlemede. Kararlı sürüm 0.12.x hattında, 1.0 ise npm’de
@nextetiketi altında. Ürünün GA olması ile SDK’nın 1.0 olması iki ayrı şey — karıştırma. - Yeni projede kararlı sürümü mü @next’i mi kullanmalıyım?
- Cloudflare’in kendi önerisi
@next: “We recommend starting new projects on the preview, and migrating existing apps when you can, so you are ready when 1.0 becomes the stable release.” 1.0 için kesin bir GA tarihi yayımlanmamış. - Sandbox’ım istekler arasında dosyalarımı saklıyor mu?
- Yalnızca container ayaktayken. Resmî ifade: “After a period of inactivity (10 minutes by default, configurable via
sleepAfter), the container stops to free resources. When the next request arrives, a fresh container starts. All previous state is lost and the environment resets to its initial state.” Kalıcılık için R2 mount’u veya yedekleme/geri yükleme API’sini kullan. - Her kullanıcıya otomatik olarak ayrı sandbox mı düşüyor?
- Hayır — kimliği sen seçersin ve bu en kritik güvenlik kararıdır.
getSandbox(env.Sandbox, `kullanici-${kullaniciId}`)yazmalısın. Cloudflare’in kendi dokümanında etiketlenmiş bir anti-desen var:getSandbox(env.Sandbox, 'shared')→ “Users can read each other's files!” Ayrıca: “Sandbox IDs provide basic access control but aren't cryptographically secure.” - Session’lar güvenlik sınırı mı?
- Hayır, ve bu sık yapılan bir hata. Resmî ifade: “They are not a security boundary between users because sessions share the same filesystem and process space.” Session’lar aynı bilgisayardaki terminal sekmeleri gibidir. Gerçek izolasyon için kullanıcı başına ayrı sandbox gerekir.
@nextsürümünde session kavramı tamamen kaldırıldı. - Neden ‘Too many subrequests’ hatası alıyorum?
- Varsayılan HTTP taşımasında her SDK çağrısı bir subrequest sayılır —
exec(),readFile(),writeFile(), hepsi. Sınır: ücretsizde 50, ücretlide 1.000. Çözümwrangler.jsonciçindevarsaltınaSANDBOX_TRANSPORT = "rpc"eklemek: kalıcı bağlantı tek subrequest sayılır, sonraki tüm işlemler ek subrequest üretmez. - Sürüm uyuşmazlığı uyarısı alıyorum, neden?
- SDK npm paketinin sürümü ile Dockerfile’daki image etiketinin eşleşmesi gerekiyor: “The SDK automatically checks that your npm package version matches the Docker container image version.” Dikkat: Cloudflare’in kendi doküman örnekleri bayat —
cloudflare/sandbox:0.7.0pinliyorlar, oysa npm’deki güncel sürüm 0.12.x. Örnekten sürüm kopyalama, kendi kurduğun sürümü yaz. - Sandbox içindeki bir servise dışarıdan nasıl erişirim?
- İki yol var ve dokümanlar bu konuda çelişiyor. Yeni yol:
sandbox.tunnels.get(port)—*.trycloudflare.comüzerinde hızlı tünel, ya da{ name }ile kendi alan adında kalıcı hostname. RPC taşıması gerektirir. Eski yol:exposePort()+proxyToSandbox(). Haziran 2026 changelog’uexposePort()’u değiştirmeni söylüyor ama preview-urls sayfası hâlâ üretim için onu öneriyor. Yeni projede tünel API’sini kullan. - Hangi diller ve paketler hazır geliyor?
- Üç image varyantı var. Varsayılan: Ubuntu 22.04, Node.js 20 LTS, Bun, ve curl/wget/git/jq gibi araçlar.
-python: Python 3.11 ile matplotlib, numpy, pandas, ipython önyüklü.-opencode: AI kodlama ajanları için OpenCode CLI. Çalışma anındapip install,npm installveapt-get installda çalışır. - Sandbox’a API anahtarı vermeli miyim?
- Hayır. Resmî uyarı: “the sandbox process holds a live credential that any code running inside it can read.” Sandbox’ta güvenilmeyen kod çalıştırıyorsun — ona verdiğin her sır okunabilir. Bunun yerine outbound handler kullan: “Outbound handlers remove that exposure by keeping credentials in the Worker and injecting them into outbound requests… The sandbox never sees the real credential.”
- Sandboxes ile ham Containers arasında nasıl seçim yaparım?
- Sandboxes: container senin kontrol etmediğin kod için genel amaçlı bir yürütme yüzeyi ise — LLM çıktısı, kullanıcı gönderimi, CI işi, kodlama ajanı. Ham Containers: kendi uygulama image’ını, kendi sunucunu, kendi portlarını ve yaşam döngünü deploy ediyorsan. Sandboxes’ta Dockerfile ve iç sunucu Cloudflare’den gelir; ham Containers’ta ikisi de senin.
- Fiyatı nasıl hesaplanıyor?
- Ayrı bir Sandbox fiyat listesi yok. Resmî ifade: “Sandbox SDK pricing is determined by the underlying Containers platform it's built on.” Fatura üç kalemden oluşur: Containers (bellek/CPU/disk/egress) + Workers + Durable Objects. Yani Containers sayfasındaki tüm rakamlar buraya da aynen uygulanır.
- Hangi API'ler kullanımdan kalkıyor?
- Haziran 2026 itibarıyla: HTTP ve WebSocket taşımaları,
desktop(0.10.2’de zaten kaldırıldı),exposePort(), varsayılan session’lar, veexecStream/readFileStream/writeFileStream. Resmî ifade: “Do not build new work on them.”
İlgili servisler
- ContainersDocker image’ını Cloudflare ağında çalıştırır; Workers’a sığmayan diller, gerçek filesystem ve ağır bağımlılıklar için.
- WorkersJavaScript/TypeScript/Python kodunu Cloudflare’in 330+ şehirdeki sunucularında, sunucu yönetmeden çalıştırır.
- Durable ObjectsHer nesnenin tek bir instance’ı olan, state tutan compute; sohbet odası, oyun oturumu, sayaç gibi işler için.
- AgentsDurumu koruyan, zamanlanmış görev çalıştırabilen ve WebSocket ile konuşan yapay zekâ ajanları kurar.
- Workers AIAçık kaynak modelleri Cloudflare’in GPU’larında, API çağrısıyla çalıştırır.
Bu sayfadaki fiyat ve özellik bilgileri 31 Ağustos 2026 tarihinde Cloudflare’in resmî kaynaklarından doğrulanmıştır. Cloudflare fiyatlandırmasını önceden haber vermeden değiştirebilir; bağlayıcı bilgi içinresmî sayfaya bakın.