From 1df5f3aae0587e6ef96c90e921bd0f6cc2df2585 Mon Sep 17 00:00:00 2001 From: kelinfoxy <67766943+kelinfoxy@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:49:04 -0400 Subject: [PATCH] Add media-management template --- docker-templates/media-management/.env | 40 +++ .../media-management/docker-compose.yaml | 329 ++++++++++++++++++ docker-templates/media-management/readme.md | 17 + .../media-management/remote-server.yaml | 141 ++++++++ registry.json | 2 +- 5 files changed, 528 insertions(+), 1 deletion(-) create mode 100644 docker-templates/media-management/.env create mode 100644 docker-templates/media-management/docker-compose.yaml create mode 100644 docker-templates/media-management/readme.md create mode 100644 docker-templates/media-management/remote-server.yaml diff --git a/docker-templates/media-management/.env b/docker-templates/media-management/.env new file mode 100644 index 0000000..bbbf07b --- /dev/null +++ b/docker-templates/media-management/.env @@ -0,0 +1,40 @@ +# ####################################################### +# Templating variables, not used by compose file directly +SERVER_NAME= +SERVER_IP= +SUBDOMAIN= +ICON_URL=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/${SERVICE_NAME}.svg + + +# ############################################################################# +# Compose file variables + +TZ=America/New_York +PUID=1000 +PGID=1000 + +DOMAIN=${SUBDOMAIN}.duckdns.org + +# Default credentials (used by multiple services) +# For better security: replace each ${DEFAULT_PASSWORD} with unique values +DEFAULT_USER= +DEFAULT_EMAIL= + +# FOLDER PATHS +MEDIA_DIR=/mnt/media # Large media files on separate drive +DOWNLOAD_DIR=/mnt/downloads # Downloads on separate drive + + +# Host label defines the domain for each service when Traefik is on the same server +SONARR_HOST_LABEL=traefik.http.routers.sonarr.rule=Host(`sonarr.${DOMAIN}`) +RADARR_HOST_LABEL=traefik.http.routers.radarr.rule=Host(`radarr.${DOMAIN}`) +PROWLARR_HOST_LABEL=traefik.http.routers.prowlarr.rule=Host(`prowlarr.${DOMAIN}`) +READARR_HOST_LABEL=traefik.http.routers.readarr.rule=Host(`readarr.${DOMAIN}`) +LIDARR_HOST_LABEL=traefik.http.routers.lidarr.rule=Host(`lidarr.${DOMAIN}`) +LAZYLIBRARIAN_HOST_LABEL=traefik.http.routers.lazylibrarian.rule=Host(`lazylibrarian.${DOMAIN}`) +MYLAR3_HOST_LABEL=traefik.http.routers.mylar3.rule=Host(`mylar3.${DOMAIN}`) +JELLYSEER_HOST_LABEL=traefik.http.routers.jellyseer.rule=Host(`jellyseer.${DOMAIN}`) + + + + diff --git a/docker-templates/media-management/docker-compose.yaml b/docker-templates/media-management/docker-compose.yaml new file mode 100644 index 0000000..320c620 --- /dev/null +++ b/docker-templates/media-management/docker-compose.yaml @@ -0,0 +1,329 @@ +services: + sonarr: + # Sonarr - TV show management and automation + image: linuxserver/sonarr:4.0.0 + container_name: sonarr + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '8989:8989' + volumes: + - ./sonarr/config:/config + - ${MEDIA_DIR}:/media + - ${DOWNLOAD_DIR}:/downloads # Large downloads on separate drive + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:8989/'] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + labels: + - ${SONARR_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/sonarr.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with Sonarr' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.sonarr.entrypoints=websecure' + - 'traefik.http.routers.sonarr.tls.certresolver=letsencrypt' + - 'traefik.http.routers.sonarr.middlewares=authelia@docker' + - 'traefik.http.services.sonarr.loadbalancer.server.port=8989' + + # Radarr - Movie automation + radarr: + image: linuxserver/radarr:5.2.6 + container_name: radarr + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '7878:7878' + volumes: + - ./radarr/config:/config + - ${MEDIA_DIR}:/media + - ${DOWNLOAD_DIR}:/downloads # Large downloads on separate drive + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:7878/'] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + labels: + - ${RADARR_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/radarr.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with Radarr' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.radarr.entrypoints=websecure' + - 'traefik.http.routers.radarr.tls.certresolver=letsencrypt' + - 'traefik.http.routers.radarr.middlewares=authelia@docker' + - 'traefik.http.services.radarr.loadbalancer.server.port=7878' + + # Prowlarr - Indexer manager + prowlarr: + image: linuxserver/prowlarr:1.11.4 + container_name: prowlarr + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '9696:9696' + volumes: + - ./prowlarr/config:/config + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9696/'] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + labels: + - ${PROWLARR_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/prowlarr.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Prowlarr indexer management' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.prowlarr.entrypoints=websecure' + - 'traefik.http.routers.prowlarr.tls.certresolver=letsencrypt' + - 'traefik.http.routers.prowlarr.middlewares=authelia@docker' + - 'traefik.http.services.prowlarr.loadbalancer.server.port=9696' + + + # Readarr - Ebook and audiobook management + readarr: + image: linuxserver/readarr:0.4.19-nightly + container_name: readarr + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '8787:8787' + volumes: + - ./readarr/config:/config + - ${MEDIA_DIR}/books:/books + - ${DOWNLOAD_DIR}:/downloads + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + labels: + - ${READARR_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/readarr.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with Readarr' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.readarr.entrypoints=websecure' + - 'traefik.http.routers.readarr.tls.certresolver=letsencrypt' + - 'traefik.http.routers.readarr.middlewares=authelia@docker' + - 'traefik.http.services.readarr.loadbalancer.server.port=8787' + + # Lidarr - Music collection manager + lidarr: + image: linuxserver/lidarr:2.0.7 + container_name: lidarr + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '8686:8686' + volumes: + - ./lidarr/config:/config + - ${MEDIA_DIR}/music:/music + - ${DOWNLOAD_DIR}:/downloads + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + labels: + - ${LIDARR_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/lidarr.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with Lidarr' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.lidarr.entrypoints=websecure' + - 'traefik.http.routers.lidarr.tls.certresolver=letsencrypt' + - 'traefik.http.routers.lidarr.middlewares=authelia@docker' + - 'traefik.http.services.lidarr.loadbalancer.server.port=8686' + + + # Lazy Librarian - Book manager + lazylibrarian: + image: linuxserver/lazylibrarian:latest + container_name: lazylibrarian + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '5299:5299' + volumes: + - ./lazylibrarian/config:/config + - ${MEDIA_DIR}/books:/books + - ${DOWNLOAD_DIR}:/downloads + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + - DOCKER_MODS=linuxserver/mods:lazylibrarian-ffmpeg + labels: + - ${LAZYLIBRARIAN_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/lazylibrarian.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with LazyLibrarian' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.lazylibrarian.entrypoints=websecure' + - 'traefik.http.routers.lazylibrarian.tls.certresolver=letsencrypt' + - 'traefik.http.routers.lazylibrarian.middlewares=authelia@docker' + - 'traefik.http.services.lazylibrarian.loadbalancer.server.port=5299' + + # Mylar3 - Comic book manager + mylar3: + image: linuxserver/mylar3:latest + container_name: mylar3 + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '8090:8090' + volumes: + - ./mylar3/config:/config + - ${MEDIA_DIR}/comics:/comics + - ${DOWNLOAD_DIR}:/downloads + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/New_York + labels: + - ${MYLAR3_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/mylar3.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with Mylar3' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.mylar3.entrypoints=websecure' + - 'traefik.http.routers.mylar3.tls.certresolver=letsencrypt' + - 'traefik.http.routers.mylar3.middlewares=authelia@docker' + - 'traefik.http.services.mylar3.loadbalancer.server.port=8090' + + + # Jellyseerr - Request management for Jellyfin/Plex + jellyseerr: + image: fallenbagel/jellyseerr:latest + container_name: jellyseerr + restart: unless-stopped + networks: + - homelab-network + - traefik-network + ports: + - '5055:5055' + volumes: + - ./jellyseerr/config:/app/config + environment: + - LOG_LEVEL=info + - TZ=America/New_York + healthcheck: + test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:5055/'] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + labels: + - ${JELLYSEERR_HOST_LABEL} + - com.getarcaneapp.arcane.icon=https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/jellyseerr.svg + - 'com.centurylinklabs.watchtower.enable=true' + - 'homelab.category=Media Management' + - 'homelab.description=Media management with Jellyseerr' + - 'traefik.enable=true' + - 'traefik.docker.network=traefik-network' + - 'traefik.http.routers.jellyseerr.entrypoints=websecure' + - 'traefik.http.routers.jellyseerr.tls.certresolver=letsencrypt' + - 'traefik.http.routers.jellyseerr.middlewares=authelia@docker' + - 'traefik.http.services.jellyseerr.loadbalancer.server.port=5055' + + # FlareSolverr - Cloudflare bypass for Prowlarr + # No web UI - used by Prowlarr + flaresolverr: + image: flaresolverr/flaresolverr:latest + container_name: flaresolverr + restart: unless-stopped + networks: + - homelab-network + environment: + - LOG_LEVEL=info + - TZ=America/New_York + + +networks: + homelab-network: + external: true + traefik-network: + external: true + +x-dockge: + urls: + - https://sonarr${DOMAIN} + - ${SERVER_IP}8989 + - https://radarr${DOMAIN} + - ${SERVER_IP}7878 + - https://prowlarr${DOMAIN} + - ${SERVER_IP}9696 + - https://readarr${DOMAIN} + - ${SERVER_IP}8787 + - https://lidarr${DOMAIN} + - ${SERVER_IP}8686 + - https://lazylibrarian${DOMAIN} + - ${SERVER_IP}5299 + - https://mylar3${DOMAIN} + - ${SERVER_IP}8090 + - https://jellyseerr${DOMAIN} + - ${SERVER_IP}5055 + +x-arcane: + icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/servarr.svg + urls: + - https://sonarr${DOMAIN} + - ${SERVER_IP}8989 + - https://radarr${DOMAIN} + - ${SERVER_IP}7878 + - https://prowlarr${DOMAIN} + - ${SERVER_IP}9696 + - https://readarr${DOMAIN} + - ${SERVER_IP}8787 + - https://lidarr${DOMAIN} + - ${SERVER_IP}8686 + - https://lazylibrarian${DOMAIN} + - ${SERVER_IP}5299 + - https://mylar3${DOMAIN} + - ${SERVER_IP}8090 + - https://jellyseerr${DOMAIN} + - ${SERVER_IP}5055 \ No newline at end of file diff --git a/docker-templates/media-management/readme.md b/docker-templates/media-management/readme.md new file mode 100644 index 0000000..69ace8c --- /dev/null +++ b/docker-templates/media-management/readme.md @@ -0,0 +1,17 @@ +# Media Management Stack + +>If Traefik is on a different server see [remote-server.yaml](https://gitea.kelinreij.duckdns.org/kelin/arcane-registry/src/branch/main/docker-templates/media-management/remote-server.yaml) + +## Radarr + +## Sonarr + +## Lidarr + +## Readarr + +## LazyLibrarian + +## Mylar3 + +## Flaresolverr \ No newline at end of file diff --git a/docker-templates/media-management/remote-server.yaml b/docker-templates/media-management/remote-server.yaml new file mode 100644 index 0000000..b0714ab --- /dev/null +++ b/docker-templates/media-management/remote-server.yaml @@ -0,0 +1,141 @@ +# Example Traefik remote-host.yaml + +# If Traefik is NOT on the same server, use find/replace to update the following variables: +# ${SERVER_NAME} ${SERVER_IP} ${DOMAIN} in both the routers and services sections below + +# Then create a new file similiar to remote-host-servername.yaml or +# integrate it into an existing Traefik dynamic configuration file on the remote server. + +http: + routers: + sonarr-${SERVER_NAME}: + rule: "Host(`sonarr.${DOMAIN}`)" + service: sonarr-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + radarr-${SERVER_NAME}: + rule: "Host(`radarr.${DOMAIN}`)" + service: radarr-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + lidarr-${SERVER_NAME}: + rule: "Host(`lidarr.${DOMAIN}`)" + service: lidarr-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + prowlarr-${SERVER_NAME}: + rule: "Host(`prowlarr.${DOMAIN}`)" + service: prowlarr-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + readarr-${SERVER_NAME}: + rule: "Host(`readarr.${DOMAIN}`)" + service: readarr-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + lazylibrarian-${SERVER_NAME}: + rule: "Host(`lazylibrarian.${DOMAIN}`)" + service: lazylibrarian-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + mylar3-${SERVER_NAME}: + rule: "Host(`mylar3.${DOMAIN}`)" + service: mylar3-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + jellyseerr-${SERVER_NAME}: + rule: "Host(`jellyseerr.${DOMAIN}`)" + service: jellyseerr-${SERVER_NAME}-service + entrypoints: + - websecure + tls: + certResolver: letsencrypt + middlewares: + - authelia@docker + + + + services: + sonarr-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:3552" + passHostHeader: true + + radarr-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:7878" + passHostHeader: true + + lidarr-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:8686" + passHostHeader: true + + prowlarr-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:9696" + passHostHeader: true + + readarr-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:8787" + passHostHeader: true + + lazylibrarian-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:5299" + passHostHeader: true + + mylar3-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:5298" + passHostHeader: true + + jellyseerr-${SERVER_NAME}-service: + loadBalancer: + servers: + - url: "http://${SERVER_IP}:5055" + passHostHeader: true + + \ No newline at end of file diff --git a/registry.json b/registry.json index e6451f7..382301a 100644 --- a/registry.json +++ b/registry.json @@ -39,7 +39,7 @@ { "id": "core-app", "name": "Core", - "description": "Core infrastructure services", + "description": "Authelia DuckDNS Traefik", "version": "1.0.0", "author": "kelin", "compose_url": "https://gitea.kelinreij.duckdns.org/kelin/arcane-registry/raw/branch/main/docker-templates/core/docker-compose.yml",