Come creare uno streaming musicale self-hosted su VPS
Installa Navidrome su un VPS e ascolta la tua libreria da ogni telefono. Guida a spazio, client Subsonic, sincronizzazione offline, TLS e backup sicuri.
Cosa offre lo streaming musicale self-hosted su un VPS
Lo streaming musicale self-hosted su un VPS significa gestire il player e fornire la musica. Il server conserva i file che già possiedi e qualsiasi telefono può raggiungerlo tramite Internet con un normale accesso. Prima di iniziare, valuta con chiarezza il compromesso: questa soluzione sostituisce il player di un servizio di streaming, non il relativo catalogo. Nella libreria non compare nulla di nuovo finché non acquisti o estrai la musica e non copi il file sul server.
L'audio richiede molte meno risorse rispetto al video. I file sono piccoli, i telefoni decodificano tutti i formati comuni senza assistenza e un ascoltatore usa meno banda rispetto a una videochiamata. La CPU non è un problema in questo caso. Il vero limite è lo spazio su disco. Gli altri due fattori che determinano il funzionamento della soluzione sono la qualità dei tag e la possibilità per l'app del telefono di scaricare la musica per l'uso offline.
Quale server musicale: Navidrome, Jellyfin o Funkwhale?
Navidrome è la scelta predefinita quando ti interessa soltanto l'audio. È un singolo binario Go eseguito in un solo container e conserva lo stato in un unico database SQLite. Espone l'API Subsonic, motivo per cui esiste un'ampia famiglia di app telefoniche di terze parti. La versione 0.63.2 era quella corrente ad agosto 2026. Il progetto dichiara che il software del server funziona anche su hardware compatto come un Raspberry Pi Zero, quindi non è il software del server la voce di costo principale.
Jellyfin è una scelta adatta se esegui già Jellyfin come server multimediale su un VPS per i video. La libreria musicale funziona e Finamp è un'app musicale Jellyfin per Android e iOS che scarica le tracce per l'ascolto offline. Il limite è l'API. Jellyfin non include un endpoint Subsonic e il plugin della community che lo aggiungeva non viene più aggiornato dal 2022; di conseguenza, l'ecosistema di app Subsonic non è disponibile. Devi usare le app che supportano l'API proprietaria di Jellyfin, che sono meno numerose.
Funkwhale è l'opzione federata e la versione 2.0 è stata rilasciata a marzo 2026. Un server Funkwhale è chiamato pod; i pod federano tramite ActivityPub, il protocollo alla base di Mastodon, e un utente di un pod può seguire una libreria pubblica ospitata su un altro. Funkwhale espone a sua volta una parte dell'API Subsonic, con una differenza importante: ogni utente imposta una password Subsonic separata nelle proprie impostazioni, perché il protocollo Subsonic richiede una password che il server possa leggere. L'installazione di Funkwhale è più impegnativa, perché accanto all'app web richiede PostgreSQL e una coda di attività.
Scegli Navidrome, a meno che tu non voglia usare la federazione o che Jellyfin sia già in esecuzione. Il resto di questa guida configura Navidrome con Docker.
Perché l’API Subsonic determina quale app usare sul telefono
Subsonic era un server musicale la cui API HTTP è diventata il linguaggio comune per l’audio self-hosted, mentre OpenSubsonic è il progetto della community che continua a estenderla. Per questo sul telefono sono disponibili diverse opzioni. Navidrome non distribuisce una propria app mobile e non ne ha bisogno, perché qualsiasi client Subsonic accede usando l’indirizzo del server e le credenziali dell’account.
Questo è particolarmente importante per la sincronizzazione offline, la funzione che determina se la configurazione è adatta all’uso quotidiano. Un telefono in una galleria non può raggiungere il server, quindi il client deve aver copiato in anticipo i file nello spazio di archiviazione locale. Tutti i client eseguono lo streaming. Solo alcuni scaricano i file. La directory dei client all’indirizzo navidrome.org/apps indica quali lo supportano; la scelta è ampia su entrambe le piattaforme: Substreamer e Ultrasonic su Android, Amperfy e play:Sub su iOS. Alcuni dei client più completi sono app a pagamento e, su Android, Symfonium è quello citato più spesso. Installane due prima di decidere, perché questa è la parte del sistema con cui interagisci ogni giorno.
Di quanto spazio di archiviazione ha bisogno una libreria musicale?
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"
}
]Queste sono stime dell’ordine di grandezza ricavate dal bitrate, non misurazioni di una raccolta reale. Il calcolo è abbastanza semplice da poter essere verificato sui propri file. Considera un album di 45 minuti, cioè 2.700 secondi. Moltiplica il bitrate espresso in kilobit al secondo per 2.700, quindi dividi per 8.000 per ottenere i megabyte. A 320 kbps si ottengono 108 MB per album, quindi mille album occupano circa 108 GB.
Il formato lossless cambia il risultato. Un FLAC con qualità CD raggiunge in media circa 900 kbps con materiale ordinario, quindi gli stessi mille album richiedono circa 304 GB. Una libreria a 24 bit e 96 kHz arriva a circa 1,013 GB, cioè un terabyte per una raccolta che potresti elencare su carta. Una copia Opus ottimizzata per gli smartphone a 128 kbps contiene gli stessi mille album in 43 GB. Esegui du -sh /path/to/music sulla libreria che hai già, perché il tuo bitrate medio è l’unico dato rilevante quando scegli un piano.
La larghezza di banda rappresenta la parte minore del costo complessivo. Uno stream a 320 kbps trasferisce 40 kilobyte al secondo, quindi un’ora di ascolto genera circa 144 MB di traffico. Cento ore al mese corrispondono a circa 14 GB, una quantità che non incide sul limite di trasferimento di una VPS. L’eccezione è la prima sincronizzazione offline di un telefono, che in una sola sera può trasferire decine di gigabyte.
Livello di archiviazione o livello di calcolo?
Un server musicale contiene una grande quantità di dati freddi e richiede pochissima capacità di calcolo. La lettura di un file a 40 kilobyte al secondo lascia inattivo qualsiasi disco, mentre la CPU lavora soltanto durante la scansione della libreria o la transcodifica, attività che nella maggior parte dei casi non eseguirai. Il rapido NVMe incluso in un piano di calcolo non offre quindi alcun vantaggio in questo scenario, mentre il suo costo per gigabyte può impedirti di caricare le copie FLAC. Questo è il caso in cui un VPS per l'archiviazione è preferibile a un VPS standard, perché questi piani vengono tariffati in base ai terabyte anziché ai core.
La memoria richiesta è contenuta. Navidrome gestisce una libreria personale con poche centinaia di megabyte e la scansione rappresenta il picco di utilizzo, non la riproduzione. Assegna al server 1 GB o 2 GB di RAM e usa il resto del budget per lo spazio su disco.
Installare Navidrome con Docker Compose
Creare prima le directory e assegnarle all'ID utente con cui verrà eseguito il container. Se Docker Compose è una novità, Docker Compose su un VPS descrive le impostazioni presupposte da questo file.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicScrivere docker-compose.yml senza aggiungere quasi altro, nella sua directory dedicata:
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 dovrebbe mostrare il servizio in esecuzione, non in riavvio continuo. Un container che si riavvia in ciclo presenta quasi sempre un problema di permessi su /srv/navidrome, mentre docker compose logs navidrome indica il file che non è stato possibile scrivere.
Nel file ci sono quattro dettagli che meritano una spiegazione. La porta è pubblicata solo su 127.0.0.1, quindi il server è raggiungibile tramite il reverse proxy e non sulla porta 4533 da Internet. Docker scrive le proprie regole del firewall, quindi un semplice 4533:4533 resta esposto anche su un server in cui ufw indica che tutto è negato. Il volume della musica è in sola lettura: un bug dello scanner non può quindi eliminare l'unica copia disponibile. ND_SCANNER_SCHEDULE è disabilitato per impostazione predefinita e nelle guide scritte prima di Navidrome 0.55 viene chiamato ND_SCANSCHEDULE, un nome che non esiste più. Le tre impostazioni per i backup attivano il backup integrato del database, utilizzato dalla sezione sui backup riportata sotto.
Trasferire la musica sul server
Copia la libreria con rsync. Se la connessione si interrompe, il trasferimento riprende invece di ricominciare.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/La barra finale nel percorso sorgente è importante. Senza di essa ottieni /srv/music/Music. Al termine della copia, correggi il proprietario:
sudo chown -R 1000:1000 /srv/music
id -uIl container viene eseguito con l'ID utente 1000 e il mount è in sola lettura. Per questo ogni file deve essere leggibile da quell'ID. Se l'account SSH non ha UID 1000 sul VPS, la copia risulta di proprietà di un altro utente. La scansione non trova alcuna traccia e l'interfaccia Web rimane vuota. id -u mostra il tuo ID effettivo, mentre come funzionano PUID e PGID nei container Docker spiega in dettaglio questa mappatura.
Reverse proxy e TLS per usare il telefono da qualsiasi rete
Punta un record DNS A al VPS, quindi configura Caddy con queste tre righe:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy richiede il certificato alla prima richiesta. Le porte 80 e 443 devono essere entrambe aperte, perché la challenge ACME (ambiente per la gestione automatica dei certificati) riceve la risposta sulla porta 80. In nginx, aggiungi proxy_buffering off; al blocco location: Navidrome invia gli eventi di avanzamento all'interfaccia web tramite una connessione persistente, e con il buffering attivo l'interfaccia resta in attesa della risposta che nginx sta ancora trattenendo. Se lo pubblichi in un percorso come /music invece che su un sottodominio dedicato, imposta ND_BASEURL sullo stesso percorso; altrimenti l'interfaccia viene caricata come una pagina vuota. I tre proxy più comuni sono confrontati in Nginx, Caddy e Traefik su un VPS.
Apri il sito e crea il primo account. Non esiste una password predefinita e al primo visitatore viene chiesto di creare l'utente amministratore. Esegui questa operazione prima di comunicare l'indirizzo a chiunque. Quindi verifica il percorso esatto usato dal client sul telefono:
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"Una risposta corretta inizia con {"subsonic-response":{"status":"ok" e indica navidrome come tipo di server. Un corpo che contiene "status":"failed" e il codice di errore 40 indica che il proxy funziona e che le credenziali sono errate. Se a questo punto viene restituito un errore del certificato, risolvilo per primo: la maggior parte dei client per telefono rifiuta un certificato non valido mostrando un messaggio privo di informazioni utili.
Perché la libreria appare errata dopo la prima scansione
Navidrome organizza la musica in base ai tag e non alle directory, quindi sono i tag a determinare ciò che viene visualizzato. Una traccia senza il tag dell'artista dell'album viene catalogata in base all'artista della traccia. Per questo una compilation con un artista diverso per ogni traccia può diventare una raccolta di venti album composti da una sola traccia ciascuno. Correggete i tag nei file, non in Navidrome: MusicBrainz Picard e beets cercano l'album nel database MusicBrainz e riscrivono i tag standard.
Navidrome divide inoltre un tag con più artisti in artisti distinti. Di conseguenza, il nome di una band che contiene un separatore viene suddiviso per errore; AC/DC è l'esempio più comune. ND_SCANNER_ARTISTSPLITEXCEPTIONS contiene i nomi che non devono mai essere suddivisi.
I nuovi file vengono rilevati da un file watcher pochi secondi dopo la loro aggiunta. Il watcher dipende dalle notifiche delle modifiche del kernel, che non vengono generate per i file scritti su una condivisione di rete montata da un altro computer. In questo tipo di configurazione, quindi, è la scansione periodica ND_SCANNER_SCHEDULE a mantenere aggiornata la libreria. Una scansione completa legge i tag di ogni file, quindi può essere lenta in una libreria di grandi dimensioni. Questo è uno dei motivi per cui conviene proteggere il database descritto di seguito.
Utenti, playlist e condivisione
L'amministratore crea gli altri account nell'interfaccia web; non è prevista l'autoregistrazione. Ogni utente dispone di conteggi degli ascolti, playlist, preferiti e valutazioni separati. In questo modo gli utenti della stessa famiglia non condividono un unico profilo dei gusti.
Le playlist possono arrivare da due origini. Una playlist creata in un client viene memorizzata nel database. Un file .m3u copiato nella directory della libreria viene importato durante la scansione. Questo è il modo più semplice per trasferire le playlist da un player desktop. Le playlist intelligenti sono file .nsp, piccoli file JSON che definiscono le regole e vengono importati nello stesso modo. Si aggiornano automaticamente quando cambia la libreria.
La condivisione è attiva per impostazione predefinita dalla versione 0.63.0, rilasciata a luglio 2026. Consente a un utente di creare un link pubblico a un album, che chiunque può aprire senza autenticarsi. Su un server che contiene l'intera libreria, questo comportamento potrebbe non essere desiderato. Impostare ND_ENABLESHARING su false lo disattiva.
Eseguire il backup del database separatamente dai file musicali
Il backup nativo di Navidrome copre solo il database. La documentazione lo specifica chiaramente: il processo di backup salva il database, quindi utenti, conteggi degli ascolti e gli altri dati, ma non salva la musica né la configurazione. È corretto considerare separatamente questi due elementi, perché possono subire guasti diversi. I file musicali possono essere copiati di nuovo dal disco da cui sono stati estratti. I conteggi degli ascolti, le valutazioni, i preferiti e le playlist non esistono altrove, e una nuova scansione non li ripristina.
Il file Compose crea già ogni notte una copia in /data/backup e ne conserva sette. Creare manualmente una copia prima di un aggiornamento:
sudo docker compose run --rm navidrome backup createIl ripristino cancella il database corrente e copia il backup al suo posto. Deve essere eseguito mentre Navidrome è arrestato. Un ripristino non è sicuro su un server in esecuzione.
Questi file si trovano ancora sullo stesso VPS, quindi non sopravvivono alla perdita del VPS. Inviare periodicamente /srv/navidrome a un'altra macchina o a uno storage a oggetti: è proprio il tipo di attività per cui sono progettati restic e BorgBackup. L'intera directory è di piccole dimensioni, in genere molto inferiore a un gigabyte. Una copia giornaliera crittografata al di fuori del server costa quasi nulla e consente di recuperare tutto ciò che una nuova scansione non può ripristinare.
FAQ
Devo transcodificare la musica su un VPS?
Quasi mai. Telefoni e browser decodificano autonomamente MP3, AAC, Opus e FLAC. Il server invia quindi il file nel formato originale e utilizza una quantità di CPU quasi nulla. C'è un caso in cui vale la pena abilitarla: una raccolta FLAC riprodotta tramite rete mobile. In questo caso, convertire da circa 900 kbps a Opus a 128 kbps riduce il consumo di dati di circa sette volte. Navidrome può applicare questa impostazione per singolo utente e singolo player. La transcodifica resta disabilitata finché non la attivi.
Perché l'app del telefono non riesce a scaricare la musica per l'ascolto offline?
Perché l'archiviazione offline è una funzione del client, non del server. L'API Subsonic consente a qualsiasi client di scaricare un file completo. È però l'app a decidere se conservarne una copia sul telefono. Controlla la directory dei client su navidrome.org/apps e scegline uno la cui descrizione menzioni i download offline o il caching. Alcuni client memorizzano nella cache solo i brani già riprodotti. Questo non equivale a sincronizzare un album prima di un viaggio.
Perché dopo la scansione un album è stato suddiviso in più album?
Il tag dell'artista dell'album è assente o non è coerente tra le tracce. Navidrome raggruppa i brani in base ai tag, non alle directory. Di conseguenza, dodici tracce con dodici valori diversi per l'artista e senza un valore condiviso per l'artista dell'album vengono interpretate come dodici album. Imposta il tag dell'artista dell'album su ogni traccia dell'album, in genere su Various Artists per una compilation, quindi avvia una nuova scansione. MusicBrainz Picard o beets possono applicare questa modifica a un'intera directory in una sola operazione.
Lo streaming musicale self-hosted sostituisce Spotify?
Sostituisce il player e la raccolta musicale, non il catalogo. Hai la tua raccolta su ogni dispositivo, con playlist e conteggi di riproduzione che nessuna modifica alle licenze può sottrarti. Non ottieni le nuove uscite e non ottieni consigli basati sugli ascolti di altri utenti. La maggior parte delle persone che configura questo tipo di servizio acquista la propria musica e mantiene un account di streaming economico per scoprire nuovi contenuti.