Salta el contingut

Pràctica: Ràdio per Internet amb Icecast i Docker

Objectius

En aquesta pràctica aprendràs a:

  • ✅ Desplegar un servidor Icecast utilitzant Docker
  • ✅ Configurar un servidor de streaming personalitzat amb el teu nom
  • ✅ Emetre àudio en directe des d'un contenidor
  • ✅ Crear múltiples punts de muntatge amb diferents formats
  • ✅ Accedir i gestionar el servidor via interfície web
  • ✅ Documentar la configuració i els resultats

Requisits

Programari necessari

  • Docker Desktop o Docker Engine instal·lat
  • Docker Compose (normalment inclòs amb Docker Desktop)
  • Navegador web modern (Chrome, Firefox, Edge)
  • Fitxers d'àudio MP3 per emetre (música lliure o propis)

Coneixements previs

  • Nocions bàsiques de Docker i contenidors
  • Conceptes d'àudio digital i streaming
  • Ús de terminal/línia de comandes

Part 1: Preparació de l'Entorn

Pas 1.1: Crear l'estructura de directoris

Crea un directori de treball per a la pràctica:

# SubstitueixNOM-COGNOM pel teu nom i cognom (tot en minúscules, sense espais)
mkdir -p ~/radio-NOMCOGNOM
cd ~/radio-NOMCOGNOM

# Crear subdirectoris necessaris
mkdir -p config audio logs

Exemple per a l'estudiant Joan Garcia:

mkdir -p ~/radio-fbarragan
cd ~/radio-fbarragan
mkdir -p config audio logs

Pas 1.2: Descarregar música lliure

Per evitar problemes de drets d'autor, utilitza música amb llicència lliure:

cd audio

# Exemple: Descarregar música de Free Music Archive
wget https://freemusicarchive.org/track/example.mp3 -O canco1.mp3
wget https://freemusicarchive.org/track/example2.mp3 -O canco2.mp3

O col·loca els teus propis fitxers MP3 al directori audio/.

Drets d'autor

Només utilitza música que tinguis dret a emetre. Pots utilitzar:

  • Free Music Archive: https://freemusicarchive.org/
  • Incompetech: https://incompetech.com/music/royalty-free/
  • YouTube Audio Library: https://www.youtube.com/audiolibrary

Part 2: Configuració d'Icecast

Pas 2.1: Crear el fitxer de configuració personalitzat

Crea el fitxer config/icecast.xml amb el següent contingut personalitzat amb el teu nom:

<icecast>
    <!-- PERSONALITZACIÓ OBLIGATÒRIA: Substitueix NOMCOGNOM pel teu nom i cognom -->
    <location>Institut Sa Palomera, Blanes</location>
    <admin>NOMCOGNOM@sapalomera.cat</admin>

    <limits>
        <clients>50</clients>
        <sources>3</sources>
        <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>
        <burst-size>65535</burst-size>
    </limits>

    <authentication>
        <!-- CANVIA aquestes contrasenyes per unes personalitzades -->
        <source-password>Font_NOMCOGNOM_2024!</source-password>
        <relay-password>Relay_NOMCOGNOM_2024!</relay-password>
        <admin-user>admin</admin-user>
        <admin-password>Admin_NOMCOGNOM_2024!</admin-password>
    </authentication>

    <!-- PERSONALITZACIÓ: Nom del host amb el teu nom -->
    <hostname>radio-NOMCOGNOM.local</hostname>

    <listen-socket>
        <port>8000</port>
    </listen-socket>

    <fileserve>1</fileserve>

    <paths>
        <basedir>/usr/share/icecast</basedir>
        <logdir>/var/log/icecast</logdir>
        <webroot>/usr/share/icecast/web</webroot>
        <adminroot>/usr/share/icecast/admin</adminroot>
        <alias source="/" destination="/status.xsl"/>
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <loglevel>3</loglevel>
        <logsize>10000</logsize>
    </logging>

    <!-- MOUNT POINT PERSONALITZAT -->
    <mount type="normal">
        <mount-name>/radio-NOMCOGNOM.mp3</mount-name>
        <max-listeners>25</max-listeners>
        <burst-size>65535</burst-size>

        <!-- Metadades personalitzades -->
        <stream-name>Ràdio NOMCOGNOM</stream-name>
        <stream-description>Emissora personal de [Nom Complet]</stream-description>
        <stream-url>http://radio-NOMCOGNOM.local:8000</stream-url>
        <genre>Variada</genre>
        <public>0</public>
    </mount>

    <security>
        <chroot>0</chroot>
    </security>
