Sign inSign up

chrno79/shoutcast-webui

By chrno79

•Updated about 5 hours ago

All-in-one-Container für einen eigenen Internetradio-Sender

Image
0

1.3K

chrno79/shoutcast-webui repository overview

⁠Shoutcast WebUI

All-in-one-Container für einen eigenen Internetradio-Sender: SHOUTcast DNAS v2, AutoDJ (Liquidsoap) und eine deutschsprachige Verwaltungsoberfläche (PHP/SQLite) in einem Image. Mehrere Streams, DJ-Konten mit Live-Übergabe, Hörerliste mit Karte, Geo-/Provider-Sperren und Installation als App auf dem Handy.

Aktuelle Version: 1.30

Das Image ist als Test- und Heimbetriebs-Umgebung gedacht. Ändere vor dem Produktivbetrieb alle Standardpasswörter (siehe unten).

⁠Funktionen

Streaming

  • SHOUTcast DNAS v2 mit AutoDJ (Liquidsoap), der Musik aus der Bibliothek spielt
  • Multi-Stream: bis zu 6 Kanäle, jeder mit eigenem AutoDJ, eigenem DJ-Eingang, eigener Musikbibliothek und eigenem Ordner-Sendeplan; Kanäle lassen sich einzeln ein-/ausschalten
  • Hörerplätze je Kanal festlegbar (streammaxuser)
  • Ordner-Sendeplan: zu festen Zeiten spielt der AutoDJ nur Titel aus einem bestimmten Ordner

DJs

  • Eigener DJ-Eingang (Source-Proxy): DJs verbinden sich mit Mixxx, SAM Broadcaster, RadioBoss & Co. mit ihrem persönlichen Source-Passwort; das echte Server-Passwort bleibt geheim
  • Lückenlose Übergabe zwischen zwei DJs, DJ-Name wird im Stream angezeigt
  • DJ-Verwaltung mit Rollen (Admin, Musik-Admin, DJ), Kanal-Freigabe je DJ, WebUI-Login je Konto erlaubt/gesperrt und freigebbare Bereiche (Hörerliste, Sendeplan, Upload)

Musik

  • Upload durch DJs, Freigabe durch Musik-Admins, Bibliothek mit AutoDJ-Ordner und Lager, ID3-Tags bearbeiten, Suchen & Ersetzen
  • Optionaler FTP-Server als Ziel für den AutoDJ-Push

Hörer & Sicherheit

  • Aktuelle Hörer mit Standort (MaxMind GeoLite2), Provider und Kartenansicht; Kick und Sperren per IP oder /24-Netz
  • Hörer-Gate: prüft die echte Hörer-IP (auch hinter Reverse-Proxy) und weist gesperrte Hörer sofort mit 403 ab
  • Geo-Blocking (Länder-Allowlist) und Provider-/ASN-Blocking (Sperrliste, Whitelist, Vorlagen für VPN- und Hosting-Netze)
  • Whiteliste: Eigene IP eintragen verhindert, dass man sich selber ausspeert. IP prüfen zeigt, ob und warum eine IP blockiert wird.

Bedienung

  • Responsive Oberfläche mit Dark-Theme, Bearbeiten-Dialoge als Modal
  • Als App installierbar (PWA) auf Android, iOS und Desktop

⁠Anmerkungen

  • Die WebUI kann auch zur Verwaltung von einem externen Shoutcast-Server verwendet werden. Dies ist aber nur mit einigen Einschränkungen möglich, da einige Funktionen höhere Adminrechte bzw. Schreibrechte auf dem Shoutcast-Server benötigen.
  • 127.0.0.1 = lokaler Server im Container [Standard-Einstellung]
  • jede andere Adresse = 🌐 Externer Server (Kanäle, Neustart, AutoDJ-Übergänge, Server-Log und Ordner-Sendeplan sind dann abgeschaltet, der lokale SHOUTcast-Server und AutoDJ im Container werden gestoppt)
  • 🌐 Externer Server: Geo- und Provider-/ASN-Blocking greifen hier nur über den Sperr-Dienst, der unerwünschte Hörer nachträglich über die Admin-API trennt. Das vorgeschaltete Hörer-Gate (Sperre schon beim Verbindungsaufbau) gibt es nur beim lokalen Server.

⁠Schnellstart

docker-compose.yml:

services:
  shoutcast-webui:
    image: chrno79/shoutcast-webui:latest
    container_name: shoutcast-webui
    restart: unless-stopped
    environment:
      TZ: Europe/Berlin						 # Zeitzone
      SC_ADMIN_PASSWORD: "bitte-aendern"     # SHOUTcast-Admin (admin.cgi)
      SC_SOURCE_PASSWORD: "bitte-aendern"    # echtes, gemeinsames Source-Passwort
      WEBUI_ADMIN_USER: admin                # Admin WebUI-Login
      WEBUI_ADMIN_PASS: "mind-8-zeichen"     # Admin Passwort
      RADIO_NAME: Mein Radio                 # Radio Name
      RADIO_GENRE: Schlager                  # Stream Genre
      PUBLIC_HOST: radio.example.org         # wird DJs in der Verwaltung angezeigt
      GEOIP_UPDATE: "1"                      # GeoLite2-Datenbanken beim Start laden
	  SEED_SAMPLE_TRACKS: "true"			 # Biep-Tracks anlegen, wenn der AutoDJ-Ordner leer ist
      # AUTODJ_FTP_PASS: "bitte-aendern"     # optional, nur für externe Server benötigt
      # SC_USERID: ""                        # optional, SHOUTcast-Premium-Lizenz
      # SC_LICENSEID: ""                     # optional, SHOUTcast-Premium-Lizenz
      # SC_PUBLIC_SERVER: "never"            # Eintrag im SHOUTcast-Verzeichnis (never / default / always)
    ports:
      - "7080:80"                # WebUI
      - "7000:8200"              # Stream + admin.cgi über das Hörer-Gate
      - "7004:8004"              # DJ-Eingang Kanal 1
      - "7005:8004"              # DJ-Eingang Kanal 1 (Port + 1) SHOUTcast-v1-Clients
      - "7010-7019:8010-8019"    # DJ-Eingänge der Kanäle 2-6
      # - "21:21"                # FTP (optional)
      # - "21000-21010"          # FTP (optional, Passivports)
    volumes:
      - ./storage:/var/www/shoutcast-webui/storage   # Datenbank, .env, Musik
      - ./autodj:/srv/autodj

