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

@@ -2,38 +2,46 @@ import os
class UserGroupSetup:
def __init__(self, root_dir='/'):
def __init__(self, root_dir='/', config_dir=None, downloads_dir=None, media_dir=None):
self.root_dir = root_dir
# Individual location overrides with ROOT_DIR-based fallbacks.
self.config_dir = config_dir or f'{root_dir}/config'
self.downloads_dir = downloads_dir or f'{root_dir}/data'
self.media_dir = media_dir or f'{root_dir}/data/media'
os.system('sudo groupadd mediacenter -g 13000')
os.system('sudo usermod -a -G mediacenter $USER')
os.system(
'/bin/bash -c "sudo mkdir -pv ' + self.root_dir + '/data/{media,usenet,torrents} -m 775'
' ; sudo chown $(id -u):mediacenter ' + self.root_dir + '/data'
' ; sudo chown $(id -u):mediacenter ' + self.root_dir + '/data/{media,usenet,torrents}"'
f'/bin/bash -c "sudo mkdir -pv {self.downloads_dir}/{{usenet,torrents}} -m 775'
f' ; sudo mkdir -pv {self.media_dir} -m 775'
f' ; sudo chown $(id -u):mediacenter {self.downloads_dir}'
f' ; sudo chown $(id -u):mediacenter {self.downloads_dir}/{{usenet,torrents}}'
f' ; sudo chown $(id -u):mediacenter {self.media_dir}"'
)
def create_config_dir(self, service_name):
os.system(
f'sudo mkdir -p {self.root_dir}/config/{service_name}-config -m 775' # -m 775 gives read/write access to the whole mediacenter group, change to 755 for only read
f' ; sudo chown -R {service_name}:mediacenter {self.root_dir}/config/{service_name}-config'
f' ; sudo chown $(id -u):mediacenter {self.root_dir}/config'
f'sudo mkdir -p {self.config_dir}/{service_name}-config -m 775' # -m 775 gives read/write access to the whole mediacenter group, change to 755 for only read
f' ; sudo chown -R {service_name}:mediacenter {self.config_dir}/{service_name}-config'
f' ; sudo chown $(id -u):mediacenter {self.config_dir}'
)
def _make_media_subdir(self, service_name, uid, media_subdir):
"""Create matching subdirs under downloads/ and media/ and chown them to the given service user."""
os.system(
f'/bin/bash -c "sudo useradd {service_name} -u {uid}'
f' ; sudo mkdir -pv {self.downloads_dir}/{{usenet,torrents}}/{media_subdir} -m 775'
f' ; sudo mkdir -pv {self.media_dir}/{media_subdir} -m 775'
f' ; sudo chown -R {service_name}:mediacenter {self.downloads_dir}/{{usenet,torrents}}/{media_subdir}'
f' ; sudo chown -R {service_name}:mediacenter {self.media_dir}/{media_subdir}"'
)
def sonarr(self):
os.system(
'/bin/bash -c "sudo useradd sonarr -u 13001'
' ; sudo mkdir -pv ' + self.root_dir + '/data/{media,usenet,torrents}/tv -m 775'
' ; sudo chown -R sonarr:mediacenter ' + self.root_dir + '/data/{media,usenet,torrents}/tv"'
)
self._make_media_subdir('sonarr', 13001, 'tv')
self.create_config_dir('sonarr')
os.system('sudo usermod -a -G mediacenter sonarr')
def radarr(self):
os.system(
'/bin/bash -c "sudo useradd radarr -u 13002'
' ; sudo mkdir -pv ' + self.root_dir + '/data/{media,usenet,torrents}/movies -m 775'
' ; sudo chown -R radarr:mediacenter ' + self.root_dir + '/data/{media,usenet,torrents}/movies"'
)
self._make_media_subdir('radarr', 13002, 'movies')
self.create_config_dir('radarr')
os.system('sudo usermod -a -G mediacenter radarr')
@@ -43,28 +51,20 @@ class UserGroupSetup:
os.system('sudo usermod -a -G mediacenter bazarr')
def lidarr(self):
os.system(
'/bin/bash -c "sudo useradd lidarr -u 13003'
' ; sudo mkdir -pv ' + self.root_dir + '/data/{media,usenet,torrents}/music -m 775'
' ; sudo chown -R lidarr:mediacenter ' + self.root_dir + '/data/{media,usenet,torrents}/music"'
)
self._make_media_subdir('lidarr', 13003, 'music')
self.create_config_dir('lidarr')
os.system('sudo usermod -a -G mediacenter lidarr')
def mylar3(self):
os.system(
'/bin/bash -c "sudo useradd mylar -u 13005'
' ; sudo mkdir -pv ' + self.root_dir + '/data/{media,usenet,torrents}/comics -m 775'
' ; sudo chown -R mylar:mediacenter ' + self.root_dir + '/data/{media,usenet,torrents}/comics"'
)
self._make_media_subdir('mylar', 13005, 'comics')
self.create_config_dir('mylar')
os.system('sudo usermod -a -G mediacenter mylar')
def audiobookshelf(self):
os.system(
'/bin/bash -c "sudo useradd audiobookshelf -u 13014'
' ; sudo mkdir -pv ' + self.root_dir + '/data/media/{audiobooks,podcasts,audiobookshelf-metadata} -m 775'
' ; sudo chown -R audiobookshelf:mediacenter ' + self.root_dir + '/data/media/{audiobooks,podcasts,audiobookshelf-metadata}"'
f'/bin/bash -c "sudo useradd audiobookshelf -u 13014'
f' ; sudo mkdir -pv {self.media_dir}/{{audiobooks,podcasts,audiobookshelf-metadata}} -m 775'
f' ; sudo chown -R audiobookshelf:mediacenter {self.media_dir}/{{audiobooks,podcasts,audiobookshelf-metadata}}"'
)
self.create_config_dir('audiobookshelf')
os.system('sudo usermod -a -G mediacenter audiobookshelf')