# Cloudflare R2 Kurulum Kontrol Listesi ## ✅ Tamamlanan Adımlar ### 1. Kod Değişiklikleri - [x] AWS SDK (@aws-sdk/client-s3) kuruldu - [x] R2 storage servisi oluşturuldu (app/lib/r2-storage.ts) - [x] Upload endpoint'leri güncellendi (hem /api hem /api/v1) - [x] List endpoint'leri güncellendi (R2 URL'leri kullanıyor) - [x] Delete endpoint'leri güncellendi (R2'den silme) - [x] Environment variables eklendi (.env, .env.local, .env.example) - [x] Yerel dosya sistemi referansları kaldırıldı - [x] Linter hataları temizlendi ### 2. Yapılandırma - [x] Europa server endpoint yapılandırıldı - [x] R2 credentials .env dosyalarına eklendi - [x] Bucket name: `resimlerim` - [x] Public URL: `https://images.beyhano.com.tr` ## 📋 Yapılması Gerekenler (Cloudflare Dashboard) ### 1. R2 Bucket Kontrolü - [ ] Cloudflare Dashboard'a giriş yapın - [ ] R2 > Buckets bölümüne gidin - [ ] `resimlerim` adında bucket olduğunu kontrol edin - [ ] Bucket location'ın Europa (EEUR) olduğunu doğrulayın ### 2. Public Access Ayarları - [ ] Bucket > Settings > Public Access - [ ] Custom Domain ekleyin: `images.beyhano.com.tr` - [ ] DNS kayıtlarını yapılandırın (CNAME veya A record) - [ ] SSL/TLS sertifikasının aktif olduğunu kontrol edin ### 3. CORS Ayarları (Gerekirse) Eğer frontend'den direkt R2'ye erişim gerekiyorsa: ```json [ { "AllowedOrigins": ["https://image.beyhano.com.tr"], "AllowedMethods": ["GET", "HEAD"], "AllowedHeaders": ["*"], "MaxAgeSeconds": 3600 } ] ``` ### 4. API Token Kontrolü - [ ] R2 > Manage R2 API Tokens - [ ] Token'ın aktif olduğunu kontrol edin - [ ] Permissions: Object Read & Write - [ ] Token bilgilerinin .env'de doğru olduğunu doğrulayın ## 🧪 Test Adımları ### 1. Yerel Test (Development) ```bash # Sunucuyu başlat yarn dev # Test resmi yükle curl -X POST http://localhost:3000/api/images/upload \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@test-image.jpg" \ -F "width=800" \ -F "height=600" ``` ### 2. Production Test ```bash # Test resmi yükle curl -X POST https://image.beyhano.com.tr/api/images/upload \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@test-image.jpg" # Resimleri listele curl -X GET https://image.beyhano.com.tr/api/images \ -H "Authorization: Bearer YOUR_TOKEN" # Resmi tarayıcıda aç (dönen URL'yi kullan) # Örnek: https://images.beyhano.com.tr/abc123.jpg ``` ### 3. Kontrol Edilecekler - [ ] Resim başarıyla yükleniyor - [ ] R2 bucket'ta resim görünüyor - [ ] Public URL üzerinden resme erişilebiliyor - [ ] Resim listesi doğru URL'leri döndürüyor - [ ] Resim silme işlemi çalışıyor - [ ] Resim manipülasyonu (resize, format) çalışıyor ## 🔄 Mevcut Resimlerin Migrasyonu (Opsiyonel) Eğer `public/uploads/` klasöründe mevcut resimler varsa: ### 1. Resimleri R2'ye Yükle ```bash # AWS CLI veya rclone kullanarak toplu yükleme # Örnek: rclone sync public/uploads/ r2:resimlerim/ ``` ### 2. Veritabanını Güncelle ```sql -- Eski URL'leri yeni R2 URL'leriyle değiştir UPDATE images SET url = CONCAT('https://images.beyhano.com.tr/', fileName), filePath = fileName WHERE url LIKE '/uploads/%'; ``` ### 3. Eski Dosyaları Temizle ```bash # Migrasyon başarılı olduktan sonra rm -rf public/uploads/* ``` ## 🚨 Sorun Giderme ### R2 Bağlantı Hatası ``` Error: R2'ye yükleme başarısız ``` **Çözüm:** - Environment variables'ları kontrol edin - R2 API Token'ın aktif olduğunu doğrulayın - Account ID'nin doğru olduğunu kontrol edin ### Public URL Erişim Hatası ``` 403 Forbidden veya 404 Not Found ``` **Çözüm:** - Custom domain yapılandırmasını kontrol edin - Public access ayarlarını kontrol edin - DNS propagation'ı bekleyin (24 saat) ### Upload Başarılı Ama Resim Görünmüyor **Çözüm:** - Browser cache'i temizleyin - R2 bucket'ta dosyanın var olduğunu kontrol edin - Content-Type header'ının doğru olduğunu kontrol edin ## 📊 Monitoring ### Cloudflare Dashboard - R2 > Analytics - Storage kullanımı - Request sayısı - Bandwidth kullanımı ### Önemli Metrikler - Upload success rate - Average response time - Error rate - Storage growth ## 🔒 Güvenlik Notları 1. **API Credentials:** - Asla commit etmeyin - Production'da environment variables kullanın - Düzenli olarak rotate edin 2. **Public Access:** - Sadece gerekli dosyalar public olsun - Rate limiting uygulayın - Hotlink protection düşünün 3. **Backup:** - Kritik resimlerin yedeğini alın - Versioning'i etkinleştirin (R2 settings) - Disaster recovery planı oluşturun ## 📝 Notlar - R2 egress ücreti yoktur (Cloudflare CDN üzerinden) - Storage maliyeti: ~$0.015/GB/ay - Class A operations: $4.50/million (PUT, LIST) - Class B operations: $0.36/million (GET, HEAD) - Europa server kullanıldığı için GDPR uyumlu ## ✅ Son Kontrol Deployment öncesi: - [ ] Tüm environment variables production'da ayarlandı - [ ] R2 bucket ve custom domain yapılandırıldı - [ ] Test upload/download/delete çalışıyor - [ ] Monitoring ve alerting kuruldu - [ ] Backup stratejisi belirlendi - [ ] Documentation güncellendi