Plex has run as a container on the Docker host since the 2026-09-16 migration. The old Debian 11 VM (10.100.0.24) is now retired per plex-docker-migration.md section 9, steps 1, 2 and 4-7: - removed from the Veeam "Backup VMs" job - guest shut down gracefully, pre-migration snapshot removed and consolidated back to Plex.vmdk - Guacamole "Plex SSH" connection deleted - .24 / 10.50.0.31 DHCP leases released on the UDM The VMDKs are deliberately kept until ~2026-10-15 so the VM remains a one-command rollback; step 3 stays open until then. Before powering the VM off, every integration was re-verified as pointing at 10.100.0.35: Sonarr, Radarr, Tautulli, seerr, Uptime Kuma, Homepage, Traefik and the UDM PLEX port-forward. Section 9 gains a decommission log recording two behaviours that cost time to work out: Veeam turns a removed job include into an explicit Exclude tombstone rather than deleting it, and a plain sqlite3 integrity_check on a Plex library DB fails with "unknown tokenizer: collating" because the stock binary lacks Plex's FTS collation - that is not corruption. ESXi port-group counts corrected (LAN_100 7->6, DATA_50 4->3), verified by counting NICs on powered-on VMs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
3.8 KiB
Plex Media Server
Migrated to Docker 2026-09-16; old VM decommissioned 2026-09-17. Plex ran on a dedicated Debian 11 VM at 10.100.0.24 until that OS reached LTS EOL (2026-08-31). It now runs as a container on the Docker host.
The old VM is powered off with its disks intact (
[NVME_1] Plex/Plex.vmdk, 128 GB) and is scheduled for deletion ~2026-10-15. Until then, rollback is: power the VM on,sudo systemctl enable --now plexmediaserver, and repoint the UDMPLEXport-forward to 10.100.0.24. Its.24/10.50.0.31leases have been released and it is no longer in the VeeamBackup VMsjob. A verified copy of the pre-migration library DB is at/mnt/share/backups/plex-migration-2026-09-16/. Full procedure: plex-docker-migration.md.
Access
- Host: DOCKER (10.100.0.35), container
plex - Web UI (LAN): http://10.100.0.35:32400/web
- Remote access: WAN TCP 32400 port-forwarded on UDM Pro → 10.100.0.35:32400 (rule
PLEX, id67ebfaef41b7da3e559ab08d). Public IP 208.161.27.232. Also reachable at https://plex.dohertylan.com (Traefik + Authelia SSO), but Plex does not advertise that URL (customConnectionsunset), so clients use the:32400path. - Shell:
docker exec -it plex bash(no separate SSH host any more)
Container
- Image:
lscr.io/linuxserver/plex:latest(running1.43.4.10903-e5521bd8c-ls324) - Compose:
/opt/plex/docker-compose.yml, rendered by theplexAnsible role - Networking:
network_mode: host— needed for GDM discovery (32410-32414/udp) and real client source IPs, so LAN clients are not misclassified as remote - PUID/PGID: 1000/1000
VERSION=docker: pins Plex to the image tag and disables the in-container self-updater
Volumes
| Host | Container | Notes |
|---|---|---|
/opt/plex/config |
/config |
32 GB library (metadata, thumbnails, DBs) |
/opt/plex/transcode |
/transcode |
Local-disk scratch, never NFS |
/mnt/share/Media/Movies |
/mnt/nfs/Movies |
Legacy path — matches the library DB |
/mnt/share/Media/TV |
/mnt/nfs/TV |
″ |
/mnt/share/Media/Anime |
/mnt/nfs/Anime |
″ |
Why the
/mnt/nfs/*container paths look odd: the Plex library DB stores 32,262 absolute media paths from the old VM. Mounting the media at those exact paths inside the container meant the migration touched zero DB rows and could not trigger a library rematch. Do not "tidy" these to/data/*without rewritingsection_locations,media_partsandmedia_streams.
Identity
- MachineIdentifier:
7aa65063599874eac3d9a2f62df74c1816400c88(preserved across the migration — Tautulli, seerr and all clients kept working) - No Plex Pass (
PlexOnlineHome="0") — software transcoding only; there is no usable hardware encoder on this host (VMware SVGA /vmwgfx)
Libraries
| ID | Name | Root path | Items (2026-09-16) |
|---|---|---|---|
| 1 | Movies | /mnt/nfs/Movies |
1,959 |
| 2 | TV Shows | /mnt/nfs/TV |
421 |
| 4 | Anime | /mnt/nfs/Anime |
146 |
Updates
Managed by Ansible, not by Plex. ansible-playbook update.yml -e only=plex pulls the latest image and recreates the container; the full update.yml pass includes it. The in-container updater is disabled via VERSION=docker.
Integrations pointing at this server
| Service | Where configured |
|---|---|
| Sonarr / Radarr | "Plex Media Server" connection (id 2), updateLibrary: true — stored in sonarr.db/radarr.db, not templated by Ansible |
| Tautulli | /opt/tautulli/config.ini (pms_ip, pms_url) |
| seerr | /opt/seerr/settings.json (plex.ip) |
| Uptime Kuma | monitor id 17 in /opt/uptime_kuma/data/kuma.db |
| Homepage | /opt/homepage/config/services.yaml |
| Traefik | /opt/traefik/traefik/rules/external-services.yml (file provider) |