Ejecuta Plex Media Server con PostgreSQL en lugar de SQLite.
Una librería shim pequeña que captura las llamadas SQLite de Plex y las envía a PostgreSQL. No necesitas modificar Plex.
| Plataforma | Estado |
|---|---|
| macOS | ✅ Probado en producción |
| Linux (Docker) | ✅ Funciona (init y ejecución probados, no probado en producción) |
| Linux (Nativo) |
Shim 100% Rust — todo el código runtime C ha sido eliminado. El shim se compila enteramente desde Rust a una sola librería dinámica. El modelo de propiedad y el borrow checker de Rust previenen fugas de memoria, desbordamientos de buffer y errores use-after-free por diseño.
- 🆕 Runtime completo en Rust: toda la interposición, acceso a columnas, ejecución de consultas y gestión de conexiones en Rust
- 🆕 Arquitectura modular: archivos monolíticos divididos en submódulos enfocados para mejor mantenibilidad
- 🔧 Correcciones de deadlock: mutex de conexión recursivo, tiempos de bloqueo reducidos, logging lock-free como fallback
- 🔧 Seguridad de pila: buffers thread-local asignados en heap para los hilos de 544K de Plex
- ✅ 713 tests pasando en suites unitarias, de integración y compatibilidad
Descarga: https://github.com/cgnl/plex-postgresql/releases/tag/v1.2.0
SQLite funciona bien en muchos casos, pero tiene una limitación importante: bloqueo de base de datos.
- Menos bloqueos - con PostgreSQL, escaneos y reproducción conviven mejor.
- Mejor para almacenamiento remoto - útil con rclone y servicios en la nube.
- Mejor en bibliotecas grandes - maneja catálogos grandes con más estabilidad.
- Herramientas conocidas -
pg_dumpy clientes PostgreSQL para backup y revisión.
La forma más simple de ejecutar Plex con PostgreSQL:
git clone https://github.com/cgnl/plex-postgresql.git
cd plex-postgresql
# Iniciar Plex + PostgreSQL
docker compose up -d
# Ver logs
docker compose logs -f plexPlex estará disponible en http://localhost:8080
PostgreSQL se configura automáticamente y crea el esquema inicial.
Si ya tienes Plex local usando 32400, ejecuta Docker con otro puerto:
PLEX_HOST_PORT=32410 PLEX_DLNA_PORT=32471 docker compose up -dLuego abre http://localhost:32410/web
El montaje de medios de prueba por defecto es ./fixtures/media:/media:ro.
Edita docker-compose.yml para personalizar:
environment:
- PLEX_PG_HOST=postgres
- PLEX_PG_PORT=5432
- PLEX_PG_DATABASE=plex
- PLEX_PG_USER=plex
- PLEX_PG_PASSWORD=plex
- PLEX_PG_SCHEMA=plex
- PLEX_PG_POOL_SIZE=50Monta tus medios:
volumes:
- /ruta/a/medios:/media:roEl instalador copia la librería shim dentro de Plex Media Server.app, parchea los binarios y configura el wrapper. Todo queda dentro del app bundle de Plex.
brew install postgresql@15
brew services start postgresql@15
createuser plex
createdb -O plex plex
psql -d plex -c "ALTER USER plex PASSWORD 'plex';"curl -L https://github.com/cgnl/plex-postgresql/releases/download/v1.0.0/plex-postgresql-v1.0.0-macos.zip -o /tmp/plex-pg-macos.zip
mkdir -p /tmp/plex-pg-macos && cd /tmp/plex-pg-macos
unzip /tmp/plex-pg-macos.zip
pkill -f "Plex Media Server" 2>/dev/null || true
./scripts/install_wrappers.shgit clone https://github.com/cgnl/plex-postgresql.git
cd plex-postgresql
make clean && make
pkill -f "Plex Media Server" 2>/dev/null || true
./scripts/install_wrappers.shopen "/Applications/Plex Media Server.app"El shim se inyecta automáticamente. Ver logs: tail -f /tmp/plex_redirect_pg.log
Después de una actualización de Plex, ejecuta install_wrappers.sh de nuevo.
pkill -f "Plex Media Server" 2>/dev/null || true
./scripts/uninstall_wrappers.shsudo apt install postgresql-15
sudo -u postgres createuser plex
sudo -u postgres createdb -O plex plex
sudo -u postgres psql -c "ALTER USER plex PASSWORD 'plex';"
psql -U plex -d plex -c "CREATE SCHEMA plex;"curl -L https://github.com/cgnl/plex-postgresql/releases/download/v1.0.0/plex-postgresql-v1.0.0-linux.zip -o /tmp/plex-pg-linux.zip
mkdir -p /tmp/plex-pg && cd /tmp/plex-pg
unzip /tmp/plex-pg-linux.zip
# Instalar shim y wrappers
sudo mkdir -p /usr/local/lib/plex-postgresql
if [ "$(uname -m)" = "x86_64" ]; then
sudo install -m 755 db_interpose_pg-linux-x86_64.so /usr/local/lib/plex-postgresql/db_interpose_pg.so
else
sudo install -m 755 db_interpose_pg-linux-aarch64.so /usr/local/lib/plex-postgresql/db_interpose_pg.so
fi
sudo ./scripts/install_wrappers_linux.shsudo apt install build-essential libsqlite3-dev libpq-dev
git clone https://github.com/cgnl/plex-postgresql.git
cd plex-postgresql
make linux
sudo make install
sudo systemctl stop plexmediaserver
sudo ./scripts/install_wrappers_linux.sh# Añadir a /etc/default/plexmediaserver:
# PLEX_PG_HOST=localhost
# PLEX_PG_DATABASE=plex
# PLEX_PG_USER=plex
# PLEX_PG_PASSWORD=plex
sudo systemctl start plexmediaserversudo systemctl stop plexmediaserver
sudo ./scripts/uninstall_wrappers_linux.sh| Variable | Predeterminado | Descripción |
|---|---|---|
PLEX_PG_HOST |
localhost | Host de PostgreSQL |
PLEX_PG_PORT |
5432 | Puerto de PostgreSQL |
PLEX_PG_DATABASE |
plex | Nombre de la base de datos |
PLEX_PG_USER |
plex | Usuario de la base de datos |
PLEX_PG_PASSWORD |
(vacío) | Contraseña de la base de datos |
PLEX_PG_SCHEMA |
plex | Nombre del esquema |
PLEX_PG_POOL_SIZE |
50 | Tamaño inicial del pool de conexiones (crece automáticamente hasta 200) |
PLEX_PG_IDLE_TIMEOUT |
300 | Segundos antes de cerrar conexiones inactivas |
PLEX_PG_LOG_LEVEL |
1 | 0=ERROR, 1=INFO, 2=DEBUG |
macOS: Plex → SQLite API → DYLD_INTERPOSE shim → Traductor SQL → PostgreSQL
Linux: Plex → SQLite API → LD_PRELOAD shim → Traductor SQL → PostgreSQL
Docker: Plex → SQLite API → LD_PRELOAD shim → Traductor SQL → PostgreSQL (contenedor)El shim captura llamadas sqlite3_*, traduce SQL de SQLite a PostgreSQL y lo ejecuta con libpq.
Capa 4+3: Interposer C (~9.400 líneas) — fishhook, DYLD_INTERPOSE, LD_PRELOAD
Capa 2: Módulos PG Rust (C/Rust híbrido) — pool, statement, cache, config, logging
Capa 1: Traductor SQL Rust (sqlparser-rs) — traducción AST completa SQLite → PostgreSQL- Pool de conexiones - Reutiliza conexiones PostgreSQL
- Traducción SQL - Convierte sintaxis SQLite → PostgreSQL
- Prepared statements - Usa caché de consultas para mejor rendimiento
- Inicialización del esquema - Crea el esquema PostgreSQL en el primer arranque
# Verificar PostgreSQL
pg_isready -h localhost -U plex
# Ver logs (macOS)
tail -50 /tmp/plex_redirect_pg.log
# Ver logs (Docker)
docker compose logs -f plex
# Analizar fallbacks
./scripts/analyze_fallbacks.shPlex no inicia: verifica que PostgreSQL esté activo y accesible.
Errores de base de datos: Asegúrate de que el esquema existe: psql -U plex -d plex -c "CREATE SCHEMA IF NOT EXISTS plex;"
Conflicto de puerto Docker: Cambia el puerto en docker-compose.yml si 8080 está en uso.
MIT - Ver LICENSE
Proyecto no oficial, no afiliado con Plex Inc. Usar bajo tu propio riesgo.