Music Assistant dans Docker : le chef d'orchestre de toute votre musique (avec Navidrome et Traefik)


Salut les amateurs de self-hosting ! Aujourd’hui, on s’attaque à un projet qui fait plaisir aux oreilles : reprendre le contrôle total de sa musique à la maison. Fini les enceintes propriétaires qui ne se parlent pas, les abonnements qui se multiplient et les apps qui changent d’avis tous les six mois. On va monter notre propre système multiroom, qui pioche dans notre bibliothèque comme dans Spotify, et qui envoie le son sur toutes nos enceintes.

Pour ça, deux logiciels qui forment un duo parfait :

  • Navidrome, c’est votre bibliothèque musicale perso — votre « Spotify maison », qui sert vos fichiers depuis votre NAS.
  • Music Assistant, c’est le chef d’orchestre : il va chercher la musique (dans Navidrome, Spotify, vos radios…) et l’envoie en multiroom synchronisé vers vos Sonos, Chromecast, AirPlay, Squeezelite et compagnie.

Le tout en Docker, derrière Traefik, bien au propre. C’est exactement ce qui tourne chez moi, et je vais vous partager les quelques pièges qui m’ont fait transpirer, histoire que vous, vous arriviez directement à la musique. 🎶

⚠️ À lire avant de se lancer — deux particularités à connaître. Music Assistant doit tourner en réseau host (on verra pourquoi), ce qui change la façon de le mettre derrière Traefik. Et surtout : MA stream l’audio vers vos enceintes en HTTP, par IP locale. Autrement dit, Traefik et le HTTPS servent uniquement à accéder confortablement à l’interface — le flux audio, lui, reste sur votre réseau local. Ce n’est pas un défaut, c’est par conception (les enceintes du salon n’ont que faire d’un certificat SSL).

L’architecture en deux mots

Rien de sorcier une fois qu’on a l’image en tête :

  • Navidrome scanne votre dossier de musique et l’expose. Il est compatible Subsonic, un protocole standard que Music Assistant sait lire.
  • Music Assistant se connecte à Navidrome comme source, découvre vos enceintes sur le réseau, et orchestre tout ça.
  • Traefik met une jolie URL en HTTPS devant les interfaces web.

Navidrome est un conteneur web tout ce qu’il y a de plus classique (réseau bridge, Traefik l’adore). Music Assistant, lui, est le client capricieux de la soirée. On commence par le facile.

Prérequis

  • Un Docker opérationnel sur une machine allumée en permanence (NAS, Raspberry Pi, mini-PC…).
  • Un Traefik qui tourne déjà (si ce n’est pas le cas, j’en parle dans d’autres articles).
  • Un dossier de musique quelque part sur votre machine.
  • Vos enceintes et votre machine sur le même réseau local (même VLAN). C’est important, on y revient.

Étape 1 : Navidrome, votre bibliothèque

On commence par le membre sage du duo. Dans un dossier ~/navidrome, créez ce docker-compose.yml :

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    restart: unless-stopped
    user: "1000:1000"   # adaptez à votre utilisateur (id -u / id -g)
    environment:
      ND_SCANSCHEDULE: 1h
      ND_LOGLEVEL: info
      ND_BASEURL: ""
    volumes:
      - ./data:/data
      - /chemin/vers/votre/musique:/music:ro
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.navidrome.rule=Host(`musique.mondomaine.fr`)"
      - "traefik.http.routers.navidrome.entrypoints=websecure"
      - "traefik.http.routers.navidrome.tls.certresolver=letsencrypt"
      - "traefik.http.services.navidrome.loadbalancer.server.port=4533"

networks:
  traefik-public:
    external: true

Adaptez le chemin de votre musique (monté en lecture seule, :ro, on ne risque rien) et le nom de votre réseau Traefik. Puis :

docker compose up -d

Rendez-vous sur https://musique.mondomaine.fr, créez votre compte admin, et laissez Navidrome scanner votre collection. Selon la taille, ça peut prendre un café (ou trois ☕). Notez bien vos identifiants : Music Assistant en aura besoin juste après.

