Muzibu.com → Bunny CDN + Storage Zone
Tam Teknik Dokümantasyon
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
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
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ı
Şu an BUNNY_STORAGE_MODE=hybrid ile çalışıyor,
yani hem local hem Bunny'den serve edebilir durumda.
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
| 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 metodları
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 &
# 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/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
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, 21:00