Saltar al contenido principal

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 db con PostgreSQL.
  • Servicio app con PlexSub.
  • Volumen plexsub_postgres_data para base de datos.
  • Volúmenes plexsub_backups_data, plexsub_backup_fallback_data y plexsub_uploads_data.
  • App con filesystem de solo lectura, tmpfs y 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:

  • db aparece como healthy.
  • app está en ejecución.
  • La app no entra en reinicios.
  • /adminportal abre 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.