Skip to main content

Docker - VPN Media Stack without Downloaders

networks:
  media-network:
    name: media-network
    driver: bridge

services:
###########################################################################
##  Docker Compose File:  Prowlarr (LinuxServer.io)
##  Function:             Indexer and Search Manager
##  Documentation:        https://docs.linuxserver.io/images/docker-prowlarr
###########################################################################
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - PROWLARR_API_KEY=${PROWLARR_API_KEY}
      - ARGS=
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}  # Max number of log files
        max-size: ${DOCKERLOGGING_MAXSIZE}  # Max file size
    ports:
      - 9696:9696 # Prowlarr web interface port
    volumes:
      - ${DOCKERFOLDER}/prowlarr/config:/config:rw # Host path for Prowlarr configuration
    depends_on:
      - flaresolverr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Flaresolverr (Flaresolverr)
##  Function:             Cloudflare Proxy Server
##  Documentation:        https://github.com/FlareSolverr/FlareSolverr
###########################################################################
  flaresolverr:
    image: flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=info
      - CAPTCHA_SOLVER=none
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}  # Max number of log files
        max-size: ${DOCKERLOGGING_MAXSIZE}  # Max file size
    ports:
      - 8191:8191 # FlareSolverr web interface port
    volumes:
      - ${DOCKERFOLDER}/flaresolverr/config:/config
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Radarr (LinuxServer.io)
##  Function:             Movie Library Manager
##  Documentation:        https://docs.linuxserver.io/images/docker-radarr
###########################################################################
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - RADARR_API_KEY=${RADARR_API_KEY}
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}  # Max number of log files
        max-size: ${DOCKERLOGGING_MAXSIZE}  # Max file size
    ports:
      - 7878:7878 # Radarr web interface port
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ${DOCKERFOLDER}/radarr/config:/config # Radarr configuration files
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Sonarr (LinuxServer.io)
##  Function:             Series Library Manager (TV Shows)
##  Documentation:        https://docs.linuxserver.io/images/docker-sonarr
###########################################################################
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - SONARR__API=${SONARR_API_KEY}
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}  # Max number of log files
        max-size: ${DOCKERLOGGING_MAXSIZE}  # Max file size
    ports:
      - 8989:8989 # Sonarr web interface port
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ${DOCKERFOLDER}/sonarr/config:/config # Replace with your desired config path
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Bazarr (LinuxServer.io)
##  Function:             Download subtitles for Radarr and Sonarr
##  Documentation:        https://docs.linuxserver.io/images/docker-bazarr
###########################################################################
  bazarr:
    image: ghcr.io/hotio/bazarr:nightly
    container_name: bazarr
    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 6767:6767 # Bazarr web interface port
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ${DOCKERFOLDER}/bazarr:/config
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Lidarr (LinuxServer.io)
##  Function:             Music Library Manager
##  Documentation:        https://docs.linuxserver.io/images/docker-lidarr
###########################################################################
  lidarr:
    image: lscr.io/linuxserver/lidarr:latest
    container_name: lidarr

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - APIKEY=${LIDARR_API_KEY}
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 8686:8686 # Lidarr web interface port
    volumes:
      - ${DOCKERFOLDER}/lidarr/config:/config # Replace with your config path
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Lazylibrarian (LinuxServer.io)
##  Function:             Book Library Manager
##  Documentation:        https://docs.linuxserver.io/images/docker-lazylibrarian/
###########################################################################
  lazylibrarian:
    image: lscr.io/linuxserver/lazylibrarian:latest
    container_name: lazylibrarian

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 5299:5299 # LazyLibrarian web interface port
    volumes:
      - ${DOCKERFOLDER}/lazylibrarian/config:/config # Path to store configuration files
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Mylar3 (LinuxServer.io)
##  Function:             Comic Manager
##  Documentation:        https://docs.linuxserver.io/images/docker-mylar3/
###########################################################################
  mylar3:
    image: linuxserver/mylar3
    container_name: mylar3

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - COMICVIN_BASEURL=#optional
      - KEY=${MYLAR_API_KEY}
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 8090:8090 # Mylar3 web interface port
    volumes:
      - ${DOCKERFOLDER}/mylar3/config:/config # Mylar3 configuration files
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/media/comics:/comics
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Mylar3 (LinuxServer.io)
##  Function:             Comic Manager
##  Documentation:        https://github.com/thespad/docker-whisparr/pkgs/container/whisparr
###########################################################################
  whisparr:
    image: ghcr.io/thespad/whisparr:latest
    container_name: whisparr

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 6969:6969 # Whisparr web interface port
    volumes:
      - ${DOCKERFOLDER}/whisparr/config:/config # Whisparr configuration files
      - ${MEDIAFOLDER}:/data
      - ${MEDIAFOLDER}/torrents:/downloads # Torrent downloads (complete and incomplete)
    depends_on:
      - prowlarr
    networks:
      - media-network      
    restart: unless-stopped

  plex:
    image: ghcr.io/hotio/plex
    container_name: plex

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - PLEX_CLAIM_TOKEN=${PLEX_CLAIM_TOKEN}
      - PLEX_ADVERTISE_URL=${PLEX_ADVERTISE_URL}
      - PLEX_NO_AUTH_NETWORKS=
      - PLEX_BETA_INSTALL=${PLEX_BETA_INSTALL}
      - VERSION=docker # Specifies the Docker version of Plex
      - NVIDIA_VISIBLE_DEVICES=all     # Tells the NVIDIA Container Toolkit to expose all available NVIDIA GPUs to the container
      - NVIDIA_DRIVER_CAPABILITIES=all
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 32400:32400
      #- 8324:8324/tcp
      #- 32469:32469/tcp
      #- 1900:1900/udp
      #- 32410:32410/udp
      #- 32412:32412/udp
      #- 32413:32413/udp
      #- 32414:32414/udp
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ${DOCKERFOLDER}/plex:/config:rw
      - ${MEDIAFOLDER}/media:/data/media:rw
      - /mnt/photo:/media/photo:rw # Path to your photos, :ro for read-only :rw for read-write
    devices:                # optional: hardware transcoding (only with Plex Pass) uncomment this line.
      - /dev/dri:/dev/dri   # optional: hardware transcoding (only with Plex Pass) uncomment this line.
      #- /dev/dvb:/dev/dvb  # Uncomment this device for typical USB TV Tuner cards
    tmpfs:                  # optional: enable transcoding in RAM. uncomment this line.
      - /transcode          # optional: enable transcoding in RAM. uncomment this line.
    #runtime: nvidia # Crucial for NVIDIA GPU access
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Jellyfin (LinuxServer.io)
##  Function:             Media Server
##  Documentation:        https://jellyfin.org/docs/general/administration/installing#docker
##                        https://jellyfin.org/docs/general/administration/hardware-acceleration/
###########################################################################
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - COMICVIN_BASEURL=#optional
      - NVIDIA_VISIBLE_DEVICES=all     # Tells the NVIDIA Container Toolkit to expose all available NVIDIA GPUs to the container
      - NVIDIA_DRIVER_CAPABILITIES=all
      - ROC_ENABLE_PRE_VEGA=1 # Hardware Acceleration
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    healthcheck:
      test: timeout 10s bash -c ':> /dev/tcp/127.0.0.1/8096' || exit 1
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 90s
    volumes:
      - ${DOCKERFOLDER}/jellyfin/config:/config # Path to your config directory
      - ${DOCKERFOLDER}/jellyfin/cache:/cache   # Path to your cache directory
      - ${MEDIAFOLDER}/media:/data/media:rw
      - /mnt/photo:/media/photo:rw # Path to your photos, :ro for read-only :rw for read-write
    ports:
      - 8096:8096 # Jellyfin Web UI
      - 8920:8920 # Jellyfin Web UI HTTPS (optional)
      - 7359:7359/udp # Jellyfin DLNA discovery
      - 1900:1900/udp # Jellyfin DLNA advertising
    #runtime: nvidia # Crucial for NVIDIA GPU access
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Jellyseerr (fallenbagel)
##  Function:             Media Request Manager
##  Documentation:        https://hub.docker.com/r/fallenbagel/jellyseerr
###########################################################################
  jellyseerr:
    image: fallenbagel/jellyseerr:latest
    container_name: jellyseerr

    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
      - LOG_LEVEL=debug
    logging:
      driver: json-file
      options:
        max-file: ${DOCKERLOGGING_MAXFILE}
        max-size: ${DOCKERLOGGING_MAXSIZE}
    ports:
      - 5055:5055 # Jellyseer Web UI
    volumes:
      - ${DOCKERFOLDER}/jelleyseer/config:/app/config # Change to your desired config path
    networks:
      - media-network
    restart: unless-stopped

