Cara Bina Pelayan Muzik Sendiri di VPS dengan Navidrome
Bina pelayan muzik peribadi menggunakan Navidrome pada VPS anda. Panduan ini merangkumi pengiraan storan, konfigurasi TLS, penggunaan klien Subsonic, serta cara sandaran data.
Kelebihan penstriman muzik yang dihoskan sendiri pada VPS
Penstriman muzik yang dihoskan sendiri pada VPS bermakna anda menjalankan pemain muzik dan anda sendiri yang menyediakan koleksi muzik tersebut. Pelayan menyimpan fail yang sudah anda miliki, dan mana-mana telefon boleh mengaksesnya melalui internet dengan log masuk biasa. Bersikap jujur tentang pertukaran ini sebelum anda bermula: ini menggantikan pemain perkhidmatan penstriman, bukan katalognya. Tiada kandungan baharu muncul dalam pustaka anda sehingga anda membelinya atau menyalinnya (rip), dan memindahkan fail tersebut ke pelayan.
Audio jauh lebih ringan untuk pelayan berbanding video. Failnya kecil, telefon boleh menyahkod setiap format biasa tanpa bantuan, dan seorang pendengar menggunakan lebar jalur yang kurang daripada panggilan video. CPU bukanlah masalah utama di sini. Ruang cakera adalah kekangan sebenar. Dua perkara lain yang menentukan sama ada persediaan ini berkesan ialah kualiti tag anda dan sama ada aplikasi telefon anda boleh memuat turun muzik untuk kegunaan luar talian.
Pelayan muzik yang mana: Navidrome, Jellyfin, atau Funkwhale?
Navidrome ialah pilihan utama jika anda hanya mementingkan audio. Ia terdiri daripada satu binari Go dalam satu kontena, dan menyimpan statusnya dalam satu pangkalan data SQLite. Ia menyokong API Subsonic, yang menjadi sebab wujudnya pelbagai aplikasi telefon pihak ketiga. Versi 0.63.2 adalah versi semasa pada Ogos 2026. Projek ini menyatakan bahawa ia berjalan lancar pada perkakasan sekecil Raspberry Pi Zero, jadi perisian pelayan bukanlah komponen yang memerlukan kos.
Jellyfin berbaloi digunakan jika anda sudah menjalankan Jellyfin sebagai pelayan media pada VPS untuk video. Pustaka muziknya berfungsi, dan Finamp ialah aplikasi muzik Jellyfin untuk Android dan iOS yang memuat turun trek untuk pendengaran luar talian. Hadnya terletak pada API. Jellyfin tidak mempunyai endpoint Subsonic terbina dalam, dan pemalam komuniti yang menambah fungsi tersebut telah berhenti dikemas kini pada tahun 2022, jadi ekosistem aplikasi Subsonic tidak boleh digunakan dengannya. Anda perlu menggunakan aplikasi yang menyokong API asli Jellyfin, yang mana pilihannya lebih terhad.
Funkwhale ialah pilihan berfederasi, dan versi 2.0 telah dikeluarkan pada Mac 2026. Pelayan Funkwhale dipanggil pod, pod berfederasi melalui ActivityPub (protokol di sebalik Mastodon), dan pengguna pada satu pod boleh mengikuti pustaka awam di pod lain. Ia juga menyokong sebahagian daripada API Subsonic, dengan satu perbezaan yang perlu diketahui: setiap pengguna menetapkan kata laluan Subsonic yang berasingan dalam tetapan masing-masing, kerana protokol Subsonic memerlukan kata laluan yang boleh dibaca semula oleh pelayan. Pemasangan Funkwhale lebih berat kerana ia memerlukan PostgreSQL dan baris gilir tugas (task queue) di samping aplikasi web.
Pilih Navidrome melainkan anda mahukan federasi, atau melainkan Jellyfin sudah pun berjalan. Bahagian panduan seterusnya akan menyediakan Navidrome menggunakan Docker.
Mengapa API Subsonic menentukan aplikasi telefon yang anda peroleh
Subsonic merupakan pelayan muzik yang API HTTP-nya menjadi bahasa umum untuk audio yang dihoskan sendiri, dan OpenSubsonic ialah projek komuniti yang terus mengembangkannya. Sejarah itulah sebabnya telefon anda mempunyai pilihan. Navidrome tidak mengeluarkan aplikasi mudah alihnya sendiri dan tidak memerlukannya, kerana mana-mana klien Subsonic boleh log masuk menggunakan alamat pelayan dan butiran akaun anda.
Perkara ini paling penting untuk penyelarasan luar talian (offline sync), iaitu ciri yang menentukan sama ada persediaan tersebut sesuai untuk kegunaan harian. Telefon di dalam terowong tidak dapat mencapai pelayan anda, jadi klien mesti telah menyalin fail ke storan tempatan terlebih dahulu. Setiap klien boleh melakukan penstriman. Hanya sesetengahnya yang boleh memuat turun. Direktori klien di navidrome.org/apps menyatakan klien mana yang menyokongnya, dan pilihannya luas pada kedua-dua platform: Substreamer dan Ultrasonic pada Android, Amperfy dan play:Sub pada iOS. Beberapa klien yang paling mantap merupakan aplikasi berbayar, dan Symfonium pada Android ialah aplikasi yang paling kerap disebut oleh pengguna. Pasang dua aplikasi sebelum anda membuat keputusan, kerana ini merupakan bahagian sistem yang anda gunakan setiap hari.
Berapakah storan yang diperlukan oleh pustaka muzik?
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-angka tersebut merupakan anggaran magnitud yang diperoleh daripada kadar bit (bitrate), bukan ukuran koleksi sebenar, dan pengiraannya cukup mudah untuk disemak dengan fail anda sendiri. Anggap satu album sebagai 45 minit, iaitu 2,700 saat. Darabkan kadar bit dalam kilobit sesaat dengan 2,700, kemudian bahagikan dengan 8,000 untuk mendapatkan megabait. Pada 320 kbps, ini memberikan 108 MB untuk satu album, jadi seribu album adalah kira-kira 108 GB.
Format tanpa kehilangan (lossless) mengubah jawapannya. FLAC kualiti CD secara purata menghampiri 900 kbps untuk bahan biasa, jadi seribu album yang sama memerlukan kira-kira 304 GB. Pustaka 24 bit, 96 kHz mencecah kira-kira 1,013 GB, iaitu satu terabait penuh untuk koleksi yang boleh anda senaraikan di atas kertas. Salinan Opus yang mesra telefon pada 128 kbps memuatkan seribu album yang sama ke dalam 43 GB. Jalankan du -sh /path/to/music pada pustaka yang anda sudah miliki, kerana purata kadar bit anda sendiri adalah satu-satunya angka yang penting apabila anda memilih pelan.
Lebar jalur (bandwidth) adalah bahagian bil yang lebih kecil. Strim 320 kbps adalah 40 kilobait sesaat, jadi satu jam mendengar muzik memindahkan kira-kira 144 MB. Seratus jam dalam sebulan adalah sekitar 14 GB, yang mana tiada peruntukan pemindahan VPS akan mengesannya. Pengecualiannya ialah penyelarasan luar talian (offline sync) pertama bagi telefon, yang boleh menolak puluhan gigabait dalam satu malam.
Tingkat storan atau tingkat pengkomputeran?
Pelayan muzik merupakan himpunan data sejuk yang besar dengan hampir tiada pengkomputeran yang terlibat. Membaca fail pada kelajuan 40 kilobyte sesaat tidak membebankan mana-mana cakera, dan CPU hanya berfungsi semasa imbasan pustaka atau semasa transkod, yang biasanya tidak akan anda lakukan. Oleh itu, NVMe pantas pada pelan pengkomputeran tidak memberikan sebarang kelebihan di sini, manakala harganya bagi setiap gigabait adalah faktor yang menghalang anda memuat naik salinan FLAC. Ini adalah situasi di mana VPS storan lebih baik daripada VPS biasa, kerana pelan tersebut diletakkan harga berdasarkan terabait dan bukannya berdasarkan teras.
Keperluan memori adalah sederhana. Navidrome melayani pustaka peribadi dalam beberapa ratus megabait, dan imbasan merupakan kemuncak penggunaan berbanding main balik. Berikan pelayan tersebut 1 GB atau 2 GB RAM dan belanjakan baki bajet untuk cakera.
Memasang Navidrome dengan Docker Compose
Cipta direktori terlebih dahulu, dengan pemilikan diberikan kepada ID pengguna yang akan menjalankan kontena tersebut. Jika anda baharu menggunakan Compose, Docker Compose pada VPS menerangkan perkara yang diandaikan oleh fail ini.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicTulis docker-compose.yml tanpa kandungan lain, di dalam 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 sepatutnya menunjukkan servis sedang berjalan dan bukannya memulakan semula. Kontena yang memulakan semula secara berulang hampir selalu disebabkan oleh masalah keizinan pada /srv/navidrome, dan docker compose logs navidrome menamakan fail yang gagal ditulis olehnya.
Empat perincian dalam fail tersebut perlu dijelaskan. Port diterbitkan pada 127.0.0.1 sahaja, supaya pelayan boleh dicapai melalui reverse proxy dan bukan pada port 4533 daripada internet terbuka: Docker menulis peraturan firewallnya sendiri, jadi 4533:4533 biasa akan tetap terdedah walaupun pada mesin di mana ufw melaporkan segala-galanya sebagai dinafikan. Volum muzik ditetapkan sebagai baca sahaja (read only), yang bermaksud pepijat pengimbas tidak boleh memadamkan satu-satunya salinan anda. ND_SCANNER_SCHEDULE dilumpuhkan secara lalai, dan panduan yang ditulis sebelum Navidrome 0.55 memanggilnya ND_SCANSCHEDULE, satu nama yang tidak lagi wujud. Tiga tetapan sandaran mengaktifkan sandaran pangkalan data terbina dalam yang digunakan oleh bahagian sandaran di bawah.
Pindahkan muzik anda ke pelayan
Salin pustaka muzik anda menggunakan rsync, yang akan menyambung semula proses sekiranya sambungan terputus, bukannya bermula dari awal.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/Garis miring (trailing slash) pada sumber adalah penting. Tanpanya, anda akan mendapat /srv/music/Music. Apabila proses penyalinan selesai, betulkan pemilikan fail:
sudo chown -R 1000:1000 /srv/music
id -uKontena tersebut berjalan sebagai user id 1000, dan mount ditetapkan sebagai read only, jadi setiap fail mestilah boleh dibaca oleh id tersebut. Jika akaun SSH anda bukan uid 1000 pada VPS, fail yang disalin akan dimiliki oleh pengguna lain dan proses imbasan tidak akan menemui sebarang trek, manakala antara muka web akan kekal kosong. id -u akan memaparkan id sebenar anda, dan bagaimana PUID dan PGID berfungsi dalam kontena Docker menjelaskan pemetaan tersebut dengan terperinci.
Reverse proxy dan TLS supaya telefon berfungsi dari mana-mana sahaja
Halakan DNS A record ke VPS, kemudian berikan tiga baris ini kepada Caddy:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy akan meminta sijil pada permintaan pertama. Port 80 dan 443 kedua-duanya perlu dibuka, kerana cabaran ACME (automatic certificate management environment) dijawab pada port 80. Pada nginx, tambahkan proxy_buffering off; ke dalam blok location: Navidrome menolak (push) peristiwa kemajuan ke antara muka web melalui satu sambungan yang tahan lama, dan dengan buffering diaktifkan, antara muka tersebut akan menunggu respons yang masih ditahan oleh nginx. Jika anda menghidangkan servis di bawah path seperti /music dan bukannya subdomain sendiri, tetapkan ND_BASEURL kepada path yang sama atau antara muka tersebut akan dimuatkan sebagai halaman kosong. Tiga proksi yang biasa digunakan dibandingkan dalam Nginx, Caddy dan Traefik pada VPS.
Buka laman tersebut dan cipta akaun pertama. Tiada kata laluan lalai, dan pelawat pertama akan diminta untuk mencipta pengguna admin, jadi lakukan ini sebelum anda memberitahu sesiapa tentang alamat tersebut. Kemudian, uji path tepat yang digunakan oleh klien telefon:
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"Jawapan yang sihat bermula dengan {"subsonic-response":{"status":"ok" dan menamakan navidrome sebagai jenis pelayan. Badan respons yang mengandungi "status":"failed" dan kod ralat 40 bermakna proksi berfungsi dengan baik dan kelayakan (credentials) yang dimasukkan adalah salah. Ralat sijil pada langkah ini adalah perkara pertama yang perlu dibaiki, kerana kebanyakan klien telefon menolak sijil yang rosak dengan mesej yang tidak memberikan maklumat berguna kepada pengguna.
Mengapa pustaka anda kelihatan tidak betul selepas imbasan pertama
Navidrome melayari berdasarkan tag dan bukannya folder, jadi tag menentukan apa yang anda lihat. Trek tanpa tag album artist akan difailkan di bawah track artist-nya, itulah sebabnya satu kompilasi dengan artis berbeza pada setiap trek menjadi dua puluh album yang setiap satunya mempunyai satu trek. Selesaikan perkara itu pada fail, bukan dalam Navidrome: MusicBrainz Picard dan beets kedua-duanya mencari album dalam pangkalan data MusicBrainz dan menulis semula tag standard.
Navidrome juga memisahkan tag berbilang artis kepada artis yang berasingan, jadi nama kumpulan yang mengandungi pemisah akan tersilap dipisahkan, dengan AC/DC sebagai contoh yang sering ditemui oleh semua orang. ND_SCANNER_ARTISTSPLITEXCEPTIONS menyimpan nama yang tidak boleh dipisahkan sama sekali.
Fail baharu akan dikesan oleh pemerhati fail beberapa saat selepas ia dimuat naik. Pemerhati ini bergantung pada pemberitahuan perubahan kernel, dan pemberitahuan tersebut tidak sampai untuk fail yang ditulis pada network share yang dipasang dari mesin lain, jadi dalam persediaan sedemikian, ND_SCANNER_SCHEDULE berkala adalah perkara yang memastikan pustaka sentiasa terkini. Imbasan penuh membaca tag setiap fail, yang perlahan pada pustaka yang besar, dan itulah salah satu sebab pangkalan data di bawah perlu dilindungi.
Pengguna, senarai main dan perkongsian
Pentadbir mencipta akaun lain melalui antara muka web, dan tiada pendaftaran kendiri disediakan. Setiap pengguna mempunyai kiraan main, senarai main, kegemaran dan penilaian yang berasingan, supaya satu isi rumah tidak berkongsi profil citarasa yang sama.
Senarai main diperoleh daripada dua arah. Senarai main yang dibuat dalam klien disimpan di dalam pangkalan data. Fail .m3u yang diletakkan ke dalam folder pustaka akan diimport semasa proses imbasan, iaitu cara mudah untuk memindahkan senarai main daripada pemain desktop. Senarai main pintar ialah fail .nsp, iaitu fail peraturan JSON kecil yang diimport dengan cara yang sama, dan ia mengemas kini diri sendiri apabila pustaka berubah.
Perkongsian didayakan secara lalai bermula dari versi 0.63.0, yang dikeluarkan pada Julai 2026. Ia membolehkan pengguna mencipta pautan awam ke album yang boleh dibuka oleh sesiapa sahaja tanpa perlu log masuk. Pada pelayan yang menyimpan keseluruhan pustaka anda, ini mungkin bukan perkara yang anda inginkan, dan menetapkan ND_ENABLESHARING kepada false akan mematikan fungsi tersebut.
Sandarkan pangkalan data secara berasingan daripada fail muzik
Sandaran Navidrome hanya meliputi pangkalan data sahaja. Dokumentasinya menyatakan dengan jelas: proses sandaran hanya menyandarkan pangkalan data, iaitu pengguna, kiraan main (play counts) dan data lain, tetapi tidak menyandarkan muzik atau konfigurasi. Pemisahan ini adalah cara yang betul untuk menanganinya, kerana kedua-dua bahagian tersebut mempunyai risiko kegagalan yang berbeza. Fail muzik boleh disalin semula daripada cakera asal yang anda gunakan untuk menyalin (rip) muzik tersebut. Kiraan main, penarafan, kegemaran dan senarai main tidak wujud di tempat lain, dan proses imbasan semula (rescan) tidak akan memulihkannya.
Fail compose sudah pun menulis salinan harian ke dalam /data/backup dan menyimpan tujuh salinan daripadanya. Buat salinan secara manual sebelum melakukan naik taraf:
sudo docker compose run --rm navidrome backup createProses pemulihan akan memadamkan pangkalan data semasa dan menyalin fail sandaran ke tempatnya, dan ia mesti dijalankan semasa Navidrome dihentikan. Tiada aspek pemulihan yang selamat dilakukan pada pelayan yang sedang aktif.
Fail-fail tersebut masih berada pada VPS yang sama, jadi ia tidak akan terselamat jika VPS tersebut gagal. Hantar /srv/navidrome ke mesin lain atau ke storan objek mengikut jadual, yang merupakan tugas utama bagi restic dan BorgBackup. Keseluruhan direktori tersebut bersaiz kecil, biasanya jauh di bawah satu gigabait, jadi salinan harian yang disulitkan ke luar pelayan hampir tidak memakan kos dan mampu memulihkan segala data yang tidak dapat dikembalikan oleh proses imbasan semula.
FAQ
Adakah saya perlu melakukan transkod muzik pada VPS?
Hampir tidak perlu. Telefon dan pelayar web boleh menyahkod MP3, AAC, Opus dan FLAC secara sendiri, jadi pelayan hanya menghantar fail asal dan hampir tidak menggunakan CPU. Terdapat satu situasi yang wajar untuk mengaktifkannya: pustaka FLAC yang distrim melalui data mudah alih, di mana penukaran daripada kira-kira 900 kbps kepada Opus pada 128 kbps mengurangkan penggunaan data sebanyak kira-kira tujuh kali ganda. Navidrome boleh melakukan perkara ini mengikut pengguna dan pemain, dan ia kekal dimatikan sehingga anda mengaktifkannya.
Mengapa aplikasi telefon saya tidak boleh memuat turun muzik untuk pendengaran luar talian?
Kerana storan luar talian adalah ciri klien, bukan ciri pelayan. API Subsonic membenarkan mana-mana klien mengambil keseluruhan fail, tetapi aplikasi tersebut yang menentukan sama ada mahu menyimpan salinan pada telefon. Semak direktori klien di navidrome.org/apps dan pilih satu yang deskripsinya menyebut tentang muat turun luar talian atau caching. Sesetengah klien hanya menyimpan cache bagi apa yang telah anda mainkan, yang tidak sama dengan menyegerakkan album sebelum memulakan perjalanan.
Mengapa satu album terpecah kepada beberapa album selepas imbasan?
Tag album artist tiada atau tidak konsisten pada trek-trek tersebut. Navidrome mengumpulkan muzik berdasarkan tag dan bukannya folder, jadi dua belas trek dengan dua belas nilai artis yang berbeza dan tiada nilai album artist yang dikongsi akan kelihatan seperti dua belas album. Tetapkan tag album artist pada setiap trek dalam album tersebut, biasanya kepada Various Artists untuk kompilasi, kemudian biarkan ia mengimbas semula. MusicBrainz Picard atau beets boleh melakukan ini untuk keseluruhan folder sekaligus.
Adakah penstriman muzik yang dihoskan sendiri menggantikan Spotify?
Ia menggantikan pemain dan pustaka, bukan katalog. Anda mendapat koleksi anda sendiri pada setiap peranti, dengan senarai main dan kiraan mainan yang tidak boleh diambil daripada anda oleh sebarang perubahan pelesenan. Anda tidak mendapat keluaran baharu, dan anda tidak mendapat cadangan yang dibina daripada tabiat pendengaran orang lain. Kebanyakan orang yang menjalankan sistem ini membeli muzik mereka dan mengekalkan akaun penstriman yang murah untuk tujuan penemuan muzik baharu.