</icecast>

IMPORTANT: Substitueix TOTES les aparicions de NOMCOGNOM pel teu nom i cognom real.

Exemple per Joan Garcia:

<hostname>radio-fbarragan.local</hostname>
<admin>fbarragan@sapalomera.cat</admin>
<source-password>Font_fbarragan_2024!</source-password>
<mount-name>/radio-fbarragan.mp3</mount-name>
<stream-name>Ràdio Joan Garcia</stream-name>

Pas 2.2: Crear el docker-compose.yml

Crea el fitxer docker-compose.yml a l'arrel del projecte:

version: '3.8'

services:
  # PERSONALITZA el nom del servei amb el teu nom
  icecast-NOMCOGNOM:
    image: moul/icecast:latest
    container_name: icecast-NOMCOGNOM

    ports:
      - "8000:8000"    # Interfície web i streaming

    volumes:
      - ./config/icecast.xml:/etc/icecast.xml:ro
      - ./logs:/var/log/icecast
      - ./audio:/audio:ro

    environment:
      - TZ=Europe/Madrid

    restart: unless-stopped

    networks:
      - radio-network

  # Contenidor per streaming (ffmpeg)
  # PERSONALITZA el nom amb el teu nom
  streamer-NOMCOGNOM:
    image: linuxserver/ffmpeg:latest
    container_name: streamer-NOMCOGNOM

    volumes:
      - ./audio:/audio:ro

    # Aquesta comanda s'executarà en iniciar
    # PERSONALITZA la contrasenya i el mount point amb el teu nom
    command: >
      -re -stream_loop -1
      -i /audio/canco1.mp3
      -codec:a libmp3lame
      -b:a 128k
      -content_type audio/mpeg
      -f mp3
      icecast://source:Font_NOMCOGNOM_2024!@icecast-NOMCOGNOM:8000/radio-NOMCOGNOM.mp3

    depends_on:
      - icecast-NOMCOGNOM

    restart: unless-stopped

    networks:
      - radio-network

networks:
  radio-network:
    driver: bridge

IMPORTANT: Substitueix NOMCOGNOM pel teu nom i cognom en: - Noms dels serveis - Noms dels contenidors - URL de streaming - Contrasenya (ha de coincidir amb icecast.xml)


Part 3: Desplegament i Verificació

Pas 3.1: Iniciar els contenidors

Des del directori radio-NOMCOGNOM/:

# Aixecar els serveis
docker-compose up -d

# Verificar que estan en execució
docker-compose ps

Hauries de veure dos contenidors en estat Up:

NAME                    STATUS
icecast-fbarragan      Up 30 seconds
streamer-fbarragan     Up 28 seconds

Pas 3.2: Comprovar els logs

# Logs d'Icecast
docker-compose logs icecast-NOMCOGNOM

# Logs del streamer
docker-compose logs streamer-NOMCOGNOM

# Seguir logs en temps real
docker-compose logs -f

Busca missatges com:

icecast-fbarragan  | [INFO] Source connected: /radio-fbarragan.mp3
streamer-fbarragan | Stream #0:0: Audio: mp3, 44100 Hz, stereo, 128 kb/s

Pas 3.3: Accedir a la interfície web

Obre un navegador i accedeix a:

http://localhost:8000

Hauries de veure: - La pàgina d'estat d'Icecast - El mount point actiu: /radio-NOMCOGNOM.mp3 - Informació del stream: bitrate, format, listeners

Captura de pantalla 1: Pàgina principal d'Icecast mostrant el teu mount point.

Pas 3.4: Reproduir el stream

Opció A - Navegador:

Clica a l'enllaç M3U del teu mount point o accedeix directament a:

http://localhost:8000/radio-NOMCOGNOM.mp3

Opció B - VLC:

  1. Obre VLC
  2. Media → Open Network Stream
  3. Introdueix: http://localhost:8000/radio-NOMCOGNOM.mp3
  4. Play

Captura de pantalla 2: VLC o navegador reproduint el teu stream.


Part 4: Configuració Avançada

Pas 4.1: Afegir un segon mount point (qualitat alta)

Edita config/icecast.xml i afegeix abans de </icecast>:

    <mount type="normal">
        <mount-name>/radio-NOMCOGNOM-hq.mp3</mount-name>
        <max-listeners>10</max-listeners>
        <stream-name>Ràdio NOMCOGNOM - Alta Qualitat</stream-name>
        <stream-description>Stream d'alta qualitat (320 kbps)</stream-description>
        <genre>Variada HQ</genre>
    </mount>

