SSD Nodes Learn 🎉 VPS dès $5.50/mois
Guides Matt ConnorPar Matt Connor

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 musical 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 base SQLite unique. Il fournit l’API Subsonic, ce qui explique l’existence de nombreuses applications mobiles tierces. La version 0.63.2 était la version courante en août 2026. Le projet indique qu’il fonctionne correctement sur un matériel aussi limité qu’un Raspberry Pi Zero. Le logiciel serveur n’est donc pas le poste qui vous coûtera le plus cher.

Jellyfin convient 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 pour Android et iOS qui télécharge les morceaux pour une écoute hors ligne. La limite concerne l’API. Jellyfin ne fournit pas de endpoint Subsonic intégré, et le plugin communautaire qui en ajoutait un n’est plus mis à jour depuis 2022. L’écosystème d’applications Subsonic ne lui est donc pas accessible. Vous utilisez à la place les applications qui parlent l’API propre à Jellyfin, et elles sont moins nombreuses.

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é notamment par Mastodon. Un utilisateur d’un pod peut suivre une bibliothèque publique hébergée sur un autre. Funkwhale 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 file de tâches en plus de l’application web.

Choisissez Navidrome, sauf si vous voulez la fédération ou si Jellyfin est déjà installé. 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 ?

ChartStorage per 1,000 albums by audio format
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"
  }
]

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.

Niveau stockage ou niveau calcul ?

Un serveur musical contient surtout un grand volume de données peu sollicitées et demande très peu de calcul. La lecture d’un fichier à 40 kilooctets par seconde laisse n’importe quel disque inactif, et le CPU ne travaille que pendant l’analyse de la bibliothèque ou le transcodage, opérations que vous effectuerez rarement. Le NVMe rapide inclus dans une offre orientée 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 préférable à 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 à la machine et consacrez le reste du budget au stockage.

Installer Navidrome avec Docker Compose

Créez d’abord les répertoires et attribuez-les à l’identifiant 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 pratiquement rien d’autre, dans son propre répertoire :

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:ro
docker compose up -d
docker compose ps

docker compose ps doit afficher le service comme étant en cours d’exécution, et non en redémarrage permanent. Un conteneur qui redémarre en boucle indique 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 pare-feu. Un simple 4533:4533 reste donc exposé, même sur une machine où ufw indique que tout est refusé. Le volume contenant la musique est 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, mais ce nom n’existe plus. Les trois paramètres de sauvegarde activent la sauvegarde intégrée de la base de données, utilisée par la section suivante.

Transférez votre musique sur le serveur

Copiez la bibliothèque avec rsync. Le transfert reprend là où il s’est arrêté si 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 -u

Le conteneur s’exécute avec l’ID utilisateur 1000 et le montage est en lecture seule. Chaque fichier doit donc être lisible par cet ID. Si votre compte SSH n’a pas l’UID 1000 sur le VPS, la copie appartient à un autre utilisateur. L’analyse ne trouve alors aucune piste et l’interface web reste vide. id -u affiche votre ID réel. Consultez le fonctionnement de PUID et PGID dans les conteneurs Docker pour comprendre le mappage complet.

Un reverse proxy et TLS pour que le téléphone fonctionne partout

Pointez un enregistrement DNS A vers le VPS, puis donnez trois lignes à Caddy :

music.example.com {
    reverse_proxy 127.0.0.1:4533
}
sudo systemctl reload caddy

Caddy demande le certificat lors de la première requête. Les ports 80 et 443 doivent tous deux être ouverts, car le challenge ACME (automatic certificate management environment) reçoit sa réponse sur le port 80. Avec nginx, ajoutez proxy_buffering off; au bloc location : Navidrome envoie les événements de progression à l’interface web via une connexion persistante, et lorsque le buffering est activé, l’interface attend une réponse que nginx conserve encore. Si vous le servez sous un chemin tel que /music au lieu d’utiliser son propre sous-domaine, définissez ND_BASEURL sur le même chemin. Sinon, l’interface se charge comme une 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 donc 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 le code d’erreur 40 signifie 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 rejettent un mauvais certificat avec un message qui n’indique 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 de Navidrome couvre uniquement la base de données. La documentation est claire sur ce point : le processus sauvegarde la base de données, c’est-à-dire les utilisateurs, le nombre d’écoutes et le reste, mais pas la musique ni la configuration. Cette séparation est la bonne manière de raisonner, car les deux éléments ne se récupèrent 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. Une nouvelle analyse ne les restaure pas.

Le fichier compose écrit déjà une copie nocturne dans /data/backup et en conserve sept. Créez-en une manuellement avant une mise à niveau :

sudo docker compose run --rm navidrome backup create

La restauration supprime la base de données actuelle et copie la sauvegarde à sa place. Elle doit être exécutée alors que Navidrome est arrêté. Une restauration n’est pas sûre sur un serveur en fonctionnement.

Ces fichiers se trouvent toujours sur le même VPS. Ils ne survivent donc pas à la perte 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 bien inférieur à un gigaoctet. Une copie chiffrée quotidienne hors du serveur coûte donc presque rien et permet de récupérer tout ce qu’une nouvelle analyse ne peut pas restaurer.

FAQ

Dois-je transcoder la musique sur un VPS ?

Presque jamais. Les téléphones et les navigateurs décodent eux-mêmes les formats MP3, AAC, Opus et FLAC. Le serveur envoie donc le fichier tel quel et utilise presque aucun CPU. Un cas justifie toutefois l’activation du transcodage : une bibliothèque FLAC diffusée sur un réseau mobile. Convertir environ 900 kbps en Opus à 128 kbps réduit le volume de données utilisé d’environ sept fois. Navidrome permet de l’activer par utilisateur et par lecteur. Le transcodage reste désactivé tant que vous ne l’activez pas.

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 ou non 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 mettent uniquement en cache les titres que vous avez déjà écoutés. Cela ne revient pas à synchroniser un album avant un voyage.

Pourquoi un album a-t-il été divisé en plusieurs albums après l’analyse ?

Le tag de l’artiste de l’album est absent ou incohérent entre les titres. Navidrome regroupe les titres à partir des tags, et non des dossiers. Douze titres avec douze valeurs d’artiste différentes et aucune valeur commune pour l’artiste de l’album sont donc interprétés comme douze albums. Définissez le tag de l’artiste de l’album sur tous les titres 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 retrouvez votre propre collection sur tous vos appareils, avec les playlists et le nombre d’écoutes qu’aucun changement de licence ne peut vous retirer. Vous n’avez pas accès aux nouvelles sorties ni aux recommandations fondées sur l’écoute d’autres personnes. La plupart des utilisateurs de ce type de service achètent leur musique et conservent un compte de streaming peu coûteux pour découvrir de nouveaux titres.

#navidrome#music#streaming#auto-hébergement#media-server