scripts/build.mediastack.md
2025-05-05 11:58:47 -06:00

15 KiB

author, date, tags
author date tags
The Bunker Admin 2025 04 29
sript

build.mediastack

This script is for getting the mediastack operating on the build.homelab. Also see:

[!note] Repository

This entire stack is available as a repository for download. Contact admin@thebunkerops.ca for more information.


I am going to use Docker Compose to do this full deployment. With some tweaking, should be able to get this whole system up and running in a single .yml that can be shared later.

Plex

Plex is installed as a .deb. It can be downloaded from the Plex website.

Plex also requires setup of drive permissions to access data on drives. See the config.drives.homelab#Plex Media Permissions for more info.

Full Docker Compose

*Individual services defined below

[!info] Drive Setup

The volumes section of the entire docker compose do need to be updated to point to the necessary directories on the users system.

---
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - WEBUI_PORT=8082
      - TORRENTING_PORT=6881
    volumes:
      - /mnt/storage4tb/mediastack/configs/qbittorrent:/config
      - /mnt/storage4tb/mediastack/media/downloads:/downloads
    ports:
      - 8082:8082
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped
    networks:
      - media

  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - LOG_HTML=${LOG_HTML:-false}
      - CAPTCHA_SOLVER=${CAPTCHA_SOLVER:-none}
      - TZ=Europe/London
    ports:
      - "${PORT:-8191}:8191"
    restart: unless-stopped
    networks:
      - media

  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/prowlarr:/config
    ports:
      - 9696:9696
    restart: unless-stopped
    networks:
      - media

  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/radarr:/config
      - /mnt/storage4tb/mediastack/media/movies:/movies
      - /mnt/storage4tb/mediastack/media/downloads:/downloads
    ports:
      - 7878:7878
    restart: unless-stopped
    networks:
      - media

  overseerr:
    image: lscr.io/linuxserver/overseerr:latest
    container_name: overseerr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/overseerr:/config
    ports:
      - 5055:5055
    restart: unless-stopped
    networks:
      - media

  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/sonarr:/config
      - /mnt/storage4tb/mediastack/media/tv:/tv
      - /mnt/storage4tb/mediastack/media/downloads:/downloads
    ports:
      - 8989:8989
    restart: unless-stopped
    networks:
      - media


  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - /mnt/storage4tb/mediastack/configs/homepage:/app/config
      - /mnt/storage4tb/mediastack/configs/homepage/images:/app/public/images
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - HOMEPAGE_ALLOWED_HOSTS=*
    restart: unless-stopped
    networks:
      - media


  tautulli:
    image: ghcr.io/tautulli/tautulli:latest
    container_name: tautulli
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/tautulli:/config
    ports:
      - 8181:8181
    restart: unless-stopped
    networks:
      - media

  whisparr:
    image: ghcr.io/hotio/whisparr:latest
    container_name: whisparr
    environment:
      - PUID=1000
      - PGID=1000
      - UMASK=002
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/whisparr:/config
      - /mnt/storage4tb/mediastack/media/other:/other
      - /mnt/storage4tb/mediastack/media/downloads:/downloads
    ports:
      - 6969:6969
    restart: unless-stopped
    networks:
      - media

  bazarr:
    image: lscr.io/linuxserver/bazarr:latest
    container_name: bazarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/bazarr:/config
      - /mnt/storage4tb/mediastack/media/movies:/movies
      - /mnt/storage4tb/mediastack/media/tv:/tv
    ports:
      - 6767:6767
    restart: unless-stopped
    networks:
      - media

  decluttarr:
    image: ghcr.io/manimatter/decluttarr:latest
    container_name: decluttarr
    restart: always
    depends_on:
      - radarr
      - sonarr
      - whisparr
    networks:
      - media
    environment:
      TZ: mnt/Canada/Edmonton
      PUID: 1000
      PGID: 1000

      ## General
      # TEST_RUN: True
      # SSL_VERIFICATION: False
      LOG_LEVEL: INFO

      ## Features
      REMOVE_TIMER: 10
      REMOVE_FAILED: True
      REMOVE_FAILED_IMPORTS: True
      REMOVE_METADATA_MISSING: True
      REMOVE_MISSING_FILES: True
      REMOVE_ORPHANS: True
      REMOVE_SLOW: True
      REMOVE_STALLED: True
      REMOVE_UNMONITORED: True
      RUN_PERIODIC_RESCANS: '
        {
        "SONARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7},
        "RADARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7}
        }'

      # Feature Settings
      PERMITTED_ATTEMPTS: 3
      NO_STALLED_REMOVAL_QBIT_TAG: Don't Kill
      MIN_DOWNLOAD_SPEED: 100
      FAILED_IMPORT_MESSAGE_PATTERNS: '
        [
        "Not a Custom Format upgrade for existing",
        "Not an upgrade for existing"
        ]'
      IGNORED_DOWNLOAD_CLIENTS: '
        [
        ]'

      ## Radarr
      RADARR_URL: ${RADARR_URL:-http://radarr:7878}
      RADARR_KEY: ${RADARR_API_KEY}

      ## Sonarr
      SONARR_URL: ${SONARR_URL:-http://sonarr:8989}
      SONARR_KEY: ${SONARR_API_KEY}

      ## Whisparr
      WHISPARR_URL: ${WHISPARR_URL:-http://whisparr:6969}
      WHISPARR_KEY: ${WHISPARR_API_KEY}

      ## qBitorrent
      QBITTORRENT_URL: ${QBITTORRENT_URL:-http://qbittorrent:8080}
      QBITTORRENT_USERNAME: ${QBITTORRENT_USERNAME:-admin}
      QBITTORRENT_PASSWORD: ${QBITTORRENT_PASSWORD:-adminadmin}


networks:
  media:
    driver: bridge

Qbitorrent

Getting started with Qbitorrent

---
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - WEBUI_PORT=8082
      - TORRENTING_PORT=6881
    volumes:
      - /media/bunker-admin/archive/media/configs/qbittorrent:/config
      - /media/bunker-admin/archive/media/downloads:/downloads
    ports:
      - 8082:8082
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped

Flaresoverr

Flaresoverr helps Prowlarr with cloudflare challenges.

---
services: 
  flaresolverr:
    # DockerHub mirror flaresolverr/flaresolverr:latest
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - LOG_HTML=${LOG_HTML:-false}
      - CAPTCHA_SOLVER=${CAPTCHA_SOLVER:-none}
      - TZ=Europe/London
    ports:
      - "${PORT:-8191}:8191"
    restart: unless-stopped

Prowlarr

Handles the indexers (torrent backend).

---
services: 
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /media/bunker-admin/archive/media/configs/prowlarr:/config
    ports:
      - 9696:9696
    restart: unless-stopped

Radarr

Requests and handles media files for movies.

---
services: 
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /media/bunker-admin/archive/media/configs/radarr:/config
      - /media/bunker-admin/archive/media/movies:/movies
      - /media/bunker-admin/archive/media/downloads:/downloads
    ports:
      - 7878:7878
    restart: unless-stopped

Overseerr

Web-based user interface for requesting and managing media.

---
services:
  overseerr:
    image: lscr.io/linuxserver/overseerr:latest
    container_name: overseerr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/overseerr:/config
    ports:
      - 5055:5055
    restart: unless-stopped
    networks:
      - media

Sonarr

Requests and handles media files for TV shows.

---
services:
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/sonarr:/config
      - /mnt/storage4tb/mediastack/media/tv:/tv
      - /mnt/storage4tb/mediastack/media/downloads:/downloads
    ports:
      - 8989:8989
    restart: unless-stopped
    networks:
      - media

Homepage

A modern dashboard for all your services and monitoring.

---
services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - /mnt/storage4tb/mediastack/configs/homepage:/app/config
      - /mnt/storage4tb/mediastack/configs/homepage/images:/app/public/images
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - HOMEPAGE_ALLOWED_HOSTS=*
    restart: unless-stopped
    networks:
      - media

Tautulli

Monitors and tracks Plex Media Server usage statistics.

---
services:
  tautulli:
    image: ghcr.io/tautulli/tautulli:latest
    container_name: tautulli
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/tautulli:/config
    ports:
      - 8181:8181
    restart: unless-stopped
    networks:
      - media

Whisparr

Manages adult content media files.

---
services:
  whisparr:
    image: ghcr.io/hotio/whisparr:latest
    container_name: whisparr
    environment:
      - PUID=1000
      - PGID=1000
      - UMASK=002
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/whisparr:/config
      - /mnt/storage4tb/mediastack/media/other:/other
      - /mnt/storage4tb/mediastack/media/downloads:/downloads
    ports:
      - 6969:6969
    restart: unless-stopped
    networks:
      - media

Bazarr

Manages and downloads subtitles for media files.

---
services:
  bazarr:
    image: lscr.io/linuxserver/bazarr:latest
    container_name: bazarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /mnt/storage4tb/mediastack/configs/bazarr:/config
      - /mnt/storage4tb/mediastack/media/movies:/movies
      - /mnt/storage4tb/mediastack/media/tv:/tv
    ports:
      - 6767:6767
    restart: unless-stopped
    networks:
      - media

Decluttarr

Manages and cleans up download clients and *arr applications.

---
services:
  decluttarr:
    image: ghcr.io/manimatter/decluttarr:latest
    container_name: decluttarr
    restart: always
    depends_on:
      - radarr
      - sonarr
      - whisparr
    networks:
      - media
    environment:
      TZ: mnt/Canada/Edmonton
      PUID: 1000
      PGID: 1000

      ## General
      # TEST_RUN: True
      # SSL_VERIFICATION: False
      LOG_LEVEL: INFO

      ## Features
      REMOVE_TIMER: 10
      REMOVE_FAILED: True
      REMOVE_FAILED_IMPORTS: True
      REMOVE_METADATA_MISSING: True
      REMOVE_MISSING_FILES: True
      REMOVE_ORPHANS: True
      REMOVE_SLOW: True
      REMOVE_STALLED: True
      REMOVE_UNMONITORED: True
      RUN_PERIODIC_RESCANS: '
        {
        "SONARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7},
        "RADARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7}
        }'

      # Feature Settings
      PERMITTED_ATTEMPTS: 3
      NO_STALLED_REMOVAL_QBIT_TAG: Don't Kill
      MIN_DOWNLOAD_SPEED: 100
      FAILED_IMPORT_MESSAGE_PATTERNS: '
        [
        "Not a Custom Format upgrade for existing",
        "Not an upgrade for existing"
        ]'
      IGNORED_DOWNLOAD_CLIENTS: '
        [
        ]'

      ## Radarr
      RADARR_URL: ${RADARR_URL:-http://radarr:7878}
      RADARR_KEY: ${RADARR_API_KEY}

      ## Sonarr
      SONARR_URL: ${SONARR_URL:-http://sonarr:8989}
      SONARR_KEY: ${SONARR_API_KEY}

      ## Whisparr
      WHISPARR_URL: ${WHISPARR_URL:-http://whisparr:6969}
      WHISPARR_KEY: ${WHISPARR_API_KEY}

      ## qBitorrent
      QBITTORRENT_URL: ${QBITTORRENT_URL:-http://qbittorrent:8080}
      QBITTORRENT_USERNAME: ${QBITTORRENT_USERNAME:-admin}
      QBITTORRENT_PASSWORD: ${QBITTORRENT_PASSWORD:-adminadmin}

Network Configuration

The Docker Compose file creates a dedicated bridge network for all media services to communicate with each other.

networks:
  media:
    driver: bridge

Setup Notes

  1. Before running the Docker Compose file, ensure all necessary directories exist.
  2. You'll need to set environment variables or update the Docker Compose file with API keys for services.
  3. For Plex, which is installed as a .deb rather than as a container, ensure proper drive permissions as mentioned in the configuration notes.
  4. Adjust all volume paths to match your system's directory structure.
  5. Consider security implications when exposing ports to the internet.