Peşin ücret yokMağazanız 24 saatte satışa hazır — kurulumu ve ürün aktarımını biz yapıyoruz, ödemeyi onayınızdan sonra alıyoruz. Detay →
Mağaza Altyapısı

Cloudflare R2 Nedir, Nasıl Kullanılır? Üretimde 415 Bin Görselle Öğrendiklerimiz

Cloudflare R2, S3 ile aynı API'yi konuşan ama çıkış ücreti almayan nesne depolama servisi. Fiyatlandırmanın kalem kalem hesabı, kurulum adımları, faturayı asıl düşüren iki ayar ve 116 GB'lık gerçek bir taşımada çarptığımız duvarlar.

18 dakika okuma
Cloudflare R2 ile Amazon S3 aylık fatura karşılaştırması: aynı 116 GB ve aynı trafik için S3 180 dolar, R2 1,59 dolar

Bulut depolama faturasını ilk kez ciddiye aldığınız gün, kalemlerin sizi şaşırttığı yer neredeyse hiçbir zaman depolamanın kendisi olmaz. 100 GB görsel tutmak dünyanın hiçbir sağlayıcısında pahalı değildir. Fatura, o görselleri kullanıcıya gönderdiğiniz anda büyür. Buna çıkış ücreti (egress) denir ve klasik bulut sağlayıcılarında depolamanın kendisinden on kat, yüz kat büyük bir kalem hâline gelebilir.

Cloudflare R2, tam olarak bu kalemi sıfırlamak için var. Amazon S3 ile aynı API'yi konuşur, aynı SDK'larla çalışır, ama internete çıkan veriden ücret almaz.

Bu yazı bir ürün tanıtımı değil. Mubido'da 415.018 görseli, 116 GB'lık bir veriyi yerel diskten R2'ye taşıdık ve o gün bugündür tüm mağaza görsellerini oradan servis ediyoruz. Aşağıdakiler o taşımadan, taşıma sonrası aylardan ve yolda kırdığımız birkaç şeyden çıkan notlar: R2 nedir, faturası gerçekte nasıl hesaplanır, nasıl kurulur, hangi ayarlar maliyeti gerçekten düşürür ve dokümantasyonda yazmayan hangi duvarlara çarparsınız.

Cloudflare R2 nedir?

Cloudflare R2, Cloudflare'in nesne depolama (object storage) servisidir. "Nesne depolama" dosyaları bir klasör ağacında değil, düz bir anahtar-değer havuzunda tutan yaklaşımdır: her dosyanın bir anahtarı (tenants/abc123/products/urun-01.webp gibi) ve içeriği vardır. Görsel, video, yedek dosyası, log arşivi, statik site varlıkları — internetten servis edilecek her şey için doğru araçtır. Veritabanı ya da üzerinde sürekli değişiklik yapılan dosyalar için değildir.

R2'yi rakiplerinden ayıran üç şey var:

  • Çıkış ücreti yok. Bucket'ınızdan internete ne kadar veri akarsa aksın, aktarım için ödeme yapmazsınız. Ne aylık kota, ne oran sınırı, ne de "adil kullanım" yıldızı.
  • S3 API uyumlu. AWS'nin resmî SDK'larıyla (@aws-sdk/client-s3, boto3, aws-sdk-php…) çalışır. S3 kullanan bir uygulamada değiştirmeniz gereken şey pratikte üç satırdır: uç nokta (endpoint), kimlik bilgileri ve bölge.
  • Cloudflare ağının içinde. Bucket'a bir özel alan adı bağladığınızda dosyalar Cloudflare'in CDN'i, önbelleği, WAF'ı ve bot korumasının arkasından servis edilir. Ayrı bir CDN kurmanız gerekmez.

Karşılığında R2, S3'ün on yılda biriktirdiği ekosistemin tamamını sunmaz. Hangi noktalarda eksik kaldığını bu yazının sınırlar bölümünde tek tek yazdık; önce faturanın nasıl çalıştığına bakalım, çünkü R2'yi seçme kararının %90'ı orada veriliyor.

Asıl mesele depolama değil, çıkış ücreti

Somut bir örnek üzerinden gidelim. Orta ölçekli bir e-ticaret mağazası düşünün: 116 GB ürün görseli (bizim gerçek rakamımız), ayda 2 TB görsel trafiği, ayda 5 milyon görsel isteği ve 100 bin yeni dosya yüklemesi.

