Instalación de Jellyfin: Servidor de Medios en Linux

Jellyfin es un servidor de medios open-source y gratuito que permite organizar y transmitir tu biblioteca de vídeos, música y fotos desde tu propio servidor VPS o baremetal. Sin costes de suscripción ni limitaciones propietarias, Jellyfin ofrece transcodificación con aceleración hardware, gestión de usuarios, apps para múltiples plataformas y acceso remoto. Esta guía cubre la instalación completa de Jellyfin en Linux.

Requisitos Previos

  • Ubuntu 20.04+, Debian 11+, CentOS 8+ o Rocky Linux 8+
  • Mínimo 2 GB de RAM (4 GB recomendados)
  • CPU potente para transcodificación por software (o GPU para aceleración hardware)
  • Almacenamiento suficiente para la biblioteca de medios
  • Puerto 8096 (HTTP) y 8920 (HTTPS) disponibles

Instalación de Jellyfin

Ubuntu/Debian

# Instalar dependencias
sudo apt install -y curl gnupg apt-transport-https

# Agregar la clave GPG de Jellyfin
curl -fsSL https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | \
  gpg --dearmor | sudo tee /usr/share/keyrings/jellyfin.gpg > /dev/null

# Agregar el repositorio
echo "deb [signed-by=/usr/share/keyrings/jellyfin.gpg arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/debian $( lsb_release -c -s ) main" | \
  sudo tee /etc/apt/sources.list.d/jellyfin.list

# Instalar Jellyfin
sudo apt update
sudo apt install -y jellyfin

# Habilitar e iniciar el servicio
sudo systemctl enable --now jellyfin

# Verificar el estado
sudo systemctl status jellyfin

CentOS/Rocky Linux

# Agregar el repositorio RPM
sudo dnf install -y https://repo.jellyfin.org/releases/server/centos/stable/server/jellyfin-server-latest.rpm
sudo dnf install -y https://repo.jellyfin.org/releases/server/centos/stable/web/jellyfin-web-latest.rpm

# Instalar ffmpeg (necesario para transcodificación)
sudo dnf install -y epel-release
sudo dnf install -y ffmpeg

# Iniciar Jellyfin
sudo systemctl enable --now jellyfin

Instalación con Docker

La instalación con Docker es la más portable y fácil de gestionar:

# Crear directorio para los datos de Jellyfin
mkdir -p ~/jellyfin/{config,cache,media}

# Crear estructura de medios
mkdir -p ~/jellyfin/media/{peliculas,series,musica,fotos}

# Ejecutar Jellyfin con Docker
docker run -d \
  --name jellyfin \
  --restart unless-stopped \
  -p 8096:8096 \
  -p 8920:8920 \
  -v ~/jellyfin/config:/config \
  -v ~/jellyfin/cache:/cache \
  -v ~/jellyfin/media:/media \
  -e PUID=$(id -u) \
  -e PGID=$(id -g) \
  -e TZ=Europe/Madrid \
  jellyfin/jellyfin:latest

Con Docker Compose:

cat > ~/jellyfin/docker-compose.yml << 'EOF'
version: '3'

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    user: "1000:1000"
    environment:
      - TZ=Europe/Madrid
    volumes:
      - ./config:/config
      - ./cache:/cache
      - ./media:/media:ro
    ports:
      - 8096:8096
      - 8920:8920
    restart: unless-stopped
    # Para aceleración hardware Intel (VAAPI)
    # devices:
    #   - /dev/dri/renderD128:/dev/dri/renderD128
EOF

docker compose up -d

Configuración Inicial de la Biblioteca

Acceder al panel de Jellyfin en http://TU-SERVIDOR:8096 para completar la configuración inicial:

  1. Seleccionar idioma (Español disponible)
  2. Crear cuenta de administrador
  3. Agregar bibliotecas de medios

Para organizar los archivos correctamente (Jellyfin usa NFO/TMDB para metadatos):

# Estructura recomendada para películas
~/jellyfin/media/peliculas/
├── El Padrino (1972)/
│   └── El Padrino (1972).mkv
├── Pulp Fiction (1994)/
│   └── Pulp Fiction (1994).mp4
└── Matrix (1999)/
    └── Matrix (1999).mkv

# Estructura recomendada para series
~/jellyfin/media/series/
├── Breaking Bad/
│   ├── Season 01/
│   │   ├── Breaking Bad S01E01.mkv
│   │   └── Breaking Bad S01E02.mkv
│   └── Season 02/
│       └── Breaking Bad S02E01.mkv
# Ajustar permisos para que Jellyfin pueda leer los archivos
sudo chown -R jellyfin:jellyfin /var/lib/jellyfin/  # Instalación nativa
# Para Docker, asegurarse de que el PUID/PGID coincide con el propietario de los archivos

