From aa08c5ed574844e021d26d47b841b7b9887b1385 Mon Sep 17 00:00:00 2001 From: Vidhin Date: Wed, 25 Jun 2025 11:54:33 -0500 Subject: [PATCH] feat: add decypharr (#23) Co-authored-by: Viren070 --- apps/.env | 3 +- apps/autosync/compose.yaml | 2 +- apps/bazarr/compose.yaml | 4 +- apps/compose.yaml | 7 +- apps/decypharr/compose.yaml | 84 +++++++++++++++++++++++ apps/jellyfin/compose.yaml | 2 +- apps/plex/compose.yaml | 2 +- apps/radarr/compose.yaml | 6 +- apps/seanime/compose.yaml | 2 +- apps/sonarr/compose.yaml | 6 +- apps/wests-scripts/blackhole/compose.yaml | 6 +- data/decypharr/config.json | 76 ++++++++++++++++++++ data/decypharr/rclone.conf | 5 ++ 13 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 apps/decypharr/compose.yaml create mode 100644 data/decypharr/config.json create mode 100644 data/decypharr/rclone.conf diff --git a/apps/.env b/apps/.env index 43922ad..5bc76d1 100644 --- a/apps/.env +++ b/apps/.env @@ -120,6 +120,7 @@ BAZARR4K_HOSTNAME=4k.bazarr.${DOMAIN} BESZEL_HOSTNAME=beszel.${DOMAIN} COMET_HOSTNAME=comet.${DOMAIN} DASHDOT_HOSTNAME=dash.${DOMAIN} +DECYPHARR_HOSTNAME=decypharr.${DOMAIN} DOCKGE_HOSTNAME=dockge.${DOMAIN} DOZZLE_HOSTNAME=dozzle.${DOMAIN} EASYNEWS_PLUS_HOSTNAME=easynews-plus.${DOMAIN} @@ -169,7 +170,7 @@ ZIPLINE_HOSTNAME=zipline.${DOMAIN} ZURG_HOSTNAME=zurg.${DOMAIN} # This is the list of all the domains for which Cloudflare DDNS will create A/AAAA records for. -DOMAINS=${ADDON_MANAGER_HOSTNAME},${AIOSTREAMS_HOSTNAME},${AIOSTREMIO_HOSTNAME},${ANIME_KITSU_HOSTNAME},${ARCANE_HOSTNAME},${AUTHELIA_HOSTNAME},${AUTOSYNC_HOSTNAME},${BAZARR_HOSTNAME},${BAZARR4K_HOSTNAME},${BESZEL_HOSTNAME},${COMET_HOSTNAME},${DASHDOT_HOSTNAME},${DOCKGE_HOSTNAME},${DOZZLE_HOSTNAME},${EASYNEWS_PLUS_HOSTNAME},${EASYNEWS_PLUS_PLUS_HOSTNAME},${HONEY_HOSTNAME},${HUNTARR_HOSTNAME},${JACKETT_HOSTNAME},${JACKETTIO_HOSTNAME},${JELLYFIN_HOSTNAME},${JELLYSEER_HOSTNAME},${LIBRESPEED_HOSTNAME},${MEDIAFLOW_PROXY_HOSTNAME},${MEDIAFUSION_HOSTNAME},${MINECRAFT_HOSTNAME},${NZBHYDRA2_HOSTNAME},${OMG_TV_STREMIO_ADDON_HOSTNAME},${OVERSEERR_HOSTNAME},${PLAUSIBLE_HOSTNAME},${PLEX_HOSTNAME},${PORTAINER_HOSTNAME},${PROWLARR_HOSTNAME},${RADARR_HOSTNAME},${RADARR4K_HOSTNAME},${RADARRANIME_HOSTNAME},${SEANIME_HOSTNAME},${SEARXNG_HOSTNAME},${SONARR_HOSTNAME},${SONARR4K_HOSTNAME},${SONARRANIME_HOSTNAME},${SPEEDTEST_TRACKER_HOSTNAME},${STREAMYSTATS_HOSTNAME},${STREMIO_ACCOUNT_BOOTSTRAPPER_HOSTNAME},${STREMIO_CATALOG_PROVIDERS_HOSTNAME},${STREMIO_JACKETT_HOSTNAME},${STREMIO_SERVER_HOSTNAME},${STREMIO_TRAKT_ADDON_HOSTNAME},${STREMTHRU_HOSTNAME},${TAUTULLI_HOSTNAME},${TMDB_ADDON_HOSTNAME},${TORBOX_MANAGER_HOSTNAME},${TRAEFIK_HOSTNAME},${UPTIME_KUMA_HOSTNAME},${VAULTWARDEN_HOSTNAME},${YAMTRACK_HOSTNAME},${ZILEAN_HOSTNAME},${ZIPLINE_HOSTNAME},${ZURG_HOSTNAME} +DOMAINS=${ADDON_MANAGER_HOSTNAME},${AIOSTREAMS_HOSTNAME},${AIOSTREMIO_HOSTNAME},${ANIME_KITSU_HOSTNAME},${ARCANE_HOSTNAME},${AUTHELIA_HOSTNAME},${AUTOSYNC_HOSTNAME},${BAZARR_HOSTNAME},${BAZARR4K_HOSTNAME},${BESZEL_HOSTNAME},${COMET_HOSTNAME},${DASHDOT_HOSTNAME},${DECYPHARR_HOSTNAME},${DOCKGE_HOSTNAME},${DOZZLE_HOSTNAME},${EASYNEWS_PLUS_HOSTNAME},${EASYNEWS_PLUS_PLUS_HOSTNAME},${HONEY_HOSTNAME},${HUNTARR_HOSTNAME},${JACKETT_HOSTNAME},${JACKETTIO_HOSTNAME},${JELLYFIN_HOSTNAME},${JELLYSEER_HOSTNAME},${LIBRESPEED_HOSTNAME},${MEDIAFLOW_PROXY_HOSTNAME},${MEDIAFUSION_HOSTNAME},${MINECRAFT_HOSTNAME},${NZBHYDRA2_HOSTNAME},${OMG_TV_STREMIO_ADDON_HOSTNAME},${OVERSEERR_HOSTNAME},${PLAUSIBLE_HOSTNAME},${PLEX_HOSTNAME},${PORTAINER_HOSTNAME},${PROWLARR_HOSTNAME},${RADARR_HOSTNAME},${RADARR4K_HOSTNAME},${RADARRANIME_HOSTNAME},${SEANIME_HOSTNAME},${SEARXNG_HOSTNAME},${SONARR_HOSTNAME},${SONARR4K_HOSTNAME},${SONARRANIME_HOSTNAME},${SPEEDTEST_TRACKER_HOSTNAME},${STREAMYSTATS_HOSTNAME},${STREMIO_ACCOUNT_BOOTSTRAPPER_HOSTNAME},${STREMIO_CATALOG_PROVIDERS_HOSTNAME},${STREMIO_JACKETT_HOSTNAME},${STREMIO_SERVER_HOSTNAME},${STREMIO_TRAKT_ADDON_HOSTNAME},${STREMTHRU_HOSTNAME},${TAUTULLI_HOSTNAME},${TMDB_ADDON_HOSTNAME},${TORBOX_MANAGER_HOSTNAME},${TRAEFIK_HOSTNAME},${UPTIME_KUMA_HOSTNAME},${VAULTWARDEN_HOSTNAME},${YAMTRACK_HOSTNAME},${ZILEAN_HOSTNAME},${ZIPLINE_HOSTNAME},${ZURG_HOSTNAME} # ==================================================== # DOCKER COMPOSE CONFIGURATION diff --git a/apps/autosync/compose.yaml b/apps/autosync/compose.yaml index fd4b254..44d98d6 100644 --- a/apps/autosync/compose.yaml +++ b/apps/autosync/compose.yaml @@ -20,7 +20,7 @@ services: volumes: - ${DOCKER_DATA_DIR}/autosync/config.yaml:/app/config.yaml - /etc/localtime:/etc/localtime:ro - - /mnt:/mnt + - /mnt:/mnt:rslave depends_on: sonarr: condition: service_healthy diff --git a/apps/bazarr/compose.yaml b/apps/bazarr/compose.yaml index 5244f78..f466e0e 100644 --- a/apps/bazarr/compose.yaml +++ b/apps/bazarr/compose.yaml @@ -12,7 +12,7 @@ services: volumes: - ${DOCKER_DATA_DIR}/bazarr/default/config:/config - ${DOCKER_DATA_DIR}/bazarr/default/data:/data - - /mnt:/mnt + - /mnt:/mnt:rslave labels: - "traefik.enable=true" - "traefik.http.routers.bazarr.rule=Host(`${BAZARR_HOSTNAME?}`)" @@ -43,7 +43,7 @@ services: volumes: - ${DOCKER_DATA_DIR}/bazarr/4k/config:/config - ${DOCKER_DATA_DIR}/bazarr/4k/data:/data - - /mnt:/mnt + - /mnt:/mnt:rslave labels: - "traefik.enable=true" - "traefik.http.routers.bazarr4k.rule=Host(`${BAZARR4K_HOSTNAME?}`)" diff --git a/apps/compose.yaml b/apps/compose.yaml index db80ab6..c584bb9 100644 --- a/apps/compose.yaml +++ b/apps/compose.yaml @@ -12,6 +12,7 @@ include: - cloudflare-ddns/compose.yaml - comet/compose.yaml - dash/compose.yaml + - decypharr/compose.yaml - dockge/compose.yaml - dozzle/compose.yaml - easynews-plus/compose.yaml @@ -65,7 +66,11 @@ include: - yamtrack/compose.yaml - zilean/compose.yaml - zipline/compose.yaml - - zurg/compose.yaml + # Uncomment if you are using zurg and comment out decypharr + # There is also a way to use both together, but it requires 2 rclone instances + # To use both, update Zurg's rclone service name and its container name to rclone_zurg + # You will also need to change Zurg's rclone's `- /mnt/remote/realdebrid:/data:rshared` to `- /mnt/remote/zurg:/data:rshared` + # - zurg/compose.yaml networks: default: diff --git a/apps/decypharr/compose.yaml b/apps/decypharr/compose.yaml new file mode 100644 index 0000000..f87e3a4 --- /dev/null +++ b/apps/decypharr/compose.yaml @@ -0,0 +1,84 @@ +services: + decypharr: + image: cy01/blackhole:latest # or cy01/blackhole:beta + container_name: decypharr + restart: unless-stopped + user: "${PUID}:${PGID}" + security_opt: + - "apparmor:unconfined" + environment: + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + volumes: + - /mnt/:/mnt:rslave + - ${DOCKER_DATA_DIR}/decypharr/:/app # config.json must be in this directory + labels: + - "traefik.enable=true" + - "traefik.http.routers.decypharr.rule=Host(`${DECYPHARR_HOSTNAME?}`)" + - "traefik.http.routers.decypharr.entrypoints=websecure" + - "traefik.http.routers.decypharr.tls.certresolver=letsencrypt" + - "traefik.http.routers.decypharr.middlewares=authelia@docker" + profiles: + - decypharr + - debrid_media_server + - all + + rclone: + image: rclone/rclone:latest + container_name: rclone + restart: unless-stopped + environment: + TZ: ${TZ:-UTC} + PUID: ${PUID} + PGID: ${PGID} + RCLONE_BUFFER_SIZE: "0" + RCLONE_VFS_FAST_FINGERPRINT: "false" + RCLONE_VFS_READ_CHUNK_SIZE: "2M" + RCLONE_VFS_READ_CHUNK_SIZE_LIMIT: "32M" + RCLONE_VFS_READ_AHEAD: "2M" + RCLONE_VFS_READ_WAIT: "30ms" + RCLONE_VFS_CACHE_MIN_FREE_SPACE: "1G" + RCLONE_VFS_CACHE_MAX_AGE: "72h" + volumes: + - /mnt/remote/realdebrid:/data:rshared + - ${DOCKER_DATA_DIR}/decypharr/rclone.conf:/config/rclone/rclone.conf + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/decypharr/cache:/cache + cap_add: + - SYS_ADMIN + security_opt: + - apparmor:unconfined + devices: + - /dev/fuse:/dev/fuse:rwm + depends_on: + - decypharr + command: > + mount decypharr: /data + --allow-non-empty + --uid=${PUID} + --gid=${PGID} + --umask=002 + --allow-other + --log-level=INFO + --vfs-fast-fingerprint + --async-read=true + --use-mmap + --no-checksum + --no-modtime + --rc + --rc-addr=0.0.0.0:9990 + --rc-no-auth + --rc-web-gui + --rc-web-gui-no-open-browser + --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' + --dir-cache-time=10s + --vfs-cache-mode=full + --vfs-cache-max-size=100G + --vfs-cache-poll-interval=30s + --cache-dir=/cache + --vfs-read-chunk-size-limit=32M + profiles: + - all + - decypharr + - debrid_media_server \ No newline at end of file diff --git a/apps/jellyfin/compose.yaml b/apps/jellyfin/compose.yaml index 431afdf..3094534 100644 --- a/apps/jellyfin/compose.yaml +++ b/apps/jellyfin/compose.yaml @@ -11,7 +11,7 @@ services: - PGID=${PGID} volumes: - ${DOCKER_DATA_DIR}/jellyfin:/config - - /mnt:/mnt + - /mnt:/mnt:rslave labels: - "traefik.enable=true" - "traefik.http.routers.jellyfin.rule=Host(`${JELLYFIN_HOSTNAME?}`)" diff --git a/apps/plex/compose.yaml b/apps/plex/compose.yaml index 2a1d1ca..72b7efa 100644 --- a/apps/plex/compose.yaml +++ b/apps/plex/compose.yaml @@ -22,7 +22,7 @@ services: volumes: - /dev/shm:/dev/shm - ${DOCKER_DATA_DIR}/plex/transcodes:/transcode - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/plex/config:/config labels: - "traefik.enable=${PLEX_TRAEFIK_ENABLE:-true}" diff --git a/apps/radarr/compose.yaml b/apps/radarr/compose.yaml index 4563244..4fe0b8c 100644 --- a/apps/radarr/compose.yaml +++ b/apps/radarr/compose.yaml @@ -9,7 +9,7 @@ services: image: ghcr.io/hotio/radarr:release restart: unless-stopped volumes: - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/radarr/default/:/config - /usr/bin/rclone:/usr/bin/rclone labels: @@ -43,7 +43,7 @@ services: image: ghcr.io/hotio/radarr:release restart: unless-stopped volumes: - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/radarr/4k:/config - /usr/bin/rclone:/usr/bin/rclone labels: @@ -76,7 +76,7 @@ services: - PGID=${PGID} restart: unless-stopped volumes: - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/radarr/anime:/config - /usr/bin/rclone:/usr/bin/rclone labels: diff --git a/apps/seanime/compose.yaml b/apps/seanime/compose.yaml index 65922c2..58ce730 100644 --- a/apps/seanime/compose.yaml +++ b/apps/seanime/compose.yaml @@ -5,7 +5,7 @@ services: volumes: - /mnt/user/anime:/anime - /mnt/user/downloads:/downloads - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/seanime:/root/.config/Seanime expose: - 43211 diff --git a/apps/sonarr/compose.yaml b/apps/sonarr/compose.yaml index 5a44389..01efde9 100644 --- a/apps/sonarr/compose.yaml +++ b/apps/sonarr/compose.yaml @@ -16,7 +16,7 @@ services: - "traefik.http.routers.sonarr.middlewares=authelia@docker" - "traefik.http.services.sonarr.loadbalancer.server.port=8989" volumes: - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/sonarr/default:/config - /usr/bin/rclone:/usr/bin/rclone depends_on: @@ -48,7 +48,7 @@ services: - "traefik.http.routers.sonarr4k.middlewares=authelia@docker" - "traefik.http.services.sonarr4k.loadbalancer.server.port=8989" volumes: - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/sonarr/4k:/config - /usr/bin/rclone:/usr/bin/rclone depends_on: @@ -82,7 +82,7 @@ services: - "traefik.http.routers.sonarranime.middlewares=authelia@docker" - "traefik.http.services.sonarranime.loadbalancer.server.port=8989" volumes: - - /mnt:/mnt + - /mnt:/mnt:rslave - ${DOCKER_DATA_DIR}/sonarr/anime:/config - /usr/bin/rclone:/usr/bin/rclone depends_on: diff --git a/apps/wests-scripts/blackhole/compose.yaml b/apps/wests-scripts/blackhole/compose.yaml index 624fbb1..376df76 100644 --- a/apps/wests-scripts/blackhole/compose.yaml +++ b/apps/wests-scripts/blackhole/compose.yaml @@ -9,7 +9,7 @@ services: - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/default/logs:/app/logs - - /mnt:/mnt + - /mnt:/mnt:rslave env_file: - ../.env environment: @@ -44,7 +44,7 @@ services: - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/4k/logs:/app/logs - - /mnt:/mnt + - /mnt:/mnt:rslave env_file: - ../.env environment: @@ -82,7 +82,7 @@ services: - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/anime/logs:/app/logs - - /mnt:/mnt + - /mnt:/mnt:rslave env_file: - ../.env environment: diff --git a/data/decypharr/config.json b/data/decypharr/config.json new file mode 100644 index 0000000..20e7ade --- /dev/null +++ b/data/decypharr/config.json @@ -0,0 +1,76 @@ +{ + "debrids": [ + { + "name": "realdebrid", + "api_key": "", + "folder": "/mnt/remote/realdebrid/__all__/", + "rate_limit": "250/minute", + "use_webdav": true, + "torrents_refresh_interval": "15s", + "download_links_refresh_interval": "40m", + "workers": 200, + "auto_expire_links_after": "3d", + "folder_naming": "original_no_ext", + "rc_url": "http://rclone:9990", + "download_uncached": false, + "serve_from_rclone": true + } + ], + "max_cache_size": 10000, + "qbittorrent": { + "download_folder": "/mnt/symlinks/", + "categories": [ + "sonarr", + "sonarr4k", + "sonarranime", + "radarr", + "radarr4k", + "radarranime" + ], + "refresh_interval": 5, + "skip_pre_cache": false + }, + "repair": { + "enabled": true, + "interval": "12h", + "run_on_start": false, + "use_webdav": true, + "auto_process": true, + "_comment_addThisIfYouAreUsingZurg_zurg_url": "http://zurg:9999" + }, + "arrs": [ + { + "name": "sonarr", + "host": "http://sonarr:8989", + "token": "" + }, + { + "name": "sonarr4k", + "host": "http://sonarr4k:8989", + "token": "" + }, + { + "name": "sonarranime", + "host": "http://sonarranime:8989", + "token": "" + }, + { + "name": "radarr", + "host": "http://radarr:7878", + "token": "" + }, + { + "name": "radarr4k", + "host": "http://radarr4k:7878", + "token": "" + }, + { + "name": "radarranime", + "host": "http://radarranime:7878", + "token": "" + } + ], + "use_auth": false, + "log_level": "info", + "port": "8282" +} \ No newline at end of file diff --git a/data/decypharr/rclone.conf b/data/decypharr/rclone.conf new file mode 100644 index 0000000..98d7ba3 --- /dev/null +++ b/data/decypharr/rclone.conf @@ -0,0 +1,5 @@ +[decypharr] +type = webdav +url = http://decypharr:8282/webdav/realdebrid +vendor = other +pacer_min_sleep = 0 \ No newline at end of file