Amazon S3 Standard ile (US East fiyatları, Eylül 2026):

  • Depolama: 116 GB × 0,023 $ = 2,67 $
  • İnternete çıkış: ilk 100 GB ücretsiz, kalan 1.948 GB × 0,09 $ = 175,32 $
  • GET istekleri: 5.000.000 ÷ 1.000 × 0,0004 $ = 2,00 $
  • PUT istekleri: 100.000 ÷ 1.000 × 0,005 $ = 0,50 $
  • Toplam: yaklaşık 180 $/ay

Aynı iş yükü Cloudflare R2'de:

  • Depolama: ilk 10 GB ücretsiz, kalan 106 GB × 0,015 $ = 1,59 $
  • İnternete çıkış: 0 $
  • Okuma işlemleri (Class B): aylık ilk 10 milyon ücretsiz, 5 milyon bunun içinde = 0 $
  • Yazma işlemleri (Class A): aylık ilk 1 milyon ücretsiz, 100 bin bunun içinde = 0 $
  • Toplam: yaklaşık 1,59 $/ay

Aradaki fark 113 kat. Yazının yazıldığı gün geçerli kurla (1 $ ≈ 48,26 TL) ayda yaklaşık 8.700 TL'ye karşı 77 TL. Ve bu farkın tamamı tek bir kalemden geliyor: 175 dolarlık çıkış ücreti.

Burada dürüst olmak gerekir, çünkü çoğu karşılaştırma yazısı bu noktayı atlar: S3'ü de bir CDN'in arkasına koyabilirsiniz. CloudFront ya da Cloudflare önbelleğe alır, isabet eden istekler S3'e hiç ulaşmaz ve çıkış ücreti düşer. Ama iki şey değişmez. Birincisi, önbellek ıskaları (cache miss) hâlâ S3'ten çıkar ve hâlâ ücretlidir — yüz binlerce nadir erişilen ürün görseliniz varsa ıska oranınız düşük olmaz. İkincisi, AWS Cloudflare'in Bandwidth Alliance'ında değildir; yani S3'ü Cloudflare arkasına almak çıkışı ücretsiz yapmaz, sadece azaltır. R2'de ise ıska da, isabet de, doğrudan erişim de ücretsizdir. Optimize etmeniz gereken bir kalem olmaktan çıkar.

R2 fiyatlandırması: kalem kalem

R2'nin faturası üç kalemden oluşur: depoladığınız veri, yaptığınız işlem sayısı ve — hiç ödemediğiniz — çıkış.

KalemStandardInfrequent AccessAylık ücretsiz (Standard)
Depolama0,015 $ / GB-ay0,01 $ / GB-ay10 GB-ay
Class A işlem (yazma, listeleme)4,50 $ / milyon9,00 $ / milyon1 milyon
Class B işlem (okuma)0,36 $ / milyon0,90 $ / milyon10 milyon
Veri geri alma0,01 $ / GB
İnternete çıkışÜcretsizÜcretsizSınırsız

Class A ve Class B ne demek?

R2 işlemleri iki sınıfa ayırır ve aradaki fiyat farkı 12,5 kattır. Hangi çağrının hangi sınıfa girdiğini bilmek, faturayı okuyabilmenin şartıdır.

  • Class A (pahalı, 4,50 $/milyon): durumu değiştiren ya da tarayan işlemler. PutObject, CopyObject, CreateMultipartUpload, CompleteMultipartUpload, UploadPart, ListObjects, ListBuckets, PutBucketCors.
  • Class B (ucuz, 0,36 $/milyon): durumu okuyan işlemler. GetObject, HeadObject, UsageSummary.
  • Ücretsiz: DeleteObject, DeleteBucket ve AbortMultipartUpload. Silmek para götürmez — bu, yaşam döngüsü kurallarını cesurca kullanabileceğiniz anlamına gelir.

Buradaki en sinsi kalem listelemedir. ListObjectsV2 bir okuma gibi hissettirir ama Class A'dır ve sayfa başına bin nesne döner. 500 bin nesnelik bir bucket'ı tek seferde saymak 500 Class A işlemi demektir; bunu her gece bir cron'a yaptırırsanız ayda 15 bin işlem eder. Tek başına yıkıcı değil, ama envanterinizi bucket'ı tarayarak tutuyorsanız yanlış yerdesiniz demektir. Dosya listesi veritabanınızda durmalı, bucket yalnızca içeriği tutmalı.

