Muzibu.com → Bunny CDN + Storage Zone
Tam Teknik Dokümantasyon v2
Muzibu.com müzik platformunun ses dosyalarını Cloudflare'den Bunny.net altyapısına taşımak. Bu geçiş ile daha iyi performans, maliyet tasarrufu ve gelişmiş güvenlik hedefleniyor.
| Servis | İsim | URL / ID | Açıklama |
|---|---|---|---|
| Storage Zone | muzibu-audio |
Frankfurt (de) | Ses dosyalarının depolandığı yer |
| Pull Zone (Audio) | muzibu-audio-cdn |
https://muzibu-audio-cdn.b-cdn.net | Ses dosyaları için CDN |
| Pull Zone (Web) | muzibuweb |
https://cdn.muzibu.com | Website asset'leri için CDN |
| Perma-Cache Zone | muzibu-perma-cache |
Frankfurt + London + Stockholm | Kalıcı SSD cache storage |
| Shield | Advanced |
muzibuweb pull zone | WAF + DDoS + Rate Limiting |
muzibu-audio/
├── hls/
│ ├── {song_id}/
│ │ ├── master.m3u8 # Ana playlist
│ │ ├── ultralow/ # 32kbps
│ │ │ ├── playlist.m3u8
│ │ │ └── segment_*.ts
│ │ ├── low/ # 64kbps
│ │ ├── mid/ # 128kbps
│ │ └── high/ # Orijinal kalite
│ └── ...
├── mp3_64/
│ └── {song_id}.mp3 # 64kbps MP3
├── mp3_128/
│ └── {song_id}.mp3 # 128kbps MP3
└── songs/
└── original/
└── {song_id}.mp3 # Orijinal MP3
enc.bin (AES-128 key) dosyaları ASLA Bunny'ye yüklenmez!
Bu dosyalar her zaman local sunucudan serve edilir. HLS player key'i local'dan alır, segment'leri Bunny'den alır.
/storage/tenant1001/app/public/muzibu/hls/{song_id}/enc.bin
Redis, hafızada çalışan süper hızlı bir veritabanıdır. Şöyle düşünün:
Senaryo: Kullanıcı şarkı #12345'i dinlemek istiyor.
Sistem "Bu şarkı Bunny'de var mı?" diye sorar → Redis anında cevap verir (evet/hayır) → Varsa Bunny'den, yoksa local'dan çalınır.
Yeni şarkı yüklenince güncellenmez, silinen şarkılar hâlâ "var" görünür.
Şarkı yüklenince anında eklenir, silinince anında çıkarılır. Her zaman güncel!
bunny:uploaded_songs → Redis SET (şarkı ID'leri)
├── 12345 → Şarkı #12345 Bunny'de
├── 12346 → Şarkı #12346 Bunny'de
└── ... → (33,000+ kayıt)
// Şarkı Bunny'ye yüklenince:
Redis::sadd('bunny:uploaded_songs', $songId);
// Şarkı silinince:
Redis::srem('bunny:uploaded_songs', $songId);
// Kontrol (O(1) - anlık):
$onBunny = Redis::sismember('bunny:uploaded_songs', $songId);
| Yöntem | Hız | 33,000 şarkı için |
|---|---|---|
| HTTP HEAD (Bunny API) | ~50ms | ~27 dakika |
| Cache Dosyası (array) | ~1ms | Tek seferlik yükleme |
| Redis SISMEMBER | ~0.1ms | Her zaman güncel! |
Upload/delete anında Redis'e yansır
33K şarkıda bile aynı hız
Server restart'ta veri kaybolmaz
Zaten Redis kullanıyoruz (session, cache)
/tmp/bunny-existing-hls.txt → Redis SET (bir kerelik)
Yükleme sonrası otomatik: Redis::sadd()
Silme sonrası otomatik: Redis::srem()
URL oluştururken: Bunny'de var → CDN URL, yok → Local URL
"Hybrid" = Karışık demek. Şarkılar iki yerden sunulabilir:
Hızlı, dünya genelinde edge sunucular
Migration tamamlanan şarkılar buradan
Mevcut sunucu (fallback)
Henüz migrate edilmemiş şarkılar + enc.bin
HLS şifreleme anahtarı her zaman local sunucudan gelir:
Güvenlik: Key asla CDN'de tutulmaz. Player key'i alır, segment'leri indirir, client-side decrypt yapar.
Storage Zone: muzibu-audio
Region: Frankfurt (de)
Replication: Yok (tek bölge)
Pull Zone: muzibu-audio-cdn
URL: https://muzibu-audio-cdn.b-cdn.net
Origin: Storage Zone (muzibu-audio)
SafeHop: Origin bağlantı hatalarında otomatik retry
Pull Zone: muzibuweb
Aktivasyon: Bunny Panel → Pull Zone → General → SafeHop → Enable
Karar: Origin Shield yerine Perma-Cache tercih edildi (daha hızlı)
Storage Zone: muzibu-perma-cache
Replication: Frankfurt + London + Stockholm
Origin Shield ve Perma-Cache birlikte kullanılamaz. Perma-Cache = kalıcı SSD cache, dosyalar hiç expire olmaz. Origin'e daha az istek = daha hızlı.
Plan: Advanced ($9.5/ay)
Pull Zone: muzibuweb (sadece web, audio CDN'de yok)
Özellikler:
WAF Learning Mode: 7 gün (22-29 Mart 2026)
Yüklenen: 33,110 / 33,112
Konum: songs/original/{song_id}.mp3
Komut: php artisan muzibu:migrate-originals --all
Not: Orijinal MP3'ler farklı path formatlarında olabilir:
SONG_*.mp3, song_*.mp3, veya nested path
İptal tarihi: 14 Nisan 2026
Cloudflare Pro: $25/ay → İptal
Cloudflare Argo: $5/ay → İptal
Toplam tasarruf: $30/ay
CDN Cache: %100 HIT
Edge Location: Turkey PoP (TR1-942)
Perma-Cache: Aktif ve çalışıyor
Her şarkı için yüklenen dosyalar:
hls/{song_id}/master.m3u8hls/{song_id}/ultralow/playlist.m3u8 + segment_*.tshls/{song_id}/low/playlist.m3u8 + segment_*.tshls/{song_id}/mid/playlist.m3u8 + segment_*.tshls/{song_id}/high/playlist.m3u8 + segment_*.tsmp3_64/{song_id}.mp3mp3_128/{song_id}.mp3enc.bin YÜKLENMİYOR! (şifreleme key'i local'da kalır)
watch -n 10 /tmp/bunny-status.sh
Migration bitmeden önce yapılabilir - fallback zaten çalışıyor.
Değişiklik yapılacak dosyalar:
BunnyStorageService.php
(+2 satır)
// uploadSong() sonuna:
Redis::sadd('bunny:uploaded_songs', $songId);
// deleteSong() sonuna:
Redis::srem('bunny:uploaded_songs', $songId);
SignedUrlService.php
(+5-10 satır)
// generateAudioCdnUrl() içinde:
$onBunny = Redis::sismember('bunny:uploaded_songs', $songId);
if ($onBunny) {
return config('bunny.storage_cdn_url') . "/hls/{$songId}/master.m3u8";
}
return "/audio/songs/{$songId}/hls/master.m3u8"; // fallback
İlk kurulum: php /tmp/import-cache-to-redis.php ile mevcut cache Redis'e aktarılır
Player'ın HLS ve MP3 dosyalarını Bunny CDN'den alması sağlanmalı.
Kontrol edilecek dosyalar:
public/themes/muzibu/js/player/ içindeki player dosyalarıRedis implementasyonu sonrası otomatik çalışacak
Test edilmesi gereken senaryolar:
14 Nisan 2026'da Cloudflare Pro bitince:
Bunny Shield 7 gün Learning Mode'da çalışacak.
29 Mart'ta yapılacaklar:
Şu an: BUNNY_STORAGE_MODE=hybrid
Anlamı: Dosya Bunny'de yoksa local'dan serve et
Migration %100 tamamlandıktan sonra:
hybrid modda kalabilir (güvenli, fallback var)bunny moduna geçilebilir (sadece Bunny)Öneri: Test tamamlanana kadar hybrid modda kal
# BUNNY CDN CONFIGURATION (Pull Zone - Website)
BUNNY_CDN_ENABLED=false
BUNNY_CDN_URL=https://cdn.muzibu.com
BUNNY_CDN_TOKEN_KEY=646b6c86-af40-4660-a8b1-e060eb248c36
BUNNY_CDN_ZONE_ID=5347238
# BUNNY STORAGE ZONE (Audio Files)
BUNNY_STORAGE_ENABLED=true
BUNNY_STORAGE_API_KEY=b9edcf9f-7707-4baf-87ee55fec79a-e7d7-4efe
BUNNY_STORAGE_ZONE=muzibu-audio
BUNNY_STORAGE_REGION=de
BUNNY_STORAGE_CDN_URL=https://muzibu-audio-cdn.b-cdn.net
BUNNY_STORAGE_MODE=hybrid
BUNNY_FALLBACK_TO_LOCAL=true
# REDIS (Mevcut - değişiklik yok)
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
| Mod | Açıklama | Kullanım |
|---|---|---|
local |
Sadece local sunucudan serve et | Bunny'ye geçmeden önce |
hybrid |
Önce Bunny, yoksa local (fallback) | Şu anki mod (önerilen) |
bunny |
Sadece Bunny'den serve et | Migration %100 tamamlandıktan sonra |
app/Services/Bunny/BunnyStorageService.php
Ana Bunny servis sınıfı - upload, exists, getUrl, Redis işlemleri
app/Services/SignedUrlService.php
URL oluşturucu - Redis kontrolü ile hybrid serving
app/Console/Commands/MigrateToBunnyCommand.php
HLS + MP3 migration komutu
app/Console/Commands/MigrateOriginalsToBunnyCommand.php
Sadece orijinal MP3'leri yükleyen komut
# Tüm şarkıları migrate et
php artisan muzibu:migrate-to-bunny --all
# Belirli ID aralığı
php artisan muzibu:migrate-to-bunny --from=1 --to=1000
# Tek şarkı
php artisan muzibu:migrate-to-bunny --song=12345
# Skip existing (cache dosyası ile hızlı)
php artisan muzibu:migrate-to-bunny --all --skip-existing --cache-file=/tmp/bunny-existing-hls.txt
# Test modu (yüklemez)
php artisan muzibu:migrate-to-bunny --all --dry-run
# Sadece orijinal MP3'ler
php artisan muzibu:migrate-originals --all --skip-existing
# Timeout limitsiz worker başlat
nohup /opt/plesk/php/8.3/bin/php -d max_execution_time=0 \
artisan muzibu:migrate-to-bunny --from=1 --to=10000 \
--skip-existing --cache-file=/tmp/bunny-existing-hls.txt \
> /tmp/bunny-worker1.log 2>&1 &
# Mevcut cache'i Redis'e aktar (bir kerelik)
php /tmp/import-cache-to-redis.php
# Redis'teki şarkı sayısını kontrol et
redis-cli SCARD bunny:uploaded_songs
# Belirli şarkının Bunny'de olup olmadığını kontrol et
redis-cli SISMEMBER bunny:uploaded_songs 12345
# Tüm şarkı ID'lerini listele (dikkat: çok çıktı!)
redis-cli SMEMBERS bunny:uploaded_songs | head -20
# Bunny'deki mevcut HLS klasörlerini listele
php /tmp/fetch-bunny-list.php
# Sonuç:
# /tmp/bunny-existing-hls.txt - HLS klasör ID'leri
# /tmp/bunny-existing-mp3.txt - MP3 dosya ID'leri
# Canlı takip (her 10 saniye)
watch -n 10 /tmp/bunny-status.sh
# Manuel kontrol
for i in 1 2 3 4 5 6 7 8; do
echo "W$i: $(tail -1 /tmp/bunny-worker$i.log | grep -oE '[0-9]+/[0-9]+.*%')"
done
# Çalışan worker sayısı
ps aux | grep "migrate-to-bunny" | grep -v grep | wc -l
# Worker'ları durdur
pkill -f "migrate-to-bunny"
# Laravel cache
php artisan cache:clear && php artisan view:clear && \
php artisan config:clear && php artisan route:clear && \
php artisan responsecache:clear
# Bunny cache (Perma-Cache kullanılıyorsa)
# Panel: Pull Zones → muzibuweb → Caching → Purge All
/var/www/vhosts/muzibu.com/httpdocs/
├── storage/
│ └── tenant1001/
│ └── app/public/muzibu/
│ ├── hls/
│ │ └── {song_id}/
│ │ ├── master.m3u8
│ │ ├── enc.bin ← SADECE LOCAL!
│ │ ├── ultralow/
│ │ ├── low/
│ │ ├── mid/
│ │ └── high/
│ ├── songs/
│ │ └── {file_path} ← Orijinal MP3
│ ├── mp3_64/
│ │ └── {song_id}.mp3
│ └── mp3_128/
│ └── {song_id}.mp3
├── app/Services/Bunny/
│ └── BunnyStorageService.php
├── app/Services/
│ └── SignedUrlService.php ← Redis kontrolü
└── app/Console/Commands/
├── MigrateToBunnyCommand.php
└── MigrateOriginalsToBunnyCommand.php
muzibu-audio/ (Storage Zone)
├── hls/
│ └── {song_id}/
│ ├── master.m3u8
│ ├── ultralow/
│ │ ├── playlist.m3u8
│ │ └── segment_*.ts
│ ├── low/
│ ├── mid/
│ └── high/
│ (enc.bin YOK!)
├── mp3_64/
│ └── {song_id}.mp3
├── mp3_128/
│ └── {song_id}.mp3
└── songs/
└── original/
└── {song_id}.mp3
Redis:
└── bunny:uploaded_songs (SET)
├── 12345
├── 12346
└── ... (33,000+ kayıt)
Not: Bunny bandwidth maliyeti kullanıma göre değişir, ancak Cloudflare'den ucuz olması bekleniyor.
HLS şifreleme anahtarları (enc.bin) ASLA Bunny'ye yüklenmez!
Bu dosyalar her zaman local sunucudan serve edilir. Player, key'i local'dan alır,
şifreli segment'leri Bunny'den alır ve client-side decrypt yapar.
Shield koruması sadece muzibuweb pull zone'unda aktif.
muzibu-audio-cdn pull zone'unda Shield yok (ses dosyaları için gereksiz).
İki pull zone'a da Shield eklemek 2x maliyet demek ($19/ay).
Bunny Stream video için tasarlanmış, ses için avantaj sağlamıyor. Bunny destek ekibi de ses içeriği için Stream yerine Storage + CDN önerdi. Mevcut kurulum (Storage Zone + Pull Zone) ses platformu için optimal.
İkisi birlikte kullanılamaz. Perma-Cache tercih edildi çünkü:
npm run prod sonrası Perma-Cache temizlenmeli:
Bunny Panel → Pull Zones → muzibuweb → Caching → Purge All
max_execution_time=0 ile çalışmalı (timeout yok)--skip-existing ile cache dosyası kullan (hızlı)22 Mart 2026 • Muzibu.com
Son güncelleme: 22 Mart 2026, 22:50 (v2 - Redis Tracking eklendi)