Production Veritabanı Değişikliği - Dikkatli İncele

HLS Path Düzeltme Raporu

muzibu_songs.hls_path kolonundaki tenant prefix sorunu

Basit Anlatım (Herkes İçin)

Veritabanında her şarkının HLS dosya yolu saklanıyor. Bu yolun başına yanlışlıkla tenant1001/ ekleniyor. Laravel zaten tenant modunda çalışırken dosya yollarının başına otomatik olarak tenant1001/ ekliyor. Sonuç: yol iki kere ekleniyor ve dosya bulunamıyor.

Şu anki durum (Yanlış)
tenant1001/muzibu/hls/51/playlist.m3u8
Sistem bunu şöyle çözümlüyor:
/storage/tenant1001/app/public/tenant1001/muzibu/hls/51/...
Dosya bulunamıyor!
Olması gereken (Doğru)
muzibu/hls/51/playlist.m3u8
Sistem bunu şöyle çözümlüyor:
/storage/tenant1001/app/public/muzibu/hls/51/...
Dosya bulunuyor!
Neden şu an çalışıyor?

Ana player (SongStreamController::serveHls) veritabanındaki hls_path'i kullanmıyor. URL'deki song ID'den yolu kendisi oluşturuyor. Bu yüzden müzik çalıyor. Ama bazı admin paneli özellikleri ve eski API endpoint'ler bu yanlış yolu kullanıyor ve sessizce hata veriyor.

Teknik Detaylar (Geliştiriciler İçin)

Sorunun Kaynağı

Modules/Muzibu/App/Jobs/ConvertToHLSJob.php - Satır 158
// YANLIŞ - tenant prefix ekleniyor
$relativePath = 'tenant' . tenant()->id . '/'muzibu/hls/' . $song->song_id . '/playlist.m3u8';

// DOĞRU - prefix olmadan
$relativePath = 'muzibu/hls/' . $song->song_id . '/playlist.m3u8';
Neden çift prefix oluşuyor?
// Tenant context'te storage_path() zaten tenant dizinine işaret ediyor:
storage_path()           = /storage/tenant1001/
storage_path('app/public') = /storage/tenant1001/app/public/

// DB'deki hls_path = tenant1001/muzibu/hls/51/playlist.m3u8
// Birleşince:
storage_path('app/public/' . hls_path) =
  /storage/tenant1001/app/public/tenant1001/muzibu/hls/51/playlist.m3u8
//          ↑ otomatik                  ↑ DB'deki (fazlalık!)

hls_path Kullanan Tüm Kod Noktaları

Dosya Satır Kullanım Etkileniyor mu?
SongController.php 287 storage_path('app/public/' . $song->hls_path) EVET - Dosya bulunamaz
Song.php (Model) 509 Storage::disk('public')->url($this->hls_path) EVET - Yanlış URL üretir
ConvertSongToHLS.php 46 Storage::disk('tenant')->exists($song->hls_path) EVET - Mevcut HLS'i algılamaz
playlist-songs-manage.blade 161,304 asset('storage/' . $song->hls_path) Kısmen - asset() farklı çözümler
SongStreamController.php - hls_path kullanmıyor, songId ile yol oluşturuyor HAYIR - Etkilenmiyor
SignedUrlService.php - hls_path kullanmıyor, songId ile yol oluşturuyor HAYIR - Etkilenmiyor
SidebarComposer, CacheService, Repository - Sadece whereNotNull('hls_path') filtre HAYIR - Sadece varlık kontrolü
API Controller'lar (Album, Artist, Genre vs.) - Sadece 'hls_path' => $song->hls_path JSON çıktı HAYIR - Sadece bilgi döndürür

Yapılması Gereken Değişiklikler

1. VERİTABANI 35,065 şarkının hls_path değerini düzelt
-- Önce kontrol (kaç kayıt etkilenecek?)
SELECT COUNT(*) FROM muzibu_songs WHERE hls_path LIKE 'tenant1001/%';

-- Önce 5 kayıt örnek göster
SELECT song_id, hls_path FROM muzibu_songs
WHERE hls_path LIKE 'tenant1001/%' LIMIT 5;