Faturada gözden kaçan üç kural

  • Yukarı yuvarlama. Kullanım bir sonraki fatura birimine yuvarlanır; 1,1 GB, 2 GB olarak faturalanır. Küçük bucket'larda oransal olarak hissedilir.
  • Depolama, günlük zirvelerin ortalamasıdır. GB-ay değeri 30 gün boyunca günlük en yüksek kullanımın ortalaması alınarak bulunur. Ayın ortasında 200 GB yükleyip akşam silmek bedava değildir.
  • Yetkisiz istekler ücretsizdir. HTTP 401 dönen çağrılar için ücret alınmaz. Yanlış yapılandırılmış bir istemcinin sizi soymasını engelleyen küçük ama gerçek bir koruma.

Infrequent Access ne zaman mantıklı, ne zaman tuzak?

Infrequent Access (seyrek erişim) sınıfı depolamayı 0,015 $'dan 0,01 $'a indirir — üçte bir tasarruf. Karşılığında üç bedel ödersiniz: işlem ücretleri 2,5 kat artar, geri alınan her GB için 0,01 $ ödersiniz ve her nesne için asgari 30 günlük depolama faturalanır (30 günden önce silseniz bile).

Basit bir eşik: bir nesneye ayda ortalama bir kereden az erişiliyorsa ve en az bir ay duracaksa Infrequent Access kazandırır. Yedekler, arşivlenmiş faturalar, eski sipariş belgeleri, ham log dosyaları buraya girer. Aktif ürün görselleri kesinlikle girmez: 116 GB'lık kataloğumuzda tasarruf ayda 0,53 $ olurken, geri alma ücretleri ve artan işlem fiyatları bunu fazlasıyla götürürdü.

Biz ne taşıdık: 415.018 görsel, 116 GB

Mubido çok kiracılı bir e-ticaret altyapısı: her mağaza kendi ürünlerini, kendi görsellerini, kendi temasını yönetiyor. Görseller uzun süre uygulama sunucusunun yerel diskinde durdu. Şu anda sistemde 415.018 görsel varlığı ve 501.011 ürün görseli kaydı var; bunların diskteki karşılığı 116 GB.

Bu modelin bizi zorlayan tarafı maliyet değildi, mimariydi:

  • Görseller uygulama sunucusuna bağlıydı. İkinci bir sunucu eklemek, dosyaları da senkronize etmek anlamına geliyordu.
  • Disk büyüdükçe yedekleme süresi ve maliyeti büyüyordu; 116 GB'lık bir görsel havuzunu her gün yedeklemenin anlamı yoktu, çünkü içeriği pratikte değişmiyordu.
  • Her görsel isteği uygulama sunucusundan geçiyordu. Node süreci, olması gerekenden çok daha fazla iş yapıyordu.

Taşımayı geri dönülebilir kurmak

Taşımanın en önemli kararı teknik değil, stratejikti: hiçbir aşamada geri dönülemez bir adım atmamak. Üç kuralla yaptık.

1. R2 anahtarı, diskteki göreli yolla birebir aynı. Diskte uploads/tenants/<tenant>/products/x.webp olan dosya, R2'de tenants/<tenant>/products/x.webp anahtarıyla duruyor. Böylece veritabanındaki hiçbir URL'i değiştirmek zorunda kalmadık; kayıtlı yol ikisine de aynı şekilde çözülüyor.

2. Okuma sırası her yerde önce disk, sonra R2. Uygulama bir görseli isterken önce yerel diske bakar, bulamazsa R2'den okur. Bu tek karar, taşımayı bir "geçiş gecesi" olmaktan çıkarıp arka planda haftalarca sürebilen sıradan bir işe dönüştürdü. Taşınmış dosya R2'den, taşınmamış dosya diskten gelir; kullanıcı farkı görmez.

3. Yapılandırma eksikse sistem eski hâline döner. R2 ortam değişkenlerinden biri bile boşsa depolama servisi kendini devre dışı bırakır ve her şey eskisi gibi diskte çalışır. Bu, üretimde bizi bir kez kurtardı — ve bir kez de fena hâlde yaktı; nedenini duvarlar bölümünde anlatıyorum.

Sonuç

