15 KiB
author, date, tags
author | date | tags | |
---|---|---|---|
The Bunker Admin | 2025 04 29 |
|
build.mediastack
This script is for getting the mediastack operating on the build.homelab. Also see:
- config.mediastack for configuration instructions
[!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
- Before running the Docker Compose file, ensure all necessary directories exist.
- You'll need to set environment variables or update the Docker Compose file with API keys for services.
- For Plex, which is installed as a .deb rather than as a container, ensure proper drive permissions as mentioned in the configuration notes.
- Adjust all volume paths to match your system's directory structure.
- Consider security implications when exposing ports to the internet.