###########################################################################
##  Docker Compose File:  Unpackerr (Hotio.Dev)
##  Function:             Archive Media Extraction
##  Documentation:        https://github.com/davidnewhall/unpackerr
##                        https://github.com/davidnewhall/unpackerr/blob/master/examples/docker-compose.yml
###########################################################################
  unpackerr:
    image: golift/unpackerr:latest
    container_name: unpackerr
    network_mode: none
    environment:
      - PUID=${PUID}    # User ID
      - PGID=${PGID}    # Group ID
      - TZ=${TZ}        # TimeZone
      - UMASK=${UMASK}  # File Umask
# Documentation on all Environment Variables can be found at:
# https://github.com/davidnewhall/unpackerr#docker-env-variables
      - UN_DEBUG=false
      - UN_LOG_FILE=
      - UN_LOG_FILES=10
      - UN_LOG_FILE_MB=10
      - UN_INTERVAL=2m
      - UN_START_DELAY=1m
      - UN_RETRY_DELAY=5m
      - UN_MAX_RETRIES=3
      - UN_PARALLEL=1
      - UN_FILE_MODE=0664
      - UN_DIR_MODE=0775
      # Sonarr Config - Copy API Key from: http://sonarr:8989/general/settings
      - UN_SONARR_0_URL=http://sonarr:8989
      - UN_SONARR_0_API_KEY=${SONARR_API_KEY}
      - UN_SONARR_0_PATHS_0=/data/torrents/anime
      - UN_SONARR_0_PATHS_1=/data/torrents/series
      - UN_SONARR_0_PROTOCOLS=torrent
      - UN_SONARR_0_TIMEOUT=10s
      - UN_SONARR_0_DELETE_ORIG=false
      - UN_SONARR_0_DELETE_DELAY=5m
      # Radarr Config - Copy API Key from: http://radarr:7878/general/settings
      - UN_RADARR_0_URL=http://radarr:7878
      - UN_RADARR_0_API_KEY=${RADARR_API_KEY}
      - UN_RADARR_0_PATHS_0=/data/torrents/movies
      - UN_RADARR_0_PROTOCOLS=torrent
      - UN_RADARR_0_TIMEOUT=10s
      - UN_RADARR_0_DELETE_ORIG=false
      - UN_RADARR_0_DELETE_DELAY=5m
      # Lidarr Config - Copy API Key from: http://lidarr:8686/general/settings
      - UN_LIDARR_0_URL=http://lidarr:8686
      - UN_LIDARR_0_API_KEY=${LIDARR_API_KEY}
      - UN_LIDARR_0_PATHS_0=/data/torrents/music
      - UN_LIDARR_0_PROTOCOLS=torrent
      - UN_LIDARR_0_TIMEOUT=10s
      - UN_LIDARR_0_DELETE_ORIG=false
      - UN_LIDARR_0_DELETE_DELAY=
    volumes:
      - ${DOCKERFOLDER}/unpackerr:/config
      - ${MEDIAFOLDER}:/data
    security_opt:
      - no-new-privileges:true
    restart: unless-stopped

