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:
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/:
Hauries de veure dos contenidors en estat Up:
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:
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:
Opció B - VLC:
- Obre VLC
Media → Open Network Stream- Introdueix:
http://localhost:8000/radio-NOMCOGNOM.mp3 - 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:
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.xmlidocker-compose.ymlpersonalitzats amb el teu nom - Explicació de cada secció modificada
3. Captures de pantalla (mínimes)
- Terminal mostrant
docker-compose psamb els contenidors actius - Pàgina principal d'Icecast amb els mount points personalitzats
- VLC o navegador reproduint el stream amb el teu nom visible
- Panell d'administració d'Icecast
- 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
- Audio File Converter - Convertir formats
- Audacity - Editor d'àudio
- VLC Media Player - Reproductor universal
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!