Bugün tenants/ ön ekiyle başlayan her şey R2'de ve cdn.mubido.com üzerinden servis ediliyor. Uygulama sunucusu görsel trafiğinden tamamen çıktı, yedekleme yalnızca veritabanını ve kodu kapsıyor, yeni bir uygulama sunucusu eklemek dosya senkronizasyonu sorunu doğurmuyor. Depolamanın aylık maliyeti ise iki dolar mertebesinde — 116 GB'ın 106 GB'ı ücretli, gerisi ücretsiz katmanda.

Kurulum: bucket'tan özel alan adına

R2'yi ayağa kaldırmak yarım saatlik iştir. Sıra önemlidir; özellikle son adım, çoğu rehberin es geçtiği ama üretimde en kritik olanıdır.

1. Bucket oluşturun

Cloudflare panelinde R2 > Create bucket. İki karar verirsiniz ve ikisi de sonradan değiştirilemez:

  • Konum ipucu (location hint): weur (Batı Avrupa), eeur (Doğu Avrupa), enam, wnam, apac, oc. Boş bırakırsanız Cloudflare, isteği yapan tarafa en yakın bölgeyi seçer. Türkiye'den yönetiyorsanız ve kullanıcılarınız da Türkiye'deyse weur ya da eeur makul; ama bunun etkisi sandığınızdan küçüktür, çünkü kullanıcı dosyayı bucket'tan değil kendi şehrindeki Cloudflare düğümünün önbelleğinden alır. Konum ipucu yalnızca önbellek ıskalarının gecikmesini etkiler.
  • Yargı bölgesi (jurisdiction): eu seçerseniz veri AB sınırları içinde tutulur. Kişisel veri işleyen bir mağaza için anlamlı bir tercih olabilir.

Bu ayarlar bucket adına bağlıdır: bucket'ı silip aynı adla yeniden oluştursanız bile eski konum korunur. Yanlış seçtiyseniz tek çare farklı adla yeni bucket açıp veriyi kopyalamaktır.

2. API belirteci üretin

R2 > Manage R2 API Tokens > Create API Token. İzin olarak Object Read & Write yeterlidir; bucket yaratma yetkisi vermeyin. Belirteç oluşturulduğunda size Access Key ID ve Secret Access Key verilir — ikincisi bir daha gösterilmez. Belirteci tek bir bucket'la sınırlandırma seçeneğini kullanın.

3. S3 SDK'sını bağlayın

Uç nokta https://<ACCOUNT_ID>.r2.cloudflarestorage.com biçimindedir. Node.js tarafında üretimde kullandığımız yapılandırmanın sadeleştirilmiş hâli:

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

const r2 = new S3Client({
  region: 'auto',                                   // R2'de bölge yok, 'auto' zorunlu
  endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: process.env.R2_ACCESS_KEY_ID,
    secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
  },
});

await r2.send(new PutObjectCommand({
  Bucket: 'magaza-gorselleri',
  Key: 'tenants/abc123/products/urun-01.webp',
  Body: buffer,
  ContentType: 'image/webp',
  CacheControl: 'public, max-age=31536000, immutable',
}));

region: 'auto' satırını atlamayın. R2'nin bölge kavramı yoktur ama S3 SDK'sı imza üretmek için bir bölge adı ister; boş bırakırsanız imza doğrulama hatası alır ve hatanın nedenini anlamanız uzun sürer.

CacheControl satırı ise yükleme anında yazılmalıdır. Sonradan değiştirmek nesneyi yeniden yazmayı gerektirir. Neden bu kadar önemli olduğu bir sonraki bölümde.

4. Özel alan adı bağlayın — bu adım isteğe bağlı değildir

Bucket'ı herkese açtığınızda Cloudflare size <hash>.r2.dev biçiminde bir adres verir. Bu adres üretim için değildir. Cloudflare'in kendi dokümanı açıkça şunu söylüyor: r2.dev alt alan adları üzerinden genel erişim hız sınırlıdır ve yalnızca geliştirme amaçlı kullanılmalıdır. Yüksek trafikte 429 Too Many Requests alırsınız. Dahası r2.dev'de önbellek yoktur, WAF kuralları çalışmaz, bot yönetimi ve erişim denetimi yoktur.

Doğrusu: R2 > bucket > Settings > Custom Domains üzerinden Cloudflare'de yönettiğiniz bir alan adının alt alanını bağlayın (bizde cdn.mubido.com). Cloudflare CNAME kaydını kendisi oluşturur. Bu andan itibaren dosyalarınız CDN'in, önbelleğin ve güvenlik katmanının arkasındadır.

