# Welcome to my Ultimate Plex Stack! # # Make sure to rename this file to "docker-compose.yaml" if you are using git clone # # I was hoping this could maybe help some people out when setting up their stack # # Environment Variable Examples: # PUID = 99 # GUID = 101 # TZ = America/Edmonton # BASE_PATH = /home/username/docker # # https://trash-guides.info/Hardlinks/Hardlinks-and-Instant-Moves/ # This can be useful for establishing how the media will be presented below # MEDIA_SHARE = /mnt/media # This can also be renamed to "SHARE" or "MEDIA" this is where you will present your media # # NOTE: This is not a plug and play solution, some research / customization will be required to make this work as intented # Feel free to customize ie: remove/change/add containers as needed - one size does not fit all --- version: "3.0" networks: #This is used if you have a reverse proxy. I use Nginx Proxy Manager but anything will do proxy: #You can remove this block if you are not planning to use a vpn external: name: proxy services: #Plex - used to display the media # #This can also be replaced by Emby/Jellyfin plex: image: lscr.io/linuxserver/plex:latest container_name: plex network_mode: host environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} - VERSION=docker - PLEX_CLAIM=${PLEX_CLAIM} ports: - 32400:32400 devices: - /dev/dri:/dev/dri #Required for plex HW transcoding / QuickSync volumes: - ${BASE_PATH}/plex/config:/config - ${MEDIA_SHARE}/media/tv:/tv - ${MEDIA_SHARE}/media/movies:/movies restart: unless-stopped #Radarr - used to find movies automatically radarr: image: lscr.io/linuxserver/radarr:latest container_name: radarr environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/radarr/config:/config - ${MEDIA_SHARE}:/share #Access to the entire share #networks: #Does not connect to overseer if you use NPM # - proxy ports: - 7878:7878 restart: unless-stopped #Sonarr - used to find tv shows automatically sonarr: image: lscr.io/linuxserver/sonarr:latest container_name: sonarr environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/sonarr/config:/config - ${MEDIA_SHARE}:/share #Access to the entire share #networks: #Does not connect to overseer if you use NPM # - proxy ports: - 8989:8989 restart: unless-stopped #Readarr - Used to download books readarr: image: lscr.io/linuxserver/readarr:develop container_name: readarr environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/readarr/config:/config - ${MEDIA_SHARE}:/share ports: - 8787:8787 restart: unless-stopped #Lidarr - Used to download music lidarr: image: lscr.io/linuxserver/lidarr:latest container_name: lidarr environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/lidarr/config:/config - ${MEDIA_SHARE}:/share ports: - 8686:8686 restart: unless-stopped #Prowlarr - manages your Sonarr, Radarr and download client prowlarr: image: lscr.io/linuxserver/prowlarr:latest container_name: prowlarr environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/prowlarr/config:/config #networks: # - proxy ports: - 9696:9696 restart: unless-stopped #Autobrr - used to grab torrents using the trackers IRC channel - Increases seeding due to grabbing content before RSS feed autobrr: container_name: autobrr image: ghcr.io/autobrr/autobrr:latest restart: unless-stopped environment: - TZ=${TZ} - PUID=${PUID} - PGID=${GUID} volumes: - ${BASE_PATH}/autobrr/config:/config ports: - 7474:7474 #Overseer - allows users to request media on their own overseerr: image: lscr.io/linuxserver/overseerr:latest container_name: overseerr environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/overseer/config:/config - ${MEDIA_SHARE}:/share #Access to the entire share #networks: # - proxy ports: - 5055:5055 restart: unless-stopped #Flaresolerr - Used as a proxy server to bypass Cloudflare and DDoS-GUARD protection. flaresolverr: # DockerHub mirror flaresolverr/flaresolverr:latest image: ghcr.io/flaresolverr/flaresolverr:latest container_name: flaresolverr environment: - LOG_LEVEL=info - LOG_HTML=false - CAPTCHA_SOLVER=none - TZ=${TZ} ports: - 8191:8191 restart: unless-stopped #Qbittorrent - torrenting software # #You can also use RuTorrent, Transmisson or Deluge qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest container_name: qbittorrent environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} - WEBUI_PORT=8080 - TORRENTING_PORT=8694 #Make sure to port forward this port in your router so you can seed more effectively volumes: - ${BASE_PATH}/qbittorrent/config:/config - ${MEDIA_SHARE}:/share restart: unless-stopped #Tautulli - for plex statistics. Very useful when troubleshooting performance issues tautulli: image: lscr.io/linuxserver/tautulli:latest container_name: tautulli environment: - PUID=${PUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/tautulli:/config networks: - proxy ports: - 8181:8181 restart: unless-stopped #Tdarr - to transcode videos from one format to another like x265 or H.265 # #This container requires a decent amount of horse power to run but will save space in the long run tdarr: container_name: tdarr image: ghcr.io/haveagitgat/tdarr:latest restart: unless-stopped ports: - 8265:8265 # webUI port - 8266:8266 # server port environment: - TZ=${TZ} - PUID=${PUID} - PGID=${GUID} - UMASK_SET=002 - nodeName=ServerNode - serverIP=0.0.0.0 - serverPort=8266 - webUIPort=8265 - internalNode=true - inContainer=true - ffmpegVersion=6 volumes: - ${BASE_PATH}/tdarr/server:/app/server - ${BASE_PATH}/tdarr/configs:/app/configs - ${BASE_PATH}/tdarr/logs:/app/logs - ${MEDIA_SHARE}:/media - /transcode_cache:/temp devices: - /dev/dri:/dev/dri #Required for HW transcoding / QuickSync #Membarr - to invite users via discord # #Can be configured so that when a plex member invites an outside user to a discord channel they are auto invited to plex # #Feel free to remove this container if you want to manually invite everyone yourself membarr: container_name: membarr image: yoruio/membarr:latest restart: unless-stopped environment: - token=${MEMBARR_TOKEN} volumes: - ${BASE_PATH}/membarr/config:/app/app/config #Bazarr - for subtitles. Try to use SRT format if you can rather than PGS due to performance issues bazarr: container_name: bazarr image: lscr.io/linuxserver/bazarr:latest restart: unless-stopped environment: - PUID=${GUID} - PGID=${GUID} - TZ=${TZ} volumes: - ${BASE_PATH}/bazarr/config:/config - ${MEDIA_SHARE}:/share ports: - 6767:6767 #Plex Auto Languages - This switchs languages automatically example: watching english show and non english speaks you get subtitle lol plexautolanguages: image: remirigal/plex-auto-languages:latest container_name: plex-auto-languages environment: - PLEX_URL=${PLEX_URL} #This is your local URl example: http://192.168.1.10:32400 #To find your plex token go to https://app.plex.tv/, go to your library, click on the 3 dots on the bottom right of one of your tv/movie posters #Then click "View XML" in the bottom right of that popup, look at the URL of the XML window and find your X-Plex-Token= in the URL (at the very end) - PLEX_TOKEN=${PLEX_TOKEN} - TZ=${TZ} volumes: - ${BASE_PATH}/pal/config:/config #Cross Seed - used to take torrents from one tracker and seed them on another without leeching first. Increases ratio # #This is fairly advanced but can be removed if you don't think you will need it. Some trackers also don't allow this cross-seed: image: ghcr.io/cross-seed/cross-seed container_name: cross-seed environment: - PUID=${PUID} - PGID=${GUID} ports: - "2468:2468" # you'll need this for daemon mode only volumes: - ${BASE_PATH}/cross-seed/config:/config #To configure you have to manually nano the config file - ${BASE_PATH}/qbittorent/config/qBittorrent/BT_backup:/torrents:ro # your torrent clients .torrent cache, can and should be mounted read-only (e.g. qbit: `BT_Backup` | deluge: `state` | transmission: `transmission/torrents` | rtorrent: session dir from `.rtorrent.rc`) - ${MEDIA_SHARE}/cross-seed/current-cross-seeds:/cross-seeds # A place to temp save current cross seed .torrent files #- ${MEDIA_SHARE}/downloads:/data # OPTIONAL!!! this is dataDir path (for data-based matching) - will need to replicate your torrent client's container path (like Arr's do) command: daemon # this enables the search mode, change to daemon to specifically run the daemon #Plex Meta Manager - used to create collections in plex. Example: "Most Popular Movies This Week", "Best of horror", etc. plex-meta-manager: image: meisnate12/plex-meta-manager container_name: plex-meta-manager environment: - TZ=${TZ} #- PMM_OVERLAYS_ONLY=true #Tells PMM to run overlays only - PMM_CONFIG=/config/config.yml - PMM_RUN=true #Runs PMM Immediately #- PMM_RUN_LIBRARIES=Movies #Tells PMM to process only a library called "Movies" volumes: - ${BASE_PATH}/plex-meta-manager/config:/config restart: unless-stopped #Wizarr - Allows you to create a share link that you can send to users to invite them to your media server wizarr: container_name: wizarr image: ghcr.io/wizarrrr/wizarr:latest ports: - 5690:5690 volumes: - ${BASE_PATH}/wizarr/data/database:/data/database #Dozzle - Used to easily view logs of any container in real time! dozzle: container_name: dozzle image: amir20/dozzle:latest volumes: - /var/run/docker.sock:/var/run/docker.sock ports: - 9999:8080 #Unpacker - Used to unzip zipped files unpackerr: image: golift/unpackerr container_name: unpackerr volumes: # You need at least this one volume mapped so Unpackerr can find your files to extract. # Make sure this matches your Starr apps; the folder mount (/downloads or /data) should be identical. - ${MEDIA_SHARE}:/share #- ${BASE_PATH}/unpackerr/config:/config restart: always user: 1000:1000 #Needs to run as 1000 # What you see below are defaults for this compose. You only need to modify things specific to your environment. # Remove apps and feature configs you do not use or need. # ie. Remove all lines that begin with UN_CMDHOOK, UN_WEBHOOK, UN_FOLDER, UN_WEBSERVER, and other apps you do not use. environment: - UN_START_DELAY=1m #- UMASK=002 - TZ=${TZ} #- UN_DEBUG=true # Sonarr Config - UN_SONARR_0_URL=http://${SERVER_IP}:7878 - UN_SONARR_0_API_KEY=${SONARR_KEY} #- UN_SONARR_0_PATHS_0=/share/downloads/tv - UN_SONARR_0_TIMEOUT=10s #- UN_SONARR_0_PATHS_0=/share/downloads/tv # Radarr Config - UN_RADARR_0_URL=http://${SERVER_IP}:8989 - UN_RADARR_0_API_KEY=${RADARR_KEY} #- UN_RADARR_0_PATHS_0=/share/downloads/movies - UN_RADARR_0_TIMEOUT=10s #- UN_RADARR_0_PATHS_0=/share/downloads/movies # Used to sync Trash Guides config's to radarr and sonarr # Only accessible via command line! No GUI recyclarr: image: ghcr.io/recyclarr/recyclarr container_name: recyclarr user: ${PUID}:${GUID} volumes: - ${BASE_PATH}/recyclarr/config:/config environment: - TZ=${TZ}