Pràctica: Creació i Allotjament d'un Podcast amb Docker
Objectius
En aquesta pràctica aprendràs a:
- ✅ Crear i editar un episodi de podcast personalitzat
- ✅ Generar un feed RSS vàlid amb el teu nom
- ✅ Desplegar un servidor web amb Docker per allotjar el podcast
- ✅ Configurar Nginx per servir els fitxers d'àudio
- ✅ Validar i provar el feed RSS
- ✅ Generar estadístiques bàsiques d'accés
Requisits
Programari necessari
- Docker Desktop o Docker Engine
- Audacity: Editor d'àudio (descarregar)
- Navegador web modern
- Editor de text: VS Code, Notepad++, o similar
Coneixements previs
- Edició bàsica d'àudio
- Conceptes d'XML i RSS
- Docker i contenidors
Part 1: Producció del Contingut
Pas 1.1: Planificació del podcast personalitzat
Defineix els següents elements utilitzant el teu nom i cognom:
- Nom del podcast: "Tecnologia amb [NOM COGNOM]"
- Tema de l'episodi 1: "Introducció als serveis de xarxa"
- Durada: 5-10 minuts
- Estructura:
- Intro: "Hola, sóc [nom complet] i aquest és el meu podcast..."
- Contingut: Explica breument què són DNS, DHCP i streaming
- Outro: "Això ha estat tot per avui, [nom complet] us desitja bon dia!"
Pas 1.2: Gravació amb Audacity
- Obre Audacity
- Configura
Edit → Preferences → Quality: - Sample Rate: 44100 Hz
- Sample Format: 32-bit float
- Grava el teu episodi amb el guió personalitzat
- Important: Menciona el teu nom complet almenys 3 vegades durant l'episodi
Pas 1.3: Edició i exportació
- Normalitza l'àudio:
Effect → Normalize(-1.0 dB) - Redueix soroll si cal:
Effect → Noise Reduction - Exporta a MP3:
File → Export → Export as MP3- Qualitat: 128 kbps
- Nom del fitxer:
episodi01-NOMCOGNOM.mp3
Exemple per Joan Garcia: episodi01-fbarragan.mp3
- Emplena metadades ID3:
- Artist: [El teu nom complet]
- Track Title: "Episodi 1: Introducció als serveis de xarxa"
- Album: "Tecnologia amb [NOM COGNOM]"
- Year: 2024
- Genre: Podcast
Pas 1.4: Crear artwork personalitzat
Crea una imatge 1400x1400 píxels que inclogui: - Títol del podcast amb el teu nom - El teu nom ben visible - Disseny senzill però professional
Guarda com: podcast-cover-NOMCOGNOM.jpg
Part 2: Estructura del Projecte Docker
Pas 2.1: Crear directoris
# Crea l'estructura amb el teu nom
mkdir -p ~/podcast-NOMCOGNOM
cd ~/podcast-NOMCOGNOM
# Subdirectoris
mkdir -p episodis imatges nginx-config logs
Pas 2.2: Col·locar els fitxers
# Mou els fitxers creats
mv /path/to/episodi01-NOMCOGNOM.mp3 episodis/
mv /path/to/podcast-cover-NOMCOGNOM.jpg imatges/
Part 3: Creació del Feed RSS Personalitzat
Pas 3.1: Crear podcast.xml
Crea el fitxer podcast.xml a l'arrel del projecte amb tota la informació personalitzada:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<!-- PERSONALITZACIÓ OBLIGATÒRIA -->
<title>Tecnologia amb NOM COGNOM</title>
<link>http://localhost:8080/podcast-NOMCOGNOM/</link>
<language>ca</language>
<description>
Podcast sobre tecnologia i serveis de xarxa presentat per [Nom complet].
Estudiant d'ASIX a l'Institut Sa Palomera.
</description>
<!-- Autor - EL TEU NOM -->
<itunes:author>NOM COGNOM</itunes:author>
<itunes:summary>
Exploro el món de la tecnologia des de la perspectiva d'un estudiant d'ASIX.
</itunes:summary>
<itunes:owner>
<itunes:name>NOM COGNOM</itunes:name>
<itunes:email>NOMCOGNOM@sapalomera.cat</itunes:email>
</itunes:owner>
<!-- Artwork personalitzat -->
<itunes:image href="http://localhost:8080/imatges/podcast-cover-NOMCOGNOM.jpg"/>
<itunes:category text="Technology">
<itunes:category text="Tech News"/>
</itunes:category>
<itunes:category text="Education"/>
<itunes:explicit>no</itunes:explicit>
<!-- EPISODI 1 - Personalitzat -->
<item>
<title>Episodi 1: Introducció als Serveis de Xarxa</title>
<description>
En aquest primer episodi, [Nom complet] explica els conceptes bàsics
dels serveis de xarxa: DNS, DHCP i streaming. Una introducció perfecta
per entendre com funciona Internet.
</description>
<itunes:summary>
[Nom complet] introdueix els serveis fonamentals de xarxa.
</itunes:summary>
<!-- URL personalitzada amb el teu nom -->
<enclosure
url="http://localhost:8080/episodis/episodi01-NOMCOGNOM.mp3"
type="audio/mpeg"
length="MIDA_EN_BYTES"/>
<!-- GUID únic amb el teu nom -->
<guid isPermaLink="false">podcast-NOMCOGNOM-ep01</guid>
<!-- Data actual en format RFC 822 -->
<pubDate>Mon, 15 Jan 2024 10:00:00 GMT</pubDate>
<itunes:duration>8:45</itunes:duration>
<itunes:explicit>no</itunes:explicit>
<itunes:episode>1</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
<!-- Autor de l'episodi -->
<itunes:author>NOM COGNOM</itunes:author>
</item>
</channel>
</rss>
IMPORTANT: Substitueix:
- NOM COGNOM → El teu nom i cognom
- NOMCOGNOM → nom i cognom junts sense espais
- [Nom complet] → El teu nom complet
- MIDA_EN_BYTES → Mida del fitxer MP3
Pas 3.2: Obtenir la mida del fitxer
# Linux/Mac
ls -l episodis/episodi01-NOMCOGNOM.mp3
# Windows (PowerShell)
(Get-Item episodis\episodi01-NOMCOGNOM.mp3).Length
Copia el número de bytes i actualitza length="..." al XML.
Part 4: Configuració de Nginx
Pas 4.1: Crear nginx.conf personalitzat
Crea nginx-config/nginx.conf:
server {
listen 80;
server_name localhost;
# Directori arrel personalitzat
root /usr/share/nginx/html/podcast-NOMCOGNOM;
# Habilitar directoris
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
# Configuració per al feed RSS
location = /podcast.xml {
add_header Content-Type application/rss+xml;
add_header Cache-Control "public, max-age=3600";
}
# Configuració per als fitxers MP3
location ~ \.mp3$ {
add_header Content-Type audio/mpeg;
add_header Accept-Ranges bytes;
add_header Cache-Control "public, max-age=86400";
# Habilitar streaming progressiu
mp3;
}
# Configuració per imatges
location ~ \.(jpg|jpeg|png|gif)$ {
add_header Cache-Control "public, max-age=604800";
}
# Logs personalitzats
access_log /var/log/nginx/podcast-NOMCOGNOM-access.log combined;
error_log /var/log/nginx/podcast-NOMCOGNOM-error.log warn;
# Pàgina d'índex personalitzada
location = / {
return 200 '
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Podcast de NOM COGNOM</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 50px auto; padding: 20px; }
h1 { color: #2c3e50; }
.info { background: #ecf0f1; padding: 15px; border-radius: 5px; margin: 20px 0; }
a { color: #3498db; text-decoration: none; }
a:hover { text-decoration: underline; }
</style>
</head>
<body>
<h1>🎙️ Tecnologia amb NOM COGNOM</h1>
<div class="info">
<p><strong>Autor:</strong> NOM COGNOM</p>
<p><strong>Descripció:</strong> Podcast sobre tecnologia i serveis de xarxa</p>
<p><strong>Correu:</strong> NOMCOGNOM@sapalomera.cat</p>
</div>
<h2>📡 Subscripció</h2>
<p><a href="/podcast.xml">Feed RSS</a></p>
<h2>🎧 Episodis</h2>
<ul>
<li><a href="/episodis/episodi01-NOMCOGNOM.mp3">Episodi 1: Introducció als Serveis de Xarxa</a></li>
</ul>
<h2>📊 Estadístiques</h2>
<p><a href="/admin/stats.html">Veure estadístiques d\'accés</a></p>
</body>
</html>
';
add_header Content-Type text/html;
}
}
IMPORTANT: Substitueix NOM COGNOM i NOMCOGNOM pel teu nom.
Part 5: Docker Compose
Pas 5.1: Crear docker-compose.yml
version: '3.8'
services:
# PERSONALITZA el nom amb el teu nom i cognom
podcast-web-NOMCOGNOM:
image: nginx:alpine
container_name: podcast-NOMCOGNOM
ports:
- "8080:80"
volumes:
# Configuració de Nginx
- ./nginx-config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
# Contingut del podcast (tot l'arrel del projecte)
- ./podcast.xml:/usr/share/nginx/html/podcast-NOMCOGNOM/podcast.xml:ro
- ./episodis:/usr/share/nginx/html/podcast-NOMCOGNOM/episodis:ro
- ./imatges:/usr/share/nginx/html/podcast-NOMCOGNOM/imatges:ro
# Logs
- ./logs:/var/log/nginx
environment:
- TZ=Europe/Madrid
restart: unless-stopped
networks:
- podcast-network
networks:
podcast-network:
driver: bridge
Part 6: Desplegament
Pas 6.1: Iniciar el servidor
cd ~/podcast-NOMCOGNOM
# Aixecar el contenidor
docker-compose up -d
# Verificar que està en execució
docker-compose ps
Pas 6.2: Verificar l'accés
Pàgina principal:
Hauries de veure la pàgina personalitzada amb el teu nom.
Feed RSS:
Episodi directe:
Captura de pantalla 1: Pàgina principal mostrant el teu nom i informació.
Captura de pantalla 2: Feed RSS al navegador.
Part 7: Validació del Feed
Pas 7.1: Validador online
Per validar el feed sense haver-lo publicat a Internet, copia el contingut de podcast.xml i enganxa'l a:
Corregeix qualsevol error mostrat.
Pas 7.2: Provar amb un reproductor local
Opció A - VLC:
1. Obre VLC
2. Media → Open Network Stream
3. URL: http://localhost:8080/podcast.xml
4. VLC hauria de mostrar l'episodi i reproduir-lo
Opció B - Navegador amb extensió: Instal·la una extensió RSS (com "RSS Feed Reader") i obre el feed.
Captura de pantalla 3: Reproductor mostrant el podcast amb el teu nom.
Part 8: Estadístiques d'Accés
Pas 8.1: Crear pàgina d'estadístiques
Crea admin/stats.html dins del projecte:
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Estadístiques - Podcast NOM COGNOM</title>
<style>
body { font-family: monospace; padding: 20px; background: #1e1e1e; color: #d4d4d4; }
h1 { color: #4ec9b0; }
pre { background: #252526; padding: 15px; border-radius: 5px; overflow-x: auto; }
</style>
</head>
<body>
<h1>📊 Estadístiques d'Accés - NOM COGNOM</h1>
<h2>Accessos al feed RSS</h2>
<pre id="rss-stats">Carregant...</pre>
<h2>Descàrregues d'episodis</h2>
<pre id="download-stats">Carregant...</pre>
<script>
// Simulació (en producció es llegeixien logs reals)
document.getElementById('rss-stats').textContent =
'Total accessos: 25\nÚltim accés: 2024-01-15 14:30:22\nUser-agents:\n - Pocket Casts: 12\n - Apple Podcasts: 8\n - Altres: 5';
document.getElementById('download-stats').textContent =
'episodi01-NOMCOGNOM.mp3: 18 descàrregues\nTràfic total: 234 MB';
</script>
<p><a href="/" style="color: #4ec9b0;">← Tornar a l\'inici</a></p>
</body>
</html>
Afegeix el volum a docker-compose.yml:
Reinicia:
Accedeix a: http://localhost:8080/admin/stats.html
Captura de pantalla 4: Pàgina d'estadístiques.
Part 9: Afegir un Segon Episodi
Pas 9.1: Crear episodi 2
Repeteix el procés de gravació per crear:
- Fitxer: episodi02-NOMCOGNOM.mp3
- Tema: "Docker i contenidors" (menciona el teu nom)
- Durada: 5-8 minuts
Pas 9.2: Actualitzar el feed RSS
Afegeix un nou <item> abans de l'episodi 1 a podcast.xml:
<!-- Episodi 2 (més recent) -->
<item>
<title>Episodi 2: Docker i Contenidors</title>
<description>
[Nom complet] explica què són els contenidors Docker i per què
són útils per desplegar serveis com aquest mateix podcast.
</description>
<enclosure
url="http://localhost:8080/episodis/episodi02-NOMCOGNOM.mp3"
type="audio/mpeg"
length="MIDA_BYTES"/>
<guid isPermaLink="false">podcast-NOMCOGNOM-ep02</guid>
<pubDate>Mon, 22 Jan 2024 10:00:00 GMT</pubDate>
<itunes:duration>7:12</itunes:duration>
<itunes:episode>2</itunes:episode>
<itunes:author>NOM COGNOM</itunes:author>
</item>
<!-- Episodi 1 ... -->
Pas 9.3: Reiniciar el servei
Verifica que ara el feed mostra dos episodis.
Qüestions i Exercicis
Qüestió 1: Estructura RSS
Explica per què l'ordre dels <item> al feed és important i com afecta la visualització en reproductors de podcasts.
Qüestió 2: Docker vs Instal·lació Traditional
Compara les avantatges i desavantatges d'utilitzar Docker per allotjar un podcast vs. instal·lar Nginx directament al sistema operatiu.
Qüestió 3: Amplada de banda
Si tens 3 episodis de 15 MB cadascun i reps 100 subscriptors que descarreguen automàticament cada nou episodi:
a) Quin tràfic es genera quan publiques l'episodi 4?
b) Si el teu hosting té límit de 10 GB/mes, quants subscriptors pots tenir?
Exercici 1: Categoria personalitzada
Afegeix una categoria personalitzada al teu podcast que reflecteixi el teu interès específic dins de tecnologia.
Exercici 2: Capítols
Investiga i implementa capítols (chapters) per a un episodi llarg (>15 min), permetent saltar entre seccions.
Exercici 3: HTTPS
Configura un certificat SSL auto-signat per servir el podcast via HTTPS.
Pista:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout nginx-config/cert.key \
-out nginx-config/cert.crt
Lliurament
Format de lliurament
Document PDF amb:
1. Portada
- Nom complet, curs, data
2. Fitxers de configuració
podcast.xmlcomplet (personalitzat)docker-compose.ymlcompletnginx.confcomplet
3. Captures de pantalla (obligatòries)
- Terminal amb
docker-compose ps - Pàgina web principal amb el teu nom visible
- Feed RSS al navegador
- Reproductor (VLC o altre) amb l'episodi carregat
- Pàgina d'estadístiques
- Contingut de
logs/podcast-NOMCOGNOM-access.logmostrant accessos
4. Metadades dels episodis
Taula amb informació de cada episodi:
| Episodi | Títol | Durada | Mida (MB) | Bitrate | Vegades que menciones el teu nom |
|---|---|---|---|---|---|
| 1 | |||||
| 2 |
5. Respostes a qüestions
- Respostes completes i justificades
6. Transcripció parcial
- Transcriu els primers 2 minuts de l'episodi 1 on s'ha de veure clarament que menciones el teu nom
7. Reflexió (250-300 paraules)
- Procés de creació
- Dificultats trobades
- Aplicacions pràctiques
- Millores futures
Criteris d'avaluació
| Criteri | Puntuació |
|---|---|
| Personalització completa (nom en tots els llocs obligatoris) | 20% |
| Episodis gravats amb qualitat i mencionant el nom | 15% |
| Feed RSS vàlid i ben format | 20% |
| Docker-compose i Nginx funcionals | 20% |
| Captures de pantalla completes | 10% |
| Respostes a qüestions | 10% |
| Documentació i presentació | 5% |
Penalitzacions: - -25% si el nom no apareix en configuracions obligatòries - -15% si no es menciona el nom verbalment als episodis - -10% si el feed RSS no valida correctament - -10% si el contenidor no s'inicia
Recursos Addicionals
Eines d'àudio
Validadors
Disseny
- Canva - Plantilles per artwork
Música lliure
Conclusió
Has creat un sistema complet de podcasting amb:
- ✅ Producció professional d'episodis personalitzats
- ✅ Feed RSS estàndard i vàlid
- ✅ Infraestructura Docker per allotjament
- ✅ Servidor web Nginx configurat
- ✅ Sistema d'estadístiques bàsic
Aquest projecte demostra habilitats en producció de contingut multimèdia, administració de sistemes amb Docker, configuració de servidors web i comprensió de protocols de sindicació.
Excel·lent feina!