
Plex Unlocker
Parchea Plex Media Server que se ejecuta en Docker — tanto la imagen oficial plexinc/pms-docker como la imagen de la comunidad lscr.io/linuxserver/plex — usando el mismo mecanismo de LD_PRELOAD sobre la ejecución de PMS que la instalación nativa con systemd. Consulta el README de nivel superior y la guía completa docs/DOCKER.md para conocer el porqué y la solución de problemas.
Desde la raíz del proyecto:
# Official image (plexinc/pms-docker)
docker build -f docker/Dockerfile.plexinc -t plex-crack:plexinc .
# Community image (lscr.io/linuxserver/plex)
docker build -f docker/Dockerfile.linuxserver -t plex-crack:lsio .
La primera compilación descarga zig 0.13.0 y la imagen base de Plex elegida. Las compilaciones posteriores reutilizan las capas en caché hasta que cambien src/, third_party/ o build.sh. Fija la imagen base con --build-arg PLEX_BASE_IMAGE=... si necesitas reproducibilidad entre actualizaciones de PMS.
# plexinc (no PUID/PGID; the image runs PMS as the upstream 'plex' user)
docker run -d --name plex --network=host \
-v /srv/plex/config:/config \
-v /srv/plex/data:/data \
plex-crack:plexinc
# linuxserver (honor PUID/PGID so /config and /data chown correctly on first start)
docker run -d --name plex --network=host \
-e PUID=$(id -u) -e PGID=$(id -g) \
-e TZ=America/Los_Angeles \
-v /srv/plex/config:/config \
-v /srv/plex/data:/data \
plex-crack:lsio
Luego:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:32400/identity # -> 200
Si ya tienes un contenedor de Plex en ejecución y no quieres reconstruir la imagen ni recrear el contenedor, plex-docker-patch.sh aplica el mismo parche a un contenedor en ejecución — no se necesita docker build, la imagen original no se toca y se conservan el contenedor original y sus volúmenes. Reversible mediante uninstall (se guarda una copia .orig del archivo run de s6).
# Default container name: "plex"
./docker/plex-docker-patch.sh install
# Custom container name
./docker/plex-docker-patch.sh install my-plex
# Revert (restores the s6 run file from its .orig)
./docker/plex-docker-patch.sh uninstall my-plex
# Status
./docker/plex-docker-patch.sh status my-plex
El script detecta automáticamente la imagen base (plexinc vs LSIO) leyendo el contenido del archivo run de s6 dentro del contenedor, por lo que se usan el mismo .so y wrapper.sh en ambos casos. Zig debe estar disponible en el host (el script invoca build.sh); se reutiliza un build/plexmediaserver_crack.so preexistente.
docker build anterior) — ideal para despliegues repetidos, múltiples hosts, CI/CD e imágenes inmutables. Fijas una imagen parcheada y la distribuyes.plex-docker-patch.sh — ideal para parchear una sola vez un contenedor en ejecución que no quieres tocar. Modifica el sistema de archivos del contenedor en ejecución; totalmente reversible mediante uninstall.Para docker-compose, deriva de firma, verificación con scripts/readbitset.py, desinstalación y solución de problemas, consulta ../docs/DOCKER.md.
Para diagnósticos más profundos (salida 127 de PMS, ABI glibc vs musl, propiedad de /config en LSIO, deriva de firma en actualizaciones de PMS), consulta ../docs/DOCKER.md.
| Archivo | Propósito |
|---|
Dockerfile.plexinc | Compilación en varias etapas → plexinc/pms-docker parcheado |
Dockerfile.linuxserver | Compilación en varias etapas → lscr.io/linuxserver/plex parcheado |
wrapper.sh | Lanzador dentro del contenedor (env → LD_PRELOAD al final → exec PMS) |
plex-docker-patch.sh | Parcheador in situ para un contenedor en ejecución (install / uninstall / status) |
| Síntoma | Causa probable | Primera comprobación |
|---|
install dice ERROR: docker not on PATH | CLI de docker no instalada o usuario no está en el grupo docker | docker version (debe ejecutarse como tu usuario) |
install dice could not find s6 svc-plex run file | la imagen upstream cambió su estructura de s6 | docker exec <name> ls -la /etc/s6-overlay/s6-rc.d/svc-plex/ /etc/services.d/plex/ — abre un issue con la salida |
install tiene éxito pero .so is NOT in /proc/$PID/maps | PMS salió con 127 (fallo del cargador) | docker logs <name> | tail -50 — normalmente se ha colado un .so de glibc (recompila con build.sh) |
status muestra PATCH IS NOT ACTIVE después de install | el archivo run no se reescribió (p. ej., capa de solo lectura) o el contenedor no se reinició | docker exec <name> cat /etc/s6-overlay/s6-rc.d/svc-plex/run — debería imprimir exec .../plex-crack-wrapper.sh |
uninstall dice no run.orig found | .orig se eliminó, o el archivo run nunca se respaldó (p. ej., ejecutaste una versión anterior del script) | restaura manualmente: docker cp <upstream-image>:/etc/s6-overlay/s6-rc.d/svc-plex/run <name>:/etc/s6-overlay/s6-rc.d/svc-plex/run |