Ma propre webradio avec MPD et Icecast (2)

WebradioDans mon précédent article, j’ai décrit l’installation d’une webradio dans mon réseau local, dans le but de prendre en main les différents composants. Aujourd’hui, je vais installer le tout sur une machine publique, à savoir un serveur Dedibox de chez Online. En passant, j’en ai profité pour faire pointer le domaine radionovak.com vers un de mes serveurs de production.

Configurer le pare-feu

Mon installation locale utilisait le port 8000 en TCP pour les connexions en HTTP. Sur ma machine publique, je vais également ouvrir le port 8001 en TCP pour les connexions en HTTPS.

# iptables -A INPUT -p tcp -i eth0 --dport 8000:8001 -j ACCEPT

Installer le serveur de sons

J’installe le serveur de sons Pulseaudio.

# yum install pulseaudio pulseaudio-utils

Notez que je n’installe pas alsamixer, puisque cela n’aurait pas de sens. Le serveur est dépourvu de carte son (lspci | grep audio), et de toute façon, il est installé dans un datacenter à 800 kilomètres de chez moi, je ne peux donc pas brancher mes écouteurs dessus.

Installer MPD et Icecast

Je configure le dépôt de paquets Nux-Dextop et j’installe “à la louche” les paquets nécessaires.

# yum install mpd ncmpcpp icecast

Importer les fichiers audio

Je range mes fichiers audio et mes playlists dans l’arborescence /var/lib/mpd en définissant les permissions qui vont bien.

# cd /var/lib/mpd
# chown -R mpd:mpd music/ playlists/
# find . -type d -exec chmod 0755 {} \;
# find . -type f -exec chmod 0644 {} \;

Configurer MPD et Icecast

J’effectue une copie de sauvegarde de la configuration par défaut des serveurs MPD et Icecast.

# cd /etc
# cp mpd.conf mpd.conf.orig
# cp icecast.xml icecast.xml.orig

J’édite /etc/mpd.conf pour définir le flux audio.

audio_output {
  type        "shout"
  encoding    "ogg"     
  name        "Radio Novak"
  host        "localhost"
  port        "8000"
  mount       "/radionovak.ogg"
  password    "mot_de_passe"
  bitrate     "128"
  format      "44100:16:1"
  protocol    "icecast2"
  user        "source"    
  description "The Supersexy Swinging Sound Of Kiki Novak"
  url         "http://www.radionovak.com"
  genre       "mixed"
  public      "yes"
  timeout     "2"     
  mixer_type  "software"
}

Cette configuration se reflète dans /etc/icecast.xml.

<icecast>
  <location>Radio Novak</location>
  <admin>info@microlinux.fr</admin>
  <limits>
    <clients>100</clients>
    <sources>2</sources>
    <threadpool>5</threadpool>
    <queue-size>524288</queue-size>
    <client-timeout>30</client-timeout>
    <header-timeout>15</header-timeout>
    <source-timeout>10</source-timeout>
    <burst-on-connect>1</burst-on-connect>
  </limits>

  <authentication>
    <!-- Sources log in with username 'source' -->
    <source-password>mot_de_passe</source-password>
    <!-- Relays log in username 'relay' -->
    <relay-password>mot_de_passe</relay-password>

    <!-- Admin logs in with the username given below -->
    <admin-user>admin</admin-user>
    <admin-password>mot_de_passe</admin-password>
  </authentication>

  <hostname>www.radionovak.com</hostname>

  <!-- You may have multiple <listener> elements -->
  <listen-socket>
    <port>8000</port>
    <bind-address>127.0.0.1</bind-address>
  </listen-socket>

Activer et démarrer les services

J’active les services au démarrage.

# systemctl enable icecast mpd

Je démarre les services dans un ordre cohérent.

# systemctl start icecast mpd

Je lance le client ncmpcpp, j’ajoute des morceaux à la playlist et je démarre la lecture.

Lire le flux audio avec VLC

À présent, je peux lancer VLC sur ma station de travail et tenter d’ouvrir le flux réseau.

VLC Icecast

Ça fonctionne ! Un grand pas pour moi, un petit pas pour l’humanité. J’en profite pour aller boire un café et réfléchir aux peaufinages divers et variés pour améliorer mon installation.

SELinux et MPD

SELinux affiche une erreur bénigne qui est manifestement le fruit d’un cafouillage dans l’emplacement des fichiers de configuration de MPD.

# sealert -a /var/log/audit/audit.log
If you believe that mpd should be allowed getattr access 
on the .config directory by default.