Bir uyarı daha: r2.dev adresine kendiniz CNAME çekmeyin. Cloudflare bunu desteklenmeyen bir erişim yolu olarak tanımlıyor ve tutarlı performans garantisi vermiyor.

Faturayı asıl düşüren iki ayar

R2'ye geçmek çıkış ücretini sıfırlar. Kalan faturayı da küçültmek isterseniz iş iki ayara bakar ve ikisi de dosyayı yazarken verilen kararlardır.

1. Uzun ömürlü, değişmez önbellek başlığı

Özel alan adı bağladığınızda Cloudflare, R2'nin önüne kendi önbelleğini koyar. Önbellekten karşılanan bir istek bucket'a hiç ulaşmaz — yani Class B işlemi olarak faturalanmaz. Okuma ağırlıklı bir yükte fatura farkı buradan çıkar.

Önbelleğin işini yapabilmesi için ona izin vermeniz gerekir. Biz her nesneyi şu başlıkla yazıyoruz:

Cache-Control: public, max-age=31536000, immutable

Bir yıl, ve immutable: tarayıcıya "bu dosya bir daha asla değişmeyecek, doğrulama isteği bile gönderme" demek. Ürün görselleri için bu doğru bir vaattir — ama yalnızca dosya adları içerikle birlikte değişiyorsa.

2. İçerik-adresli dosya adları

immutable başlığının bedeli şudur: aynı ada sahip dosyanın içeriğini değiştirirseniz, kullanıcıların bir kısmı eski görseli aylarca görür. Önbelleği temizlemek Cloudflare tarafını halleder, kullanıcının tarayıcısındaki kopyayı halletmez.

Çözüm dosya adını içeriğe bağlamaktır: yeni bir sürüm yüklendiğinde yeni bir anahtar üretin (içerik özetinden türetilmiş bir sonek, sürüm numarası ya da yükleme zaman damgası). Eski anahtar ölür, yenisi doğar, önbellek sorunu ortadan kalkar. Silme işlemi R2'de ücretsiz olduğu için eskisini temizlemek size hiçbir şeye mal olmaz.

Bu ikisi birlikte kurulduğunda tipik bir e-ticaret yükünde Class B işlemlerinin büyük bölümü önbellekte karşılanır ve aylık ücretsiz 10 milyonluk sınır fazlasıyla yeter. Kurmazsanız, her görsel isteği bucket'a iner ve trafik büyüdükçe ödediğiniz kalem geri gelir — çıkış ücreti olarak değil, işlem ücreti olarak.

Üretimde çarptığımız duvarlar

Buraya kadarki her şey dokümantasyonda da yazıyor. Bu bölüm yazmayanlar için.

1. Sessizce yerel diske yazan göç betiği

Bizim en pahalı hatamız. Görsel aktarım betiğini komut satırından çalıştırdık; betik .env dosyasını yüklemiyordu, dolayısıyla R2_* değişkenleri boştu. Depolama servisi tasarımı gereği kendini devre dışı bıraktı ve binlerce görseli R2 yerine yerel diske yazdı. Hata vermedi. Çıkış tamamen normal göründü; tek işaret, kimsenin okumadığı bir günlük satırıydı.

Ders şu: bir yedek yola düşme (fallback) davranışı, sessiz olduğu anda hata ayıklanamaz hâle gelir. Geliştirme ortamında diske düşmek doğru davranıştır; üretimde ya da toplu göç betiğinde değildir. Bugün betiklerimiz açılışta R2 depolama aktif: bucket=… satırını arıyor ve göremezse başlamıyor. Aynı tuzak ortam değişkenine bağlı her betik için geçerlidir.

2. Toplu silmede bin anahtar sınırı

DeleteObjects tek çağrıda en fazla 1.000 anahtar kabul eder. Bir mağazayı silerken 40 bin görseli tek listede göndermeye çalışırsanız istek reddedilir. Silme kodunuzu baştan bin'erlik parçalara bölerek yazın — sonradan eklenen bir düzeltme olarak değil.

3. Aynı anahtara saniyede birden fazla yazma

R2, aynı nesne anahtarına saniyede birden fazla eşzamanlı yazmada 429 döner. Paralel bir işleyiciniz aynı dosyayı iki kez üretiyorsa (bizde küçük resim üretiminde oldu) bunu ya kuyruğa alın ya da anahtarları benzersizleştirin.

