İçeriğe atla
Cloudflare Wiki

    gez · aç · Esc kapat

    Workers for Platforms

    Kendi müşterilerinin yazdığı kodu izole biçimde çalıştırmanı sağlar; SaaS platformları için.

    • DurumGenel kullanımda
    • FiyatScript başına ücret + temel Workers kullanımı
    • Doğrulama

    Workers for Platforms nedir?

    Bir SaaS ürünü kuruyorsun ve müşterilerin kendi mantıklarını yazabilmesini istiyorsun. E-ticaret platformunda mağaza sahibi özel bir kargo hesaplama fonksiyonu yazsın. CMS’te tema geliştiricisi sunucu tarafı bir dönüşüm eklesin. Otomasyon aracında kullanıcı kendi webhook işleyicisini tanımlasın.

    Bu, güvenilmeyen kodu ölçekte çalıştırmak demektir — ve klasik çözümleri (konteyner havuzu, sanal makine, VM izolasyonu) pahalı ve yavaştır.

    Workers for Platforms bu modeli Cloudflare’in isolate mimarisi üzerine kurar. Müşteri Worker’ları bir dispatch namespace içinde toplanır; senin yazdığın bir dispatch Worker gelen isteği inceleyip hangi müşteri kodunun çalışacağına karar verir.

    Cloudflare resmî olarak üç kullanıcı adı veriyor: Shopify Oxygen (birebir “built on Workers for Platforms”), Grafbase ve Triplit.

    Nasıl çalışır?

    Mimari

    İstek → Dispatch Worker (senin kodun)
               │  hangi müşteri? hangi Worker?
    
            Dispatch namespace
               ├── musteri-a Worker'ı
               ├── musteri-b Worker'ı
               └── musteri-c Worker'ı

    Müşteri Worker’ları doğrudan internetten erişilemez. Yalnızca senin dispatch Worker’ın üzerinden çalışırlar — yani yetkilendirme, hız sınırlama ve yönlendirme tamamen senin kontrolünde.

    Dispatch Worker

    export default {
      async fetch(request, env) {
        const url = new URL(request.url);
        const musteriId = url.hostname.split(".")[0];   // musteri-a.platform.com
    
        // Kendi yetkilendirme ve kotam burada
        if (!(await musteriAktifMi(env, musteriId))) {
          return new Response("Hesap askıda", { status: 402 });
        }
    
        try {
          const musteriWorker = env.DISPATCHER.get(musteriId);
          return await musteriWorker.fetch(request);
        } catch (h) {
          if (h.message.startsWith("Worker not found")) {
            return new Response("Bu müşteri için Worker tanımlı değil", { status: 404 });
          }
          throw h;
        }
      },
    };

    Müşteri Worker’ı yükleme

    # Namespace yönetimi
    npx wrangler dispatch-namespace create production
    npx wrangler dispatch-namespace list
    npx wrangler dispatch-namespace get production
    npx wrangler dispatch-namespace rename eski yeni
    
    # Müşteri Worker'ını namespace'e yükle
    npx wrangler deploy --dispatch-namespace production

    Namespace silmek için önce içindeki tüm müşteri Worker’ları silinmelidir: “You must delete all user Workers in the dispatch namespace before it can be deleted.”

    Outbound Worker — müşteri egress’ini kontrol etme

    Müşteri kodunun dışarıya ne gönderdiğini denetlemek istersin. Outbound Worker bunu sağlar: müşteri Worker’ının yaptığı her fetch senin kodundan geçer.

    Ne zaman kullanılır, ne zaman kullanılmaz

    Uygun olduğu işler

    • Müşterilerin sunucu tarafı kod yazabildiği SaaS platformları
    • Çok kiracılı eklenti/tema ekosistemleri
    • Müşteri başına özelleştirilebilir yönlendirme veya dönüşüm mantığı
    • Kendi platformunun altında “fonksiyon olarak hizmet” sunmak

    Uygun olmadığı işler

    • Kendi kodunu çalıştırmak. Düz Workers yeterli.
    • Workflows gerektiren müşteri mantığı. Desteklenmiyor.
    • Tam kabuk erişimi veya dosya sistemi gerektiren müşteri kodu. Bunun için Sandboxes var.
    • Az sayıda müşteri. Dispatch namespace altyapısı kurmak, üç müşteri için fazla karmaşıktır; service binding’lerle daha basit çözülür.
    • Egress kontrolünün mutlak olması gereken durumlar. Yukarıdaki iki kör nokta var.

    Somut örnekler

    1. Müşteri başına kota ve yetkilendirme

    export default {
      async fetch(request, env) {
        const musteriId = new URL(request.url).hostname.split(".")[0];
    
        // Kota kontrolü — müşteri Worker'ı çalışmadan ÖNCE
        const sayac = env.KOTA.getByName(`musteri:${musteriId}`);
        const { izin, kalan } = await sayac.kontrol();
        if (!izin) {
          return new Response("Aylık kota doldu", { status: 429 });
        }
    
        const worker = env.DISPATCHER.get(musteriId);
        const yanit = await worker.fetch(request);
    
        // Müşteri Worker'ının yanıtına kendi başlıklarını ekle
        const cikti = new Response(yanit.body, yanit);
        cikti.headers.set("X-Kalan-Kota", String(kalan));
        return cikti;
      },
    };

    2. Müşteri Worker’ına sınırlı kaynak verme

    // Upload API metadata'sında her müşteriye kendi izole kaynakları verilir
    const metadata = {
      main_module: "index.js",
      bindings: [
        // Müşterinin yalnızca kendi KV alanına erişimi var
        { type: "kv_namespace", name: "VERI", namespace_id: musteriKvId },
        // Müşteri kendi kimliğini değiştiremez
        { type: "plain_text", name: "MUSTERI_ID", text: musteriId },
      ],
      // Kaynak sınırları
      limits: { cpu_ms: 50 },
    };

    3. Statik dosya hash’ini tuzlama

    Bu, çok kiracılı bir platformda zorunlu bir adımdır.

    // YANLIŞ — aynı içerik farklı müşteriler arasında paylaşılır
    const hash = sha256(dosyaIcerigi).slice(0, 32);
    
    // DOĞRU — hesap kimliğiyle tuzla
    const hash = sha256(hesapId + dosyaIcerigi).slice(0, 32);

    Resmî gerekçe: “assets with identical hashes may be shared across them.” Tuzlamazsan iki müşterinin aynı içerikli dosyası aynı depoya düşer.

    4. Outbound Worker ile egress denetimi

    export default {
      async fetch(request, env) {
        const url = new URL(request.url);
    
        // Müşteri kodunun iç ağa erişmesini engelle
        if (url.hostname.endsWith(".internal") || url.hostname === "localhost") {
          return new Response("İç ağa erişim engellendi", { status: 403 });
        }
    
        // Denetim kaydı
        env.LOG.writeDataPoint({
          blobs: [env.MUSTERI_ID, url.hostname],
          doubles: [Date.now()],
        });
    
        return fetch(request);
      },
    };

    Demo 1: Dispatch namespace kurma ve iki müşteri yükleme

    Adım 1 — Namespace oluştur

    npx wrangler dispatch-namespace create production
    npx wrangler dispatch-namespace list
    Terminal — namespace oluşturma onayı ve list çıktısında namespace'in görünmesi

    Adım 2 — Dispatch Worker’ı yaz ve deploy et

    {
      "name": "platform-dispatcher",
      "main": "src/index.ts",
      "compatibility_date": "2026-08-31",
      "dispatch_namespaces": [
        { "binding": "DISPATCHER", "namespace": "production" }
      ]
    }
    wrangler deploy çıktısı — bindings bölümünde DISPATCHER (dispatch namespace) satırı

    Adım 3 — İki müşteri Worker’ı yükle

    Terminal veya API çıktısı — musteri-a ve musteri-b Worker'larının yüklendiği
    Workers & Pages → Workers for Platforms → namespace → içindeki müşteri Worker'larının listesi

    Adım 4 — Yönlendirmeyi doğrula

    curl -H "Host: musteri-a.platform.com" https://<dispatcher>/
    curl -H "Host: musteri-b.platform.com" https://<dispatcher>/
    İki curl çıktısı yan yana — aynı dispatcher'a giden isteklerin farklı müşteri Worker'larına düştüğü

    Adım 5 — Olmayan müşteriyi dene

    Worker not found hatasının yakalanıp anlamlı bir 404'e çevrildiği yanıt

    Demo 2: İzolasyon ve egress kontrolü

    Adım 1 — Müşteri Worker’ları birbirini görebiliyor mu

    Bir müşteri Worker’ından diğerinin KV alanına erişmeyi dene.

    Erişim denemesinin başarısız olduğunu gösteren yanıt veya hata

    Adım 2 — Outbound Worker’ı devreye al

    wrangler tail çıktısı — müşteri Worker'ından çıkan isteğin outbound Worker'da göründüğü
    Müşteri kodundan .internal adresine yapılan isteğin 403 ile engellendiği çıktı

    Adım 3 — Kör noktayı doğrula

    Durable Object binding’i üzerinden yapılan fetch’in outbound Worker’a düşmediğini göster.

    wrangler tail — DO içinden yapılan isteğin outbound Worker log'unda görünmediği; resmî kör noktanın kanıtı

    Adım 4 — Log devralmayı doğrula

    Workers Logs ekranı — hem dispatch Worker'ın hem müşteri Worker'ının kayıtlarının bir arada göründüğü

    Ölçüm

    ÖlçütDeğer
    Müşteri Worker’ları arası veri erişimi
    Outbound Worker’ın yakaladığı istek oranı
    Durable Object üzerinden kaçan istek
    Dispatch Worker’ın eklediği gecikme

    Fiyatlandırma

    Kesin olan: müşteri Worker’larının çalıştırdığı istek ve CPU süresi normal Workers fiyatlandırmasına tabidir ve script sayısı ayrı bir kalem oluşturur.

    Limitler

    SınırDeğer
    Worker sürümü başına statik dosya (Paid / W4P)100.000
    Worker sürümü başına statik dosya (Free)20.000
    Tek statik dosya boyutu25 MiB
    Artırılmış dosya sınırı için gereken Wrangler4.34.0+
    Workflows desteğiYok

    Müşteri Worker’larının bellek, script boyutu, başlangıç süresi ve subrequest sınırlarında hangi kolonun (Free / Paid) geçerli olduğu resmî olarak yayımlanmamıştır.

    Lisanslama ve hukuki çerçeve

    Workers for Platforms tescilli bir hizmettir; Cloudflare Hizmet Şartları kapsamındadır.

    Sorumluluk zinciri. Bu ürünle müşterilerinin kodunu sen çalıştırıyorsun. Cloudflare’in Kabul Edilebilir Kullanım Politikası senin hesabın üzerinden geçen tüm trafiği kapsar — yani müşterinin kötüye kullanımı senin sorumluluğuna girer. Kendi kullanım şartlarında bunu müşterine yansıtman ve teknik olarak sınırlaman gerekir.

    Veri işleme. Müşteri Worker’larının işlediği veri senin hesabın üzerinden akar. Kişisel veri söz konusuysa hem Cloudflare ile aranda hem de müşterinle aranda veri işleme sözleşmeleri gerekir — bu durumda sen hem veri sorumlusu hem veri işleyen konumunda olabilirsin.

    Sık yapılan hatalar

    Statik dosya hash’ini tuzlamamak. Aynı içerikli dosyalar müşteriler arasında paylaşılır. sha256(hesapId + icerik) kullan.

    Outbound Worker’ı tam bir güvenlik sınırı sanmak. Durable Object ve mTLS sertifika binding’lerinden çıkan istekler yakalanmaz.

    Binding’leri Wrangler yapılandırma dosyası olarak yüklemeye çalışmak. Upload API’de binding’ler metadata alanına konur.

    keep_bindings vermeden PUT atmak. Mevcut binding’ler silinir.

    Etiket eklerken PUT .../tags kullanmak. Bu tam değiştirmedir; tek etiket için PUT .../tags/$TAG kullan.

    Trusted mode’u sonradan açıp yeniden deploy etmemek. request.cf nesnesi mevcut Worker’larda görünmez.

    Müşteri Worker’larında Workflows kullanmaya çalışmak. Desteklenmiyor.

    Namespace’i silmeye çalışmadan önce içini boşaltmamak. Tüm müşteri Worker’ları önce silinmelidir.

    Sıkça sorulan sorular

    Bu ürün kimin için?
    Kendi müşterilerine kod çalıştırma yeteneği veren platformlar için. Tipik örnekler: e-ticaret platformunda mağaza sahibinin özel checkout mantığı yazması, bir CMS'te tema geliştiricisinin sunucu tarafı kod eklemesi, bir otomasyon aracında kullanıcının kendi dönüşüm fonksiyonunu tanımlaması. Kendi kodunu çalıştırıyorsan bu ürüne ihtiyacın yok — düz Workers yeterli.
    Ne zaman GA oldu?
    İki aşamalı. 21 Eylül 2022: Enterprise müşterilere GA — “We're excited to announce that Workers for Platforms is now in GA for all Enterprise customers!” 16 Nisan 2024: kullandıkça öde planıyla tüm geliştiricilere açıldı. Arada geçen dönemde resmî ifade şuydu: “Workers for Platforms is an enterprise only product (for now).”
    Dispatch namespace nedir?
    Müşteri Worker'larının toplandığı yalıtılmış bir alan. Sen bir dispatch Worker yazarsın; gelen isteği inceleyip hangi müşteri Worker'ının çalışacağına karar verir ve onu çağırır. Müşteri Worker'ları doğrudan internetten erişilemez — yalnızca senin dispatch Worker'ın üzerinden çalışırlar.
    Müşteri Worker'larını nasıl yüklerim?
    İki yol var. Wrangler: npx wrangler deploy --dispatch-namespace production. Upload API: platformunun kendi arayüzünden programatik yükleme — asıl kullanılan yol budur, çünkü müşterilerin Wrangler kullanmaz. API'de binding'ler multipart isteğin metadata alanına konur; resmî uyarı: “You cannot upload the Wrangler configuration file as a module to configure the bindings.”
    Outbound Worker ile müşterilerin dış erişimini kontrol edebilir miyim?
    Büyük ölçüde evet, ama iki boşluğu bilmen gerekiyor. Resmî ifade: “Outbound Workers do not intercept fetch requests made from Durable Objects or mTLS certificate bindings.” Yani egress kontrolünü bir güvenlik garantisi olarak satıyorsan bu iki kanal açık kalır. Müşterilere Durable Object binding'i vermeden önce bunu düşün.
    Statik dosyalarda çok kiracılı bir tuzak var mı?
    Evet, ve ciddi. Statik dosyalar Worker bazında değil namespace bazında saklanır: “assets with identical hashes may be shared across them.” Aynı içeriğe sahip iki müşteri dosyası aynı hash'i üretir ve paylaşılır. Resmî uyarı: “JWTs should therefore only be shared with trusted platform services and should never be distributed to end-users.” Belgelenmiş çözüm hash'i tuzlamak: hash = slice(sha256(accountID + fileContents), 32).
    Müşteri Worker'ı başına kaç statik dosya olabilir?
    Workers Paid ve Workers for Platforms kullanıcılarında Worker sürümü başına 100.000 statik dosya (önceden 20.000 idi), ücretsiz planda 20.000. Tek dosya boyutu 25 MiB. Bu artıştan yararlanmak için Wrangler 4.34.0 veya üzeri gerekiyor.
    Müşteri Worker'larının loglarını görebilir miyim?
    Evet, ve otomatik olarak. Resmî ifade: “Enabling logging on your dispatch Worker collects logs for both the dispatch Worker and for any user Workers in the dispatch namespace.” GraphQL analitiğinde workersInvocationsAdaptive üzerinde dispatchNamespaceName boyutuyla filtreleyebilirsin.
    Trusted mode nedir, açmalı mıyım?
    Namespace'i güvenilir moda alınca müşteri Worker'ları request.cf nesnesine erişebilir. Bu, adı üstünde, güvendiğin kod için. Kritik ayrıntı: “If you enable trusted mode for a namespace that already has deployed Workers, you'll need to redeploy those Workers for the request.cf object to become available.” Güvenilmeyen üçüncü taraf kodu çalıştırıyorsan kapalı bırak.
    Workflows kullanabilir miyim?
    Hayır. Resmî ifade: “Workflows cannot be deployed to Workers for Platforms namespaces, as Workflows do not support Workers for Platforms.” Çok adımlı dayanıklı iş akışları müşteri Worker'larında çalışmaz; bu mantığı kendi platform Worker'ında tutman gerekir.
    Yerel geliştirme nasıl yapılır?
    Binding'e "remote": true ekleyip wrangler dev çalıştırdığında istekler uzaktaki namespace'te bulunan gerçek müşteri Worker'larına yönlenir. Böylece dispatch mantığını yerelde geliştirirken gerçek müşteri kodlarıyla test edebilirsin.
    Bu modeli kim kullanıyor?
    Cloudflare resmî olarak üç isim veriyor: Shopify Oxygen (“built on Workers for Platforms”), Grafbase ve Triplit. Shopify Oxygen örneği ölçek açısından anlamlı — mağaza sahiplerinin yazdığı kod bu altyapıda çalışıyor.
    Etiketleri güncellerken nelere dikkat etmeliyim?
    PUT .../tags çağrısı tam değiştirmedir: “Existing tags not in the request are removed.” Tek etiket eklemek istiyorsan PUT .../tags/$TAG kullan. Benzer şekilde binding güncellerken keep_bindings vermezsen bir PUT mevcut binding'leri siler.

    İlgili servisler

    • WorkersJavaScript/TypeScript/Python kodunu Cloudflare’in 330+ şehirdeki sunucularında, sunucu yönetmeden çalıştırır.
    • SandboxesGüvenilmeyen kodu — özellikle LLM’in ürettiği kodu — izole bir Linux ortamında çalıştırır.
    • Workers ObservabilityWorker loglarını, request trace’lerini ve error rate’i harici araç kurmadan gösterir.
    • Dynamic WorkersWorker kodunu çalışma anında oluşturup çalıştırır; kullanıcı veya AI tarafından üretilen kod için.
    • 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.

    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.

    Hata bildir

    Yanlış bir rakam, eskimiş bir bilgi veya bozuk bir bağlantı mı buldun? Bildir, kaynağıyla birlikte kontrol edelim.