Installer un serveur de streaming de musique Airsonic via un container Docker
Présentation d'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)
1 |
$ 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 :
1 |
$ vi /home/airsonic/.smbcredentials |
Insérer les lignes suivantes avec les codes d’accès au dossier partagé :
1 2 |
username=XXX password=XXXX |
Donner les droits correspondants :
1 |
$ 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
1 |
$ ufw allow out 445,139 comment 'SMB'/tcp |
Commençons par installer les utilitaires CIFS :
1 |
$ 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.
1 2 |
$ mkdir /media/Music $ vi /etc/fstab |
Ajouter le point de montage suivant :
1 |
//srv-nas-01/Music /media/Music cifs ro,uid=airsonic,gid=airsonic,credentials=/home/airsonic/.smbcredentials,iocharset=utf8 0 0 |
Lancez le montage
1 |
$ mount -a |
Vérifiez que le dossier est bien monté avec les bons droits (airsonic):
1 2 3 4 5 |
$ 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
1 2 3 4 5 6 7 8 9 |
$ 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
1 2 3 4 5 6 7 8 9 10 |
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
1 2 3 |
$ 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 :
1 |
$ chown airsonic:airsonic /home/airsonic/ -R |
Vérifions le statut du docker
1 2 3 |
$ 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
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
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.
Sur le Reverse Proxy Nginx, créez le fichier de configuration suivant. Le mien se trouve dans /etc/nginx/rproxy/http/available.
1 |
$ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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.
1 2 |
$ 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.
1 |
$ ufw allow out 4040/tcp comment 'Airsonic' |
Redémarrez le service Nginx
1 |
$ 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.
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”>$ apt–get install cifs-utils </pre>