💡 Navidrome est compatible Subsonic, ce qui veut dire que vous pouvez aussi l’utiliser depuis n’importe quelle app mobile Subsonic (Symfonium, play:Sub, DSub…) quand vous êtes en déplacement. Deux outils pour le prix d’un.

Étape 2 : Music Assistant, le chef d’orchestre

Place au personnage principal. Et tout de suite, LE point à comprendre : Music Assistant doit absolument tourner en réseau host. Pourquoi ? Parce qu’il découvre vos enceintes (Sonos, Chromecast, AirPlay, UPnP…) via des techniques de multicast (mDNS, UPnP) qui ne traversent pas l’isolation réseau d’un conteneur Docker classique. En mode host, le conteneur partage directement la pile réseau de la machine, et là, il voit tout le monde.

Dans un dossier ~/music-assistant, créez ce docker-compose.yml :

services:
  music-assistant:
    image: ghcr.io/music-assistant/server:latest
    container_name: music-assistant
    restart: unless-stopped
    # Obligatoire : MA découvre les enceintes via mDNS/UPnP
    network_mode: host
    volumes:
      - ./data:/data
      - /chemin/vers/votre/musique:/media:ro
    cap_add:
      - SYS_ADMIN
      - DAC_READ_SEARCH
    security_opt:
      - apparmor:unconfined
    environment:
      - LOG_LEVEL=info

💡 Les cap_add et security_opt ne sont nécessaires que si vous voulez monter un partage SMB/NFS directement depuis Music Assistant. Si votre musique est déjà accessible localement (montée dans /media), vous pouvez les retirer pour faire plus propre.

On démarre :

docker compose up -d
docker compose logs -f music-assistant

Dans les logs au démarrage, repérez la ligne où MA annonce l’IP locale qu’il a auto-détectée — c’est par cette IP qu’il streamera l’audio vers vos enceintes. Si elle est fausse (machine multi-cartes réseau, VLAN…), ce sera la première chose à corriger.

L’interface est maintenant accessible sur http://IP-DE-VOTRE-MACHINE:8095. Pas de page de login : Music Assistant n’a aucun système d’utilisateur. D’où l’étape suivante, qui n’est pas optionnelle si vous voulez l’exposer.

Étape 3 : Traefik devant Music Assistant (le piège du mode host)

Voici le moment qui coince tout le monde. Comme MA est en network_mode: host, il n’est sur aucun réseau Docker : Traefik ne peut donc pas le découvrir automatiquement via les habituels labels. Les labels traefik.http.services... ne fonctionneront pas ici, parce que Traefik n’a aucune IP de conteneur à cibler.

La solution propre : on déclare le service à la main via le provider fichier de Traefik, en pointant directement sur IP-du-NAS:8095.

D’abord, assurez-vous que le provider fichier est activé dans la config statique de Traefik (sinon, ajoutez ces options et un volume pour le dossier dynamic) :

      - "--providers.file.directory=/etc/traefik/dynamic"
      - "--providers.file.watch=true"

Ensuite, créez un fichier de configuration dynamique, par exemple dynamic/music-assistant.yml :

http:
  routers:
    music-assistant:
      rule: "Host(`music.mondomaine.fr`)"
      entryPoints:
        - websecure
      service: music-assistant
      tls:
        certResolver: letsencrypt
      middlewares:
        - ma-auth

  services:
    music-assistant:
      loadBalancer:
        servers:
          - url: "http://192.168.1.51:8095"   # IP de la machine qui héberge MA

  middlewares:
    ma-auth:
      basicAuth:
        users:
          - "admin:$apr1$xxxxxxxx$yyyyyyyyyyyyyyyyyyyyy0"

Pour générer la ligne d’authentification (login admin), utilisez htpasswd :

htpasswd -nb admin votremotdepasse

💡 Subtilité utile : dans un fichier dynamique Traefik (comme ici), on garde les $ tels quels. C’est seulement dans les labels d’un docker-compose.yml qu’il faut les doubler ($$). Beaucoup se font avoir.

