Dans 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
- Installer le serveur de sons
- Installer MPD et Icecast
- Importer les fichiers audio
- Configurer MPD et Icecast
- Activer et démarrer les services
- Lire le flux audio avec VLC
- SELinux et MPD
- Configurer une connexion sécurisée pour Icecast
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.
Ç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.
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.
Fonctionne avec Ff sous android…
Merci pour le retour, d’autant plus que je n’ai pas de smartphone pour tester. Est-ce que ça coupe entre les morceaux ? Ou la lecture est continue ?
Yep ça marche nickel chez moi aussi! Par contre ta un petit “blanc” de 2 secondes entre chaque morceau
OK merci pour la remarque. Là je suis en train de peaufiner tout ça. Je vais voir si je peux corriger ce comportement, et ça figurera dans le troisième article.
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
1. Merci pour le retour.
2. Différents chemins mènent à Saint-Bauzille-de-Putois.
3. Je n’ai pas de smartphone.