# Uncomment the lines below to use Nvidia GPUs for Hardware Transcoding
#    deploy:
#      resources:
#        reservations:
#          devices:
#            - driver: nvidia
#              count: 1
#              capabilities: [gpu]

This is for the .env file

COMPOSE_PROJECT_NAME=MediaStack
OPENVPN_USERNAME=
OPENVPN_PASSWORD=
PUID=1031
PGID=100
TZ=America/Montreal
UMASK=002
DOCKERLOGGING_MAXFILE=10
DOCKERLOGGING_MAXSIZE=200k
PLEX_CLAIM_TOKEN=
PLEX_BETA_INSTALL=true
PLEX_ADVERTISE_URL="http://192.168.253.35:32400"
LAN_NETWORK=192.168.253.0/24
HOSTNAME=
DOCKERFOLDER=/volume1/docker
MEDIAFOLDER=/mnt/data
DOMAIN=
SUB_DOMAIN_JELLYFIN=jellyfin
SUB_DOMAIN_PLEX=plex
SUB_DOMAIN_SONARR=sonarr
SUB_DOMAIN_RADARR=radarr
SUB_DOMAIN_PROWLARR=prowlarr
SUB_DOMAIN_JELLYSEERR=jellyseerr
SUB_DOMAIN_BAZZAR=bazzar
SUB_DOMAIN_WHISPARR=whisparr
SUB_DOMAIN_LAZYLIBRARIAN=lazylibrarian
SUB_DOMAIN_MYLAR=mylar
SUB_DOMAIN_LIDARR=lidarr
SUB_DOMAIN_FLARESOLVERR=flaresolverr
SUB_DOMAIN_JELLYFIN=jellyfin
RADARR_API_KEY=
SONARR_API_KEY=
LIDARR_API_KEY=
MYLAR_API_KEY=
PROWLARR_API_KEY=
LAZYLIBRARIAN_API_KEY=