docker.recipes

Plex Media Server Stack

intermediate

Plex media server with Overseerr, Tautulli analytics, and automated download stack

Overview

Plex Media Server transforms personal media collections into a Netflix-like streaming experience, organizing movies, TV shows, music, and photos with rich metadata and beautiful interfaces across all devices. Originally launched in 2009 as a fork of XBMC, Plex has evolved into the most popular self-hosted media solution, offering automatic metadata matching, hardware transcoding, mobile sync, and access to free streaming content alongside personal libraries. This comprehensive media automation stack combines Plex's streaming capabilities with request management through Overseerr, detailed analytics via Tautulli, and a complete download automation pipeline using Sonarr for TV shows, Radarr for movies, Prowlarr for indexer management, and Transmission for torrent handling. Together, these components create a fully automated media ecosystem where users can request content through a polished web interface, have it automatically searched, downloaded, organized, and made available in Plex within minutes. Home media enthusiasts, cord-cutters building personal streaming services, and families wanting centralized media access will find this stack invaluable. The combination eliminates manual media management while providing enterprise-grade analytics and user request handling, making it perfect for shared households or small communities wanting a professional media experience without monthly subscription fees.

Key Features

  • Automatic metadata matching with rich movie and TV show information from TheTVDB, TheMovieDB, and IMDb
  • User request management system allowing family members to request new content through Overseerr's intuitive interface
  • Comprehensive viewing analytics and statistics through Tautulli including watch history, user activity, and server performance metrics
  • Automated TV show monitoring with Sonarr tracking upcoming episodes and managing series libraries
  • Movie collection automation via Radarr with quality profiles and automatic upgrading capabilities
  • Centralized indexer management through Prowlarr supporting 500+ torrent trackers and Usenet indexers
  • Hardware transcoding support for real-time video conversion across different devices and bandwidths
  • Mobile sync functionality allowing offline viewing of selected content on phones and tablets

Common Use Cases

  • 1Family media server replacing multiple streaming subscriptions with centralized content access
  • 2Cord-cutting households wanting automated acquisition of new TV episodes and movies
  • 3Home theater enthusiasts managing large 4K movie collections with quality upgrading
  • 4Shared living situations where multiple users need request and approval workflows
  • 5Media collectors wanting detailed analytics on viewing habits and library usage patterns
  • 6Remote access scenarios where users stream personal content while traveling
  • 7Small community or friend group media sharing with user management and request systems

Prerequisites

  • Minimum 4GB RAM recommended (2GB for Plex transcoding, 2GB for automation stack)
  • Hardware transcoding support requires Intel QuickSync, NVIDIA GPU, or AMD VCE for Plex Pass users
  • Port availability: 32400 (Plex), 5055 (Overseerr), 8181 (Tautulli), 8989 (Sonarr), 7878 (Radarr), 9696 (Prowlarr), 9091 (Transmission)
  • Plex account and claim token from https://plex.tv/claim for initial server setup
  • Understanding of torrent indexers, trackers, or Usenet providers for content sources
  • Basic knowledge of media naming conventions and folder structures for proper organization

For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms

docker-compose.yml

docker-compose.yml
1services:
2 plex:
3 image: lscr.io/linuxserver/plex:latest
4 container_name: plex
5 restart: unless-stopped
6 network_mode: host
7 environment:
8 - PUID=${PUID:-1000}
9 - PGID=${PGID:-1000}
10 - TZ=${TZ:-UTC}
11 - VERSION=docker
12 - PLEX_CLAIM=${PLEX_CLAIM}
13 volumes:
14 - ./plex/config:/config
15 - ./media/movies:/movies
16 - ./media/tv:/tv
17 - ./media/music:/music
18
19 overseerr:
20 image: lscr.io/linuxserver/overseerr:latest
21 container_name: overseerr
22 restart: unless-stopped
23 ports:
24 - "${OVERSEERR_PORT:-5055}:5055"
25 volumes:
26 - ./overseerr/config:/config
27 environment:
28 - PUID=${PUID:-1000}
29 - PGID=${PGID:-1000}
30 - TZ=${TZ:-UTC}
31
32 tautulli:
33 image: lscr.io/linuxserver/tautulli:latest
34 container_name: tautulli
35 restart: unless-stopped
36 ports:
37 - "${TAUTULLI_PORT:-8181}:8181"
38 volumes:
39 - ./tautulli/config:/config
40 environment:
41 - PUID=${PUID:-1000}
42 - PGID=${PGID:-1000}
43 - TZ=${TZ:-UTC}
44
45 sonarr:
46 image: lscr.io/linuxserver/sonarr:latest
47 container_name: sonarr
48 restart: unless-stopped
49 ports:
50 - "${SONARR_PORT:-8989}:8989"
51 volumes:
52 - ./sonarr/config:/config
53 - ./media/tv:/tv
54 - ./downloads:/downloads
55 environment:
56 - PUID=${PUID:-1000}
57 - PGID=${PGID:-1000}
58 - TZ=${TZ:-UTC}
59
60 radarr:
61 image: lscr.io/linuxserver/radarr:latest
62 container_name: radarr
63 restart: unless-stopped
64 ports:
65 - "${RADARR_PORT:-7878}:7878"
66 volumes:
67 - ./radarr/config:/config
68 - ./media/movies:/movies
69 - ./downloads:/downloads
70 environment:
71 - PUID=${PUID:-1000}
72 - PGID=${PGID:-1000}
73 - TZ=${TZ:-UTC}
74
75 prowlarr:
76 image: lscr.io/linuxserver/prowlarr:latest
77 container_name: prowlarr
78 restart: unless-stopped
79 ports:
80 - "${PROWLARR_PORT:-9696}:9696"
81 volumes:
82 - ./prowlarr/config:/config
83 environment:
84 - PUID=${PUID:-1000}
85 - PGID=${PGID:-1000}
86 - TZ=${TZ:-UTC}
87
88 transmission:
89 image: lscr.io/linuxserver/transmission:latest
90 container_name: transmission
91 restart: unless-stopped
92 ports:
93 - "${TRANSMISSION_PORT:-9091}:9091"
94 - "51413:51413"
95 - "51413:51413/udp"
96 volumes:
97 - ./transmission/config:/config
98 - ./downloads:/downloads
99 environment:
100 - PUID=${PUID:-1000}
101 - PGID=${PGID:-1000}
102 - TZ=${TZ:-UTC}

