# 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: ```env # 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 ```bash 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 ```bash curl -X GET https://image.beyhano.com.tr/api/images \ -H "Authorization: Bearer YOUR_TOKEN" ``` ### 3. Resim Silme Testi ```bash 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