# Forzar un escaneo de biblioteca desde la CLI
# Nativo:
sudo -u jellyfin jellyfin --ffmpeg=/usr/bin/ffmpeg
# Docker:
docker exec jellyfin jellyfin_scan

Aceleración Hardware para Transcodificación

Intel Quick Sync / VAAPI

# Instalar controladores Intel Media
sudo apt install -y intel-media-va-driver vainfo  # Ubuntu/Debian
# sudo dnf install -y intel-media-driver libva-intel-driver  # CentOS/Rocky

# Verificar soporte VAAPI
vainfo

# Agregar el usuario jellyfin al grupo video/render
sudo usermod -aG render,video jellyfin

# Para Docker, mapear el dispositivo
# Agregar a docker-compose.yml:
# devices:
#   - /dev/dri:/dev/dri

En el panel de Jellyfin: Administración > Transcodificación > Aceleración de hardware: VAAPI o Intel QuickSync

NVIDIA NVENC

# Verificar soporte NVIDIA
nvidia-smi

# Para Docker con soporte NVIDIA
docker run -d \
  --name jellyfin \
  --runtime=nvidia \
  -e NVIDIA_VISIBLE_DEVICES=all \
  -e NVIDIA_DRIVER_CAPABILITIES=all \
  -p 8096:8096 \
  -v ~/jellyfin/config:/config \
  -v ~/jellyfin/cache:/cache \
  -v ~/jellyfin/media:/media \
  jellyfin/jellyfin:latest

En el panel: Administración > Transcodificación > NVENC

Gestión de Usuarios

# Desde el panel web: Administración > Usuarios > Agregar Usuario
# Opciones disponibles:
# - Contraseña con requisitos configurables
# - Bibliotecas accesibles por usuario
# - Control parental (clasificación por edades)
# - Límites de velocidad de transmisión
# - Perfil de transcodificación personalizado

Configuración recomendada para usuarios:

  • Administrador: Acceso completo, sin límites
  • Familia: Acceso a películas/series, sin contenido adulto
  • Invitado: Solo lectura, sin descarga, límite de streams simultáneos

Acceso Remoto y HTTPS

Configurar un proxy inverso Nginx para HTTPS:

# Instalar Nginx y Certbot
sudo apt install -y nginx certbot python3-certbot-nginx

# Obtener certificado SSL
sudo certbot --nginx -d jellyfin.tu-dominio.com

# Configuración de Nginx para Jellyfin
sudo tee /etc/nginx/sites-available/jellyfin << 'EOF'
server {
    listen 443 ssl http2;
    server_name jellyfin.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/jellyfin.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jellyfin.tu-dominio.com/privkey.pem;

    client_max_body_size 20M;

    location / {
        proxy_pass http://127.0.0.1:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffering off;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

En el panel de Jellyfin: Administración > Red > Permitir acceso remoto: Activado

Optimización del Rendimiento

# Verificar el directorio de transcodificación (debe estar en RAM o SSD rápido)
# Panel: Administración > Transcodificación > Ruta temporal

# Crear tmpfs para transcodificación (en RAM)
sudo mkdir -p /tmp/jellyfin-transcode
# Agregar a /etc/fstab para persistencia:
echo "tmpfs /tmp/jellyfin-transcode tmpfs defaults,size=2G 0 0" | sudo tee -a /etc/fstab
sudo mount -a

# Ajustar límites de hilos de transcodificación
# Panel: Administración > Transcodificación > Hilos de transcodificación: 0 (automático)

# Monitorear el uso de recursos durante transcodificación
watch -n 1 "top -bn1 | grep -E 'jellyfin|ffmpeg'"

Solución de Problemas

Jellyfin no inicia:

# Ver logs detallados
sudo journalctl -u jellyfin -n 100
# Docker:
docker logs jellyfin

# Verificar permisos del directorio de datos
ls -la /var/lib/jellyfin/
sudo chown -R jellyfin:jellyfin /var/lib/jellyfin/

Problemas de transcodificación:

# Verificar que ffmpeg está instalado y es accesible
which ffmpeg
ffmpeg -version

# Verificar los logs de transcodificación
tail -f /var/log/jellyfin/jellyfin*.log | grep -i "error\|transcode"

# Forzar transcodificación por software si falla la aceleración
# Panel: Administración > Transcodificación > Deshabilitar aceleración hardware

Los metadatos no se cargan:

# Verificar conectividad con TMDB/TVDB
curl -I https://api.themoviedb.org

# Revisar los logs de la biblioteca
sudo journalctl -u jellyfin | grep -i "metadata\|scan"

# Forzar actualización de metadatos desde el panel
# Biblioteca > Tres puntos > Actualizar metadatos

Conclusión

Jellyfin es la mejor opción open-source para montar un servidor de medios personal sin suscripciones. Con soporte para aceleración hardware, múltiples usuarios y clientes para todas las plataformas, ofrece una experiencia comparable a Plex o Emby sin coste alguno, y con el control total que aporta alojar tu propio servidor.