Files
ezarr/docker-compose.yml.sample
dtoro 92aa9b4c22
Some checks failed
Check running / run (push) Has been cancelled
Allow splitting config, downloads and media paths via .env
Adds optional CONFIG_DIR, DOWNLOADS_DIR and MEDIA_DIR env variables so
users can spread configs, downloads and media across different drives
without restructuring ROOT_DIR. Each falls back to its ROOT_DIR-based
default when left empty, so existing setups keep working unchanged.

The -arr services (sonarr, radarr, lidarr, mylar3) now use a single
${DOWNLOADS_DIR}:/data parent bind with a ${MEDIA_DIR}:/data/media
overlay. This preserves TRaSH's single-/data-mount semantics inside
the container (hardlinks still work on one filesystem) while letting
the host-side media tree live wherever the user wants.

README documents the new variables, the generated folder structure,
recommended storage layouts, and the same-filesystem requirement for
hardlinks between downloads and media.
2026-04-17 10:40:44 +02:00

257 lines
6.9 KiB
Plaintext

---
name: ezarr
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=${SONARR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/sonarr-config:/config
# Single /data parent mount (TRaSH-style) + MEDIA_DIR overlay at /data/media.
# When MEDIA_DIR is left at its default, the overlay is redundant but harmless;
# when overridden, it transparently redirects /data/media to the new location.
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}:/data
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/data/media
ports:
- "8989:8989"
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=${RADARR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/radarr-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}:/data
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/data/media
ports:
- "7878:7878"
restart: unless-stopped
lidarr:
image: lscr.io/linuxserver/lidarr:latest
container_name: lidarr
environment:
- PUID=${LIDARR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/lidarr-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}:/data
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/data/media
ports:
- "8686:8686"
restart: unless-stopped
mylar3:
image: lscr.io/linuxserver/mylar3:latest
container_name: mylar3
environment:
- PUID=${MYLAR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/mylar-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}:/data
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/data/media
ports:
- "8090:8090"
restart: unless-stopped
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
environment:
- user=${AUDIOBOOKSHELF_UID}:${MEDIACENTER_GID}
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/audiobookshelf:/config
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}/audiobooks:/audiobooks
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}/podcasts:/podcasts
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}/audiobookshelf-metadata:/metadata
ports:
- "13378:80"
restart: unless-stopped
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
environment:
- PUID=${BAZARR_UID}
- PGID=${MEDIACENTER_GID}
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/bazarr-config:/config
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/media
ports:
- "6767:6767"
restart: unless-stopped
overseerr:
image: sctx/overseerr:latest
container_name: overseerr
environment:
- PUID=${OVERSEERR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/overseerr-config:/app/config
ports:
- "5055:5055"
restart: unless-stopped
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
environment:
- PUID=${JELLYSEERR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/jellyseerr-config:/app/config
ports:
- "5056:5055"
restart: unless-stopped
prowlarr:
image: lscr.io/linuxserver/prowlarr:develop
container_name: prowlarr
environment:
- PUID=${PROWLARR_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/prowlarr-config:/config
ports:
- "9696:9696"
restart: unless-stopped
homarr:
container_name: homarr
image: ghcr.io/homarr-labs/homarr:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration
- ./homarr/appdata:/appdata
environment:
- SECRET_ENCRYPTION_KEY=
ports:
- "7575:7575"
jackett:
image: lscr.io/linuxserver/jackett:latest
container_name: jackett
environment:
- PUID=${JACKETT_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/jackett-config:/config
ports:
- 9117:9117
restart: unless-stopped
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=${TIMEZONE}
ports:
- "8191:8191"
restart: unless-stopped
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
network_mode: host
environment:
- PUID=${PLEX_UID}
- PGID=${MEDIACENTER_GID}
- VERSION=docker
- PLEX_CLAIM=${PLEX_CLAIM}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/plex-config:/config
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/media
restart: unless-stopped
tautulli:
image: lscr.io/linuxserver/tautulli:latest
container_name: tautulli
# commented out because plex can also run outside of docker
#depends_on:
# - plex
environment:
- PUID=${UID}
- PGID=${MEDIACENTER_GID}
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/tautulli-config:/config
ports:
- "8181:8181"
restart: unless-stopped
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=${UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/jellyfin-config:/config
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/data
ports:
- "8096:8096"
restart: unless-stopped
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=${QBITTORRENT_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
- WEBUI_PORT=8080
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/qbittorrent-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}/torrents:/data/torrents
ports:
- "8080:8080"
- "6881:6881"
- "6881:6881/udp"
restart: unless-stopped
sabnzbd:
image: lscr.io/linuxserver/sabnzbd:latest
container_name: sabnzbd
environment:
- PUID=${SABNZBD_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${CONFIG_DIR:-${ROOT_DIR}/config}/sabnzbd-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}/usenet:/data/usenet
ports:
- "8081:8080"
restart: unless-stopped