Installer un serveur de streaming de musique Airsonic via un container Docker

Présentation d'Airsonic

Je vais vous montrer comment installer un serveur de streaming de musique Airsonic via un container Docker, le paramétrer et ajouter un lecteur partagé SMB (qui provient de Freenas).

Airsonic est un serveur de streaming de musique. Il est open source et issu d’un  fork de Subsonic.

Airsonic

Prérequis

Un des principes de base est de minimiser les processus executés par root. Commencez par créer un utilisateur spécifique ‘airsonic’ qui gérera le container.

Le serveur qui héberge le docker Airsonic s’appelle srv-ubuntu-02 (il est sous Ubuntu 20.04 LTS)

$ useradd --shell /bin/false -m -d /home/airsonic airsonic

Pour accéder au répertoire réseau de Freenas //srv-nas-01/Music, vous avez bien entendu défini un accès.

Pour autoriser le container Docker à se connecter au répertoire partagé, créer un fichier .smbcredentials dans /home/airsonic avec les codes d’accès :

$ vi /home/airsonic/.smbcredentials

Insérer les lignes suivantes avec les codes d’accès au dossier partagé :

username=XXX
password=XXXX

Donner les droits correspondants :

$ chown airsonic:airsonic /home/airsonic/ -R

Monter le partage SMB (facultatif)

Si comme moi vous avez une VM Freenas utilisez pour télécharger et partager du contenu musical, voici comment monter le partage réseau.
Le serveur Freenas s’appelle srv-nas-01

Je pars du principe que vous avez déjà configuré le partage SMB sur le serveur Freenas. Mais vous pouvez faire de même avec n’importe quel répertoire réseau.

Toujours sur le serveur Docker, n’oubliez pas d’ajouter les règles au firewall

$ ufw allow out 445,139 comment 'SMB'/tcp

Commençons par installer les utilitaires CIFS :

$ apt install cifs-utils

La 1ère étape consiste à monter le répertoire partagé //srv-nas-01/Music sur le serveur qui hébergera le container (= srv-ubuntu-02)

Créez le dossier /media/Music que nous utiliserons ensuite pour monter le répertoire partagé, puis nous allons éditer le fichier /etc/fstab pour ajouter le montage. Les commandes sont lancées via ROOT.

$ mkdir /media/Music
$ vi /etc/fstab

Ajouter le point de montage suivant :

//srv-nas-01/Music      /media/Music    cifs    ro,uid=airsonic,gid=airsonic,credentials=/home/airsonic/.smbcredentials,iocharset=utf8  0       0

Lancez le montage

$ mount -a

Vérifiez que le dossier est bien monté avec les bons droits (airsonic):

$ ll /media/Music
drwxr-xr-x 2 airsonic airsonic    0 Jun  4 22:57 'David Guetta-Essentials 2020'/
drwxr-xr-x 2 airsonic airsonic    0 Jun  4 22:57 'Depeche Mode - 100 % Depeche Mode [2020]'/
drwxr-xr-x 2 airsonic airsonic    0 Jun  4 22:18 'Greatest Hits Ever (2019) Mp3 320Kbps'/
drwxr-xr-x 2 airsonic airsonic    0 May 23 01:06  MP3_Best/

Installation du serveur de streaming de musique Airsonic via un container Docker

Nous pouvons maintenant passer à la création du container docker

$ docker run -v /home/airsonic/data:/home/airsonic/data \
-v /media/Music:/media/Music \
-v /home/airsonic/playlists:/home/airsonic/playlists \
-v /home/airsonic/podcasts:/home/airsonic/podcasts \
-p 4040:4040 \
-u "$(id -u airsonic):$(id -g airsonic)" \
-e AIRSONIC_DIR=/home/airsonic \
--restart unless-stopped \
-d airsonic/airsonic

Il va commencer par télécharger les prérequis

Unable to find image 'airsonic/airsonic:latest' locally
latest: Pulling from airsonic/airsonic
31603596830f: Pull complete
6b5b126da30f: Pull complete
9fd6f79c1ffd: Pull complete
96eba9964278: Pull complete
b23a224e9296: Pull complete
Digest: sha256:2222c5710cca2c6396e90151cab6e2af17110006100f8895d35dcf27aa7af551
Status: Downloaded newer image for airsonic/airsonic:latest
d283dfdbd0a5a8aa4e1e832aec3b68a2772a05fe001418b124bb8ce2b2bc8178

Vérifions le statut du container

$ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED              STATUS                          PORTS                                                                                                    NAMES
d283dfdbd0a5        airsonic/airsonic    "tini -- run.sh"    About a minute ago   Restarting (1) 25 seconds ago

