This is an automated archive made by the Lemmit Bot.
The original was posted on /r/selfhosted by /u/ShuaAlfaro on 2025-05-16 08:41:16+00:00.
First of all, please excuse my English in case anything is off; I'm not a native speaker. While my spoken English is good, my written English is not as good.
Hi, I'd like to show you the setup I'm using for my music, TV, and movie streaming service.
If you have any suggestions or ideas to make it better, I'm all ears. Or if you need any extra info.
BTW: If you want to copy something from here, check the indentations, when copying and pasting to Notepadd++ they sometimes move.
I'm using:
Plex: Media Server
Jellyfin: Media Server
Navidrome: Music Server
Wiregard: VPN
qBittorent: Download Manager
Flaresolverr: Proxy Manager for Prowlarr
Jellyserr: Request Manager for Plex and Jellyfin (In this case, I'm using two instances since Jellyserr doesn't allow multiple accounts, so one for Plex and the other for Jellyfin)
Prowlarr: Indexer Manager for Radarr, Sonarr, and Lidarr
Radarr: Media Manager for movies
Sonarr: Media Manager for TV shows
Lidarr: Media Manager for music
Readarr: Media Manager for books
Bazarr: Subtitle Manager
I have it divided into 4 separate containers for reasons that will be explained below.
I leave the compose files below.
First container is Mediarr: Plex, Jellyfin, Flaresolverr, Jellyserr (Both containers), Prowlarr, Radarr, Sonarr, Lidarr, Readarr, Bazarr.
services:
#Plex
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
# network_mode: host
environment:
- PUID=998
- PGID=100
- TZ=TZ/TZ
- VERSION=docker
- PLEX_CLAIM= claim-sFdA9-TkHWHwRu8rtxxN
- device=/dev/dri:/dev/dri
volumes:
- /patch/to/config:/config
- /patch/to/media:/Media
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Jellyfin
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
# - JELLYFIN_PublishedServerUrl=your.domain.com #optional
volumes:
- /patch/to/config:/config
- /patch/to/cache:/cache
- /patct/to/tv:/data/tvshows
- /patch/to/movies:/data/movies
- /patch/to/music:/data/music
ports:
- 8096:8096
- 8920:8920 #optional
- 7359:7359/udp #optional
- 1900:1900/udp #optional
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Flaresolverr
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=TZ/TZ
ports:
- 8191:8191
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Jellyserr Jellyfin
jellyseerr_jelly:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr_jelly
environment:
- LOG_LEVEL=debug
- TZ=TZ/TZ
ports:
- 5055:5055
volumes:
- /patch/to/config:/app/config
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Jellyserr Plex
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
environment:
- LOG_LEVEL=debug
- TZ=TZ/TZ
ports:
- 5055:5055
volumes:
- /Docker/Jellyseerr/config:/app/config
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Bazarr
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
volumes:
- /patch/to/config:/config
- /patch/to/movies:/movies
- /patct/to/tv:/tv
ports:
- 6767:6767
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Prowlarr
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
volumes:
- /patch/to/config:/config
ports:
- 9696:9696
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Radarr
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
volumes:
- /Docker/Mediarr/Radarr/data:/config
- /srv/dev-disk-by-uuid-B0169C9A169C6360/Media/Peliculas:/movies #optional
- /srv/dev-disk-by-uuid-B0169C9A169C6360/Media/Downloads:/downloads #optional
ports:
- 7878:7878
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Readarr
readarr:
image: lscr.io/linuxserver/readarr:develop
container_name: readarr
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
volumes:
- /patch/to/config:/config
- /patch/to/books:/books #optional
- /patch/to/downloads:/downloads
ports:
- 8787:8787
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Sonarr
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
volumes:
- /patch/to/config:/config
- /patct/to/tv:/tv
- /patch/to/downloads:/downloads #optional
ports:
- 8989:8989
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
#Lidarr
lidarr:
image: ghcr.io/hotio/lidarr:pr-plugins
container_name: lidarr
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
volumes:
- /patch/to/config:/config
- /patch/to/music:/music
- /patch/to/downloads:/downloads
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
networks:
MacVlan:
external: true
Please note that I am using Lidarr with plugins, if you want to use regular Lidarr you can simply change the link for the image
Second container is Navidrome (I have it in a separate container in case I want to turn off the "Mediarr" container and not be left without music.)
services:
navidrome:
image: deluan/navidrome:latest
container_name: Navidrome
ports:
- "4533:4533"
environment:
- ND_LOGLEVEL=info
- ND_SCANSCHEDULE=30m
- ND_SESSIONTIMEOUT=24h
- TZ=TZ/TZ
- ND_COVERJPEGQUALITY=100
- ND_DEFAULTLANGUAGE=en (Put es if youre spanish speaker)
- ND_LASTFM_APIKEY=xxxxxxxxxx #optional (if youre using lasfm scrobble)
- ND_LASTFM_SECRET=xxxxxxxxxx #optional (if youre using lasfm scrobble)
- ND_LASTFM_LANGUAGE=en (Put es if youre spanish speaker)
- ND_SPOTIFY_ID=xxxxxxxxxx(if youre using spotify for metadata or something else)
- ND_SPOTIFY_SECRET=xxxxxxxxxx(if youre using spotify for metadata or something else)
- ND_PORT=4040
volumes:
- /patch/to/config:/data
- /patch/to/music:/music:ro
networks:
MacVlan:
ipv4_address: xxx.xxxx.xxx.xxx
restart: "unless-stopped"
networks:
MacVlan:
external: true
Third container is qBittorrent (Same reason as Navidrome, if I ever turn off "Mediarr" I use qBittorrent for other downloads)
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
- WEBUI_PORT=8080
- TORRENTING_PORT=6881
volumes:
- /patch/to/config:/config
- /patch/to/downloads:/downloads #optional
ports:
- 8080:8080
- 6881:6881
- 6881:6881/udp
networks:
MacVlan:
ipv4_address: xxx.xxx.xxx.xxx
restart: "unless-stopped"
networks:
MacVlan:
external: true
Forth container is Wireguard
services:
wireguard:
image: ghcr.io/linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=TZ/TZ
- SERVERURL=your.domain.com #optional
- SERVERPORT=51820 #optional
- PEERS=5 #optional
- PEERDNS=auto #optional (If you're using Pihole, I recommend keeping it set to auto)
Below you can configure Pihole's DNS resolver.)
- INTERNAL_SUBNET=10.13.13.0 #optional
- ALLOWEDIPS=0.0.0.0/0 #optional
volumes:
- /patch/to/config:/config
- /patch/to/libraries:/lib/modules
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
dns:
- xxx.xxx.xxx.xxx (Your pihole ip address)
restart: "unless-stopped"
There's something special about using Wireguard in my specific case.
I'm using OMV as my primary system, and almost all of my containers are on a MacVLAN network, so the host can't see the MacVLAN containers (and in my specific case, I can't use pihole as my DNS resolver in this setup).
If that's your case, you want to copy the way I did it, or you want your containers on MacVLAN and pihole in "normal mode," you'll need this command in a scheduled task in OMV.
This is so the Host can see the MacVlan containers.
sleep 600; ip link add (a name for the network) link enp0s25 type macvlan mode bridge && ip addr add (an ip inside your MacVlan container network that is not on use) dev (same name as the other) && ip link set (same name as the other) up && ip route add (ip subnet for the MacVlan network) dev (same name as t...
***
Content cut off. Read original on https://old.reddit.com/r/selfhosted/comments/1knvyck/everything_you_need_for_your_streaming_server/