Webradio in der Cloud – Einrichtung von LibreTime als Radio Station

Wir haben wieder in einer Kooperation mit dem Verein klangtapete e.V. ein neues Projekt gestartet. Ziel war es eine Website und ein Backend für ein eigenes Webradio zu erstellen. In Zeiten der Podcast-Flut ist es vielleicht ein wenig anachronistisch ein Webradio zu starten, aber der primäre Zweck des Projekts soll die Präsentation diverser Audioinhalte sein, die wiederrum von jungen Erwachsenen und Jugendlichen erstellt werden.

Freie Software für ein entsprechendes Backend gibt es. Zum einen ist da AzuraCast, ein relativ neues Projekt, welches mit einem kurzen und einfachem Skript die Möglichkeit bietet ein System mit Web-Interface zu erstellen, welches sogar mehrere unterschiedliche Streams und damit Radio Stationen verwalten kann. Auch wenn die Einrichtung da einfach war, so gab es in der Praxis einige Probleme mit dem System, die auch durch ein nicht so ganz übersichtliches Web-Interface mit verstärkt wurden. Auch die geplanten und einprogrammierten Sendungen wurden nicht zuverlässig abgespielt und last-minute Änderungen führten teilweise zu einem richtigen Chaos im Programm.

Als zweite Alternative gibt es LibreTime, welches als Fork aus dem nicht mehr weiterentwickelten Sourcefabric Airtime entstanden ist. Allerdings ist auch da die Weiterentwicklung schleppend.

© LibreTime.org

Installation von LibreTime

Im wesentlichen kann die Installation von der Documentation auf der offiziellen Website übernommen werden (siehe libretime.org/install ), es gibt aber einige Änderungen die bei einem aktuellen Betrieb beachtet werden müssen. Als Basis und zum Start wird ein installiertes Ubuntu Server 18.04 LTS vorausgesetzt.

Die statische IP (bei einer Cloud Instanz in der Regel schon gegeben) kann hier konfiguriert werden:

cd /etc/netplan && ls  # find the netplan filename
sudo nano ##-netcfg.yaml

Wenn die Netplan Konfiguration leer ist, dann das folgende Beispiel benutzen um die Datei entsprechend zu ergänzen. 192.168.123.456/24 ist in diesem Beispiel entsprechend die Server IP, die als statisch vorausgesetzt wird und 192.168.123.1 das Gateway, welches auch als primärer DNS-Server benutzt wird (hier könnte man auch öffentliche DNS-Nameserver eintragen).

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      addresses: [192.168.123.456/24]
      gateway4: 192.168.123.1
      nameservers:
        addresses: 192.168.123.1

Danach die Datei speichern und anschließend den Befehl sudo netplan apply ausführen.

Jetzt kommen wir zu den Firewall Einstellungen und den ersten wichtigen Unterschied zu der offiziellen Dokumentation. Wir aktivieren die vorinstallierte Firewall bei Ubuntu und dann brauchen LibreTime und der Icecast-Server folgende offene Ports:

sudo ufw enable
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Im Gegensatz zur originalen Dokumentation öffnen wir auch den Port 443, da wir für das Webinterface nur verschlüsselte Verbindungen über https zulassen wollen. Port 8000 für unseren Icecast Server werden wir mittels eines Reverse Proxys auf den Port 443 umlenken. Port 8001 und 8002 müssen nur geöffnet werden, wenn man von extern sich direkt mit dem System verbinden will und einen Stream an Icecast übertragen möchte.

Zuerst müssen wir Git selbst erst einmal installieren. Dies erfolgt einfach über folgende Befehle:

sudo apt update
sudo apt upgrade
sudo apt install git -y

Als nächstes installieren wir LibreTime selbst, indem wir uns die Dateien von Github holen, und starten mit dem lezten Befehl das Installationsskript, welches alles bequem für uns einrichtet:

git clone https://github.com/LibreTime/libretime.git
cd libretime
sudo ./install -fiap

Als nächstes passen wir die Konfiguration bei Apache an, damit das Webinterface bei Apache nicht über den unverschlüsselten Port 80 sondern, mit ein kostenloses Zertifikat von Let’s Encrypt abgesichert, über den Port 443 läuft.

Dafür benötigen wir zunächst zwei Domains oder Subdomains, welche jeweils in einem A-Eintrag auf die passende IP vom Server verweisen. Wir nehmen als Beispiel radio.nerdworking.de und icecast.nerdworking.de.

Dann öffnen wir als erstes die Konfigurationsdatei von Icecast:

sudo nano /etc/icecast2/icecast.xml

Anschließend suchen wir die Zeile <hostname>localhost</hostname> im Dokument und ersetzen diese durch:

<hostname>icecast.nerdworking.de</hostname>

Bei der Gelegenheit kann man auch die Location und die Emailadresse mit den passenden Werten ersetzen (für die Location die Stadt oder das Sendegebiet angeben).