Il n’arrive pas à démarrer car au lancement le container créé des sous-dossiers /home/airsonic/ avec ROOT comme propriétaire, changeons les droits :

$ chown airsonic:airsonic /home/airsonic/ -R

Vérifions le statut du docker

$  docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS                            PORTS                                                                                                    NAMES
d283dfdbd0a5        airsonic/airsonic    "tini -- run.sh"    3 minutes ago       Up 2 seconds (health: starting)   1900/udp, 0.0.0.0:4040->4040/tcp, 4041/tcp

Ouvrez le navigateur et entrez l’URL de votre serveur sur le port 4040 : http://srv-ubuntu-02:4040
Les login/passwords sont admin/admin

docker - airsonic homepage
Commencez par changer le mot de passe admin puis allez sur la page Media folders et modifiez le folder par le dossier /media/Music, puis lancez un scan

Airsonic - Media folders

Nous avons vu comment installer un serveur de streaming de musique Airsonic via un container Docker. Vous pouvez ensuite configurer le transfert de ports sur votre routeur.

Accéder de l'extérieur via un Reverse Proxy sous Nginx

Pour l’accès depuis l’extérieur, j’ai choisis d’ajouter un sous-domaine music.petitsurfeur.net qui pointe vers mon routeur.

Si ce n’est pas déjà fait, mettez en place un transfert de ports (Port Forwarding) sur votre routeur pour rediriger les ports 80 et 443 vers le serveur qui héberge le docker, ou mieux vers un Reverse Proxy. J’ai fait le choix de mettre en place un Reverse Proxy sous Nginx.

DD-WRT Port Forwarding

Sur le Reverse Proxy Nginx, créez le fichier de configuration suivant. Le mien se trouve dans /etc/nginx/rproxy/http/available.
 

$ vi /etc/nginx/rproxy/http/available/music.petitsurfeur.net.conf

Je vais sauter quelques étapes dans le tutoriel car ce serait trop long et je pars du principe que vous savez configurer Nginx et Certbot pour obtenir un certificat SSL gratuit :
– Création du fichier de configuration /etc/nginx/rproxy/http/available/music.petitsurfeur.net pour répondre sur le port 80
– Exécuter Certbot pour générer le certificat.

Au final, le fichier ressemble à ca. Pensez à modifier proxy_pass pour pointer vers le serveur qui héberge le conteneur Airsonic

server {
    listen 80;
    server_name music.petitsurfeur.net;
    return 301 https://music.petitsurfeur.net;
}

server {
    # Setup HTTPS certificates
    listen  443 default ssl ;
    server_name  music.petitsurfeur.net;
    ssl_certificate     /etc/letsencrypt/live/music.petitsurfeur.net/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/music.petitsurfeur.net/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


# Proxy to the Airsonic server
location / {
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host  $http_host;
    proxy_set_header Host              $http_host;
    #----Airsonic-advanced-------------------------------
#    proxy_buffering off;
#    proxy_max_temp_file_size 0;
#    proxy_set_header Upgrade $http_upgrade;
#    proxy_set_header Connection "Upgrade";
    #-------------------------------------------------------
    proxy_pass                         http://XXX.XXX.XXX.XXX:4040;
    proxy_redirect                     http:// https://;
#    add_header Content-Security-Policy "default-src 'self';
#    script-src 'self' 'unsafe-inline' 'unsafe-eval' www.gstatic.com;
#    img-src 'self' *.akamaized.net;
#    style-src 'self' 'unsafe-inline' fonts.googleapis.com;
#    font-src 'self' fonts.gstatic.com;
#    frame-src 'self';
#    object-src 'none'";
    }
}

Pensez à activer l’enregistrement.

$ cd /etc/nginx/rproxy/http/enabled
ln -s ../music.petitsurfeur.net.conf music.petitsurfeur.net.conf

Comme vous pouvez le remarquer, j’ai commenté les dernières lignes car le site ne s’affichait pas correctement et cela empêchait le streaming.

Pensez également à ouvrir les ports qu’il faut entre le Reverse Proxy et le serveur Docker.

$ ufw allow out 4040/tcp comment 'Airsonic'

Redémarrez le service Nginx

$ systemctl restart nginx.service

Et si tout fonctionne correctement, vous avez plus qu’à installer une application comme Ultrasonic sur le Google Store sur votre smartphone.

Ressources

Foire aux problèmes

mount: /media/Music: bad option

Si lorsque vous lancez le montage du répertoire partagé via la commande ‘mount -a’, vous avez le message d’erreur suivant :

<pre class= »lang:sh decode:true »>mount: /media/Music: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.</pre>

Il faut installer le programme suivant :

<pre class= »lang:sh decode:true »>$ aptget install cifs-utils </pre>

 

Vous aimerez aussi...