Starten mit docker compose up -d, dann die WebUI unter http://localhost:7080 öffnen und mit WEBUI_ADMIN_USER / WEBUI_ADMIN_PASS anmelden.

⁠Ports

Container-PortZweck
80WebUI
8200Hörer-Gate: dieser Port gehört nach außen (Stream + admin.cgi, prüft Sperrliste, Geo- und Provider-Regeln)
8000SHOUTcast direkt (ohne Gate, nicht für Hörer veröffentlichen)
8004DJ-Eingang Kanal 1 (Source-Proxy); SHOUTcast-v1-Clients ggf. Port+1
8010–8019DJ-Eingänge der Kanäle 2–6 (je Kanal Port N und N+1)
21, 21000–21010FTP (optional, Passivports) nur nötig, wenn FTP von außerhalb des Hosts genutzt wird

Die WebUI zeigt DJs und Hörern die äußeren Ports an: Container-Port minus CHANNEL_PORT_OFFSET (Standard 1000, passend zum Beispiel oben). Bei anderem Port-Schema CHANNEL_PORT_OFFSET anpassen; für Kanal 1 gibt es zusätzlich PROXY_PUBLIC_PORT und STREAM_PUBLIC_PORT.

⁠Umgebungsvariablen

VariableStandardBedeutung
SC_ADMIN_PASSWORDadmin123SHOUTcast-Admin-Passwort
SC_SOURCE_PASSWORDsource123gemeinsames Source-Passwort (sehen DJs nie)
WEBUI_ADMIN_USER / WEBUI_ADMIN_PASSadmin / admin12345erster WebUI-Admin (mind. 8 Zeichen)
AUTODJ_FTP_PASSautodj123Passwort des FTP-Benutzers autodj (optional)
RADIO_NAME / RADIO_GENREWebUI Testradio / SchlagerName und Genre von Kanal 1
PUBLIC_HOSTlocalhostöffentliche Adresse, wird in der DJ-Verwaltung angezeigt
SC_PUBLIC_SERVERneverEintrag im SHOUTcast-Verzeichnis (never / default / always)
SC_USERID / SC_LICENSEIDleeroptionale SHOUTcast-Premium-Lizenz
GEOIP_UPDATE01 = GeoLite2-Datenbanken und geoip2.phar beim Start laden
SEED_SAMPLE_TRACKStrueBeispieltracks anlegen, wenn der AutoDJ-Ordner leer ist
FTP_PASV_ADDRESSleernur nötig, wenn FTP von außerhalb des Hosts genutzt wird
TZEurope/BerlinZeitzone

Weitere Einstellungen (Homepage-API, FTP-Push u. a.) liegen in storage/.env und lassen sich in der WebUI unter Einstellungen ändern.

⁠Volumes

Pfad im ContainerInhalt
/var/www/shoutcast-webui/storageSQLite-Datenbank, .env, Musikordner, Ban-Listen: unbedingt sichern
/srv/autodjOrdner, den der AutoDJ tatsächlich spielt

⁠Betrieb hinter einem Reverse-Proxy

Die WebUI und das Hörer-Gate lesen die echte Client-IP aus X-Forwarded-For (interne Netze 10/8, 172.16/12, 192.168/16 gelten als vertrauenswürdige Proxys). Für Stream-Hörer den Proxy auf den Gate-Port 8200 zeigen lassen, nicht auf 8000, sonst greifen Sperren und Länderregeln nicht. Für die Installation als App ist HTTPS nötig.

⁠Als App installieren (PWA)

  • Android/Chrome, Desktop/Edge/Chrome: In der Seitenleiste auf „📲 App installieren" tippen.
  • iPhone/iPad: In Safari auf „Teilen" und „Zum Home-Bildschirm".

HTML-Seiten werden bewusst nie zwischengespeichert, nur CSS und Icons; ohne Verbindung erscheint eine Offline-Seite.

⁠Hinweise

  • Standardpasswörter ändern, bevor der Container aus dem lokalen Netz erreichbar ist.
  • Ohne GeoIP-Datenbanken (GEOIP_UPDATE=0) werden Geo- und Provider-Regeln nicht angewendet; der Stream bleibt dann erreichbar.
  • Beim Anlegen oder Löschen von Kanälen und bei geänderten Hörerplätzen startet der SHOUTcast-Server kurz neu, alle Kanäle sind dann für einige Sekunden unterbrochen.
  • SHOUTcast DNAS ist Software von Nullsoft/Radionomy. Der Download erfolgt beim Image-Build; beachte die jeweiligen Nutzungsbedingungen.

⁠Technik

Ubuntu 24.04 · Apache + PHP 8.5 · SQLite · SHOUTcast DNAS v2 · Liquidsoap · vsftpd · supervisord · MaxMind GeoLite2

Tag summary

Content type

Image

Digest

sha256:2d1b94490…

Size

286.5 MB

Last updated

about 5 hours ago

docker pull chrno79/shoutcast-webui