[{"data":1,"prerenderedAt":189},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-jellyfin-en-un-vps-ma-es":6,"promo-bar-likely":188},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-jellyfin-en-un-vps-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":127,"ctaBody":128,"ctaButton":129,"ctaUrl":130,"relatedPosts":131},84,"alojar-jellyfin-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"heberger-jellyfin","host-jellyfin-on-your-own-vps","استضافة-jellyfin-على-خادمك-الافتراضي-الخاص-vps","Alojar Jellyfin en un VPS: guía completa 2026","Despliega Jellyfin self-hosted en VPS con Docker, nginx, HTTPS, plugins, almacenamiento y transcodificación. Guía completa actualizada para 2026.",20,11,false,"2026-03-28T00:00:00+00:00","2026-11-08T01:13:14+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-jellyfin-poster.svg",{"categorySlug":34,"appSlug":35},"colaboracion-productividad","jellyfin","Jellyfin es el servidor multimedia libre que Plex debería haber sido. Sin suscripción, sin servidor central que autentique tus dispositivos, sin recopilación de datos: solo tu biblioteca, en tu máquina, accesible desde cualquier pantalla. Las plataformas de streaming centralizadas han subido sus precios en los últimos años. Esta guía te lleva desde la instalación con Docker hasta la configuración de nginx, cubriendo los tres problemas que más documentan los foros: los plugins que desaparecen tras una actualización, la elección del almacenamiento cuando la biblioteca crece, y el salto a una versión mayor cuya migración de base de datos puede no terminar nunca.",[38,42,54,57,79,82,85,88,91,94,118,121,124],{"type":39,"title":40,"body":41},"h2","Por qué Jellyfin en 2026","El panorama de los servidores multimedia personales ha cambiado en pocos años. Plex subió el precio de su Lifetime Pass en 2025 y lo triplicó el 1 de julio de 2026 (de 249,99 a 749,99 dólares, una subida anunciada en mayo de 2026), lo que encarece la entrada para un uso familiar. Emby, la otra alternativa histórica, también funciona con un modelo freemium: algunas funciones clave, como la transcodificación por hardware, el DVR o la descarga sin conexión en el móvil, quedan reservadas a los suscriptores de Emby Premiere.\n\nJellyfin nació en 2018 como un fork de Emby, precisamente para seguir siendo libre. La licencia GPLv2 impide volver a cerrar el código: si un colaborador reintroduce código propietario, los usuarios pueden bifurcar legalmente. Es una garantía estructural que ni Plex ni Emby ofrecen.\n\nEn cuanto a versiones, la serie 12.x ha sucedido a la 10.11: la 12.0 salió el 8 de septiembre de 2026, y la 12.4, publicada el 26 de octubre de 2026, es la última versión estable observada en el momento de la redacción. Este salto de versión mayor tiene una consecuencia práctica: una migración de la base de datos que a veces es muy larga, tratada más abajo en esta guía.\n\nEn cuanto a funciones, Jellyfin cubre casi todos los usos habituales: streaming adaptativo, transcodificación por software y hardware, apps nativas para iOS, Android, Android TV y Roku, LiveTV y grabación DVR, subtítulos automáticos, autenticación SSO mediante OIDC y LDAP, y un sistema de plugins que amplía la aplicación sin tocar el núcleo.",{"type":43,"title":44,"items":45},"ul","Lo que ofrece Jellyfin",[46,47,48,49,50,51,52,53],"**Streaming DLNA y HLS** — sirve películas, series y música a todos tus dispositivos, incluidos los televisores sin app nativa.","**Apps oficiales** — iOS, Android, Android TV, Roku, Fire TV, Kodi; una interfaz web adaptable para todo lo demás.","**Transcodificación al vuelo** — convierte el formato de origen si el dispositivo de destino no lo soporta, por software o mediante GPU.","**LiveTV y grabación DVR** — conecta un sintonizador USB o una fuente IPTV para ver y grabar televisión en directo.","**SSO OIDC y LDAP** — integra tu directorio existente o un proveedor de identidad como Authentik o Keycloak.","**Subtítulos automáticos** — plugin OpenSubtitles, extracción de las pistas incrustadas, renderizado WebVTT.","**Plugins ampliados** — integraciones con LastFM, scrobbling, metadatos musicales, tráilers, gestión de colecciones.","**Sin ninguna nube propietaria** — ninguna autenticación a través de servidores de Plex, ningún dato de reproducción enviado a terceros.",{"type":39,"title":55,"body":56},"Requisitos por caso de uso","Las necesidades varían mucho según lo que pretendas hacer.\n\n**SD y 1080p sin transcodificación (direct play)**: si tus dispositivos reproducen de forma nativa el códec de origen (H.264 o H.265), Jellyfin no transcodifica: sirve el archivo como un servidor de archivos inteligente. 2 vCPU y 2 GB de RAM bastan de sobra para una biblioteca de varios cientos de títulos. Es el caso de uso más habitual en un VPS.\n\n**1080p con transcodificación por software**: cuando el cliente no soporta el códec o cuando limitas la tasa de bits, Jellyfin codifica al vuelo. Un solo flujo 1080p H.264 consume de 2 a 4 núcleos según la resolución de origen. Apunta a 4 vCPU \u002F 4 GB de RAM como mínimo para dos usuarios simultáneos.\n\n**4K HDR con transcodificación por software**: el tone-mapping HDR (conversión HDR→SDR para pantallas sin HDR) es extremadamente exigente. Un solo flujo 4K HDR puede saturar 8 núcleos. Este caso no es adecuado para un VPS cloud estándar: prefiere el direct play 4K (el cliente debe soportar HEVC\u002FHDR) o un servidor dedicado con GPU.\n\n**Transcodificación por hardware GPU (VAAPI\u002FNVENC)**: reduce mucho la carga de CPU, pero requiere acceso al dispositivo `\u002Fdev\u002Fdri` o a una tarjeta NVIDIA. Los VPS cloud estándar no exponen GPU; es una opción reservada a servidores dedicados o a VPS con GPU especializados.\n\n**Disco para una subida de versión**: prevé espacio para guardar una copia completa de la carpeta de configuración (base de datos incluida) junto al original. La documentación de copias de seguridad de Jellyfin exige al menos 5 GB libres para una copia integrada, y más si incluyes subtítulos y trickplay.",{"type":58,"title":59,"steps":60},"steps","Instalar Jellyfin en un VPS Ubuntu\u002FDebian con Docker Compose",[61,64,67,70,73,76],{"title":62,"body":63},"Preparar el VPS e instalar Docker","Conéctate por SSH a tu VPS (Ubuntu 22.04 o Debian 12). Actualiza el sistema e instala Docker:\n\n`apt update && apt upgrade -y`\n`curl -fsSL https:\u002F\u002Fget.docker.com | sh`\n`systemctl enable --now docker`\n\nComprueba que Docker funciona: `docker info`. Haz esta actualización ahora, con el servidor todavía vacío: más adelante, en una máquina que aloje un Jellyfin instalado por paquete, un `apt upgrade` puede reiniciar el servicio en el peor momento (consulta la sección sobre subida de versión).",{"title":65,"body":66},"Crear la estructura de carpetas","Elige dónde guardar la configuración de Jellyfin y tus medios:\n\n`mkdir -p \u002Fopt\u002Fjellyfin\u002F{config,cache}`\n`mkdir -p \u002Fmnt\u002Fmedia\u002F{peliculas,series,musica}`\n`chown -R 1000:1000 \u002Fopt\u002Fjellyfin \u002Fmnt\u002Fmedia`\n\nEl UID 1000 es el que el archivo Compose de abajo da al contenedor de Jellyfin (parámetro `user`, opcional según la documentación: sin él, el contenedor se ejecuta como root).",{"title":68,"body":69},"Escribir el archivo docker-compose.yml","Crea `\u002Fopt\u002Fjellyfin\u002Fdocker-compose.yml`. Bajo `services:` y luego `jellyfin:` (indentación YAML de dos espacios por nivel), coloca estas líneas:\n\n`image: jellyfin\u002Fjellyfin:12.4`\n`container_name: jellyfin`\n`user: \"1000:1000\"`\n`ports:` y debajo `- \"127.0.0.1:8096:8096\"`\n`restart: unless-stopped`\n`volumes:` y debajo `- \u002Fopt\u002Fjellyfin\u002Fconfig:\u002Fconfig`, `- \u002Fopt\u002Fjellyfin\u002Fcache:\u002Fcache` y `- \u002Fmnt\u002Fmedia:\u002Fmedia:ro`\n`environment:` y debajo `- JELLYFIN_PublishedServerUrl=https:\u002F\u002Fjellyfin.tu-dominio.com`\n\n**No escribas `latest`.** Según la documentación oficial, esa etiqueta «sigue siempre la última versión estable, incluso a través de subidas de versión mayor y menor»: basta entonces un simple `docker compose pull` para lanzar una migración de base de datos que no has preparado. Fija una versión: una etiqueta `X.Y` (como `12.4`) sigue las correcciones de esa rama, una etiqueta `X.Y.Z` congela una versión exacta. Comprueba la etiqueta vigente en el registro de imágenes antes de copiar `12.4`.\n\nEl puerto solo se publica en `127.0.0.1`: únicamente nginx, en la misma máquina, accede a él, y Jellyfin no es accesible en HTTP sin cifrar desde la IP pública. `network_mode: host` solo es necesario para el descubrimiento DLNA, según la documentación; DLNA solo funciona en una red local, y en un VPS ese modo expondría el puerto 8096 en todas las interfaces.",{"title":71,"body":72},"Arrancar el contenedor","`cd \u002Fopt\u002Fjellyfin`\n`docker compose up -d`\n`docker compose logs -f`\n\nJellyfin escucha en el puerto 8096. Espera la línea `Startup complete` en los logs antes de continuar.",{"title":74,"body":75},"Configurar nginx como reverse proxy","Instala nginx y certbot: `apt install -y nginx certbot python3-certbot-nginx`\n\nCrea `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fjellyfin` con un solo bloque `server`, en el puerto 80: `listen 80;`, `server_name jellyfin.tu-dominio.com;` y, dentro de `location \u002F {`, `proxy_pass http:\u002F\u002Flocalhost:8096;`, las cabeceras `proxy_set_header Host $host;`, `proxy_set_header X-Real-IP $remote_addr;`, `proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;` y `proxy_set_header X-Forwarded-Proto $scheme;`, y después, para los WebSockets, `proxy_http_version 1.1;`, `proxy_set_header Upgrade $http_upgrade;` y `proxy_set_header Connection \"upgrade\";`. No escribas todavía el bloque 443: sus líneas `ssl_certificate` apuntarían a archivos que no existen antes de pasar certbot, y nginx se negaría a cargar la configuración.\n\nActiva el sitio, compruébalo y obtén el certificado:\n\n`ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fjellyfin \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F`\n`nginx -t && systemctl reload nginx`\n`certbot --nginx -d jellyfin.tu-dominio.com`\n\nEl plugin nginx de certbot obtiene el certificado, lo guarda en `\u002Fetc\u002Fletsencrypt\u002Flive\u002Fjellyfin.tu-dominio.com\u002F` (`fullchain.pem` y `privkey.pem`) y después lo instala: añade él mismo al bloque la escucha en 443 y las líneas `ssl_certificate` y `ssl_certificate_key`, junto con la redirección de HTTP a HTTPS, activa por defecto. Comprueba el resultado con `nginx -t`.\n\nSi prefieres `certbot certonly --nginx -d jellyfin.tu-dominio.com`, que obtiene el certificado sin tocar la configuración, escribe después tú mismo el bloque 443: `listen 443 ssl;`, el mismo `server_name`, `ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fjellyfin.tu-dominio.com\u002Ffullchain.pem;`, `ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fjellyfin.tu-dominio.com\u002Fprivkey.pem;` y la misma `location \u002F`. Sustituye entonces el `location \u002F` del bloque 80 por `return 301 https:\u002F\u002F$host$request_uri;` y ejecuta `nginx -t && systemctl reload nginx`.",{"title":77,"body":78},"Asistente de configuración inicial","Abre `https:\u002F\u002Fjellyfin.tu-dominio.com` en tu navegador. El asistente te guía para:\n\n1. Crear la cuenta de administrador\n2. Añadir tu biblioteca (apunta a `\u002Fmedia\u002Fpeliculas`, `\u002Fmedia\u002Fseries`)\n3. Elegir el idioma y los proveedores de metadatos (TheMovieDB para películas, TheTVDB para series)\n\nLanza un escaneo completo al terminar la configuración: Panel de control > Bibliotecas > Escanear todas las bibliotecas.",{"type":39,"title":80,"body":81},"Plugins no encontrados — revisar el repositorio","Es una de las preguntas más frecuentes tras una subida de versión: el catálogo de plugins aparece vacío, o cada plugin muestra «An error occurred while getting the plugin details from the repository», mientras el resto de la instancia funciona.\n\n**Lo que dice el proyecto original.** La issue de GitHub #16654 («No longer access plugins», notificada en la versión 10.11.8) describe este error aunque las URL de repositorio del autor eran correctas. Un bot la cerró sin corrección («not planned») por inactividad. Un colaborador sugiere que algunos países bloquean `raw.githubusercontent.com`, donde se alojan varios manifiestos de plugins de terceros; un usuario cuenta que resolvió su caso desinstalando los plugins, reiniciando y reinstalándolos. No hay una causa única establecida: la explicación anterior de esta guía, un cambio de URL entre dos versiones, no es lo que dice la issue y se ha retirado.\n\n**Comprobaciones, en orden**:\n\n1. Ve a Panel de control > Plugins > Repositorios. El repositorio oficial estable debe apuntar a `https:\u002F\u002Frepo.jellyfin.org\u002Ffiles\u002Fplugin\u002Fmanifest.json`. Si habías cambiado al repositorio «unstable», vuelve al estable\n2. Desde el VPS, comprueba que el manifiesto responde: `curl -sI https:\u002F\u002Frepo.jellyfin.org\u002Ffiles\u002Fplugin\u002Fmanifest.json`. Para un repositorio de terceros alojado en GitHub, prueba también `curl -sI https:\u002F\u002Fraw.githubusercontent.com`\n3. Pulsa «Guardar» y reinicia Jellyfin para forzar la recarga de los metadatos: `docker compose -f \u002Fopt\u002Fjellyfin\u002Fdocker-compose.yml restart`\n4. Como último recurso, desinstala los plugins afectados, reinicia, reinstálalos y reinicia de nuevo",{"type":39,"title":83,"body":84},"Estrategia de almacenamiento para Jellyfin en un VPS","El almacenamiento suele ser la restricción principal. Órdenes de magnitud que conviene conocer (estimaciones estándar):\n\n- Película 1080p MKV H.264: de 5 a 15 GB según la duración y la tasa de bits\n- Película 4K HDR H.265: de 15 a 60 GB, o más en remasterizaciones Blu-ray\n- Episodio de serie 1080p: de 1 a 4 GB\n\nEjemplo de cálculo: 100 películas 1080p × 8 GB (media) = 800 GB como mínimo. Para una mediateca de 300 películas variadas + 10 series completas, cuenta de 3 a 5 TB.\n\n**Opción 1 — Volumen adicional del VPS (recomendado para empezar)**: la mayoría de los proveedores de VPS ofrecen volúmenes de bloques (Block Storage) que se montan en caliente y se facturan por GB al mes. Móntalo en ext4 sobre `\u002Fmnt\u002Fmedia` y pásalo como bind mount a Docker. Ventaja: E\u002FS directa sobre disco local, sin tránsito de red. Inconveniente: el coste crece de forma lineal con el tamaño.\n\nTras conectar el volumen (aquí `\u002Fdev\u002Fsdb`):\n\n`mkfs.ext4 \u002Fdev\u002Fsdb`\n`mount \u002Fdev\u002Fsdb \u002Fmnt\u002Fmedia`\n`echo '\u002Fdev\u002Fsdb \u002Fmnt\u002Fmedia ext4 defaults 0 2' >> \u002Fetc\u002Ffstab`\n\n**Opción 2 — Hetzner Storage Box (CIFS\u002FSamba)**: solución híbrida — tu VPS sigue siendo ligero, el almacenamiento vive en la Storage Box. Móntala por CIFS:\n\n`apt install -y cifs-utils`\n`install -m 600 \u002Fdev\u002Fnull \u002Froot\u002F.storagebox-credentials` y escribe en él dos líneas: `username=uXXXXXX` y `password=…`\n`mount -t cifs \u002F\u002FuXXXXXX.your-storagebox.de\u002Fbackup \u002Fmnt\u002Fmedia -o seal,credentials=\u002Froot\u002F.storagebox-credentials,uid=1000,gid=1000,iocharset=utf8`\n\nEl archivo de credenciales evita que la contraseña quede en el historial del shell y en la lista de procesos; la opción `seal` cifra la conexión SMB, que no siempre lo está por defecto. Activa antes SMB en la consola de Hetzner, y también la accesibilidad externa si tu VPS no está en Hetzner.\n\nLa latencia de red es aceptable para el streaming con buffer previo (Jellyfin lee por adelantado), pero inadecuada para la transcodificación en directo: el caudal de CIFS no da abasto.\n\n**Opción 3 — NAS local con túnel Tailscale o Cloudflare Tunnel**: si ya tienes un NAS doméstico, puedes exponer tu biblioteca a un VPS remoto mediante un túnel cifrado. Tailscale crea una red privada virtual entre tu NAS y tu VPS en menos de diez minutos. El streaming pasa entonces de tu NAS → VPS → usuario, con una latencia controlada. Reserva esta opción para bibliotecas muy voluminosas ya constituidas.\n\n**Punto de equilibrio**: compara el precio por TB de tu volumen de bloques con el de una Storage Box en las tarifas vigentes de tu proveedor. Por encima de 500 GB, el almacenamiento externo suele salir más barato, siempre que aceptes la latencia de red.",{"type":39,"title":86,"body":87},"Transcodificación por hardware — VAAPI y NVENC","La transcodificación por software sirve para una o dos sesiones simultáneas en un buen VPS. Más allá, o para 4K HDR frecuente, la transcodificación por hardware es indispensable.\n\n**VAAPI (Intel\u002FAMD)**: en un servidor dedicado con GPU Intel integrada o GPU AMD, el dispositivo `\u002Fdev\u002Fdri\u002FrenderD128` expone el codificador. Añade al servicio Docker las líneas `devices:` y `- \u002Fdev\u002Fdri\u002FrenderD128:\u002Fdev\u002Fdri\u002FrenderD128`, y `group_add:` con el identificador del grupo `render` del host (`getent group render | cut -d: -f3`).\n\nActiva después la aceleración por hardware en Panel de control > Reproducción > Transcodificación: elige QSV (Intel Quick Sync, preferible en GPU Intel recientes con Linux) o VA-API (GPU AMD, GPU Intel antiguas).\n\n**NVENC (NVIDIA)**: requiere en el host el controlador NVIDIA y el NVIDIA Container Toolkit (el antiguo paquete `nvidia-docker2` está obsoleto). Añade al servicio un bloque `deploy:` > `resources:` > `reservations:` > `devices:` que contenga `- driver: nvidia`, `count: 1` y `capabilities: [gpu]`.\n\n**Recordatorio**: los VPS cloud estándar no exponen GPU ni dispositivo `\u002Fdev\u002Fdri`. Este modo está reservado a servidores dedicados con tarjeta gráfica o procesador con GPU integrada accesible.",{"type":89,"body":90},"tip","Limita la carga para evitar la saturación: Jellyfin no tiene un límite global de transcodificaciones, pero puedes fijar, para cada usuario, un número máximo de sesiones simultáneas (Panel de control > Usuarios > perfil del usuario) y limitar la tasa de bits de los clientes remotos en los ajustes de reproducción. En un VPS de 4 vCPU, apunta a 2 o 3 transcodificaciones simultáneas como máximo: por encima, los demás usuarios notan una degradación perceptible.",{"type":39,"title":92,"body":93},"Subir a una versión mayor: lo que exige Jellyfin 12","Pasar de la 10.11 a la 12.x no es una actualización de rutina. Las notas de la versión 12.0 (8 de septiembre de 2026) fijan el marco:\n\n**Rutas de subida.** Se puede subir directamente desde la 10.10.7 o desde cualquier 10.11.x, sin paso intermedio. Una versión anterior a la 10.10.7 debe pasar primero por la 10.10.7.\n\n**Copia de seguridad.** Las notas recomiendan «encarecidamente» una copia completa del directorio de datos, porque volver atrás exige una restauración completa. La documentación de copias lo confirma: Jellyfin no tiene mecanismo de degradación.\n\n**Duración.** La migración comprueba las rutas de todos los elementos de la biblioteca, lo que puede tardar según su tamaño, y el primer escaneo de la biblioteca será mucho más largo de lo habitual.\n\n**Efectos secundarios anunciados.** Las versiones alternativas resueltas automáticamente (no fusionadas a mano) se eliminan y vuelven tras un escaneo completo; algunas películas pueden aparecer como recién añadidas; los nombres de usuario que solo difieren en mayúsculas deben corregirse antes de la subida; las rutas heredadas `\u002Femby\u002F*` y `\u002Fmediabrowser\u002F*` desaparecen, lo que puede romper clientes de terceros antiguos; la autorización heredada se desactiva; los ajustes globales de subtítulos se sustituyen por ajustes por biblioteca.\n\nEstos puntos proceden de las notas de la 12.0 y valen para la 12.0; relee las notas de la versión que tengas como objetivo.",{"type":58,"title":95,"steps":96},"Procedimiento duradero para subir de versión sin perder la biblioteca",[97,100,103,106,109,112,115],{"title":98,"body":99},"Leer las notas de versión y comprobar la ruta de subida","Abre la página de la versión objetivo en el repositorio de GitHub de Jellyfin y lee sus «upgrade notes». Identifica tu versión actual (`docker compose images` o el panel de control). Si es anterior a la 10.10.7, pasa primero por la 10.10.7. Retira los plugins de repositorios de terceros antes de la migración, como piden las notas de la 12.0.",{"title":101,"body":102},"Impedir cualquier actualización automática","Una migración interrumpida es la causa documentada del peor caso (consulta la sección siguiente). Desactiva, por tanto, todo lo que pueda reiniciar o reemplazar el servicio sin que lo sepas:\n\n- Docker: fija la etiqueta en `docker-compose.yml` (nunca `latest`) y apaga Watchtower o cualquier tarea que ejecute `docker compose pull`\n- Paquetes Debian\u002FUbuntu: lista los paquetes con `dpkg -l | grep -i jellyfin`, retenlos con `apt-mark hold \u003Cpaquete>` y comprueba con `apt-mark showhold`. Un paquete retenido deja de actualizarse con `apt upgrade` y con `unattended-upgrades`\n- Evita también ejecutar `apt upgrade` en la máquina mientras la migración está en curso, incluso para otros paquetes, hasta que hayas confirmado cómo se comporta tu distribución",{"title":104,"body":105},"Detener Jellyfin y copiar la carpeta de datos","Una copia en caliente de una base de datos abierta puede resultar inutilizable: la documentación indica que, para una copia manual, el servidor debe estar detenido; de lo contrario la base puede quedar bloqueada y ser irrecuperable al restaurar.\n\n`cd \u002Fopt\u002Fjellyfin`\n`docker compose stop`\n`df -h \u002Fopt` y `du -sh \u002Fopt\u002Fjellyfin\u002Fconfig` para comprobar el espacio\n`cp -a \u002Fopt\u002Fjellyfin \u002Fopt\u002Fjellyfin.antes-de-subir`\n\nSi tu configuración vive en un volumen con nombre (es el caso de la plantilla del catálogo de ServOrbit, que monta `jellyfin-data` sobre `\u002Fconfig`), copia el volumen tras comprobar su nombre con `docker volume ls`: `docker run --rm -v jellyfin-data:\u002Fsource:ro -v \u002Froot\u002Fjellyfin-antes:\u002Fcopia alpine cp -a \u002Fsource\u002F. \u002Fcopia\u002F`.\n\nLa copia integrada (Panel de control > Copias de seguridad) es una alternativa, pero no sustituye a una copia de la carpeta cuando el riesgo es la propia migración.",{"title":107,"body":108},"Cambiar la etiqueta y arrancar","Modifica la línea `image:` de `docker-compose.yml` hacia la versión objetivo y después:\n\n`docker compose pull`\n`docker compose up -d`\n\nEl servidor ejecuta las migraciones al arrancar, antes de aceptar conexiones. Mientras duran, la comprobación de salud repite «Server is still starting up.»",{"title":110,"body":111},"Vigilar sin tocar nada","`docker compose logs -f` muestra la migración en curso, numerada (por ejemplo «1 of 21»). En una segunda terminal, `docker stats` muestra la carga. No reinicies el contenedor ni vuelvas a lanzar el comando `up` mientras una migración está en marcha: es el gesto que bloqueó bases de datos en la issue #18066. Ten en cuenta que `restart: unless-stopped` también relanza un contenedor que ha sido terminado (por falta de memoria, por ejemplo) en plena migración: si el registro muestra arranques repetidos, deténlo tú mismo con `docker compose stop` y diagnostica antes de reanudar.",{"title":113,"body":114},"Decidir: esperar o restaurar","Una migración lenta consume CPU o disco; una migración bloqueada está inerte. Los informes de la issue #18066 dan órdenes de magnitud: un núcleo al 100 % durante más de dos horas en una base de más de 3 GB antes de que existiera una corrección, una subida completa de unas dos horas en otro usuario, un éxito tras esperar toda la noche en un tercero; en cambio, 0 % de CPU, ninguna E\u002FS de disco e hilos en reposo en quienes tenían la migración realmente bloqueada. Espera mientras la CPU o el disco trabajen y el contador avance. Si todo está inerte desde hace mucho, o el registro ya no se mueve, restaura.",{"title":116,"body":117},"Restaurar la copia si el proceso está inerte","`docker compose down`\n`mv \u002Fopt\u002Fjellyfin \u002Fopt\u002Fjellyfin.bloqueado`\n`cp -a \u002Fopt\u002Fjellyfin.antes-de-subir \u002Fopt\u002Fjellyfin`\n\nVuelve a poner en `docker-compose.yml` la etiqueta exacta anterior y ejecuta `docker compose up -d`. No intentes degradar la base de datos en su sitio: Jellyfin no tiene mecanismo de degradación. Cuando la subida salga bien, lanza un escaneo completo de las bibliotecas, reinstala los plugins retirados y borra las copias solo tras unos días de uso normal.",{"type":39,"title":119,"body":120},"Una migración que nunca termina: el estado real de la issue #18066","**El síntoma.** La issue jellyfin\u002Fjellyfin #18066, «Migration ChangeOwnerIdToGuid never completes and keeps one CPU core at 100%», se abrió el 15 de septiembre de 2026 tras una subida de la 10.11.11 a la 12.1.0. El autor describe un hilo .NET a cerca del 100 % de un núcleo durante más de dos horas, una base `jellyfin.db` de entre 3,2 y 3,5 GB y unos 311 000 elementos, con casi ninguna escritura en disco y ningún error en el registro.\n\n**Segundo caso: el reinicio por `apt upgrade`.** Otro usuario cuenta que un `apt upgrade` reinició el servicio en plena migración; todos los arranques posteriores quedaron bloqueados en la migración `AddForeignKeyToOwnerId`, con 0 % de CPU, sin E\u002FS ni escrituras. Señala además que un archivo systemd local que limitaba el tiempo de arranque (`TimeoutSec = 15`) mataba las migraciones. Restauró la copia que Jellyfin crea antes de migrar (carpeta `data\u002FSQLiteBackups\u002F`): la 12.2 volvió a ejecutar entonces las migraciones en unos cinco minutos.\n\n**Lo que funcionó y lo que no.** Algunos usuarios lo lograron tras dejar la migración toda la noche, otros tras restaurar una copia anterior a la migración o reinstalar Jellyfin; algunos volvieron a la 10.11.11 mientras tanto. Los bloqueos persisten en la 12.2 en al menos dos de ellos, mientras que al menos cinco comunican una subida correcta.\n\n**La corrección del proyecto.** La pull request #18073, «Fix ChangeOwnerIdToGuid migration performance», se fusionó el 26 de septiembre de 2026 en la rama 12.z (hito v12.2) y se retroportó el 27 de septiembre. Aborda dos lentitudes: una comprobación de colisiones que recorría toda la tabla `UserData` por cada fila provisional, y siete índices construidos sobre una tabla de varios gigabytes que se descartaban enseguida cuando SQLite reconstruye la tabla para añadir la clave foránea.\n\n**Estado a 7 de noviembre de 2026.** La issue sigue abierta (etiqueta `bug`), sin un análisis de causa raíz de un mantenedor en el hilo visible; el último comentario es del 17 de octubre. Existen las versiones 12.0, 12.1, 12.2, 12.3 y 12.4 (la 12.4 del 26 de octubre es la más reciente): apunta a la última 12.x mejor que a la 12.0 o la 12.1, publicadas antes de que se fusionara esta corrección de rendimiento.\n\nLectura prudente: la corrección acorta el tiempo de migración, no garantiza que todas las bases terminen, y nada dispensa de la copia previa. Un caso distinto del hilo, procesos al 100 % tras la conexión de un usuario, lo atribuyó su autor a estadísticas SQLite obsoletas (`sqlite_stat1`) y lo resolvió con `ANALYZE`; su relación con la migración no está confirmada.",{"type":39,"title":122,"body":123},"Resolución de problemas — errores frecuentes","**Biblioteca vacía tras el escaneo**: comprueba que el bind mount de Docker es correcto y que los permisos coinciden. El contenedor se ejecuta con UID 1000; si tus archivos pertenecen a root, Jellyfin no puede leerlos: `chown -R 1000:1000 \u002Fmnt\u002Fmedia`.\n\n**HTTPS roto detrás de nginx**: si la interfaz carga en HTTP aunque hayas configurado HTTPS, comprueba que las cabeceras `X-Forwarded-Proto` y `X-Real-IP` se transmiten en la configuración de nginx. Sin ellas, Jellyfin genera URL en HTTP en sus respuestas.\n\n**Transcodificación lenta o error VAAPI**: confirma que el contenedor accede al dispositivo con `docker exec jellyfin ls \u002Fdev\u002Fdri`. Si la carpeta no existe, el dispositivo no se pasa en `docker-compose.yml` o tu VPS no lo expone.\n\n**Las apps móviles rechazan la conexión**: comprueba que tu certificado TLS es válido y no autofirmado. Los clientes Jellyfin de iOS y Android rechazan los certificados autofirmados sin configuración adicional. Si usas Let's Encrypt, asegúrate de que la renovación automática (`certbot renew`) está activa: `systemctl status certbot.timer`.\n\n**Plugins instalados pero inactivos tras reiniciar**: algunos plugins requieren un reinicio COMPLETO de Jellyfin (no una recarga de configuración) para activarse. Usa `docker compose restart` en lugar de la opción de reinicio de la interfaz si el problema persiste.\n\n**«Server is still starting up.» en bucle tras una subida de versión**: hay una migración de base de datos en curso o bloqueada. No reinicies. Mira el contador de migración en `docker compose logs`, la carga con `docker stats` y aplica la decisión esperar o restaurar descrita más arriba.\n\n**Un cliente antiguo ya no se conecta tras la 12.0**: se retiraron las rutas `\u002Femby\u002F*` y `\u002Fmediabrowser\u002F*`. Actualiza el cliente o cámbialo por otro.",{"type":39,"title":125,"body":126},"Desplegar Jellyfin desde el Marketplace de ServOrbit","Si prefieres una instalación preconfigurada en lugar de gestionar Docker a mano, Jellyfin está disponible en el Marketplace de ServOrbit. La instalación crea automáticamente el contenedor y, en cuanto vinculas un dominio a la aplicación desde el área de cliente, instala el vhost nginx y el certificado TLS. Obtienes un Jellyfin listo para usar, con el asistente de configuración en el primer acceso; el almacenamiento de los medios (volumen adicional, Storage Box) sigue siendo cosa tuya, como se describe más arriba.\n\nEl VPS sigue bajo tu control total: puedes conectarte por SSH, modificar `docker-compose.yml`, añadir volúmenes o migrar a otra infraestructura en cualquier momento.\n\nOjo a una particularidad de la plantilla: a 7 de noviembre de 2026 hace referencia a la imagen `jellyfin\u002Fjellyfin:latest` y monta el volumen `jellyfin-data` sobre `\u002Fconfig`. Tras el despliegue, fija tú mismo la etiqueta de la imagen en la versión que hayas elegido y sigue después el procedimiento de subida de versión de arriba antes de cualquier cambio. Esta guía se ofrece sin soporte para tu instalación.","Tu Jellyfin en producción en 5 minutos","Despliega Jellyfin desde el Marketplace de ServOrbit: instalación automatizada, HTTPS incluido, almacenamiento configurable, VPS bajo tu control total.","Desplegar Jellyfin en VPS","\u002Fapplications\u002Fcolaboracion-productividad\u002Fjellyfin",[132,153,171],{"id":133,"slug":134,"slugs":135,"title":139,"excerpt":140,"readTime":141,"views":142,"isPinned":19,"noindex":19,"publishedAt":143,"updatedAt":144,"category":145,"categories":150,"featuredImage":30,"bgImage":31,"posterImage":152,"relatedSolution":30},98,"jellyfin-vs-plex-que-servidor-multimedia-autoalojado",{"fr":136,"en":137,"ar":138,"es":134},"jellyfin-vs-plex","jellyfin-vs-plex-which-self-hosted-media-server","jellyfin-مقابل-plex-أي-خادم-وسائط-مستضاف-ذاتيا","Jellyfin vs Plex: ¿qué servidor multimedia autoalojado?","Jellyfin vs Plex: comparativa completa para elegir su servidor multimedia autoalojado en un VPS — despliegue Docker, solución de errores y migración a Jellyfin 12.",9,1,"2026-03-14T00:00:00+00:00","2026-11-08T01:13:15+00:00",{"id":146,"name":147,"slug":148,"color":149,"icon":148},5,"Comparativas","comparatif","bg-info\u002F10 text-info",[151],{"id":146,"name":147,"slug":148,"color":149,"icon":148},"\u002Fblog\u002Fcovers\u002Fjellyfin-vs-plex-poster.svg",{"id":154,"slug":155,"slugs":156,"title":160,"excerpt":161,"readTime":162,"views":163,"isPinned":19,"noindex":19,"publishedAt":164,"updatedAt":165,"category":166,"categories":167,"featuredImage":30,"bgImage":31,"posterImage":169,"relatedSolution":170},292,"migrar-de-plex-a-jellyfin-2026",{"fr":157,"en":158,"ar":159,"es":155},"migrer-plex-vers-jellyfin-2026","migrating-from-plex-to-jellyfin-after-the-july-2026-paywall","الهجرة-من-plex-إلى-jellyfin-بعد-paywall-يوليو-2026","Migrar de Plex a Jellyfin tras el paywall de julio de 2026","Plex cobra ahora el streaming remoto y corrigió dos fallos en 2026. Pase a Jellyfin (vídeo) y Navidrome (música) en su propio VPS.",16,4,"2026-08-22T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[168],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fmigrer-plex-vers-jellyfin-2026-poster.svg",{"categorySlug":34,"appSlug":35},{"id":172,"slug":173,"slugs":174,"title":178,"excerpt":179,"readTime":141,"views":163,"isPinned":19,"noindex":19,"publishedAt":180,"updatedAt":181,"category":182,"categories":183,"featuredImage":30,"bgImage":31,"posterImage":185,"relatedSolution":186},232,"alojar-matrix-synapse-y-element-en-un-vps",{"fr":175,"en":176,"ar":177,"es":173},"heberger-matrix-synapse","host-matrix-synapse-and-element-on-your-own-vps","استضافة-matrix-synapse-وelement-على-خادم-vps-الخاص-بك","Alojar Matrix Synapse y Element en tu propio VPS","Instala Matrix Synapse y Element Web self-hosted en un VPS: Docker, PostgreSQL, reverse proxy, bridges y purga de historial. Guía completa 2026.","2026-01-19T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[184],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-matrix-synapse-poster.svg",{"categorySlug":25,"appSlug":187},"matrix-synapse",true,1794270532642]