first commit

This commit is contained in:
Beyhan Oğur
2026-04-26 22:11:03 +03:00
commit 031582ea2c
98 changed files with 13281 additions and 0 deletions

142
R2_MIGRATION.md Normal file
View File

@@ -0,0 +1,142 @@
# 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