# Plex Media Server > **Migrated to Docker 2026-09-16.** 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 still exists, powered on but with `plexmediaserver` stopped and disabled, as rollback. 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) |