Le problème persiste même si l’on suit les suggestions fournies dans l’avertissement. En effet, il s’agit d’un bug dans la politique SELinux par défaut, qui est décrit ici et ici.

Configurer une connexion sécurisée pour Icecast

Étant donné que le serveur Icecast affiche une interface web avec un accès administrateur, on va configurer une connexion sécurisée pour éviter que les identifiants de connexion et les mots de passe transitent en clair.

Mes certificats LetsEncrypt sont rangés en-dessous de l’arborescence /etc/letsencrypt/live et appartiennent à l’utilisateur root et au groupe certs. Pour plus de détails, on pourra jeter un oeil ici. Quoi qu’il en soit, l’utilisateur système icecast doit pouvoir accéder au certificat. On va donc l’ajouter au groupe système certs.

# usermod -a -G certs icecast

J’ai tenté de configurer une connexion SSL en suivant la documentation du serveur Icecast, mais sans succès. Et j’ai fini par comprendre que l’application avait manifestement un problème avec le format du certificat fullchain.pem. J’ai donc tenté la bidouille suivante, qui consiste tout simplement à concaténer le certificat et la clé privée en un seul fichier.

# cd /etc/letsencrypt/live/radionovak.com
# cat cert.pem privkey.pem > icecast.pem
# chown root:certs icecast.pem
# chmod 0640 icecast.pem

J’édite /etc/icecast.xml en indiquant le chemin vers le certificat dans la section <paths>.

<paths>
  <!-- basedir is only used if chroot is enabled -->
  <basedir>/usr/share/icecast</basedir>

  <!-- Note that if <chroot> is turned on below, these paths must 
  both be relative to the new root, not the original root -->
  <logdir>/var/log/icecast</logdir>
  <webroot>/usr/share/icecast/web</webroot>
  <adminroot>/usr/share/icecast/admin</adminroot>
  <pidfile>/var/run/icecast/icecast.pid</pidfile>
  <ssl-certificate>/chemin/vers/icecast.pem</ssl-certificate>
  <alias source="/" dest="/status.xsl"/>
</paths>

Ensuite, j’ajoute une deuxième stance <listen-socket>.

<!-- You may have multiple <listener> elements -->
  <listen-socket>
  <port>8000</port>
</listen-socket>
<listen-socket>
  <port>8001</port>
  <ssl>1</ssl>
</listen-socket>

Au redémarrage du serveur Icecast, je me retrouve confronté à une autre erreur due à SELinux. En langage tam-tam, SELinux a un problème avec Icecast qui tente d’ouvrir une connexion sur le port 8001.

# sealert -a /var/log/audit/audit.log
If you believe that icecast should be allowed name_bind access 
on the port 8001 tcp_socket by default.

Ici, je suis les recommandations données dans l’avertissement pour résoudre le problème.

# ausearch -c 'icecast' --raw | audit2allow -M my-icecast
# semodule -i my-icecast.pp

Je vérifie si le fichier /var/log/icecast/error.log contient bien quelque chose comme ceci.

INFO connection/get_ssl_certificate SSL certificate found at
/etc/letsencrypt/live/radionovak.com/icecast.pem
INFO connection/get_ssl_certificate SSL using ciphers
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM
...

À partir de là, je peux ouvrir une connexion sécurisée à l’interface d’administration du serveur Icecast.

Icecast SSL

L’installation est donc d’ores et déjà fonctionnelle. Vous pouvez utiliser n’importe quel lecteur audio digne de ce nom comme Audacious ou VLC pour lire le flux audio à l’adresse suivante.

http://www.radionovak.com:8000/radionovak.ogg

Je vous invite même à le faire, car ça me permettra de voir en direct comment le serveur digère les montées en charge.

Un gentil bonjour de votre DJ dans la garrigue.

Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

6 réponses à Ma propre webradio avec MPD et Icecast (2)

  1. Skippythekangoo dit :

    Fonctionne avec Ff sous android…

  2. tutox dit :

    Yep ça marche nickel chez moi aussi! Par contre ta un petit “blanc” de 2 secondes entre chaque morceau

  3. sebastien dit :

    Salut,
    Pour le blanc c’est a cause des infos des pistes. Si tu supprimes ça la lecture sera en continu.
    Passer par un serveur en frontal (nginx, apache) va permettre de sécuriser Icecast et ça évite d’ouvrir et d’avoir à taper le numéro de port.
    Pas besoin de pulse audio sur le serveur pour pousser sur un icecast depuis mpd.
    Sur Android, ça fonctionne en lecture avec Firefox, Chrome, VLC.
    Pour contrôler les piste depuis son smartphone je conseil l’excellent M.A.L.P

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.