4. REST API ile S3 API'si aynı şey değil

Cloudflare'in R2 REST API'si beş dakikada 1.200 istekle sınırlıdır. Bu sınır bucket yönetimi içindir; dosya okuyup yazmak için değil. Yüksek hacimli iş yükünde S3 uyumlu API'yi ya da Workers bağlamasını kullanın. İkisi bu sınıra tabi değildir.

5. Listeleme pahalı sınıftadır

Yukarıda değinmiştik, tekrar etmeye değer: ListObjectsV2 Class A'dır. Bucket'ı envanter kaynağı olarak kullanmayın. Hangi dosyanın var olduğunu veritabanınız bilmeli; R2 yalnızca içeriği tutmalı. Bu ayrıca "dosya var mı?" kontrolünü HeadObject (Class B) ile yapmanızı sağlar, listeleme ile değil.

6. Bölge ve yargı bölgesi kararı kalıcıdır

Bucket yaratılırken verilen konum ipucu ve yargı bölgesi sonradan değiştirilemez. Üstelik konum ipucu bucket adına bağlıdır: silip aynı adla yeniden oluşturmak eski konumu geri getirir. Test amaçlı açtığınız bucket'ı üretime terfi ettirmeyin; üretim bucket'ını bilinçli bir isim ve bilinçli bir konumla ayrıca açın.

7. Herkese açık bucket, önbelleğe alınmış bucket demek değildir

Bucket'ı public yapmak dosyaları erişilebilir kılar ama önbelleğe almaz. Önbellek, ancak bir özel alan adı bağladığınızda devreye girer. Bu ayrımı kaçıran ekipler "R2 yavaş" sonucuna varıyor; yavaş olan R2 değil, önbelleksiz her isteğin bucket'a inmesi.

8. Çok parçalı yüklemede parça boyutu tutarlı olmalı

Büyük dosyalarda parçaların tümü (sonuncusu hariç) aynı boyutta olmalıdır ve en fazla 10.000 parça gönderebilirsiniz. 5 GB üzeri tek dosyalar için çok parçalı yükleme zorunludur — tek parça sınırı 5 GiB'dir.

R2 mi, S3 mi, Backblaze B2 mi, MinIO mu?

Sorunun doğru cevabı iş yükünüze bağlı. Dört seçeneğin dürüst karşılaştırması:

Cloudflare R2Amazon S3Backblaze B2MinIO (kendi sunucunuz)
Depolama (GB-ay)0,015 $0,023 $0,006 $Disk maliyetiniz
İnternete çıkışÜcretsiz0,09 $/GBDepolamanın 3 katına kadar ücretsiz, Cloudflare üzerinden tamamen ücretsizSunucu trafik kotanız
CDNDahilAyrı (CloudFront)AyrıAyrı
EkosistemSınırlıEn genişOrtaS3 uyumlu, gerisi size ait
İşletme yüküYokYokYokTamamen sizde

Hangi durumda hangisi

  • R2: trafiğin yüksek, verinin orta ölçekli olduğu her iş. Görsel servisi, video, statik varlıklar, herkese açık dosyalar. E-ticaret bunun tam ortasında: 116 GB veri, terabaytlarca trafik.
  • S3: zaten AWS içinde yaşayan, Lambda tetikleyicileri, Glacier arşivleme, cross-region replication, Athena sorguları gibi derin AWS entegrasyonlarına bağlı sistemler. Verinin AWS içinde kalıp dışarı çıkmadığı iş yüklerinde çıkış ücreti zaten sorun değildir.
  • Backblaze B2: depolama maliyetinin baskın olduğu, trafiğin düşük olduğu senaryolar — yedekler, medya arşivleri, uzun süreli saklama. GB başına en ucuzu. Cloudflare Bandwidth Alliance sayesinde Cloudflare üzerinden servis ettiğinizde çıkış da ücretsiz.
  • MinIO: verinin fiziksel olarak sizde kalması gerekiyorsa ya da zaten boşta duran disk kapasiteniz varsa. Türkiye'de bu seçenek çok aranıyor ve bir noktada haklı olarak: aylık 2 dolarlık bir faturayı kendi sunucunuza kurarak da geçebilirsiniz. Ama karşılaştırmayı dürüst yapın — MinIO'da dayanıklılık, çoğaltma, yedek ve olağanüstü durum senaryosu sizin işiniz. Tek diskte duran görsel arşivi ucuz değil, sadece faturasız. R2'nin 116 GB için istediği aylık iki dolar, bir diski üç kopya hâlinde saklama işini üstlenmesinin ücretidir.

