Cara Streaming Musik Sendiri di VPS dengan Navidrome
Pelajari cara menjalankan Navidrome di VPS untuk streaming koleksi musik ke ponsel, termasuk ukuran penyimpanan, klien Subsonic, sinkronisasi offline, TLS, dan backup aman.
Manfaat streaming musik yang di-host sendiri pada VPS
Streaming musik yang di-host sendiri pada VPS berarti Anda menjalankan pemutar dan menyediakan musiknya sendiri. Server menyimpan file yang sudah Anda miliki, dan ponsel apa pun dapat mengaksesnya melalui Internet dengan login biasa. Pahami komprominya sebelum memulai: ini menggantikan pemutar dari layanan streaming, bukan katalognya. Tidak ada musik baru yang muncul di koleksi Anda sampai Anda membelinya atau menyalinnya dari media, lalu menyalin file tersebut ke server.
Audio jauh lebih ringan bagi server dibandingkan video. File audio berukuran kecil, ponsel dapat mendekode semua format umum tanpa bantuan tambahan, dan satu pendengar menggunakan bandwidth lebih sedikit dibandingkan panggilan video. CPU bukan masalah utama di sini. Ruang disk adalah batasan yang sebenarnya. Dua hal lain yang menentukan keberhasilan pendekatan ini adalah kualitas tag Anda dan kemampuan aplikasi ponsel untuk mengunduh musik agar dapat digunakan secara offline.
Server musik mana: Navidrome, Jellyfin, atau Funkwhale?
Navidrome adalah pilihan default jika Anda hanya memerlukan audio. Aplikasi ini terdiri dari satu binary Go dalam satu container dan menyimpan statusnya dalam satu database SQLite. Navidrome menyediakan Subsonic API. Karena itu, tersedia banyak aplikasi ponsel pihak ketiga yang kompatibel dengannya. Versi 0.63.2 adalah versi terbaru pada Agustus 2026. Proyek ini menyatakan bahwa Navidrome dapat berjalan dengan baik pada perangkat sekecil Raspberry Pi Zero. Jadi, perangkat lunak server bukan komponen yang memerlukan biaya besar.
Jellyfin layak digunakan jika Anda sudah menjalankan Jellyfin sebagai server media pada VPS untuk video. Pustaka musiknya berfungsi, dan Finamp adalah aplikasi musik Jellyfin untuk Android dan iOS yang dapat mengunduh trek untuk didengarkan secara offline. Batasannya ada pada API. Jellyfin tidak memiliki endpoint Subsonic bawaan, dan plugin komunitas yang menambahkannya berhenti diperbarui pada 2022. Akibatnya, ekosistem aplikasi Subsonic tidak tersedia untuk Jellyfin. Anda harus menggunakan aplikasi yang mendukung API milik Jellyfin, dan jumlahnya lebih sedikit.
Funkwhale adalah opsi federasi, dan versi 2.0 dirilis pada Maret 2026. Server Funkwhale disebut pod. Pod melakukan federasi melalui ActivityPub, yaitu protokol yang digunakan Mastodon. Pengguna pada satu pod dapat mengikuti pustaka publik pada pod lain. Funkwhale juga mendukung sebagian Subsonic API, dengan satu perbedaan penting: setiap pengguna menetapkan kata sandi Subsonic terpisah dalam pengaturannya sendiri. Hal ini diperlukan karena protokol Subsonic mengharuskan server dapat membaca kembali kata sandi tersebut. Instalasi Funkwhale lebih berat karena memerlukan PostgreSQL dan task queue selain aplikasi web.
Pilih Navidrome, kecuali Anda memerlukan federasi atau sudah menjalankan Jellyfin. Bagian selanjutnya dalam panduan ini menyiapkan Navidrome dengan Docker.
Mengapa Subsonic menentukan aplikasi ponsel yang Anda gunakan
Subsonic adalah server musik dengan HTTP API yang kemudian menjadi bahasa umum untuk audio self-hosted, sedangkan OpenSubsonic adalah proyek komunitas yang terus mengembangkannya. Sejarah tersebut menjelaskan mengapa Anda memiliki banyak pilihan aplikasi untuk ponsel. Navidrome tidak menyediakan aplikasi selulernya sendiri dan tidak memerlukannya, karena setiap klien Subsonic dapat login menggunakan alamat server dan informasi akun Anda.
Hal ini terutama penting untuk sinkronisasi offline, yaitu fitur yang menentukan apakah setup dapat digunakan untuk aktivitas sehari-hari. Ponsel yang berada di dalam terowongan tidak dapat mengakses server Anda, sehingga klien harus menyalin file ke penyimpanan lokal terlebih dahulu. Semua klien dapat melakukan streaming. Hanya sebagian yang dapat mengunduh. Direktori klien di navidrome.org/apps menunjukkan aplikasi yang mendukungnya. Pilihannya luas di kedua platform: Substreamer dan Ultrasonic di Android, serta Amperfy dan play:Sub di iOS. Beberapa klien terbaik merupakan aplikasi berbayar, dan Symfonium di Android paling sering disebut. Instal dua aplikasi sebelum menentukan pilihan, karena inilah bagian sistem yang Anda gunakan setiap hari.
Berapa kapasitas penyimpanan yang diperlukan pustaka musik?
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"
}
]Angka tersebut merupakan perkiraan berdasarkan bitrate, bukan hasil pengukuran koleksi nyata. Perhitungannya cukup sederhana untuk dibandingkan dengan file Anda sendiri. Anggap satu album berdurasi 45 menit, yaitu 2,700 detik. Kalikan bitrate dalam kilobit per detik dengan 2,700, lalu bagi dengan 8,000 untuk mendapatkan megabyte. Pada 320 kbps, hasilnya 108 MB untuk satu album. Jadi, seribu album memerlukan sekitar 108 GB.
Format lossless mengubah hasilnya. FLAC berkualitas CD memiliki rata-rata mendekati 900 kbps untuk materi audio biasa. Jadi, seribu album yang sama memerlukan sekitar 304 GB. Pustaka berformat 24 bit, 96 kHz memerlukan sekitar 1,013 GB, atau satu terabyte penuh untuk koleksi yang dapat Anda daftarkan di atas kertas. Salinan Opus yang sesuai untuk ponsel pada 128 kbps memuat seribu album yang sama dalam 43 GB. Jalankan du -sh /path/to/music pada pustaka yang sudah Anda miliki, karena rata-rata bitrate koleksi Anda sendiri adalah satu-satunya angka yang penting saat memilih paket.
Bandwidth merupakan bagian yang lebih kecil dari total penggunaan. Stream 320 kbps menggunakan 40 kilobyte per detik, sehingga satu jam pemutaran memindahkan sekitar 144 MB. Seratus jam per bulan berjumlah sekitar 14 GB. Jumlah ini biasanya tidak berarti bagi batas transfer VPS. Pengecualiannya adalah sinkronisasi offline pertama pada ponsel, yang dapat memindahkan puluhan gigabyte dalam satu malam.
Tingkat penyimpanan atau tingkat komputasi?
Server musik berisi data dingin dalam jumlah besar dengan hampir tidak ada komputasi yang berjalan di atasnya. Membaca file pada kecepatan 40 kilobyte per detik membuat disk tetap hampir tidak digunakan, dan CPU hanya bekerja saat pemindaian pustaka atau transcoding, yang sebagian besar tidak akan Anda lakukan. Jadi, NVMe cepat pada paket komputasi tidak memberi manfaat di sini, sedangkan harga per gigabita justru menghambat Anda mengunggah salinan FLAC. Inilah kondisi ketika storage VPS lebih unggul daripada VPS biasa, karena paket tersebut dihargai berdasarkan terabita, bukan core.
Kebutuhan memorinya rendah. Navidrome dapat melayani pustaka pribadi dengan beberapa ratus megabita, dan pemindaian merupakan beban puncak, bukan pemutaran. Gunakan RAM 1 GB atau 2 GB pada server tersebut, lalu alokasikan sisa anggaran untuk disk.
Instal Navidrome dengan Docker Compose
Buat direktori terlebih dahulu dan tetapkan kepemilikannya kepada user ID yang akan digunakan container. Jika Compose masih baru bagi Anda, Docker Compose pada VPS menjelaskan asumsi dalam file ini.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicTulis docker-compose.yml tanpa isi lain yang berarti, di direktorinya sendiri:
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 harus menampilkan service sebagai running, bukan restarting. Container yang terus-menerus restart hampir selalu mengalami masalah izin pada /srv/navidrome, dan docker compose logs navidrome menyebutkan nama file yang tidak dapat ditulisnya.
Ada empat detail dalam file tersebut yang perlu dijelaskan. Port hanya dipublikasikan pada 127.0.0.1, sehingga server dapat diakses melalui reverse proxy dan bukan melalui port 4533 dari Internet terbuka: Docker menulis aturan firewall-nya sendiri, sehingga plain 4533:4533 tetap terekspos bahkan pada mesin yang melaporkan semua koneksi sebagai denied melalui ufw. Volume musik bersifat read only, sehingga bug pada scanner tidak dapat menghapus satu-satunya salinan Anda. ND_SCANNER_SCHEDULE dinonaktifkan secara default, dan panduan yang ditulis sebelum Navidrome 0.55 menyebutnya ND_SCANSCHEDULE, nama yang sudah tidak ada. Tiga pengaturan backup mengaktifkan backup database bawaan yang digunakan oleh bagian backup di bawah ini.
Pindahkan musik Anda ke server
Salin pustaka dengan rsync. Proses ini dapat dilanjutkan dari posisi terakhir jika koneksi terputus, tanpa mengulang dari awal.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/Garis miring di akhir path sumber sangat penting. Tanpanya, Anda akan mendapatkan /srv/music/Music. Setelah penyalinan selesai, perbaiki kepemilikannya:
sudo chown -R 1000:1000 /srv/music
id -uContainer berjalan dengan user id 1000, dan mount bersifat read-only. Karena itu, setiap file harus dapat dibaca oleh id tersebut. Jika akun SSH Anda bukan uid 1000 pada VPS, file hasil penyalinan akan dimiliki user lain. Akibatnya, pemindaian tidak menemukan trek apa pun, sementara antarmuka web tetap kosong. id -u menampilkan id aktual Anda. cara kerja PUID dan PGID dalam container Docker menjelaskan pemetaan ini secara lengkap.
Reverse proxy dan TLS agar ponsel dapat digunakan dari mana saja
Arahkan DNS A record ke VPS, lalu berikan tiga baris berikut kepada Caddy:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy meminta sertifikat pada permintaan pertama. Port 80 dan 443 harus sama-sama terbuka karena tantangan ACME (automatic certificate management environment) dijawab melalui port 80. Pada nginx, tambahkan proxy_buffering off; ke blok location: Navidrome mengirimkan peristiwa progres ke antarmuka web melalui satu koneksi yang tetap terbuka. Jika buffering aktif, antarmuka menunggu respons yang masih ditahan oleh nginx. Jika layanan disajikan melalui path seperti /music, bukan subdomain tersendiri, tetapkan ND_BASEURL ke path yang sama. Jika tidak, antarmuka dimuat sebagai halaman kosong. Ketiga proxy yang umum digunakan dibandingkan dalam Nginx, Caddy, dan Traefik pada VPS.
Buka situs tersebut dan buat akun pertama. Tidak ada password default. Pengunjung pertama akan diminta membuat user admin. Lakukan ini sebelum memberi tahu siapa pun alamatnya. Kemudian, uji path persis yang digunakan client ponsel:
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"Respons yang sehat diawali dengan {"subsonic-response":{"status":"ok" dan menyebut navidrome sebagai jenis server. Body yang berisi "status":"failed" dan kode error 40 berarti proxy berfungsi, tetapi kredensialnya salah. Error sertifikat pada tahap ini harus diperbaiki terlebih dahulu karena sebagian besar client ponsel menolak sertifikat yang tidak valid dengan pesan yang tidak informatif bagi user.
Mengapa pustaka Anda terlihat keliru setelah pemindaian pertama
Navidrome menelusuri musik berdasarkan tag, bukan folder, sehingga tag menentukan apa yang Anda lihat. Trek tanpa tag artis album akan dimasukkan ke bawah artis treknya. Karena itu, satu album kompilasi dengan artis berbeda pada setiap trek dapat berubah menjadi dua puluh album yang masing-masing hanya berisi satu trek. Perbaiki tag pada file, bukan di Navidrome: MusicBrainz Picard dan beets sama-sama mencari album di database MusicBrainz, lalu menulis tag standar kembali ke file.
Navidrome juga memisahkan tag multi-artis menjadi beberapa artis. Akibatnya, nama band yang mengandung pemisah dapat terpecah secara keliru. AC/DC adalah contoh yang umum ditemui. ND_SCANNER_ARTISTSPLITEXCEPTIONS berisi nama-nama yang tidak boleh dipisahkan.
File baru akan terdeteksi oleh pemantau file beberapa detik setelah ditambahkan. Pemantau tersebut bergantung pada notifikasi perubahan dari kernel. Notifikasi itu tidak diterima untuk file yang ditulis pada network share yang di-mount dari mesin lain. Pada konfigurasi seperti itu, ND_SCANNER_SCHEDULE berkala diperlukan agar pustaka tetap mutakhir. Pemindaian penuh membaca tag setiap file, sehingga lambat pada pustaka besar. Itulah salah satu alasan database di bawah ini perlu dilindungi.
Pengguna, playlist, dan berbagi
Admin membuat akun lain melalui antarmuka web. Pendaftaran mandiri tidak tersedia. Setiap pengguna memiliki jumlah pemutaran, playlist, favorit, dan rating yang terpisah. Dengan demikian, anggota rumah tangga tidak menggunakan satu profil selera yang sama.
Playlist dapat berasal dari dua sumber. Playlist yang dibuat di client disimpan dalam database. File .m3u yang ditempatkan di folder pustaka akan diimpor saat pemindaian. Ini merupakan cara mudah untuk memindahkan playlist dari pemutar desktop. Smart playlist adalah file .nsp, yaitu file aturan JSON berukuran kecil yang diimpor dengan cara yang sama. Smart playlist akan diperbarui otomatis saat pustaka berubah.
Fitur berbagi diaktifkan secara default sejak versi 0.63.0, yang dirilis pada Juli 2026. Fitur ini memungkinkan pengguna membuat tautan publik ke sebuah album yang dapat dibuka siapa saja tanpa login. Pada server yang menyimpan seluruh pustaka Anda, perilaku ini mungkin tidak diinginkan. Tetapkan ND_ENABLESHARING ke false untuk menonaktifkannya.
Cadangkan database secara terpisah dari file musik
Pencadangan bawaan Navidrome hanya mencakup database. Dokumentasinya menjelaskan hal ini secara tegas: proses pencadangan mencadangkan database, termasuk pengguna, jumlah pemutaran, dan data lainnya, tetapi tidak mencadangkan musik atau konfigurasi. Pemisahan ini merupakan cara yang tepat untuk memahaminya karena kedua bagian tersebut mengalami kegagalan dengan cara yang berbeda. File musik dapat disalin kembali dari disk sumber tempat Anda menyalinnya. Jumlah pemutaran, rating, favorit, dan playlist tidak tersedia di tempat lain, dan pemindaian ulang tidak dapat memulihkannya.
File compose sudah menulis salinan setiap malam ke /data/backup dan menyimpan tujuh salinan. Buat satu salinan secara manual sebelum melakukan upgrade:
sudo docker compose run --rm navidrome backup createProses pemulihan menghapus database saat ini lalu menyalin backup ke lokasinya, dan proses ini harus dijalankan saat Navidrome dihentikan. Pemulihan tidak aman jika server sedang aktif.
File tersebut masih berada di VPS yang sama, sehingga tidak akan tetap tersedia jika VPS mengalami kerusakan. Kirim /srv/navidrome ke mesin lain atau penyimpanan objek secara terjadwal. Itulah fungsi yang disediakan oleh restic dan BorgBackup. Seluruh direktori ini berukuran kecil, biasanya jauh di bawah satu gigabyte. Karena itu, salinan terenkripsi harian di luar server hampir tidak memerlukan biaya dan dapat memulihkan semua data yang tidak dapat dikembalikan melalui pemindaian ulang.
FAQ
Apakah musik perlu ditranskode di VPS?
Hampir tidak pernah. Ponsel dan browser dapat mendekode MP3, AAC, Opus, dan FLAC sendiri, sehingga server mengirim file apa adanya dan hampir tidak menggunakan CPU. Ada satu kondisi yang layak menggunakan fitur ini: pustaka FLAC yang diputar melalui data seluler. Dalam kondisi tersebut, konversi dari sekitar 900 kbps ke Opus pada 128 kbps mengurangi penggunaan data sekitar tujuh kali lipat. Navidrome dapat menerapkannya untuk setiap pengguna dan pemutar, dan fitur ini tetap nonaktif sampai Anda mengaktifkannya.
Mengapa aplikasi ponsel tidak dapat mengunduh musik untuk didengarkan secara offline?
Karena penyimpanan offline merupakan fitur client, bukan fitur server. Subsonic API memungkinkan client mana pun mengambil seluruh file, tetapi aplikasi menentukan apakah salinannya disimpan di ponsel. Periksa direktori client di navidrome.org/apps, lalu pilih client yang deskripsinya menyebutkan pengunduhan offline atau caching. Beberapa client hanya menyimpan cache dari musik yang sudah Anda putar. Ini berbeda dari menyinkronkan album sebelum bepergian.
Mengapa satu album terpecah menjadi beberapa album setelah pemindaian?
Tag artis album tidak ada atau tidak konsisten di antara track. Navidrome mengelompokkan musik berdasarkan tag, bukan folder. Karena itu, dua belas track dengan dua belas nilai artis yang berbeda dan tanpa nilai artis album yang sama akan dianggap sebagai dua belas album. Tetapkan tag artis album pada setiap track dalam album tersebut, biasanya menjadi Various Artists untuk kompilasi, lalu jalankan pemindaian ulang. MusicBrainz Picard atau beets dapat melakukan ini untuk seluruh folder sekaligus.
Apakah streaming musik yang di-self-host menggantikan Spotify?
Layanan ini menggantikan pemutar dan pustaka, bukan katalog. Anda mendapatkan koleksi sendiri di setiap perangkat, beserta playlist dan jumlah pemutaran yang tidak dapat dihapus oleh perubahan lisensi apa pun. Anda tidak mendapatkan rilis baru dan tidak mendapatkan rekomendasi berdasarkan musik yang didengarkan orang lain. Sebagian besar orang yang menjalankan layanan ini membeli musik mereka sendiri dan tetap menggunakan akun streaming murah untuk menemukan musik baru.