586 lines
15 KiB
Markdown
586 lines
15 KiB
Markdown
---
|
|
author: The Bunker Admin
|
|
date: 2025 04 29
|
|
tags: [sript]
|
|
---
|
|
## 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.](https://www.plex.tv/media-server-downloads/?cat=computer&plat=linux#plex-media-server)
|
|
#### 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](https://hub.docker.com/r/linuxserver/qbittorrent)
|
|
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](https://github.com/FlareSolverr/FlareSolverr)
|
|
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](https://hub.docker.com/r/linuxserver/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](https://hub.docker.com/r/linuxserver/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](https://hub.docker.com/r/linuxserver/overseerr)
|
|
Web-based user interface for requesting and managing media.
|
|
|
|
```yaml
|
|
---
|
|
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](https://hub.docker.com/r/linuxserver/sonarr)
|
|
Requests and handles media files for TV shows.
|
|
|
|
```yaml
|
|
---
|
|
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](https://github.com/gethomepage/homepage)
|
|
A modern dashboard for all your services and monitoring.
|
|
|
|
```yaml
|
|
---
|
|
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](https://github.com/Tautulli/Tautulli)
|
|
Monitors and tracks Plex Media Server usage statistics.
|
|
|
|
```yaml
|
|
---
|
|
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](https://github.com/whisparr/whisparr)
|
|
Manages adult content media files.
|
|
|
|
```yaml
|
|
---
|
|
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](https://hub.docker.com/r/linuxserver/bazarr)
|
|
Manages and downloads subtitles for media files.
|
|
|
|
```yaml
|
|
---
|
|
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](https://github.com/manimatter/decluttarr)
|
|
Manages and cleans up download clients and *arr applications.
|
|
|
|
```yaml
|
|
---
|
|
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.
|
|
|
|
```yaml
|
|
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. |