Pratikte çoğu ekibin doğru cevabı karışımdır: sıcak ve herkese açık dosyalar R2'de, soğuk arşiv B2'de, veritabanı yedekleri kendi kontrolünüzdeki bir depoda.

R2'nin sınırları ve yapamadıkları

Bir aracı seçerken ne yaptığı kadar ne yapmadığı da önemlidir. R2'nin sert sınırları:

SınırDeğer
Azami nesne boyutu~4,995 TiB
Tek parça yükleme~4,995 GiB
Çok parçalı yüklemede parça sayısı10.000
Nesne anahtarı uzunluğu1.024 bayt
Nesne meta verisi8.192 bayt
Hesap başına bucket1.000.000
Bucket başına özel alan adı100
Aynı anahtara eşzamanlı yazmaSaniyede 1
REST API hız sınırı5 dakikada 1.200 istek

Bucket başına veri ve nesne sayısında sınır yok; 500 binlik nesne sayımız R2 için küçük bir rakam.

Ekosistem tarafında eksikler daha belirleyici. R2, S3'ün sunduğu bazı kurumsal özelliklerin karşılığını vermez ya da farklı şekilde verir: nesne kilitleme ve WORM uyumluluk senaryoları, çok bölgeli otomatik çoğaltma, S3 Select benzeri sorgu, Glacier seviyesinde derin arşiv katmanları. Buna karşılık R2'nin S3'te olmayan tarafları da var: bucket'a Workers üzerinden kod bağlayabilmek, olay bildirimlerini doğrudan Cloudflare Queues'a akıtabilmek ve R2 Data Catalog ile bucket'ı yönetilen bir Apache Iceberg kataloğu hâline getirip Spark, DuckDB gibi motorlarla sorgulayabilmek.

Veri nerede duruyor?

Türkiye'den çalışan bir ekip için tekrar eden soru. R2'de veri, bucket yaratılırken seçtiğiniz bölgede durur; eu yargı bölgesini seçerseniz AB sınırları içinde kalır. Kullanıcıya ise en yakın Cloudflare düğümünden servis edilir — İstanbul dahil.

E-ticarette ürün görseli mimarisi

Buraya kadarki her şey herhangi bir uygulama için geçerli. E-ticarete özel birkaç not, çünkü ürün görselleri kendine has bir yük profiline sahip: çok sayıda dosya, düşük değişim oranı, yüksek okuma trafiği ve pazaryerlerinden gelen dış bağımlılıklar.

Görselleri kendinize indirin

Ürünlerinizi bir pazaryerinden aktarıyorsanız, görsel URL'lerini olduğu gibi kaydetme cazibesine kapılmayın. Pazaryeri CDN'leri bot trafiğini agresif biçimde engeller; bizde Trendyol CDN'i belirli istemcilere bağlantı bile açmıyordu. Sitenizde görsel görünürken Meta kataloğunuzda ve ürün beslemelerinizde görselsiz kalırsınız — bunu 122 besleme kaleminde canlı olarak yaşadık. Çözüm: içe aktarma anında görseli indirin, kendi formatınıza dönüştürün, kendi deponuza yazın. R2'de çıkış ücreti olmadığı için bu kararın trafik maliyeti sıfırdır.

Türevleri yükleme anında üretin

Her görsel için WebP (web), JPEG (pazaryeri beslemeleri, JPEG dışını kabul etmeyen kanallar) ve küçük resim üretip üçünü de aynı anda yazın. İstek anında yeniden boyutlandırma yapan bir mimari, R2'nin ucuzluğunu işlem ücretiyle ve gecikmeyle geri alır.

Anahtar düzenini mağaza bazlı kurun

Çok mağazalı bir yapıda anahtarı tenants/<mağaza>/products/<dosya> gibi kurmak, bir mağazayı taşımayı, arşivlemeyi ya da silmeyi tek bir ön ek işine indirger. Düz bir havuza yazarsanız, mağaza ayrılırken hangi dosyanın kime ait olduğunu bulmak için veritabanını taramak zorunda kalırsınız.