-- Düzeltme (sadece tenant1001/ prefix'ini kaldır)
UPDATE muzibu_songs
SET hls_path = REPLACE(hls_path, 'tenant1001/', '')
WHERE hls_path LIKE 'tenant1001/%';

-- Sonuç doğrulama
SELECT song_id, hls_path FROM muzibu_songs
WHERE hls_path IS NOT NULL AND hls_path != '' LIMIT 5;

-- Hala tenant prefix olan var mı?
SELECT COUNT(*) FROM muzibu_songs WHERE hls_path LIKE 'tenant%';
Güvenlik notu: Bu UPDATE sadece string'in başındaki tenant1001/ kısmını kaldırıyor. Hiçbir veri silinmiyor, hiçbir kayıt kaybedilmiyor. Dosyalar fiziksel olarak yerinde duruyor. Sadece veritabanındaki referans yolu düzeltiliyor.
2. KOD ConvertToHLSJob.php satır 158
// ESKİ (satır 158):
$relativePath = 'tenant' . tenant()->id . '/muzibu/hls/' . $song->song_id . '/playlist.m3u8';

// YENİ:
$relativePath = 'muzibu/hls/' . $song->song_id . '/playlist.m3u8';
Güvenlik notu: Bu değişiklik yeni dönüştürülecek şarkılar için geçerli. Mevcut şarkıların HLS dosyaları etkilenmiyor.

Değişiklik Öncesi Doğrulama Checklist

Production AI: Lütfen aşağıdaki kontrolleri yap ve her birinin sonucunu raporla:

Kontrol 1: Mevcut hls_path formatını doğrula
SELECT DISTINCT SUBSTRING_INDEX(hls_path, '/', 1) as prefix, COUNT(*) as cnt
FROM muzibu_songs WHERE hls_path IS NOT NULL AND hls_path != ''
GROUP BY prefix;
Beklenen: Tüm kayıtlar "tenant1001" prefix ile başlıyor olmalı
Kontrol 2: Fiziksel dosya eşleşmesi
# Rastgele bir şarkının düzeltilmiş path'i ile fiziksel dosyayı kontrol et
# Örnek song_id=51 için:
ls -la /var/www/vhosts/muzibu.com/httpdocs/storage/tenant1001/app/public/muzibu/hls/51/playlist.m3u8
Beklenen: Dosya mevcut olmalı (prefix olmadan doğru yolu gösteriyor)
Kontrol 3: Çift prefix sorunu doğrulama
# Bu path OLMAMALI (çift tenant):
ls -la /var/www/vhosts/muzibu.com/httpdocs/storage/tenant1001/app/public/tenant1001/muzibu/hls/51/playlist.m3u8
# Beklenen: No such file or directory
Kontrol 4: storage_path() davranışı
php artisan tinker --execute="
\$t = \App\Models\Tenant::find('1001');
tenancy()->initialize(\$t);
echo storage_path('app/public') . PHP_EOL;
// Beklenen: .../storage/tenant1001/app/public
"
Kontrol 5: Düzeltme sonrası path çözümleme testi
# Düzeltilmiş path ile dosya bulunabilir mi?
# muzibu/hls/51/playlist.m3u8
php artisan tinker --execute="
\$t = \App\Models\Tenant::find('1001');
tenancy()->initialize(\$t);
\$path = storage_path('app/public/muzibu/hls/51/playlist.m3u8');
echo \$path . PHP_EOL;
echo file_exists(\$path) ? 'DOSYA VAR' : 'DOSYA YOK';
"
Beklenen: DOSYA VAR

Test Sunucusunda Doğrulandı

mztest.muzibu.com üzerinde aynı düzeltme başarıyla yapıldı (66 şarkı):
Test Düzeltme Öncesi Düzeltme Sonrası
storage_path('app/public/' + hls_path) Dosya bulunamadı Dosya bulundu
Storage::disk('tenant')->exists() false true
Song::getHlsUrl() Çift tenant1001 URL Doğru URL
Müzik player çalışıyor mu? Evet (hls_path kullanmıyor) Evet

Risk Analizi

Düşük Riskler
  • Fiziksel dosyalara dokunulmuyor, sadece DB referansı değişiyor
  • Ana player (SongStreamController) hls_path'i zaten kullanmıyor
  • Geri alma kolay: UPDATE ... SET hls_path = CONCAT('tenant1001/', hls_path)
  • Test sunucusunda başarıyla doğrulandı
Dikkat Edilecekler
  • 35,065 kayıt etkileniyor - toplu güncelleme
  • Değişiklik anında aktif olacak (cache varsa temizlenmeli)
  • ConvertToHLSJob.php kod değişikliği de yapılmalı (yeni dönüştürmeler için)
Geri Alma Komutu (Gerekirse)
-- Düzeltmeyi geri al (tenant1001/ prefix'ini tekrar ekle)
UPDATE muzibu_songs
SET hls_path = CONCAT('tenant1001/', hls_path)
WHERE hls_path LIKE 'muzibu/%'
AND hls_path NOT LIKE 'tenant%';
19 Şubat 2026 • Muzibu.com