.env Template

.env
1# Plex Media Server Stack
2OVERSEERR_PORT=5055
3TAUTULLI_PORT=8181
4SONARR_PORT=8989
5RADARR_PORT=7878
6PROWLARR_PORT=9696
7TRANSMISSION_PORT=9091
8
9# Get claim token from https://plex.tv/claim
10PLEX_CLAIM=claim-xxxxxxxxxxxx
11
12# User/Group IDs
13PUID=1000
14PGID=1000
15TZ=America/New_York

Usage Notes

  1. 1Plex at http://localhost:32400/web (network_mode: host)
  2. 2Overseerr (requests) at http://localhost:5055
  3. 3Tautulli (analytics) at http://localhost:8181
  4. 4Get PLEX_CLAIM from https://plex.tv/claim
  5. 5Prowlarr manages indexers for Sonarr/Radarr
  6. 6Configure Sonarr/Radarr to use Transmission

Individual Services(7 services)

Copy individual services to mix and match with your existing compose files.

plex
plex:
  image: lscr.io/linuxserver/plex:latest
  container_name: plex
  restart: unless-stopped
  network_mode: host
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}
    - VERSION=docker
    - PLEX_CLAIM=${PLEX_CLAIM}
  volumes:
    - ./plex/config:/config
    - ./media/movies:/movies
    - ./media/tv:/tv
    - ./media/music:/music
overseerr
overseerr:
  image: lscr.io/linuxserver/overseerr:latest
  container_name: overseerr
  restart: unless-stopped
  ports:
    - ${OVERSEERR_PORT:-5055}:5055
  volumes:
    - ./overseerr/config:/config
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}
tautulli
tautulli:
  image: lscr.io/linuxserver/tautulli:latest
  container_name: tautulli
  restart: unless-stopped
  ports:
    - ${TAUTULLI_PORT:-8181}:8181
  volumes:
    - ./tautulli/config:/config
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}
sonarr
sonarr:
  image: lscr.io/linuxserver/sonarr:latest
  container_name: sonarr
  restart: unless-stopped
  ports:
    - ${SONARR_PORT:-8989}:8989
  volumes:
    - ./sonarr/config:/config
    - ./media/tv:/tv
    - ./downloads:/downloads
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}
radarr
radarr:
  image: lscr.io/linuxserver/radarr:latest
  container_name: radarr
  restart: unless-stopped
  ports:
    - ${RADARR_PORT:-7878}:7878
  volumes:
    - ./radarr/config:/config
    - ./media/movies:/movies
    - ./downloads:/downloads
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}
prowlarr
prowlarr:
  image: lscr.io/linuxserver/prowlarr:latest
  container_name: prowlarr
  restart: unless-stopped
  ports:
    - ${PROWLARR_PORT:-9696}:9696
  volumes:
    - ./prowlarr/config:/config
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}
transmission
transmission:
  image: lscr.io/linuxserver/transmission:latest
  container_name: transmission
  restart: unless-stopped
  ports:
    - ${TRANSMISSION_PORT:-9091}:9091
    - "51413:51413"
    - 51413:51413/udp
  volumes:
    - ./transmission/config:/config
    - ./downloads:/downloads
  environment:
    - PUID=${PUID:-1000}
    - PGID=${PGID:-1000}
    - TZ=${TZ:-UTC}

Quick Start