Anschließend starten wir den Icecast Server neu mit dem Befehl

sudo systemctl restart icecast2

Als nächstes richten wir das passende Zertifikat noch ein. Dafür benutzen wir certbot von Let’s Encrypt den wir erstmal installieren und dann benutzen, um das passende Zertifikat zu generieren. Wichtig hier, die Subdomain radio.nerdworking.de muss durch eine eigene ersetzt werden:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
sudo apt-get install certbot python-certbot-apache
sudo certbot certonly --apache -d radio.nerdworking.de
sudo certbot certonly --apache -d icecast.nerdworking.de
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo a2enmod alias headers ssl

Anschließend bearbeiten wir noch die Apache Seitenkonfiguration. Zunächst öffnen wir die Konfigurationsdatei:

sudo nano /etc/apache2/sites-enabled/airtime.conf

Danach in der Konsole den Inhalt des Dokuments mit folgendem Text ersetzen, vorher aber noch radio.nerdworking.de und icecast.nerdworking.de in die eigene Subdomain umändern:



<VirtualHost radio.nerdworking.de:443>
   SSLEngine on
   SSLProtocol All -SSLv2 -SSLv3
   SSLCompression off
   SSLCertificateFile /etc/letsencrypt/live/radio.nerdworking.de/fullchain.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/radio.nerdworking.de/privkey.pem
   Header always set Strict-Transport-Security "max-age=31536000"

   ServerName radio.nerdworking.de
   ServerAdmin beispielmail@nerdworking.de
   DocumentRoot /usr/share/airtime/php/airtime_mvc/public/
   php_admin_value upload_tmp_dir /tmp
   php_value post_max_size 500M
   php_value upload_max_filesize 500M
   php_value request_order "GPC"
   php_value session.gc_probability 0
   php_value session.auto_start 0

   AddOutputFilterByType DEFLATE text/plain
   AddOutputFilterByType DEFLATE text/html
   AddOutputFilterByType DEFLATE text/xml
   AddOutputFilterByType DEFLATE text/css
   AddOutputFilterByType DEFLATE application/xml
   AddOutputFilterByType DEFLATE application/xhtml+xml
   AddOutputFilterByType DEFLATE application/rss+xml
   AddOutputFilterByType DEFLATE application/javascript
   AddOutputFilterByType DEFLATE application/x-javascript
   AddOutputFilterByType DEFLATE application/json


  <Directory /usr/share/airtime/php/airtime_mvc/public/>
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} -s [OR]
      RewriteCond %{REQUEST_FILENAME} -l [OR]
      RewriteCond %{REQUEST_FILENAME} -d
      RewriteRule ^.*$ - [NC,L]
      RewriteRule ^.*$ index.php [NC,L]

      DirectoryIndex index.php
      AllowOverride all
      Order allow,deny
      Allow from all

      Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
      ServerName radio.nerdworking.de
      ServerAdmin admin@radio.nerdworking.de
      DocumentRoot /var/www/
</VirtualHost> 

<VirtualHost icecast.nfme.de:443>
   SSLEngine on
   SSLProtocol All -SSLv2 -SSLv3
   SSLCompression off
   SSLCertificateFile /etc/letsencrypt/live/icecast.nerdworking.de/fullchain.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/icecast.nerdworking.de/privkey.pem
   Header always set Strict-Transport-Security "max-age=31536000"

   ServerName icecast.nerdworking.de
   ServerAdmin beispielmail@nerdworking.de

   ProxyPreserveHost On
   ProxyPass / http://localhost:8000/
   ProxyPassReverse / http://localhost:8000/
</VirtualHost>

Mit Strg+X Abschließen; speichern, bestätigen und beenden und dann noch Apache neu starten:

sudo systemctl restart apache2

Fertig, die erste Einrichtung ist geschafft. Jetzt kann unter der eigenen Adresse, bzw. in diesem Beispiel unter https://radio.nerdworking.de im Browser die Einrichtung beendet werden, am Ende müssen entsprechend die folgenden Dienste gestartet werden:

sudo systemctl start libretime-playout
sudo systemctl start libretime-liquidsoap
sudo systemctl start libretime-analyzer
sudo systemctl start libretime-celery

Anschließend kann man sich mit dem Standard-Administrator-Account (Benutzername: admin Passwort: admin) anmelden.

Der Stream ist jetzt unter der Adresse icecast.nerdworking.de erreichbar und das Webinterface unter radio.nerdworking.de.

Beachtet bei der ersten Einrichtung die entsprechenden Tipps, dass RabbitMQ und die Datenbank mit einem geänderten Passwort am Besten eingerichtet werden, sollte der Server vom Internet erreichbar sein.

Dieser Artikel ist entstanden durch eine Projektarbeit in Kooperation mit dem Verein klangtapete e.V. Falls du gerne Unterstützung für ähnliche Projekte haben würdest, kontaktiere uns gerne.