Silmeyi cesurca kullanın

R2'de silme işlemi ücretsizdir. Yayından kalkan ürünlerin görsellerini, artık kullanılmayan türevleri, iptal edilen kampanya banner'larını temizlemek size hiçbir şeye mal olmaz — sadece depolama kalemini düşürür. Aynı işlemi S3'te yapmak da ücretsizdir, ama orada gereken listeleme çağrıları ücretlidir.

Cloudflare R2 hakkında sık sorulanlar

Cloudflare R2 gerçekten ücretsiz mi?

Çıkış (egress) ücreti gerçekten yok ve bunun bir kotası da yok. Ücretsiz olan diğer kalemler ise aylık katmanlardır: 10 GB depolama, 1 milyon Class A ve 10 milyon Class B işlemi. Bunların üzerinde depolama için GB-ay başına 0,015 $, işlemler için sırasıyla milyon başına 4,50 $ ve 0,36 $ ödersiniz. 116 GB'lık kataloğumuzun aylık depolama maliyeti yaklaşık 1,6 dolar.

S3 kullanan uygulamamı R2'ye taşımak için kodu değiştirmem gerekir mi?

Pratikte üç satır: uç noktayı <ACCOUNT_ID>.r2.cloudflarestorage.com olarak ayarlamak, R2 API belirtecini vermek ve bölgeyi 'auto' yapmak. Nesne okuma, yazma, silme, çok parçalı yükleme ve imzalı URL üretimi aynı S3 komutlarıyla çalışır. Değişiklik gerektiren yerler S3'e özgü servislerdir: Lambda tetikleyicileri, Glacier yaşam döngüleri, S3 Select gibi.

R2'de verim hangi ülkede tutulur?

Bucket'ı oluştururken seçtiğiniz bölgede. Konum ipucu olarak Batı Avrupa, Doğu Avrupa, Kuzey Amerika, Asya-Pasifik ve Okyanusya seçilebilir; ayrıca 'eu' yargı bölgesini seçerek verinin AB sınırları içinde kalmasını zorunlu kılabilirsiniz. Bu tercih bucket oluşturulduktan sonra değiştirilemez.

Özel alan adı bağlamak zorunlu mu?

Teknik olarak hayır, pratikte evet. Cloudflare'in verdiği r2.dev adresi hız sınırlıdır ve dokümantasyonda yalnızca geliştirme amaçlı olduğu belirtilir; önbellek, WAF, bot yönetimi ve erişim denetimi bu adres üzerinden çalışmaz. Üretimde bucket'a kendi alt alan adınızı bağlayın.

R2 faturası beklenmedik şekilde nasıl büyür?

Neredeyse her zaman işlem sayısından. En sık iki sebep: önbellek başlığı verilmediği için her görsel isteğinin bucket'a inmesi (Class B) ve bucket'ı envanter için düzenli olarak listelemek (Class A, pahalı sınıf). Uzun ömürlü Cache-Control başlığı ve dosya listesini veritabanında tutmak bu iki kalemi de büyük ölçüde sıfırlar.

Kendi sunucuma MinIO kurmak daha ucuz olmaz mı?

Fatura satırı olarak evet, toplam maliyet olarak çoğu zaman hayır. MinIO'da dayanıklılık, çoğaltma, yedekleme ve olağanüstü durum senaryosu sizin sorumluluğunuzdadır. Tek sunucuda duran bir görsel arşivi ucuz değil, sadece faturasızdır. Verinin fiziksel olarak sizde kalması bir gereklilikse ya da halihazırda yönettiğiniz bir depolama kümesi varsa MinIO doğru tercihtir.

R2'den geri dönebilir miyim?

Evet. R2 S3 uyumlu olduğu için veriyi rclone gibi standart araçlarla başka bir S3 uyumlu depoya kopyalayabilirsiniz ve R2 çıkış ücreti almadığı için bu kopyalama aktarım maliyeti doğurmaz. Geçişi baştan geri dönülebilir kurgulamak — anahtar düzenini kaynakla aynı tutmak ve okuma sırasını yedekli yazmak — bu ihtimali ucuz tutar.

Operasyonu Mubido'ya bırakın.
Satışa odaklanın.

Kurulumda ekibimiz yanınızda — pazaryeri bağlantısı ve mağaza kasası ilk gün içinde hazır.

1. Gün entegrasyon Kurulum desteği 7/24 Türkçe destek