Allow splitting config, downloads and media paths via .env
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.
This commit is contained in:
2026-04-17 10:40:44 +02:00
parent d9a03a5d25
commit 92aa9b4c22
7 changed files with 292 additions and 112 deletions

View File

@@ -10,8 +10,12 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/sonarr-config:/config
- ${ROOT_DIR}/data:/data
- ${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
@@ -25,8 +29,9 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/radarr-config:/config
- ${ROOT_DIR}/data:/data
- ${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
@@ -40,8 +45,9 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/lidarr-config:/config
- ${ROOT_DIR}/data:/data
- ${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
@@ -54,8 +60,9 @@ services:
- PGID=${MEDIACENTER_GID}
- UMASK=002
volumes:
- ${ROOT_DIR}/config/mylar-config:/config
- ${ROOT_DIR}/data:/data
- ${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
@@ -67,10 +74,10 @@ services:
- user=${AUDIOBOOKSHELF_UID}:${MEDIACENTER_GID}
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/audiobookshelf:/config
- ${ROOT_DIR}/data/media/audiobooks:/audiobooks
- ${ROOT_DIR}/data/media/podcasts:/podcasts
- ${ROOT_DIR}/data/media/audiobookshelf-metadata:/metadata
- ${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
@@ -83,8 +90,8 @@ services:
- PGID=${MEDIACENTER_GID}
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/bazarr-config:/config
- ${ROOT_DIR}/data/media:/media
- ${CONFIG_DIR:-${ROOT_DIR}/config}/bazarr-config:/config
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/media
ports:
- "6767:6767"
restart: unless-stopped
@@ -98,7 +105,7 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/overseerr-config:/app/config
- ${CONFIG_DIR:-${ROOT_DIR}/config}/overseerr-config:/app/config
ports:
- "5055:5055"
restart: unless-stopped
@@ -112,7 +119,7 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/jellyseerr-config:/app/config
- ${CONFIG_DIR:-${ROOT_DIR}/config}/jellyseerr-config:/app/config
ports:
- "5056:5055"
restart: unless-stopped
@@ -126,7 +133,7 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/prowlarr-config:/config
- ${CONFIG_DIR:-${ROOT_DIR}/config}/prowlarr-config:/config
ports:
- "9696:9696"
restart: unless-stopped
@@ -142,7 +149,7 @@ services:
- SECRET_ENCRYPTION_KEY=
ports:
- "7575:7575"
jackett:
image: lscr.io/linuxserver/jackett:latest
container_name: jackett
@@ -150,9 +157,9 @@ services:
- PUID=${JACKETT_UID}
- PGID=${MEDIACENTER_GID}
- UMASK=002
- TZ=${TIMEZONE}
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/jackett-config:/config
- ${CONFIG_DIR:-${ROOT_DIR}/config}/jackett-config:/config
ports:
- 9117:9117
restart: unless-stopped
@@ -179,22 +186,22 @@ services:
- VERSION=docker
- PLEX_CLAIM=${PLEX_CLAIM}
volumes:
- ${ROOT_DIR}/config/plex-config:/config
- ${ROOT_DIR}/data/media:/media
- ${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:
#depends_on:
# - plex
environment:
- PUID=${UID}
- PGID=${MEDIACENTER_GID}
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/tautulli-config:/config
- ${CONFIG_DIR:-${ROOT_DIR}/config}/tautulli-config:/config
ports:
- "8181:8181"
restart: unless-stopped
@@ -208,8 +215,8 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/jellyfin-config:/config
- ${ROOT_DIR}/data/media:/data
- ${CONFIG_DIR:-${ROOT_DIR}/config}/jellyfin-config:/config
- ${MEDIA_DIR:-${ROOT_DIR}/data/media}:/data
ports:
- "8096:8096"
restart: unless-stopped
@@ -224,8 +231,8 @@ services:
- TZ=${TIMEZONE}
- WEBUI_PORT=8080
volumes:
- ${ROOT_DIR}/config/qbittorrent-config:/config
- ${ROOT_DIR}/data/torrents:/data/torrents
- ${CONFIG_DIR:-${ROOT_DIR}/config}/qbittorrent-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}/torrents:/data/torrents
ports:
- "8080:8080"
- "6881:6881"
@@ -241,8 +248,8 @@ services:
- UMASK=002
- TZ=${TIMEZONE}
volumes:
- ${ROOT_DIR}/config/sabnzbd-config:/config
- ${ROOT_DIR}/data/usenet:/data/usenet
- ${CONFIG_DIR:-${ROOT_DIR}/config}/sabnzbd-config:/config
- ${DOWNLOADS_DIR:-${ROOT_DIR}/data}/usenet:/data/usenet
ports:
- "8081:8080"
restart: unless-stopped