# Plex Media Server > **Migrated to Docker 2026-09-16; old VM deleted 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](docker.md). > > The old VM has been **destroyed** — `govc vm.destroy Plex` removed the inventory entry and the `[NVME_1] Plex/` folder, reclaiming 136 GB. There is no VM to roll back to. The surviving artifacts are the Veeam restore points in the `Backup VMs` chain (newest 2026-09-17 03:01, **expiring ~2026-09-24** — the job has `EnableDeletedVmDataRetention: False`) and the pre-migration library DB at `/mnt/share/backups/plex-migration-2026-09-16/`. After that date, recovery means a fresh Plex install restored from that DB, not a VM restore. Full procedure: [plex-docker-migration.md](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`, id `67ebfaef41b7da3e559ab08d`). Public IP 208.161.27.232. Also reachable at https://plex.dohertylan.com (Traefik + Authelia SSO), but Plex does not advertise that URL (`customConnections` unset), so clients use the `:32400` path. - **Shell**: `docker exec -it plex bash` (no separate SSH host any more) ## Container - **Image**: `lscr.io/linuxserver/plex:latest` (running `1.43.4.10903-e5521bd8c-ls324`) - **Compose**: `/opt/plex/docker-compose.yml`, rendered by the `plex` Ansible 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 rewriting `section_locations`, `media_parts` **and** `media_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) |