VPS Uzerinde Kendi Muzik Sunucunuzu Kurma Rehberi
Navidrome ile kendi VPS sunucunuzda muzik kutuphanenizi nasil yayinlayacaginizi ogrenin. Depolama planlamasi, Subsonic istemci secimi, TLS kurulumu ve guvenli yedekleme adimlari.
Bir VPS üzerinde self-hosted müzik yayınının size sağladıkları
Bir VPS üzerinde self-hosted müzik yayını yapmak, oynatıcıyı sizin çalıştırdığınız ve müzik dosyalarını sizin sağladığınız anlamına gelir. Sunucu, halihazırda sahip olduğunuz dosyaları barındırır ve herhangi bir telefon, internet üzerinden standart bir giriş ile bu dosyalara erişebilir. Başlamadan önce bu değiş tokuş konusunda dürüst olun: bu sistem, bir yayın servisinin kataloğunu değil, yalnızca oynatıcısını değiştirir. Siz satın alıp veya kopyalayıp sunucuya yüklemediğiniz sürece kütüphanenizde yeni hiçbir şey görünmez.
Ses dosyaları, sunucu için video dosyalarından çok daha hafiftir. Dosyalar küçüktür, telefonlar tüm yaygın formatları ek bir yardıma ihtiyaç duymadan çözebilir ve tek bir dinleyici, bir görüntülü görüşmeden daha az bant genişliği tüketir. CPU kullanımı burada işin kolay kısmıdır. Asıl kısıtlayıcı faktör disk alanıdır. Bu sistemin verimli çalışıp çalışmayacağını belirleyen diğer iki unsur ise etiketlerinizin kalitesi ve telefon uygulamanızın çevrimdışı kullanım için müzik indirme özelliğine sahip olup olmadığıdır.
Hangi müzik sunucusu: Navidrome, Jellyfin mi yoksa Funkwhale mi?
Navidrome, yalnızca ses dosyalarıyla ilgileniyorsanız varsayılan tercihtir. Tek bir container içinde çalışan tek bir Go binary dosyasından oluşur ve durum bilgisini tek bir SQLite veritabanında tutar. Subsonic API ile uyumludur; bu sayede çok sayıda üçüncü taraf mobil uygulama ile kullanılabilir. Ağustos 2026 itibarıyla 0.63.2 sürümü günceldir. Proje, yazılımın Raspberry Pi Zero gibi düşük donanımlı cihazlarda dahi sorunsuz çalıştığını belirtmektedir; dolayısıyla sunucu yazılımı için herhangi bir maliyet oluşmaz.
Jellyfin, eğer halihazırda bir VPS üzerinde medya sunucusu olarak Jellyfin kullanıyorsanız tercih edilebilir. Müzik kütüphanesi işlevseldir ve Android ile iOS için geliştirilen Finamp uygulaması, çevrimdışı dinleme için parçaları indirmenize olanak tanır. Kısıtlayıcı olan nokta API'dir. Jellyfin'in yerleşik bir Subsonic uç noktası yoktur ve bu özelliği ekleyen topluluk eklentisi 2022 yılından beri güncellenmemektedir; bu nedenle Subsonic uygulama ekosistemi Jellyfin ile kullanılamaz. Bunun yerine Jellyfin'in kendi API'sini destekleyen uygulamaları kullanmanız gerekir ve bu uygulamaların sayısı daha azdır.
Funkwhale, federe (dağıtık) seçenektir ve 2.0 sürümü Mart 2026'da yayınlanmıştır. Bir Funkwhale sunucusuna pod adı verilir; pod'lar ActivityPub (Mastodon'un arkasındaki protokol) üzerinden federasyon kurar ve bir pod üzerindeki kullanıcı, başka bir pod'daki genel kütüphaneyi takip edebilir. Subsonic API'nin bir kısmını da destekler, ancak bilinmesi gereken bir fark vardır: Her kullanıcı kendi ayarlarından ayrı bir Subsonic parolası belirler, çünkü Subsonic protokolü sunucunun okuyabileceği bir parola bekler. Funkwhale, web uygulamasının yanı sıra PostgreSQL ve bir görev kuyruğu (task queue) gerektirdiği için daha ağır bir kurulumdur.
Federasyon istemiyorsanız veya halihazırda Jellyfin kullanmıyorsanız Navidrome'u seçin. Bu kılavuzun geri kalanı, Docker ile Navidrome kurulumunu ele almaktadır.
Subsonic API'sinin hangi telefon uygulamasını kullanacağınızı nasıl belirlediği
Subsonic, HTTP API'si self-hosted ses sistemleri için ortak bir dil haline gelmiş bir müzik sunucusuydu; OpenSubsonic ise bu API'yi geliştirmeye devam eden topluluk projesidir. Telefonunuzda seçeneklerinizin olmasının nedeni bu geçmişe dayanır. Navidrome kendi mobil uygulamasını sunmaz ve buna ihtiyaç da duymaz; çünkü herhangi bir Subsonic istemcisi, sunucu adresi ve hesap bilgilerinizle giriş yapar.
Bu durum, günlük kullanımda kurulumun sürdürülebilirliğini belirleyen özellik olan çevrimdışı senkronizasyon için kritik öneme sahiptir. Tünel içindeki bir telefon sunucunuza erişemez, bu nedenle istemcinin dosyaları önceden yerel depolamaya kopyalamış olması gerekir. Her istemci akış (stream) yapabilir. Ancak sadece bazıları indirme yapabilir. navidrome.org/apps adresindeki istemci dizini hangilerinin indirme yaptığını belirtir ve her iki platformda da seçenekler geniştir: Android'de Substreamer ve Ultrasonic, iOS'te Amperfy ve play:Sub. En güçlü istemcilerin birçoğu ücretli uygulamalardır ve Android'de Symfonium en çok tavsiye edilen uygulamadır. Karar vermeden önce iki tanesini kurup deneyin, çünkü bu sistemin her gün etkileşimde bulunacağınız kısmıdır.
Bir müzik kütüphanesi ne kadar depolama alanına ihtiyaç duyar?
The data behind this chart
[
{
"label": "Opus 128k",
"kbps": 128,
"gb_per_1000_albums": 43
},
{
"label": "MP3 320k",
"kbps": 320,
"gb_per_1000_albums": 108
},
{
"label": "FLAC 16/44.1",
"kbps": 900,
"gb_per_1000_albums": 304
},
{
"label": "FLAC 24/96",
"kbps": "3,000",
"gb_per_1000_albums": "1,013"
}
]Bu değerler, gerçek bir koleksiyonun ölçümü değil, bit hızından türetilmiş büyüklük mertebesi tahminleridir; hesaplamayı kendi dosyalarınız üzerinden kolayca doğrulayabilirsiniz. Bir albümü 45 dakika, yani 2.700 saniye olarak kabul edin. Kilobit/saniye cinsinden bit hızını 2.700 ile çarpıp 8.000'e böldüğünüzde megabayt cinsinden sonucu elde edersiniz. 320 kbps hızında bir albüm 108 MB yer kaplar, dolayısıyla bin albümlük bir koleksiyon yaklaşık 108 GB eder.
Kayıpsız (lossless) formatlar bu sonucu değiştirir. CD kalitesindeki FLAC dosyaları standart materyallerde ortalama 900 kbps civarındadır, bu nedenle aynı bin albüm yaklaşık 304 GB alan gerektirir. 24 bit, 96 kHz bir kütüphane yaklaşık 1,013 GB yer tutar; bu da kağıt üzerinde listeleyebileceğiniz bir koleksiyon için tam bir terabayt demektir. Telefon dostu bir Opus kopyası ise 128 kbps hızında, aynı bin albümü 43 GB içine sığdırır. Mevcut kütüphaneniz üzerinde du -sh /path/to/music komutunu çalıştırın; çünkü bir plan seçerken önemli olan tek değer, kendi ortalama bit hızınızdır.
Bant genişliği, faturanın daha küçük kısmını oluşturur. 320 kbps hızındaki bir yayın saniyede 40 kilobayt veri tüketir, yani bir saatlik dinleme yaklaşık 144 MB veri trafiği yaratır. Ayda yüz saatlik dinleme yaklaşık 14 GB eder ki bu miktar hiçbir VPS transfer kotasında fark edilmez. İstisna durum, telefonun ilk çevrimdışı senkronizasyonudur; bu işlem tek bir akşamda onlarca gigabaytlık veri trafiğine yol açabilir.
Depolama katmanı mı, işlem katmanı mı?
Müzik sunucusu, üzerinde neredeyse hiç işlem yükü bulunmayan büyük bir soğuk veri yığınıdır. Bir dosyayı saniyede 40 kilobayt hızla okumak herhangi bir diski boşta bırakır; CPU ise yalnızca kütüphane taraması veya nadiren ihtiyaç duyacağınız kod dönüştürme (transcoding) işlemleri sırasında çalışır. Bu nedenle, bir işlem planındaki hızlı NVMe diskler size hiçbir avantaj sağlamaz; aksine, gigabayt başına düşen yüksek maliyet, FLAC kopyalarınızı yüklemenize engel olur. Bu durum, bir depolama VPS'inin standart bir VPS'ten daha avantajlı olduğu senaryodur; çünkü bu planlar çekirdek başına değil, terabayt başına fiyatlandırılır.
Bellek ihtiyacı mütevazıdır. Navidrome, kişisel bir kütüphaneyi birkaç yüz megabayt ile sunabilir; tarama işlemi oynatmadan daha fazla bellek tüketir. Sunucuya 1 GB veya 2 GB RAM ayırın ve bütçenizin geri kalanını disk kapasitesine harcayın.
Docker Compose ile Navidrome Kurulumu
Öncelikle, container'ın çalışacağı kullanıcı kimliğine ait dizinleri oluşturun. Compose sizin için yeniyse, VPS üzerinde Docker Compose rehberi bu dosyanın varsayımlarını açıklamaktadır.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicdocker-compose.yml dosyasını kendi dizininde, başka hiçbir şey olmadan oluşturun:
services:
navidrome:
image: deluan/navidrome:0.63.2
user: "1000:1000"
ports:
- "127.0.0.1:4533:4533"
restart: unless-stopped
environment:
ND_LOGLEVEL: "info"
ND_SESSIONTIMEOUT: "24h"
ND_SCANNER_SCHEDULE: "@every 24h"
ND_BACKUP_PATH: "/data/backup"
ND_BACKUP_SCHEDULE: "0 4 * * *"
ND_BACKUP_COUNT: "7"
volumes:
- /srv/navidrome:/data
- /srv/music:/music:rodocker compose up -d
docker compose psdocker compose ps, servisi yeniden başlatılıyor yerine çalışıyor durumda göstermelidir. Sürekli yeniden başlayan bir container, neredeyse her zaman /srv/navidrome üzerindeki bir izin sorunundan kaynaklanır ve docker compose logs navidrome, yazılamayan dosyanın adını belirtir.
Bu dosyadaki dört detay açıklanmaya değerdir. Port yalnızca 127.0.0.1 üzerinde yayınlanır, böylece sunucuya açık internetten 4533 numaralı port üzerinden değil, yalnızca reverse proxy aracılığıyla erişilebilir: Docker kendi güvenlik duvarı kurallarını yazar, bu nedenle ufw her şeyin reddedildiğini raporlasa bile basit bir 4533:4533 dış dünyaya açık kalır. Müzik dizini salt okunur (read only) olarak bağlanmıştır; bu, bir tarayıcı hatasının tek kopyanızı silmesini engeller. ND_SCANNER_SCHEDULE varsayılan olarak devre dışıdır ve Navidrome 0.55 öncesinde yazılan rehberler buna artık var olmayan bir isim olan ND_SCANSCHEDULE demektedir. Üç yedekleme ayarı, aşağıdaki yedekleme bölümünün dayandığı yerleşik veritabanı yedeklemesini etkinleştirir.
Müzik dosyalarınızı sunucuya aktarın
Bağlantı koptuğunda baştan başlamak yerine kaldığı yerden devam eden rsync aracını kullanarak kütüphanenizi sunucuya kopyalayın.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/Kaynak dizinin sonundaki eğik çizgi (trailing slash) önemlidir. Bu işaret kullanılmadığında /srv/music/Music oluşur. Kopyalama işlemi bittiğinde sahiplik izinlerini düzeltin:
sudo chown -R 1000:1000 /srv/music
id -uContainer, 1000 kullanıcı kimliği (uid) ile çalışır ve bağlanan dizin salt okunurdur; bu nedenle her dosyanın bu kimlik tarafından okunabilir olması gerekir. Eğer SSH hesabınız VPS üzerinde 1000 uid değerine sahip değilse, kopyalanan dosyalar başka bir kullanıcıya ait olur ve tarama işlemi hiçbir parça bulamaz; web arayüzü ise boş kalır. id -u komutu gerçek kullanıcı kimliğinizi yazdırır, Docker container'larında PUID ve PGID'nin nasıl çalıştığı başlıklı yazı ise eşleme mantığını tüm detaylarıyla açıklar.
Telefonun her yerden çalışması için reverse proxy ve TLS
DNS A kaydını VPS adresine yönlendirin, ardından Caddy yapılandırmasına şu üç satırı ekleyin:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy, sertifikayı ilk istek geldiğinde talep eder. ACME (otomatik sertifika yönetim ortamı) doğrulaması 80 numaralı port üzerinden yanıtlandığı için 80 ve 443 numaralı portların her ikisinin de açık olması gerekir. Nginx kullanıyorsanız, location bloğuna proxy_buffering off; ekleyin: Navidrome, ilerleme olaylarını web arayüzüne uzun ömürlü bir bağlantı üzerinden iletir; tamponlama (buffering) açık olduğunda arayüz, Nginx'in tutmaya devam ettiği bir yanıtı bekler. Eğer servisi kendi alt alan adı yerine /music gibi bir yol altında sunuyorsanız, ND_BASEURL değerini aynı yola ayarlayın, aksi takdirde arayüz boş bir sayfa olarak yüklenir. Yaygın kullanılan üç proxy, Nginx, Caddy ve Traefik on a VPS başlığında karşılaştırılmıştır.
Siteyi açın ve ilk hesabı oluşturun. Varsayılan bir parola yoktur; ilk ziyaretçiden yönetici kullanıcısını oluşturması istenir, bu yüzden adresi kimseyle paylaşmadan önce bu işlemi gerçekleştirin. Ardından bir telefon istemcisinin kullandığı tam yolu test edin:
SALT=$(openssl rand -hex 6)
TOKEN=$(printf '%s%s' 'YOUR_PASSWORD' "$SALT" | md5sum | cut -d' ' -f1)
curl -s "https://music.example.com/rest/ping.view?u=YOUR_USER&t=$TOKEN&s=$SALT&v=1.16.1&c=curl&f=json"Sağlıklı bir yanıt {"subsonic-response":{"status":"ok" ile başlar ve sunucu türü olarak navidrome adını verir. "status":"failed" içeren ve 40 hata kodunu döndüren bir gövde, proxy'nin düzgün çalıştığını ancak kimlik bilgilerinin hatalı olduğunu gösterir. Bu aşamada karşılaşılan bir sertifika hatası öncelikle düzeltilmelidir, çünkü çoğu telefon istemcisi hatalı bir sertifikayı kullanıcıya hiçbir bilgi vermeyen bir mesajla reddeder.
İlk taramadan sonra kütüphanenizin neden hatalı göründüğü
Navidrome, klasörler yerine etiketlere (tags) göre tarama yapar; bu nedenle ne göreceğinize etiketler karar verir. "Album artist" etiketi bulunmayan bir parça, "track artist" bilgisi altında dosyalanır. Bu durum, her parçada farklı bir sanatçının yer aldığı bir derleme albümün, her biri tek parçadan oluşan yirmi ayrı albüm olarak görünmesine neden olur. Bu sorunu Navidrome içinde değil, dosyalar üzerinde düzeltin: MusicBrainz Picard ve beets, bir albümü MusicBrainz veritabanında aratır ve standart etiketleri dosyalara geri yazar.
Navidrome ayrıca çoklu sanatçı etiketlerini ayrı sanatçılara böler. Bu nedenle, isminde ayırıcı karakter bulunan bir grup ismi yanlışlıkla bölünür; AC/DC herkesin karşılaştığı tipik bir örnektir. ND_SCANNER_ARTISTSPLITEXCEPTIONS, bölünmemesi gereken isimleri tutar.
Yeni dosyalar, sisteme eklendikten birkaç saniye sonra bir dosya izleyici (file watcher) tarafından algılanır. İzleyici, çekirdek (kernel) değişim bildirimlerine bağlıdır. Başka bir makineden mount edilen ağ paylaşımlarına yazılan dosyalar için bu bildirimler ulaşmaz; bu tür bir kurulumda kütüphaneyi güncel tutan şey periyodik ND_SCANNER_SCHEDULE işlemidir. Tam bir yeniden tarama, her dosyanın etiketini okur; bu işlem büyük kütüphanelerde yavaştır. Aşağıdaki veritabanının korunmaya değer olmasının bir nedeni de budur.
Kullanıcılar, çalma listeleri ve paylaşım
Yönetici, diğer hesapları web arayüzü üzerinden oluşturur; kullanıcıların kendi kendilerine kaydolma seçeneği bulunmaz. Her kullanıcının çalma sayıları, çalma listeleri, favorileri ve puanlamaları birbirinden ayrı tutulur; böylece aynı evdeki kullanıcılar ortak bir müzik zevki profili kullanmak zorunda kalmaz.
Çalma listeleri iki farklı yolla sisteme dahil edilir. Bir istemci üzerinde oluşturulan çalma listesi doğrudan veritabanında saklanır. Kütüphane dizinine bırakılan bir .m3u dosyası, tarama sırasında içe aktarılır; bu yöntem, çalma listelerini masaüstü oynatıcılardan taşımanın en kolay yoludur. Akıllı çalma listeleri ise .nsp dosyalarıdır; bunlar aynı şekilde içe aktarılan küçük JSON kural dosyalarıdır ve kütüphane değiştikçe kendilerini güncellerler.
Paylaşım özelliği, Temmuz 2026'da yayınlanan 0.63.0 sürümüyle varsayılan olarak etkinleştirilmiştir. Bu özellik, bir kullanıcının herhangi bir albüm için, giriş yapmaya gerek kalmadan herkesin açabileceği herkese açık bir bağlantı oluşturmasına olanak tanır. Tüm kütüphanenizi barındıran bir sunucuda bu her zaman istenen bir durum olmayabilir; ND_ENABLESHARING değerinin false olarak ayarlanması bu özelliği devre dışı bırakır.
Veritabanını müzik dosyalarından ayrı olarak yedekleyin
Navidrome'un kendi yedekleme mekanizması yalnızca veritabanını kapsar. Dokümantasyon bu konuda nettir: yedekleme süreci veritabanını, yani kullanıcıları, dinleme sayılarını ve diğer verileri yedekler; müzik dosyalarını veya yapılandırma ayarlarını yedeklemez. Bu ayrım, verilerin farklı şekillerde kaybolma riskleri nedeniyle doğru bir yaklaşımdır. Müzik dosyaları, onları kopyaladığınız diskten tekrar yüklenebilir. Ancak dinleme sayıları, puanlamalar, favoriler ve çalma listeleri başka hiçbir yerde bulunmaz ve yeniden tarama (rescan) işlemi bunları geri getirmez.
Compose dosyası halihazırda /data/backup dizinine her gece bir kopya almakta ve bu kopyalardan yedisini saklamaktadır. Bir yükseltme işleminden önce manuel olarak bir kopya alın:
sudo docker compose run --rm navidrome backup createGeri yükleme işlemi mevcut veritabanını siler ve yedeği yerine kopyalar; bu işlem Navidrome durdurulmuş durumdayken yapılmalıdır. Canlı bir sunucuda geri yükleme işleminin güvenli bir yolu yoktur.
Bu dosyalar aynı VPS üzerinde durduğu için, VPS'in tamamen kaybedilmesi durumunda veriler de kaybolur. /srv/navidrome dizinini düzenli bir program dahilinde başka bir makineye veya nesne depolama (object storage) alanına aktarın; bu, restic ve BorgBackup araçlarının temel kullanım amacıdır. Tüm dizin boyutu küçüktür, genellikle bir gigabaytın oldukça altındadır; bu nedenle günlük şifreli bir kopya almak neredeyse hiçbir maliyet getirmez ve yeniden tarama ile kurtarılamayacak tüm verileri güvence altına alır.
FAQ
Bir VPS üzerinde müzik kod dönüştürme (transcoding) yapmam gerekir mi?
Neredeyse hiçbir zaman. Telefonlar ve tarayıcılar MP3, AAC, Opus ve FLAC formatlarını kendi başlarına çözebilirler; bu nedenle sunucu dosyayı olduğu gibi gönderir ve CPU kullanımı neredeyse sıfıra yakındır. Kod dönüştürmeyi etkinleştirmenin mantıklı olduğu tek bir durum vardır: Mobil veri üzerinden FLAC kütüphanesi dinlemek. Yaklaşık 900 kbps hızındaki bir dosyayı 128 kbps hızında Opus formatına dönüştürmek, kullanılan veri miktarını yaklaşık yedi kat azaltır. Navidrome bu işlemi kullanıcı ve oynatıcı bazında yapabilir; siz etkinleştirene kadar bu özellik kapalı kalır.
Telefon uygulamam neden çevrimdışı dinleme için müzik indiremiyor?
Çünkü çevrimdışı depolama bir sunucu özelliği değil, bir istemci özelliğidir. Subsonic API, herhangi bir istemcinin tüm dosyayı çekmesine izin verir ancak dosyayı telefonda tutup tutmama kararı uygulamaya aittir. navidrome.org/apps adresindeki istemci dizinini kontrol edin ve açıklamasında çevrimdışı indirme veya önbellekleme (caching) özelliği bulunan bir uygulama seçin. Bazı istemciler yalnızca daha önce çaldığınız parçaları önbelleğe alır; bu, bir yolculuk öncesinde albümü cihazla eşitlemekle aynı şey değildir.
Tarama sonrasında bir albüm neden birkaç farklı albüme bölündü?
Albüm sanatçısı (album artist) etiketi eksiktir veya parçalar arasında tutarsızdır. Navidrome, klasörlere göre değil etiketlere göre gruplandırma yapar. On iki farklı sanatçı değerine sahip ve ortak bir albüm sanatçısı değeri bulunmayan on iki parça, on iki ayrı albüm gibi görünür. Albümdeki her parça için albüm sanatçısı etiketini ayarlayın (derleme albümler için genellikle Various Artists kullanılır) ve ardından yeniden tarama yapın. MusicBrainz Picard veya beets bu işlemi tüm klasör için tek seferde yapabilir.
Kendi kendine barındırılan müzik yayını Spotify'ın yerini tutar mı?
Bu sistem kataloğun değil, oynatıcının ve kütüphanenin yerini tutar. Kendi koleksiyonunuza her cihazdan erişebilir, lisans değişikliklerinden etkilenmeyen çalma listelerine ve dinleme istatistiklerine sahip olursunuz. Yeni çıkan albümlere erişemez ve başkalarının dinleme alışkanlıklarına göre oluşturulan önerileri alamazsınız. Bu sistemi kuran çoğu kişi müziğini satın alır ve keşif yapmak için uygun fiyatlı bir yayın servisi hesabı kullanmaya devam eder.