Some checks failed
Check running / run (push) Has been cancelled
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.
257 lines
6.9 KiB
Plaintext
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
|
|
|