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

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.