Traefik recharge le fichier à chaud (grâce à watch). Vous accédez maintenant à https://music.mondomaine.fr, protégé par mot de passe.

⚠️ Rappel de sécurité : Music Assistant donne accès à toute votre musique, vos comptes streaming connectés et vos enceintes. Ne l’exposez jamais publiquement sans authentification. Le plus sage : le garder interne (résolu uniquement par votre DNS local, façon Pi-hole en wildcard), et ne sortir que ce qui doit vraiment l’être.

Étape 4 : connecter Navidrome à Music Assistant

Le plus satisfaisant. Dans l’interface de Music Assistant :

  1. Paramètres → Fournisseurs de musique → Ajouter.
  2. Choisissez Subsonic (c’est le protocole que parle Navidrome).
  3. Renseignez :
    • URL du serveur : http://IP-DU-NAS:4533 (ou votre domaine interne Navidrome)
    • Nom d’utilisateur et mot de passe : ceux créés à l’étape 1.

Validez, et toute votre bibliothèque Navidrome apparaît dans Music Assistant. 🔥 Vous pouvez répéter l’opération pour ajouter Spotify, des radios, etc. — MA fusionne toutes les sources dans une seule interface.

Étape 5 : ajouter vos enceintes (les players)

Grâce au mode host, MA découvre automatiquement la plupart de vos appareils : Sonos, Chromecast/Google Cast, AirPlay, UPnP/DLNA. Ils apparaissent tout seuls dans les paramètres des players.

Et pour transformer un téléphone ou un vieux PC en enceinte du réseau, il y a Squeezelite. Sur Android, installez l’app Squeezelite depuis F-Droid (paquet org.lyrion.squeezelite) : elle se connecte à Music Assistant via le protocole SlimProto (port 3483) et hop, votre téléphone devient un player multiroom de plus. Pratique pour diffuser dans une pièce sans enceinte connectée.

Les pièges fréquents

Ceux que j’ai gentiment essuyés pour vous :

  • Aucune enceinte détectée : 9 fois sur 10, c’est que le network_mode: host n’a pas été appliqué, ou que vos enceintes sont sur un VLAN différent. Le multicast ne traverse pas les VLAN sans configuration spécifique. MA et les enceintes doivent être sur le même segment réseau.
  • Conflit de port en mode host : comme MA prend directement des ports sur l’hôte (8095 pour l’interface, 3483 pour SlimProto…), un autre service peut être sur le chemin. Chez moi, par exemple, Portainer squattait un port dont MA avait besoin. La solution : changer le port dans les paramètres de Music Assistant (il sait basculer sur un autre port sans broncher).
  • L’enceinte est vue mais la musique ne se lance pas : regardez l’IP locale auto-détectée dans les logs de démarrage. Si elle est fausse, le flux audio HTTP n’atteint jamais l’enceinte.
  • Navidrome introuvable depuis MA : vérifiez l’URL et les identifiants. Si vous avez mis Navidrome derrière un reverse proxy sur un sous-chemin (et non un sous-domaine dédié), il faudra renseigner ND_BASEURL côté Navidrome.

Conclusion et aller plus loin

Et voilà : vous avez un système musical multiroom complet, 100 % sous votre contrôle, qui unifie votre bibliothèque perso et vos services de streaming, et qui pilote toutes vos enceintes depuis une seule interface. Pas d’abonnement caché, pas de cloud à qui confier vos goûts musicaux. Que du bonheur.

Pour pousser plus loin :

  • Intégrer Music Assistant à Home Assistant pour déclencher la musique dans vos automatisations (réveil en douceur, annonce vocale dans toute la maison…).
  • Ajouter un satellite vocal pour demander vos morceaux à la voix.
  • Créer des groupes de players synchronisés (toute la maison en même temps, ou juste le salon et la cuisine).

Bref, une fois la base posée, le terrain de jeu est immense. Et le plus beau, c’est que tout ça tourne tranquillement sur votre infrastructure, sans rien demander à personne. 🎧