191 lines
5.1 KiB
Markdown
191 lines
5.1 KiB
Markdown
# 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
|