5a4da57457
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>
61 lines
3.8 KiB
Markdown
61 lines
3.8 KiB
Markdown
# 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](docker.md).
|
|
>
|
|
> 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 UDM `PLEX` port-forward to 10.100.0.24. Its `.24`/`10.50.0.31` leases have been released and it is no longer in the Veeam `Backup VMs` job. 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](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) |
|