Files
image-apiv3/R2_MIGRATION.md
Beyhan Oğur 031582ea2c first commit
2026-04-26 22:11:03 +03:00

4.2 KiB
Raw Permalink Blame History

Cloudflare R2 Storage Entegrasyonu

Bu proje, resim depolamasını yerel dosya sisteminden Cloudflare R2'ye taşımak için güncellenmiştir.

Yapılan Değişiklikler

1. Yeni Kütüphane

  • @aws-sdk/client-s3 eklendi (Cloudflare R2, S3-uyumlu API kullanır)

2. Yeni Dosyalar

  • app/lib/r2-storage.ts: R2 storage işlemleri için yardımcı fonksiyonlar
    • uploadToR2(): Resim yükleme
    • deleteFromR2(): Resim silme
    • getContentType(): Dosya türü belirleme

3. Güncellenen Dosyalar

API Routes (Upload)

  • app/api/images/upload/route.ts
  • app/api/v1/images/upload/route.ts

Değişiklikler:

  • Yerel dosya sistemi yerine R2'ye yükleme
  • writeFile ve mkdir kaldırıldı
  • uploadToR2() kullanılıyor
  • URL'ler artık tam R2 URL'leri olarak kaydediliyor

API Routes (List)

  • app/api/images/route.ts
  • app/api/v1/images/route.ts

Değişiklikler:

  • Base URL ekleme kaldırıldı (R2 URL'leri zaten tam URL)
  • Direkt olarak veritabanından gelen URL döndürülüyor

API Routes (Delete)

  • app/api/images/[id]/route.ts
  • app/api/v1/images/[id]/route.ts

Değişiklikler:

  • Yerel dosya silme yerine R2'den silme
  • unlink yerine deleteFromR2() kullanılıyor

4. Environment Variables

.env, .env.local ve .env.example dosyalarına eklenen değişkenler:

# Cloudflare R2 Storage (Europa Server)
R2_ACCOUNT_ID=4f3dc7a1aa54f4ba52803e952d6cf6be
R2_ACCESS_KEY_ID=177784973745076ce943e02b267cf139
R2_SECRET_ACCESS_KEY=9fcf11d84de480e0bee89f23703c655582c0b0035bcaee828ef0fe187b0d4b63
R2_BUCKET_NAME=resimlerim
R2_PUBLIC_URL=https://images.beyhano.com.tr

Not: Europa server endpoint'i kullanılıyor: https://{ACCOUNT_ID}.eu.r2.cloudflarestorage.com

R2 Bucket Yapılandırması

Gerekli Ayarlar

  1. Bucket Oluşturma:

    • Cloudflare Dashboard > R2 > Create Bucket
    • Bucket adı: images (veya .env'de belirtilen)
    • Location: Europa
  2. Public Access:

    • Bucket Settings > Public Access
    • Custom Domain ekleyin: images.beyhano.com.tr
    • CORS ayarlarını yapılandırın (gerekirse)
  3. API Token:

    • R2 > Manage R2 API Tokens
    • Create API Token
    • Permissions: Object Read & Write
    • Token bilgilerini .env'e ekleyin

Avantajlar

  1. Ölçeklenebilirlik: Sınırsız depolama kapasitesi
  2. Performans: CDN entegrasyonu ile hızlı erişim
  3. Maliyet: Egress ücreti yok (Cloudflare CDN üzerinden)
  4. Güvenilirlik: Otomatik yedekleme ve dayanıklılık
  5. Bakım: Sunucu disk alanı yönetimi gerekmez

Geriye Dönük Uyumluluk

Mevcut sistemde public/uploads/ klasöründe bulunan resimler için:

  1. Manuel Migrasyon: Mevcut resimleri R2'ye yükleyin
  2. Veritabanı Güncelleme: images tablosundaki url ve filePath alanlarını güncelleyin
  3. Eski Dosyalar: Migrasyon sonrası eski dosyaları silebilirsiniz

Test Etme

1. Resim Yükleme Testi

curl -X POST https://image.beyhano.com.tr/api/images/upload \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "file=@test-image.jpg" \
  -F "width=800" \
  -F "height=600" \
  -F "quality=90" \
  -F "format=jpeg"

2. Resim Listeleme Testi

curl -X GET https://image.beyhano.com.tr/api/images \
  -H "Authorization: Bearer YOUR_TOKEN"

3. Resim Silme Testi

curl -X DELETE https://image.beyhano.com.tr/api/images/IMAGE_ID \
  -H "Authorization: Bearer YOUR_TOKEN"

Sorun Giderme

R2 Bağlantı Hatası

  • Environment variables'ların doğru olduğundan emin olun
  • R2 API Token'ın aktif olduğunu kontrol edin
  • Bucket adının doğru olduğunu kontrol edin

Upload Hatası

  • Dosya boyutunun 10MB'ın altında olduğundan emin olun
  • Content-Type'ın doğru ayarlandığını kontrol edin
  • R2 bucket'ın write permission'a sahip olduğunu kontrol edin

URL Erişim Hatası

  • Custom domain'in doğru yapılandırıldığından emin olun
  • Public access ayarlarını kontrol edin
  • DNS kayıtlarının doğru olduğunu kontrol edin

Önemli Notlar

  1. Güvenlik: API credentials'ları asla commit etmeyin
  2. Backup: Kritik resimlerin yedeğini alın
  3. Monitoring: R2 kullanım metriklerini takip edin
  4. Rate Limiting: R2 API rate limitlerini göz önünde bulundurun