Héberger sa musique en streaming sur un VPS
Installez Navidrome sur un VPS pour écouter votre bibliothèque sur téléphone. Dimensionnement du stockage, clients Subsonic, mode hors ligne, TLS et sauvegardes.
Ce que vous apporte le streaming musical auto-hébergé sur un VPS
Le streaming musical auto-hébergé sur un VPS signifie que vous exécutez le player et fournissez la musique. Le serveur stocke les fichiers que vous possédez déjà, et n’importe quel téléphone peut y accéder sur Internet avec une authentification classique. Soyez clair sur le compromis avant de commencer : cette solution remplace le player d’un service de streaming, pas son catalogue. Rien de nouveau n’apparaît dans votre bibliothèque tant que vous ne l’avez pas acheté ou extrait, puis copié sur le serveur.
L’audio sollicite beaucoup moins un serveur que la vidéo. Les fichiers sont petits, les téléphones décodent tous les formats courants sans aide et un auditeur utilise moins de bande passante qu’un appel vidéo. Le CPU est rarement un problème ici. L’espace disque est la véritable contrainte. Les deux autres éléments qui déterminent si cette solution fonctionne sont la qualité de vos tags et la capacité de l’application mobile à télécharger la musique pour une utilisation hors ligne.
Quel serveur de musique choisir : Navidrome, Jellyfin ou Funkwhale ?
Navidrome est le choix par défaut si vous vous intéressez uniquement à l’audio. Il tient dans un seul binaire Go exécuté dans un seul conteneur et conserve son état dans une seule base SQLite. Il fournit l’API Subsonic, ce qui explique l’existence d’une vaste famille d’applications mobiles tierces. La version 0.64.2, publiée en septembre 2026, était la version courante au 2026-10-10. N’utilisez rien de plus ancien que 0.64.1 : cette version corrigeait cinq avis de sécurité, dont une vulnérabilité permettant de deviner des mots de passe Subsonic sans limitation de débit. Le projet indique qu’il fonctionne correctement sur du matériel aux ressources limitées, comme un Raspberry Pi. Le logiciel serveur ne sera donc pas le poste de dépense principal.
Jellyfin est intéressant si vous utilisez déjà Jellyfin comme serveur multimédia sur un VPS pour la vidéo. Sa bibliothèque musicale fonctionne, et Finamp est une application musicale Jellyfin gratuite pour Android et iOS qui télécharge les morceaux pour une écoute hors ligne. Jellyfin ne fournit toujours pas d’endpoint Subsonic intégré, mais un plugin communautaire en ajoute un. Subfin-NG, un fork du plugin Subfin, « permet aux applications musicales compatibles avec Subsonic de lire votre bibliothèque musicale Jellyfin » en ajoutant une API OpenSubsonic à Jellyfin. Il nécessite Jellyfin 12.1 ou une version ultérieure et a connu trois releases entre le 24 et le 28 septembre 2026. Les applications Subsonic peuvent donc aussi accéder à Jellyfin, par l’intermédiaire d’un plugin tiers plutôt que d’une fonctionnalité native. Testez votre client avant de vous y fier. Le pont fonctionne également dans l’autre sens : Navidrome 0.64.0 a ajouté une API Jellyfin expérimentale, désactivée par défaut et activable avec ND_JELLYFIN_ENABLED. Sa documentation indique qu’elle est testée avec Finamp, Jellify et Feishin.
Funkwhale est l’option fédérée, et la version 2.0 est sortie en mars 2026. Un serveur Funkwhale s’appelle un pod. Les pods se fédèrent via ActivityPub, le protocole utilisé par Mastodon, et les utilisateurs suivent les playlists des autres pods. La version 2.0 a remplacé les anciennes bibliothèques par des playlists. Les abonnements aux bibliothèques sont donc devenus des abonnements aux playlists. Un pod en version 2.0 ne se fédère pas avec des pods qui utilisent encore une version 1.x. Il fournit également une partie de l’API Subsonic, avec une différence importante : chaque utilisateur définit un mot de passe Subsonic distinct dans ses propres paramètres, car le protocole Subsonic attend un mot de passe que le serveur peut relire. L’installation de Funkwhale est plus lourde, car elle nécessite PostgreSQL et une task queue en plus de l’application web.
Choisissez Navidrome, sauf si vous avez besoin de la fédération ou si Jellyfin est déjà en fonctionnement. La suite de ce guide configure Navidrome avec Docker.
Pourquoi l’API Subsonic détermine l’application mobile que vous utilisez
Subsonic était un serveur musical dont l’API HTTP est devenue le langage commun de l’audio auto-hébergé. OpenSubsonic est le projet communautaire qui continue de l’étendre. C’est pourquoi vous avez le choix sur votre téléphone. Navidrome ne fournit pas sa propre application mobile et n’en a pas besoin, car tout client Subsonic se connecte avec l’adresse du serveur et les identifiants de votre compte.
Cela concerne surtout la synchronisation hors ligne, qui détermine si l’installation reste utilisable au quotidien. Un téléphone dans un tunnel ne peut pas joindre votre serveur. Le client doit donc avoir copié les fichiers dans le stockage local à l’avance. Tous les clients diffusent la musique en streaming. Seuls certains permettent de télécharger les fichiers. Le répertoire des clients sur navidrome.org/apps indique lesquels le permettent. Le choix est vaste sur les deux plateformes : Substreamer et Ultrasonic sur Android, Amperfy et play:Sub sur iOS. Plusieurs des meilleurs clients sont des applications payantes. Sur Android, Symfonium est le nom le plus souvent cité. Installez-en deux avant de choisir, car c’est la partie du système que vous utiliserez tous les jours.
De combien de stockage une bibliothèque musicale a-t-elle besoin ?
Les données de ce graphique
[
{
"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"
}
]Ces chiffres donnent des ordres de grandeur calculés à partir du bitrate, et non des mesures réalisées sur une collection réelle. Le calcul est suffisamment simple pour que vous puissiez le vérifier avec vos propres fichiers. Comptez 45 minutes par album, soit 2,700 secondes. Multipliez le bitrate, en kilobits par seconde, par 2,700, puis divisez par 8,000 pour obtenir des mégaoctets. À 320 kbps, cela représente 108 MB par album. Mille albums occupent donc environ 108 GB.
Le lossless modifie le résultat. Un fichier FLAC en qualité CD atteint en moyenne près de 900 kbps avec un contenu courant. Les mêmes mille albums nécessitent donc environ 304 GB. Une bibliothèque en 24 bits et 96 kHz atteint environ 1,013 GB, soit un téraoctet complet pour une collection que vous pourriez encore énumérer sur papier. Une copie Opus adaptée à un téléphone, à 128 kbps, fait tenir ces mêmes mille albums dans 43 GB. Exécutez du -sh /path/to/music sur la bibliothèque que vous possédez déjà. Votre bitrate moyen est le seul chiffre qui compte lorsque vous choisissez une offre.
La bande passante représente la plus petite partie de la facture. Un flux à 320 kbps correspond à 40 kilooctets par seconde. Une heure d’écoute transfère donc environ 144 MB. Cent heures par mois représentent environ 14 GB, ce qu’aucune limite de transfert de VPS ne remarque. L’exception concerne la première synchronisation offline d’un téléphone, qui peut transférer plusieurs dizaines de gigaoctets en une soirée.
Stockage ou calcul ?
Un serveur de musique contient principalement des données froides et sollicite très peu le processeur. La lecture d’un fichier à 40 kilooctets par seconde laisse n’importe quel disque pratiquement inactif. Le processeur ne travaille réellement que pendant l’analyse de la bibliothèque, le transcodage, que vous n’utiliserez généralement pas, et l’extraction puis la mise en cache des pochettes, pendant l’analyse ou lors de la première ouverture d’un élément. Le NVMe rapide inclus dans une offre de calcul ne vous apporte donc rien ici. En revanche, son prix au gigaoctet peut vous empêcher de téléverser les copies FLAC. C’est le cas où un VPS de stockage est plus intéressant qu’un VPS classique, car ces offres sont facturées au téraoctet plutôt qu’au nombre de cœurs.
La mémoire nécessaire reste modeste. Navidrome sert une bibliothèque personnelle avec quelques centaines de mégaoctets, et l’analyse constitue le pic de consommation, pas la lecture. Attribuez 1 GB ou 2 GB de RAM au serveur et consacrez le reste du budget au disque.
Installer Navidrome avec Docker Compose
Créez d’abord les répertoires, avec comme propriétaire l’ID utilisateur sous lequel le conteneur s’exécutera. Si Compose est nouveau pour vous, Docker Compose sur un VPS explique les éléments supposés par ce fichier.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicÉcrivez docker-compose.yml, sans presque rien d’autre, dans son propre répertoire :
services:
navidrome:
image: deluan/navidrome:0.64.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 doit indiquer que le service est en cours d’exécution, et non qu’il redémarre. Un conteneur qui redémarre en boucle signale presque toujours un problème de permissions sur /srv/navidrome, et docker compose logs navidrome indique le nom du fichier qu’il n’a pas pu écrire.
Quatre éléments de ce fichier méritent une explication. Le port est publié uniquement sur 127.0.0.1. Le serveur est donc accessible par le reverse proxy, et non sur le port 4533 depuis Internet. Docker ajoute ses propres règles de firewall. Ainsi, un simple 4533:4533 reste exposé, même sur une machine où ufw indique que tout est refusé. Le volume contenant la musique est monté en lecture seule. Un bug du scanner ne peut donc pas supprimer votre seule copie. ND_SCANNER_SCHEDULE est désactivé par défaut. Les guides rédigés avant Navidrome 0.55 l’appellent ND_SCANSCHEDULE, qui est l’ancien nom renommé dans la version 0.55. Les trois paramètres de sauvegarde activent la sauvegarde intégrée de la base de données, utilisée par la section consacrée aux sauvegardes ci-dessous.
Transférez votre musique sur le serveur
Copiez la bibliothèque avec rsync. Le transfert reprend là où il s’est arrêté au lieu de recommencer lorsque la connexion est interrompue.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/La barre oblique finale du chemin source est importante. Sans elle, vous obtenez /srv/music/Music. Une fois la copie terminée, corrigez le propriétaire :
sudo chown -R 1000:1000 /srv/music
id -uLe conteneur s’exécute avec l’ID utilisateur 1000 et le montage est en lecture seule. Cet ID doit donc pouvoir lire chaque fichier et parcourir chaque répertoire. Si la copie appartient à un autre compte dont les permissions interdisent l’accès aux autres utilisateurs, l’analyse ne trouve aucune piste. L’interface web reste alors vide et le journal affiche open /music: permission denied. La commande chown ci-dessus permet de corriger le problème. Si d’autres programmes utilisent également ce répertoire, la documentation Docker de Navidrome recommande plutôt d’autoriser la lecture sans modifier le propriétaire : sudo chmod -R a+rX /srv/music. id -u affiche votre ID réel, et explique le fonctionnement de PUID et PGID dans les conteneurs Docker en détail.
Un reverse proxy et TLS pour que le téléphone fonctionne depuis n’importe où
Pointez un enregistrement DNS A vers le VPS, puis donnez ces trois lignes à Caddy :
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy demande le certificat lors de la première requête. Le port 443 doit être ouvert. Caddy essaie d’abord le challenge HTTP ACME (automatic certificate management environment) sur le port 80. Si cela échoue, il passe au challenge TLS-ALPN sur le port 443. Un port 80 fermé n’empêche donc pas l’obtention du certificat. Laissez tout de même le port 80 ouvert, car la redirection automatique de Caddy de HTTP vers HTTPS est servie sur ce port. Avec nginx, ajoutez proxy_buffering off; au bloc location : Navidrome envoie les événements de progression à l’interface web sur une connexion longue durée. Avec la mise en tampon activée, l’interface attend une réponse que nginx conserve encore. Si vous le servez sous un chemin tel que /music plutôt que sur son propre sous-domaine, définissez ND_BASEURL avec le même chemin. Sinon, l’interface s’affiche sous forme de page blanche. Les trois proxies courants sont comparés dans Nginx, Caddy et Traefik sur un VPS.
Ouvrez le site et créez le premier compte. Il n’existe pas de mot de passe par défaut. Le premier visiteur doit créer l’utilisateur administrateur. Faites-le avant de communiquer l’adresse à qui que ce soit. Testez ensuite le chemin exact utilisé par un client mobile :
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"Une réponse correcte commence par {"subsonic-response":{"status":"ok" et indique navidrome comme type de serveur. Un corps contenant "status":"failed" et un code d’erreur 40 signifient que le proxy fonctionne et que les identifiants sont incorrects. Une erreur de certificat à cette étape doit être corrigée en priorité, car la plupart des clients mobiles refusent un mauvais certificat en affichant un message qui n’explique rien à l’utilisateur.
Pourquoi votre bibliothèque semble incorrecte après le premier scan
Navidrome parcourt la musique à partir des tags, et non des dossiers. Les tags déterminent donc ce que vous voyez. Lorsqu’une piste ne possède pas de tag d’artiste de l’album, elle est classée sous l’artiste de la piste. C’est pourquoi une compilation avec un artiste différent sur chaque piste devient vingt albums d’une seule piste chacun. Corrigez les tags dans les fichiers, et non dans Navidrome : MusicBrainz Picard et beets recherchent tous deux l’album dans la base MusicBrainz, puis réécrivent les tags standard.
Navidrome sépare également un tag contenant plusieurs artistes. Un groupe dont le nom contient un séparateur est donc découpé par erreur ; AC/DC en est l’exemple le plus courant. ND_SCANNER_ARTISTSPLITEXCEPTIONS contient les noms qui ne doivent jamais être séparés.
Les nouveaux fichiers sont détectés quelques secondes après leur ajout. Le file watcher dépend des notifications de modification du kernel. Celles-ci ne sont pas transmises pour les fichiers écrits sur un partage réseau monté depuis une autre machine. Dans ce type de configuration, le ND_SCANNER_SCHEDULE périodique maintient donc la bibliothèque à jour. Un rescan complet lit les tags de chaque fichier, ce qui est lent dans une grande bibliothèque. C’est l’une des raisons pour lesquelles la base de données présentée ci-dessous mérite d’être protégée.
Utilisateurs, playlists et partage
Un administrateur crée les autres comptes dans l’interface web. L’inscription autonome n’est pas disponible. Chaque utilisateur dispose de ses propres statistiques de lecture, playlists, favoris et évaluations. Les membres d’un même foyer ne partagent donc pas un seul profil de goûts.
Les playlists proviennent de deux sources. Une playlist créée dans un client est enregistrée dans la base de données. Un fichier .m3u placé dans le dossier de la bibliothèque est importé lors de l’analyse. C’est la méthode la plus simple pour transférer des playlists depuis un lecteur de bureau. Les playlists intelligentes sont des fichiers .nsp, de petits fichiers de règles JSON importés de la même manière. Elles se mettent à jour automatiquement lorsque la bibliothèque change.
Le partage est activé par défaut depuis la version 0.63.0, publiée en juillet 2026. Il permet à un utilisateur de créer un lien public vers un album, que n’importe qui peut ouvrir sans se connecter. Sur un serveur qui contient toute votre bibliothèque, ce comportement peut être indésirable. Définir ND_ENABLESHARING sur false le désactive.
Sauvegarder la base de données séparément des fichiers musicaux
La sauvegarde intégrée de Navidrome couvre uniquement la base de données. La documentation est explicite : le processus sauvegarde la base de données, c’est-à-dire les utilisateurs, le nombre d’écoutes et les autres données associées, mais pas la musique ni la configuration. Cette séparation est la bonne manière de raisonner, car les deux éléments ne se restaurent pas de la même façon. Les fichiers musicaux peuvent être recopiés depuis le disque à partir duquel vous les avez extraits. Les nombres d’écoutes, les évaluations, les favoris et les playlists n’existent nulle part ailleurs. Un nouveau scan ne les restaure pas.
Le fichier Compose écrit déjà une copie chaque nuit dans /data/backup et en conserve sept. Effectuez une sauvegarde manuelle avant une mise à niveau :
sudo docker compose run --rm navidrome backup createLe passage de 0.63 à 0.64 est la mise à niveau qui le nécessite le plus. La version 0.64.0 réencode chaque identifiant interne lors d’une migration qui modifie toutes les tables. Les clients qui conservent des téléchargements hors ligne devront peut-être se resynchroniser ensuite.
La restauration supprime la base de données actuelle et copie la sauvegarde à sa place. Elle doit être effectuée lorsque Navidrome est arrêté. Une restauration n’est pas sûre sur un serveur en production.
Ces fichiers se trouvent toujours sur le même VPS. Ils ne survivent donc pas à une panne du VPS. Envoyez régulièrement /srv/navidrome vers une autre machine ou un stockage objet. C’est précisément le rôle de restic et BorgBackup. L’ensemble du répertoire est peu volumineux, généralement largement inférieur à un gigaoctet. Une copie chiffrée quotidienne hors du serveur coûte donc presque rien et permet de récupérer toutes les données qu’un nouveau scan ne peut pas restaurer.
FAQ
Dois-je transcoder la musique sur un VPS ?
Presque jamais. Les téléphones décodent eux-mêmes les formats MP3, AAC, Opus et FLAC. Les navigateurs actuels font de même sur la plupart des systèmes. Le serveur envoie donc le fichier tel quel et utilise presque aucun CPU. Vérifiez surtout le comportement des navigateurs : Firefox lit l’AAC uniquement lorsque le système d’exploitation ou une bibliothèque externe fournit le décodeur. Un lecteur web peut donc avoir besoin d’un flux transcodé pour une bibliothèque AAC. Le cas où le transcodage est le plus utile concerne une bibliothèque FLAC diffusée sur un réseau mobile. La conversion d’environ 900 kbps vers Opus à 128 kbps réduit alors le volume de données utilisé d’environ sept fois. Navidrome prend en charge le transcodage côté serveur depuis la version 0.61 : il détecte les codecs pris en charge par le client, applique des valeurs de débit par défaut adaptées au format et permet de plafonner le débit pour chaque lecteur.
Pourquoi l’application de mon téléphone ne peut-elle pas télécharger de musique pour une écoute hors ligne ?
Parce que le stockage hors ligne est une fonctionnalité du client, pas du serveur. L’API Subsonic permet à n’importe quel client de récupérer un fichier complet, mais c’est l’application qui décide de conserver une copie sur le téléphone. Consultez le répertoire des clients sur navidrome.org/apps et choisissez-en un dont la description mentionne les téléchargements hors ligne ou la mise en cache. Certains clients ne mettent en cache que les titres que vous avez déjà écoutés. Ce n’est pas la même chose que synchroniser un album avant un voyage.
Pourquoi un album a-t-il été séparé en plusieurs albums après l’analyse ?
La balise de l’artiste de l’album est absente ou incohérente entre les titres. Navidrome regroupe les titres selon leurs balises et non selon leur dossier. Douze titres avec douze valeurs d’artiste différentes et aucune valeur commune pour l’artiste de l’album apparaissent donc comme douze albums. Définissez la balise de l’artiste de l’album sur chaque titre de l’album, généralement sur Various Artists pour une compilation, puis relancez l’analyse. MusicBrainz Picard ou beets peut effectuer cette opération sur un dossier entier.
Le streaming musical auto-hébergé remplace-t-il Spotify ?
Il remplace le lecteur et la bibliothèque, pas le catalogue. Vous disposez de votre propre collection sur chaque appareil, avec les playlists et les compteurs de lecture qu’aucun changement de licence ne peut vous retirer. Vous n’obtenez pas les nouvelles sorties ni les recommandations fondées sur l’écoute d’autres personnes. La plupart des personnes qui utilisent cette solution achètent leur musique et conservent un abonnement de streaming peu coûteux pour découvrir de nouveaux titres.