Pas 4.2: Crear un nou streamer per la qualitat alta

Edita docker-compose.yml i afegeix un nou servei:

  streamer-NOMCOGNOM-hq:
    image: linuxserver/ffmpeg:latest
    container_name: streamer-NOMCOGNOM-hq

    volumes:
      - ./audio:/audio:ro

    command: >
      -re -stream_loop -1
      -i /audio/canco2.mp3
      -codec:a libmp3lame
      -b:a 320k
      -content_type audio/mpeg
      -f mp3
      icecast://source:Font_NOMCOGNOM_2024!@icecast-NOMCOGNOM:8000/radio-NOMCOGNOM-hq.mp3

    depends_on:
      - icecast-NOMCOGNOM

    restart: unless-stopped

    networks:
      - radio-network

Pas 4.3: Reiniciar amb la nova configuració

# Aturar els contenidors
docker-compose down

# Tornar a aixecar amb la nova configuració
docker-compose up -d

# Verificar els dos streams
docker-compose ps
docker-compose logs -f

Ara hauries de tenir dos mount points actius: - /radio-NOMCOGNOM.mp3 (128 kbps) - /radio-NOMCOGNOM-hq.mp3 (320 kbps)


Part 5: Accés a l'Administració

Pas 5.1: Panell d'administració

Accedeix a:

http://localhost:8000/admin/

Credencials: - Usuari: admin - Contrasenya: Admin_NOMCOGNOM_2024! (la que configurares)

Captura de pantalla 3: Panell d'administració mostrant estadístiques.

Pas 5.2: Gestió de fonts

Des del panell d'administració pots: - Veure listeners actuals - Desconnectar fonts - Veure històric de connexions - Consultar estadístiques detallades


Part 6: Streaming en Format Opus (Opcional)

Opus ofereix millor qualitat a bitrates més baixos. Afegeix un tercer mount point:

Pas 6.1: Configurar mount point Opus

A config/icecast.xml:

    <mount type="normal">
        <mount-name>/radio-NOMCOGNOM.opus</mount-name>
        <max-listeners>25</max-listeners>
        <stream-name>Ràdio NOMCOGNOM - Opus</stream-name>
        <stream-description>Stream optimitzat en format Opus</stream-description>
        <genre>Variada Opus</genre>
    </mount>

Pas 6.2: Afegir streamer Opus

A docker-compose.yml:

  streamer-NOMCOGNOM-opus:
    image: linuxserver/ffmpeg:latest
    container_name: streamer-NOMCOGNOM-opus

    volumes:
      - ./audio:/audio:ro

    command: >
      -re -stream_loop -1
      -i /audio/canco1.mp3
      -codec:a libopus
      -b:a 96k
      -content_type audio/ogg
      -f opus
      icecast://source:Font_NOMCOGNOM_2024!@icecast-NOMCOGNOM:8000/radio-NOMCOGNOM.opus

    depends_on:
      - icecast-NOMCOGNOM

    restart: unless-stopped

    networks:
      - radio-network

Pas 6.3: Comparar qualitats

Reprodueix els tres streams i compara: - MP3 128 kbps - MP3 320 kbps - Opus 96 kbps

Anota les diferències de qualitat percebuda i mida de fitxer.


Part 7: Monitorització i Estadístiques

Pas 7.1: Estadístiques en temps real

Des de l'interfície web (http://localhost:8000), observa: - Nombre de listeners connectats - Durada de la connexió - Bitrate actual - Informació de la pista (si està disponible)

Pas 7.2: Logs del sistema

Consulta els logs generats:

# Veure logs d'accés
cat logs/access.log

# Logs d'errors
cat logs/error.log

# Filtrar per mount point específic
grep "radio-NOMCOGNOM" logs/access.log

Qüestions i Exercicis

Qüestió 1: Càlcul d'amplada de banda

El teu stream MP3 està configurat a 128 kbps. Si tens 15 oients simultanis:

a) Quina amplada de banda de pujada necessita el servidor?

b) Si la teva connexió té 10 Mbps de pujada, quin és el nombre màxim d'oients que pots servir?

c) Quin seria el consum mensual de dades si mantens 10 oients constants durant 30 dies?

Qüestió 2: Comparativa de formats

Compara els tres formats configurats:

Format Bitrate Qualitat percebuda Compatibilitat Eficiència
MP3 128 kbps
MP3 320 kbps
Opus 96 kbps

Emplena la taula segons la teva experiència.

Qüestió 3: Troubleshooting

