Instalación rápida con Docker
Esta guía levanta PlexSub en una instalación limpia con Docker Compose.
Usa esta ruta si administras el servidor por consola. Si usas Portainer o Unraid, empieza por sus guías específicas.
Requisitos
- Docker y Docker Compose.
- Una carpeta dedicada para PlexSub.
- Un puerto libre para la app; por defecto se usa el puerto
5000. - Claves seguras para base de datos, cifrado de settings y sesiones.
- Un dominio o reverse proxy si vas a publicarlo con HTTPS.
1. Crear carpeta
En Windows:
New-Item -ItemType Directory -Force C:\PlexSub
Set-Location C:\PlexSub
En Linux:
mkdir -p ~/plexsub
cd ~/plexsub
2. Generar claves
Necesitas tres valores largos y distintos:
- Password de PostgreSQL.
- Clave de cifrado de settings.
- Secreto de sesiones.
Con OpenSSL:
openssl rand -base64 48
openssl rand -base64 48
openssl rand -base64 48
Guárdalos en un gestor seguro. Si pierdes APP_SETTINGS_ENCRYPTION_KEY, PlexSub no podrá descifrar secretos de servicios ya guardados.
3. Crear .env
Ejemplo mínimo alineado con la plantilla actual:
COMPOSE_PROJECT_NAME=plexsub
PORT=5000
APP_IMAGE_REF=ghcr.io/pvpiimoore/plexsub:latest
PLEXSUB_POSTGRES_IMAGE_REF=postgres:18.4-alpine
POSTGRES_DB=plexsub
POSTGRES_USER=plexsub
POSTGRES_PASSWORD=pega_aqui_una_clave_larga
DB_CONNECT_RETRIES=15
DB_CONNECT_RETRY_DELAY_MS=4000
APP_SETTINGS_ENCRYPTION_KEY=pega_aqui_otra_clave_larga
SESSION_SIGNING_SECRET=pega_aqui_otra_clave_larga_distinta
PLEXSUB_SETUP_TOKEN=pega_aqui_un_token_temporal_si_lo_quieres_usar
APP_BASE_URL=http://localhost:5000
APP_TIMEZONE=Europe/Madrid
TRUST_PROXY_LEVEL=0
FORCE_SECURE_COOKIES=0
PLEXSUB_ALLOW_PRIVATE_TARGETS=0
Si usas dominio público con HTTPS:
APP_BASE_URL=https://plexsub.tudominio.com
TRUST_PROXY_LEVEL=1
FORCE_SECURE_COOKIES=1
Usa TRUST_PROXY_LEVEL=1 solo si PlexSub está detrás de un proxy inverso o túnel de confianza. PostgreSQL no debe publicarse en Internet.
4. Crear docker-compose.yml
Puedes copiar docker-compose.example.yml del proyecto y ajustar el .env. La estructura actual usa:
- Servicio
dbcon PostgreSQL. - Servicio
appcon PlexSub. - Volumen
plexsub_postgres_datapara base de datos. - Volúmenes
plexsub_backups_data,plexsub_backup_fallback_datayplexsub_uploads_data. - App con filesystem de solo lectura,
tmpfsy capacidades reducidas.
Ejemplo simplificado:
services:
db:
image: ${PLEXSUB_POSTGRES_IMAGE_REF:-postgres:18.4-alpine}
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- plexsub_postgres_data:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
app:
image: ${APP_IMAGE_REF:-ghcr.io/pvpiimoore/plexsub:latest}
restart: unless-stopped
depends_on:
db:
condition: service_healthy
env_file:
- .env
environment:
NODE_ENV: production
PORT: ${PORT:-5000}
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
ports:
- "${PORT:-5000}:5000"
volumes:
- plexsub_backups_data:/app/backups
- plexsub_backup_fallback_data:/app/backup-fallback
- plexsub_uploads_data:/app/uploads
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
- /var/tmp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
volumes:
plexsub_postgres_data:
plexsub_backups_data:
plexsub_backup_fallback_data:
plexsub_uploads_data:
5. Arrancar
docker compose pull
docker compose up -d
docker compose ps
Abre:
http://localhost:5000/adminportal
Si es una instalación limpia, PlexSub mostrará el asistente de configuración inicial. Crea ahí el primer usuario Owner.
6. Validar
docker compose logs app --tail 120
docker compose logs db --tail 80
Comprueba:
dbaparece como healthy.appestá en ejecución.- La app no entra en reinicios.
/adminportalabre correctamente.- Puedes completar la configuración inicial y entrar con el Owner creado desde el asistente.
7. Actualizar
docker compose pull app
docker compose up -d --force-recreate app
docker compose logs app --tail 120
8. Apagar
docker compose down
No uses docker compose down -v salvo que quieras borrar base de datos, backups y uploads.
PostgreSQL 18.4 Alpine
Las instalaciones limpias usan postgres:18.4-alpine.
No uses postgres:latest. Si vienes de una instalación con otro major de PostgreSQL, no cambies la imagen sobre el mismo volumen. Haz backup, volumen nuevo, restore y validación.