Nomploy Nomad Packs

← All packs

plex v0.1.0

Media

Plex Media Server — organize and stream your movies, TV, music and photos to Plex apps on every device, with transcoding and live TV/DVR. Deployed as a single host-networked Nomad service.

nomad-pack run plex --registry nomploy
…or one line (add registry + run)
curl -fsSL https://packs.nomploy.com/install.sh | sh -s -- plex

Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.

1 task http 32400 3 volumes image plexinc/pms-docker:latest tracks :latest image bumped today
Variables 14
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run plex -f values.hcl --registry nomploy
# The name of the Nomad job.
job_name = "plex"

# The Nomad namespace to deploy into.
namespace = "default"

# The datacenters to deploy to.
datacenters = ["*"]

# The Plex container image. Pin a tag in production.
image = "plexinc/pms-docker:latest"

# Host port for the Plex web UI.
port = 32400

# Named volume mounted at /config (Plex database and settings).
data_volume = "plex_data"

# Named volume mounted at /data — your media library.
media_volume = "plex_media"

# Named volume mounted at /transcode — temporary transcoder scratch.
transcode_volume = "plex_transcode"

# Optional Plex claim token (PLEX_CLAIM) to link the server to your account on first run — get one at https://plex.tv/claim (valid ~4 min). Leave empty to claim later via the web setup.
claim_token = ""

# User ID that owns the files (PUID).
puid = 1000

# Group ID that owns the files (PGID).
pgid = 1000

# Container timezone (TZ), e.g. Europe/Bratislava.
tz = "UTC"

# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# The task resources.
resources = {
    cpu    = 300
    memory = 256
  }
NameTypeDefaultDescription
job_name string
"plex"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"plexinc/pms-docker:latest"
The Plex container image. Pin a tag in production.
port number
32400
Host port for the Plex web UI.
data_volume string
"plex_data"
Named volume mounted at /config (Plex database and settings).
media_volume string
"plex_media"
Named volume mounted at /data — your media library.
transcode_volume string
"plex_transcode"
Named volume mounted at /transcode — temporary transcoder scratch.
claim_token key string
""
Optional Plex claim token (PLEX_CLAIM) to link the server to your account on first run — get one at https://plex.tv/claim (valid ~4 min). Leave empty to claim later via the web setup.
puid number
1000
User ID that owns the files (PUID).
pgid number
1000
Group ID that owns the files (PGID).
tz string
"UTC"
Container timezone (TZ), e.g. Europe/Bratislava.
constraints list
[]
Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 300
    memory = 256
  }
The task resources.
Back up this pack

This pack stores data in 3 Docker named volumes: plex_dataplex_mediaplex_transcode

restic

# Run on the node hosting this pack. Point restic at your repo first:
#   export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>"
#   export RESTIC_PASSWORD="<repo-password>"
#   export AWS_ACCESS_KEY_ID=<key>  AWS_SECRET_ACCESS_KEY=<secret>
restic backup \
  /var/lib/docker/volumes/plex_data/_data \
  /var/lib/docker/volumes/plex_media/_data \
  /var/lib/docker/volumes/plex_transcode/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/plex_data/_data backup:<bucket>/plex_data
rclone sync /var/lib/docker/volumes/plex_media/_data backup:<bucket>/plex_media
rclone sync /var/lib/docker/volumes/plex_transcode/_data backup:<bucket>/plex_transcode

Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.

Readme

plex

Plex Media Server — organize and stream your movies, TV, music and photos to Plex apps on every device, with transcoding, live TV/DVR and rich metadata. This pack runs on the host network (recommended by Plex for discovery and DLNA).

Single host-networked Nomad service with config, media and transcode volumes.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run plex --registry=nomploy

Configure

Variable Default Description
port 32400 Web UI / API port.
claim_token "" Optional PLEX_CLAIM to link the server to your account on first run — get one at plex.tv/claim (valid ~4 min).
image plexinc/pms-docker:latest Container image. Pin a tag in production.
data_volume plex_data /config — Plex database and settings.
media_volume plex_media /data — your media library.
transcode_volume plex_transcode /transcode — transcoder scratch.
puid / pgid 1000 / 1000 User/group that owns the files (PUID/PGID).
tz UTC Container timezone (TZ).
resources { cpu = 300, memory = 256 } Task resources. Bump for transcoding.

Set claim_token for a smooth first-run link to your Plex account (or claim later via the setup wizard at http://<host>:32400/web). Plex uses host networking for client discovery. For hardware transcoding, pass through the GPU/render device. Pin the job to the node holding the volumes with constraints. See also jellyfin and emby.