El streamer no es connecta a Icecast. Quines són les 3 causes més probables i com les comprovariam?

Exercici 1: Playlist rotativa

Modifica el docker-compose.yml perquè el streamer reprodueixi tots els fitxers MP3 del directori audio/ en bucle, no només un.

Pista: Investiga l'opció -f concat de ffmpeg o utilitza un playlist file.

Exercici 2: Metadades dinàmiques

Configura el streamer perquè enviï metadades (títol de cançó) a Icecast mentre reprodueix.

Exercici 3: Programació horària

Crea un script bash que: 1. A les 8:00 inici el stream principal 2. A les 14:00 canviï a un stream diferent 3. A les 22:00 aturi el streaming

Utilitza cron dins d'un contenidor o docker-compose amb healthchecks.


Lliurament

Format de lliurament

Crea un document PDF amb les següents seccions:

1. Portada

  • Nom complet
  • Curs i grup
  • Data de realització

2. Configuració

  • Contingut complet dels fitxers icecast.xml i docker-compose.yml personalitzats amb el teu nom
  • Explicació de cada secció modificada

3. Captures de pantalla (mínimes)

  1. Terminal mostrant docker-compose ps amb els contenidors actius
  2. Pàgina principal d'Icecast amb els mount points personalitzats
  3. VLC o navegador reproduint el stream amb el teu nom visible
  4. Panell d'administració d'Icecast
  5. Logs mostrant la connexió del source

4. Proves de funcionalitat

  • Taula amb els mount points creats i les seves característiques:
Mount Point Format Bitrate Estat URL Accés
/radio-NOMCOGNOM.mp3
/radio-NOMCOGNOM-hq.mp3
/radio-NOMCOGNOM.opus

5. Respostes a qüestions

  • Respostes detallades a les qüestions 1, 2 i 3
  • Càlculs justificats amb operacions

6. Exercicis opcionals

  • Documentació dels exercicis 1, 2 o 3 realitzats

7. Reflexió personal (200-300 paraules)

  • Dificultats trobades i com les vas resoldre
  • Avantatges de Docker per a aquest tipus de serveis
  • Aplicacions pràctiques que veus per a un servidor de streaming

Criteris d'avaluació

Criteri Puntuació
Personalització correcta (nom/cognom a tots els llocs) 15%
Configuració funcional d'Icecast 20%
Docker-compose correcte i ben estructurat 20%
Captures de pantalla completes i clares 15%
Múltiples mount points funcionant 15%
Respostes a qüestions 10%
Documentació i presentació 5%

Total: 100%

Penalitzacions: - -20% si no hi ha personalització amb nom/cognom - -10% si falta alguna captura obligatòria - -15% si els contenidors no s'inicien correctament


Recursos Addicionals

Documentació oficial

Eines útils

Música lliure


Solució de Problemes

Error: "Port 8000 already in use"

Un altre procés està utilitzant el port 8000.

Solució:

# Trobar què utilitza el port
sudo lsof -i :8000

# Aturar el procés o canviar el port a docker-compose.yml
ports:
  - "8001:8000"

Error: "Source authentication failed"

La contrasenya del source no coincideix.

Solució: - Verifica que source-password a icecast.xml coincideix amb la URL del streamer - Format correcte: icecast://source:CONTRASENYA@host:port/mountpoint

El stream es talla constantment

Problemes de xarxa o recursos.

Solució:

# Augmentar recursos del contenidor (si cal)
docker-compose down
# Editar docker-compose.yml i afegir:
    deploy:
      resources:
        limits:
          memory: 512M

docker-compose up -d

No es sent res al reproduir

Comprova que el fitxer d'àudio és vàlid.

Solució:

# Verificar que el fitxer existeix i és accessible
docker exec streamer-NOMCOGNOM ls -lh /audio/

# Provar el fitxer localment
ffmpeg -i audio/canco1.mp3 -f null -


Conclusió

Ara has creat una emissora de ràdio per Internet completament funcional utilitzant Docker i tecnologies de streaming professionals. Has après a:

  • ✅ Desplegar serveis amb Docker Compose
  • ✅ Configurar Icecast per streaming d'àudio
  • ✅ Gestionar múltiples formats i qualitats
  • ✅ Monitoritzar i administrar un servidor de streaming
  • ✅ Personalitzar serveis amb la teva identitat

Aquestes habilitats són directament aplicables en l'àmbit professional per a la creació de podcasts, ràdio corporativa, streaming d'esdeveniments i molt més.

Enhorabona per completar la pràctica!