143 lines
4.2 KiB
Markdown
143 lines
4.2 KiB
Markdown
# 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
|