A comprehensive media server setup using Docker Compose, featuring Plex and various supporting services for content management, automation, and monitoring. Offers a minimal but fully functional setup, with the ability to add reverse proxies.
- Plex: Media server
- Overseerr: Media request management system
- Tautulli: Plex monitoring and statistics optional
- Organizr: Web-based dashboard optional
- FileBrowser: Web file management interface optional
- Dozzle: Real-time docker log viewer optional
- Nginx Proxy Manager: Reverse proxy and SSL management optional
- qBittorrent: Torrent client
- Gluetun: VPN client container
- Radarr: Movie collection manager
- Sonarr: TV series collection manager
- Prowlarr: Indexer manager
- Bazarr: Subtitle manager optional
If you don't want to use any of the optional services, you can remove them from the
docker-compose.yml
file.
⚠️ Warning: This stack will not work out of the box. You'll need to do more configuration in the apps themselves. See the App Setup section below for more information.
Make sure you have Docker installed! These instructions are for just setting up the stack, you'll need to do more configuration in the apps (see the App Setup section below).
-
Clone this repository to your desired location (or just manually make the
docker-compose.yml
file) -
Create the following directory structure:
. ├── config/ │ └── ... ├── data/ │ ├── downloads/ │ │ ├── complete/ │ │ ├── incomplete/ │ │ └── watch/ │ └── media/ │ ├── movies/ │ └── tv/
-
The config files are made automatically when Docker starts up, but you can also run:
mkdir -p data data/downloads /data/media /data/media/movies /data/media/tv data/downloads/complete data/downloads/incomplete data/downloads/watch config
This setup assumes that all the final data is stored in the same directory as
docker-compose.yml
. If you want more space/add more drives, you need to add them to the relevantvolumes
section for each service.
- In the
.env
file, you need to set the following variables:TZ
: Your timezone (default:America/New_York
)PUID
: User ID (default: 1000)PGID
: Group ID (default: 1000)OPENVPN_USERNAME
: VPN usernameOPENVPN_PASSWORD
: VPN password
The stack uses Gluetun for VPN connectivity, which I have preconfigured for ProtonVPN but supports many other providers. You can see the full list of providers and the documentation for how to configure them here.
- Run
docker compose up -d
to start the stack. - Profit! After setting up the apps, of course. Add media via Overseerr (or by manually adding them to Radarr and Sonarr). See the App Setup section for more information, and use documentation for each app to finish setting them up.
Note: This is optional, and only if you want to be able to access the services from outside your local network. You'll need a static IP and forward the necessary ngnix ports.
- Create an A record in your DNS provider pointing to your server's public IP address, with
overseerr
as the name. - In Ngnix, go to Hosts -> Proxy Hosts -> Add Proxy Host. Fill in the following:
- Domain Names:
overseerr.mydomain.com
- Scheme:
http
- Forward Hostname/IP:
gluetun
(for VPN-protected services) or service name (for others) - Forward Port:
5055
(use the service's port) - Enable
Block Common Exploits
andWebsockets Support
- Under SSL, select
Request New SSL Certificate
,Force SSL
, andHTTP/2 Support
.
- Domain Names:
- Be sure to secure any services you forward outside your network!
Important: For services running through the VPN (Overseerr, Radarr, Sonarr, Prowlarr), use
gluetun
as the Forward Hostname/IP in Nginx Proxy Manager. These services are accessed through the gluetun container.
You'll need to do more configuration in the apps themselves to make sure that everything works. Here are some resources:
- TRaSH Guides — Radarr, Sonarr, Prowlarr, Plex
- Servarr Documentation — Radarr, Sonarr, Prowlarr
- docker-transmission-openvpn Documentation
- Ngnix Documentation
- Gluetun Documentation for providers
The flow I find best is (in order of what to get working first): Gluetun -> qBittorrent -> Prowlarr -> Sonarr/Radarr -> Plex
. Everything else can come after that.
Service | URL | Notes |
---|---|---|
Nginx Proxy Manager | 81 | Admin interface |
Organizr | 9983 | |
Filebrowser | 8081 | |
qBittorrent | 8080 | VPN Protected |
Radarr | 7878 | VPN Protected |
Sonarr | 8989 | VPN Protected |
Plex | 32400 | Host Network Mode |
Overseerr | 5055 | VPN Protected |
Tautulli | 8181 | |
Prowlarr | 9696 | VPN Protected |
Bazarr | 6767 | |
Dozzle | 9999 |
🔐 Services marked as "VPN Protected" run through the Gluetun VPN container, meaning:
- All their network traffic is routed through your VPN connection
- They're only accessible through ports exposed by the Gluetun container
- This protects these services from being directly exposed to the internet (aka they run through the VPN)
- All of these can be accessed via localhost, but you'll need to set up a reverse proxy in Nginx Proxy Manager to access them from outside your network (see the section above).
- Add a script to help users onboard (e.g. directories, what images they want)
- Add more services to support the stack (Recyclarr, Whisparr, Notifiarr)
- Add documentation for Gluetun VPN configuration with other providers