# stacks/media/compose.yml
# Jellyfin + Sonarr + Radarr + Prowlarr + Bazarr. The "arr" apps all share
# the same config volume layout under ./data. I keep the indexer behind
# Caddy basic_auth -- see the caddy/security.snippet.
# mercemay.top/src/homelab-compose/ has the wiring diagram.
networks:
media:
driver: bridge
edge:
external: true
name: homelab_edge
services:
jellyfin:
image: jellyfin/jellyfin:10.9
restart: unless-stopped
user: "1000:1000"
environment:
- TZ=${TZ}
devices:
- /dev/dri:/dev/dri # Intel Quick Sync for transcoding
volumes:
- ./data/jellyfin/config:/config
- ./data/jellyfin/cache:/cache
- ${MEDIA_ROOT}:/media:ro
networks: [media, edge]
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8096/health"]
interval: 30s
timeout: 5s
retries: 3
sonarr:
image: lscr.io/linuxserver/sonarr:4.0.9
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- ./data/sonarr:/config
- ${MEDIA_ROOT}/tv:/tv
- ${DOWNLOADS_ROOT}:/downloads
networks: [media, edge]
radarr:
image: lscr.io/linuxserver/radarr:5.10
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- ./data/radarr:/config
- ${MEDIA_ROOT}/movies:/movies
- ${DOWNLOADS_ROOT}:/downloads
networks: [media, edge]
prowlarr:
image: lscr.io/linuxserver/prowlarr:1.24
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- ./data/prowlarr:/config
networks: [media, edge]
bazarr:
image: lscr.io/linuxserver/bazarr:1.4.4
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- ./data/bazarr:/config
- ${MEDIA_ROOT}:/media
networks: [media, edge]
depends_on:
- sonarr
- radarr
sabnzbd:
image: lscr.io/linuxserver/sabnzbd:4.3
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- ./data/sabnzbd:/config
- ${DOWNLOADS_ROOT}:/downloads
- ${DOWNLOADS_ROOT}/incomplete:/incomplete-downloads
networks: [media, edge]