terminal
1# 1. Create the compose file
2cat > docker-compose.yml << 'EOF'
3services:
4 plex:
5 image: lscr.io/linuxserver/plex:latest
6 container_name: plex
7 restart: unless-stopped
8 network_mode: host
9 environment:
10 - PUID=${PUID:-1000}
11 - PGID=${PGID:-1000}
12 - TZ=${TZ:-UTC}
13 - VERSION=docker
14 - PLEX_CLAIM=${PLEX_CLAIM}
15 volumes:
16 - ./plex/config:/config
17 - ./media/movies:/movies
18 - ./media/tv:/tv
19 - ./media/music:/music
20
21 overseerr:
22 image: lscr.io/linuxserver/overseerr:latest
23 container_name: overseerr
24 restart: unless-stopped
25 ports:
26 - "${OVERSEERR_PORT:-5055}:5055"
27 volumes:
28 - ./overseerr/config:/config
29 environment:
30 - PUID=${PUID:-1000}
31 - PGID=${PGID:-1000}
32 - TZ=${TZ:-UTC}
33
34 tautulli:
35 image: lscr.io/linuxserver/tautulli:latest
36 container_name: tautulli
37 restart: unless-stopped
38 ports:
39 - "${TAUTULLI_PORT:-8181}:8181"
40 volumes:
41 - ./tautulli/config:/config
42 environment:
43 - PUID=${PUID:-1000}
44 - PGID=${PGID:-1000}
45 - TZ=${TZ:-UTC}
46
47 sonarr:
48 image: lscr.io/linuxserver/sonarr:latest
49 container_name: sonarr
50 restart: unless-stopped
51 ports:
52 - "${SONARR_PORT:-8989}:8989"
53 volumes:
54 - ./sonarr/config:/config
55 - ./media/tv:/tv
56 - ./downloads:/downloads
57 environment:
58 - PUID=${PUID:-1000}
59 - PGID=${PGID:-1000}
60 - TZ=${TZ:-UTC}
61
62 radarr:
63 image: lscr.io/linuxserver/radarr:latest
64 container_name: radarr
65 restart: unless-stopped
66 ports:
67 - "${RADARR_PORT:-7878}:7878"
68 volumes:
69 - ./radarr/config:/config
70 - ./media/movies:/movies
71 - ./downloads:/downloads
72 environment:
73 - PUID=${PUID:-1000}
74 - PGID=${PGID:-1000}
75 - TZ=${TZ:-UTC}
76
77 prowlarr:
78 image: lscr.io/linuxserver/prowlarr:latest
79 container_name: prowlarr
80 restart: unless-stopped
81 ports:
82 - "${PROWLARR_PORT:-9696}:9696"
83 volumes:
84 - ./prowlarr/config:/config
85 environment:
86 - PUID=${PUID:-1000}
87 - PGID=${PGID:-1000}
88 - TZ=${TZ:-UTC}
89
90 transmission:
91 image: lscr.io/linuxserver/transmission:latest
92 container_name: transmission
93 restart: unless-stopped
94 ports:
95 - "${TRANSMISSION_PORT:-9091}:9091"
96 - "51413:51413"
97 - "51413:51413/udp"
98 volumes:
99 - ./transmission/config:/config
100 - ./downloads:/downloads
101 environment:
102 - PUID=${PUID:-1000}
103 - PGID=${PGID:-1000}
104 - TZ=${TZ:-UTC}
105EOF
106
107# 2. Create the .env file
108cat > .env << 'EOF'
109# Plex Media Server Stack
110OVERSEERR_PORT=5055
111TAUTULLI_PORT=8181
112SONARR_PORT=8989
113RADARR_PORT=7878
114PROWLARR_PORT=9696
115TRANSMISSION_PORT=9091
116
117# Get claim token from https://plex.tv/claim
118PLEX_CLAIM=claim-xxxxxxxxxxxx
119
120# User/Group IDs
121PUID=1000
122PGID=1000
123TZ=America/New_York
124EOF
125
126# 3. Start the services
127docker compose up -d
128
129# 4. View logs
130docker compose logs -f

One-Liner

Run this command to download and set up the recipe in one step:

terminal
1curl -fsSL https://docker.recipes/api/recipes/plex-media-server-stack/run | bash

Troubleshooting

  • Plex server not accessible remotely: Check router port forwarding for port 32400 and ensure PLEX_CLAIM token was used during initial setup
  • Sonarr/Radarr not finding releases: Verify Prowlarr indexer configuration and ensure indexers are synced to both applications
  • Transmission downloads not importing: Check folder permissions match PUID/PGID values and downloads folder is accessible to Sonarr/Radarr
  • Overseerr requests not triggering downloads: Verify API connections between Overseerr and Sonarr/Radarr in Settings > Services
  • Tautulli not showing viewing history: Confirm Plex server connection in Tautulli settings and check that Plex logging is enabled
  • Media files not appearing in Plex: Ensure proper naming conventions are followed and libraries are pointing to correct mounted volumes

Community Notes

Loading...
Loading notes...

Download Recipe Kit

Get all files in a ready-to-deploy package

Includes docker-compose.yml, .env template, README, and license

Ad Space