Plex is the media server that turns your TrueNAS box into a personal Netflix — it indexes your movies, TV shows, and music, generates artwork and metadata, and streams to every device in your house and beyond.
What it is
| Platform | TrueNAS Scale (Docker custom app) |
| Ports | 32400 (web UI), 1900 (DLNA), 8324 (companion) |
| Image | lscr.io/linuxserver/plex:latest |
| Config path | /mnt/apps/plex/config → /config |
| Media path | /mnt/media → /media |
| License | Plex Pass (optional, for hardware transcoding) |
Plex scans your media library, downloads metadata (posters, cast info, plot summaries), and serves it to clients via its own protocol. It handles transcoding for devices that cannot play the original format — your 4K HEVC file gets transcoded to 1080p H.264 for your phone on a slow connection.
The LinuxServer.io image runs Plex as a headless server with automatic updates, clean volume mounts, and hardware transcoding support via NVIDIA GPUs or Intel Quick Sync.
The hard part: library paths and metadata storage
The install is five minutes. The hard part is getting the library paths right so Plex sees the same files that Radarr and Sonarr organize, without double-scanning or missing metadata.
- Correct mount structure
- Plex library paths
- /media/movies, /media/tv, /media/music
- Wrong mount structure
The mistake everyone makes: mounting media paths differently in each container. If Radarr writes to /movies but Plex watches /media/movies, Plex never sees new files. Every container must mount the same base path and use consistent subpaths.
- Consistent mount pattern
- Base
- /mnt/media → /media (same in every container)
- Plex
- watches /media/movies, /media/tv
- Radarr
- writes to /media/movies
- Sonarr
- writes to /media/tv
How to install it
Docker Compose (TrueNAS Scale custom app)
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- VERSION=docker
- PLEX_CLAIM= # Optional: claim token from https://plex.tv/claim
network_mode: host
volumes:
- /mnt/apps/plex/config:/config
- /mnt/media:/media
Note: network_mode: host is required for DLNA discovery and Plex's companion app protocol. If you use bridge networking, devices on your LAN cannot discover Plex automatically.
After deploy:
# Claim token (optional, links server to your Plex account):
# Visit https://plex.tv/claim, copy the token, add to PLEX_CLAIM env var
# Check server status:
docker logs plex 2>&1 | grep "Started"
Log in at http://<nas-ip>:32400/web and sign in with your Plex account.
Initial configuration
- Add Library
- Click Add Library → select type (Movies, TV Shows, Music)
- Click Browse for Media Folder → navigate to
/media/movies(or/media/tv) -
Click Add
-
Scan Library
- Plex scans your library and downloads metadata
- First scan of a large library takes 10–30 minutes
-
Subsequent scans are incremental
-
Settings → Transcoder
- Enable hardware transcoding if you have an NVIDIA GPU or Intel Quick Sync
-
Set transcoding quality to "Automatic" for most setups
-
Settings → Library
- Enable Scan my library automatically
- Set Periodic partial scans to every 15 minutes
- This picks up new files added by Radarr/Sonarr
Configuration that matters
Library paths
| Library | Container path | Host path |
|---|---|---|
| Movies | /media/movies |
/mnt/media/movies |
| TV Shows | /media/tv |
/mnt/media/tv |
| Music | /media/music |
/mnt/media/music |
Transcoding
| Setting | Recommended value | Why |
|---|---|---|
| Hardware transcoding | Enable if GPU available | Offloads CPU-intensive transcoding |
| Transcoder quality | Automatic | Balances quality and performance |
| Maximum simultaneous transcodes | 2–4 (depends on GPU) | Prevents GPU overload |
| H.264 profile | Auto | Lets Plex choose the best profile |
Remote access
| Setting | Value |
|---|---|
| Port | 32400 (forward on your router) |
| Manual public port | 32400 |
| Secure connections | Required |
| Custom URL | https://plex.your-domain.com:32400 |
If remote access fails, check that port 32400 is forwarded on your router to the NAS IP. Plex uses UPnP for automatic port mapping, but manual forwarding is more reliable.
Metadata
| Setting | Recommended value | Why |
|---|---|---|
| Metadata agents | The Movie Database (TMDB) | Best free metadata source |
| Prefer local metadata | Off | Online metadata is more complete |
| Refresh interval | 24 hours | Keeps metadata current without hammering APIs |
| Image quality | High | Better artwork on clients |
What I'd tell anyone building this
-
The media path must be identical across all containers. If Plex watches
/media/moviesand Radarr writes to/movies, Plex will not see new files. Mount the same base path (/mnt/media → /media) in every container. -
Use
network_mode: hoston TrueNAS Scale. Bridge networking breaks DLNA discovery, Plex companion protocol, and automatic client detection. Host mode is the simplest way to avoid connection issues. -
Hardware transcoding is worth the setup. A single 4K HEVC transcode uses 80–100% of a modern CPU. With an NVIDIA GPU or Intel Quick Sync, the same transcode uses 10–20% of the GPU. Enable it in Settings → Transcoder if your hardware supports it.
-
Don't forget the Plex claim token. Without it, your server is not linked to your Plex account and you cannot access it remotely. Get it from
https://plex.tv/claimwithin 4 minutes of starting the container. -
The first library scan is slow. A library with 500+ movies takes 15–30 minutes to scan and download metadata. Do not interrupt it — the scan resumes on restart, but the metadata cache is lost.
Get it
Links:
Quick install (Docker Compose):
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- VERSION=docker
- PLEX_CLAIM= # paste claim token from https://plex.tv/claim
network_mode: host
volumes:
- /mnt/apps/plex/config:/config
- /mnt/media:/media
Log in at http://<nas-ip>:32400/web, add your libraries, and start streaming.