├── .gitignore ├── LICENSE ├── README.md ├── apps ├── .env ├── addon-manager │ └── compose.yaml ├── aiostreams │ ├── .env │ └── compose.yaml ├── aiostremio │ ├── .env │ └── compose.yaml ├── anime-kitsu │ ├── .env │ └── compose.yaml ├── authelia │ ├── .env │ └── compose.yaml ├── autosync │ └── compose.yaml ├── bazarr │ └── compose.yaml ├── beszel │ ├── .env │ └── compose.yaml ├── byparr │ └── compose.yaml ├── cloudflare-ddns │ └── compose.yaml ├── comet │ ├── .env │ └── compose.yaml ├── compose.yaml ├── dash │ ├── .env │ └── compose.yaml ├── dockge │ └── compose.yaml ├── dozzle │ └── compose.yaml ├── easynews-plus-plus │ └── compose.yaml ├── easynews-plus │ └── compose.yaml ├── gluetun │ ├── .env │ └── compose.yaml ├── honey │ └── compose.yaml ├── huntarr │ └── compose.yaml ├── jackett │ └── compose.yaml ├── jackettio │ ├── .env │ └── compose.yaml ├── jellyfin │ └── compose.yaml ├── jellyseer │ └── compose.yaml ├── kometa │ └── compose.yaml ├── librespeed │ ├── .env │ └── compose.yaml ├── mediaflow-proxy │ ├── .env │ └── compose.yaml ├── mediafusion │ ├── .env │ └── compose.yaml ├── minecraft │ ├── .env │ └── compose.yaml ├── nzbhydra2 │ └── compose.yaml ├── omg-tv-addon │ └── compose.yaml ├── overseerr │ └── compose.yaml ├── plausible │ ├── .env │ └── compose.yaml ├── plex-trakt-sync │ └── compose.yaml ├── plex │ ├── .env │ └── compose.yaml ├── portainer │ ├── .env │ └── compose.yaml ├── prowlarr │ └── compose.yaml ├── radarr │ └── compose.yaml ├── realdebrid-account-monitor │ ├── .env │ ├── Dockerfile │ ├── compose.yaml │ └── main.py ├── recyclarr │ └── compose.yaml ├── seanime │ ├── .env │ └── compose.yaml ├── searxng │ └── compose.yaml ├── sonarr │ └── compose.yaml ├── speedtest-tracker │ ├── .env │ └── compose.yaml ├── sshbot │ ├── .env │ └── compose.yaml ├── streamystats │ ├── .env │ └── compose.yaml ├── stremio-catalog-providers │ ├── .env │ └── compose.yaml ├── stremio-jackett │ └── compose.yaml ├── stremio-server │ └── compose.yaml ├── stremio-trakt-addon │ ├── .env │ └── compose.yaml ├── stremthru │ ├── .env │ └── compose.yaml ├── tautulli │ └── compose.yaml ├── tmdb-addon │ ├── .env │ └── compose.yaml ├── torbox-manager │ └── compose.yaml ├── torbox-media-center │ ├── .env │ └── compose.yaml ├── traefik │ ├── .env │ └── compose.yaml ├── tweakio │ └── compose.yaml ├── uptime-kuma │ └── compose.yaml ├── vaultwarden │ ├── .env │ └── compose.yaml ├── warp │ └── compose.yaml ├── watchtower │ ├── .env │ └── compose.yaml ├── wests-scripts │ ├── .env │ ├── blackhole │ │ └── compose.yaml │ ├── compose.yaml │ ├── plex_authentication │ │ └── compose.yaml │ ├── plex_requests │ │ ├── .env │ │ └── compose.yaml │ ├── plex_watchlist │ │ └── compose.yaml │ └── repair │ │ └── compose.yaml ├── yamtrack │ ├── .env │ └── compose.yaml ├── zilean │ └── compose.yaml ├── zipline │ ├── .env │ └── compose.yaml └── zurg │ ├── .env │ └── compose.yaml └── data ├── aiostremio └── config.json ├── anime-kitsu └── imdb_mapping.json ├── authelia └── config │ ├── assets │ └── empty │ ├── certificates │ └── empty │ ├── configuration.yml │ └── users.yml ├── autosync └── config.yml ├── easynews-plus-plus └── custom-titles.json ├── honey └── config.json ├── kometa └── config.yml ├── plausible └── clickhouse │ ├── ip4-only.xml │ ├── logs.xml │ └── low-resources.xml ├── prowlarr └── Definitions │ └── Custom │ ├── 52btCustom.yml │ ├── debridio.yml │ ├── torbox.yml │ └── zilean.yml ├── recyclarr ├── recyclarr.yml └── secrets.yml ├── tweakio └── config.yaml ├── wests-scripts └── shared │ └── tokens.json └── zurg ├── config-v0.10.yml ├── config-v0.9.yml └── rclone.conf /.gitignore: -------------------------------------------------------------------------------- 1 | ..* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Viren070 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker Compose VPS Template 2 | 3 | A template compose.yaml to self host various applications on a server/VPS using Docker Compose with Traefik as a reverse proxy, using Authelia for authentication. 4 | 5 | This is a template, so feel free to edit it by removing or adding services as you see fit. 6 | 7 | You can use the Always Free resources of Oracle to set this up. Here is a [set up guide](https://guides.viren070.me/oracle) I made for that. 8 | 9 | A full start-to-finish guide, which assumes you start from scratch, can be found on my site [here](https://guides.viren070.me/selfhosting). 10 | It will go through setting up an Oracle VPS for free, installing Docker, and then a guide on using this compose.yaml. 11 | 12 | This is the general guide: 13 | 14 | Prerequisites: 15 | - A VPS with Docker installed. 16 | - Port 80 and 443 open. 17 | - A domain with DNS records pointing to the VPS IP for each domain/subdomain you want to use. 18 | - Domains from [DuckDNS](https://www.duckdns.org/) or [Afraid.org](https://afraid.org/) are free and can be used for this 19 | - Moving your namservers to Cloudflare is preferred as it enables you to use Cloudflare DDNS, included in this template, to automatically create and maintain your DNS records (Note that this is not possible with DuckDNS or Afraid.org). 20 | 21 | 1. Ensure docker is installed per https://get.docker.com 22 | 2. Clone this repository and cd into it: 23 | ``` 24 | cd /opt 25 | git clone https://github.com/Viren070/docker-compose-vps-template.git docker 26 | cd docker 27 | ``` 28 | 3. Use a text editor to open the `.env` file in the `apps` folder. You can use `nano`, but I recommend using either **XPipe** or **VS Code (with the `Remote - SSH` extension)** to edit the files. 29 | - If you are using nano, run this command: 30 | ``` 31 | nano .env 32 | ``` 33 | 4. After you fill in the initial values in the root .env, I'd recommend using the `required` profile only and running the following command to start Authelia and Traefik: 34 | ``` 35 | docker compose --profile required up -d 36 | ``` 37 | 5. Now, you can either start adding other `profiles` to the `COMPOSE_PROFILES` environment variable or use the `all` profile and fill in any other `.env` files if they exist for the services you want to use. 38 | 6. Finally, ensure you are in the root directory of the apps folder and not inside an app-specific folder (You can check this by running `pwd` and ensuring it returns `/opt/docker/apps`) and run this command to start all the services (according to your profiles in the `.env`) 39 | ``` 40 | docker compose up -d 41 | ``` 42 | - Ensure you defined the `COMPOSE_PROFILES` environment variable in the .env file, otherwise none of the services will start 43 | - You can also use the --profile flag e.g. docker compose --profile stremio --profile seanime up -d 44 | - This can be useful for other commands like `docker compose --profile seanime restart` or `docker compose --profile seanime logs` 45 | - Ensure port 443 and port 80 are open. 46 | - If you have not setup Cloudflare DDNS in the .env by providing your token and using the `cloudflare-ddns` profile, you will need to manually create A records for each service you want to use using the subdomain in the .env file. 47 | - Ensure you follow the instructions in the .env for any additional instructions that need to be carried out for some services (e.g. adding the prowlarr/jackett api keys or editing Seanime's config.toml) 48 | 49 | -------------------------------------------------------------------------------- /apps/.env: -------------------------------------------------------------------------------- 1 | # This file is used to store the core configuration for this template. Filling this .env in is the minimum requirement to get the template up and running. 2 | # It will set up Traefik and Authelia 3 | 4 | # The timezone to use, find your timezone database name from 5 | # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 6 | # Use the value from the 'TZ identifier' column 7 | TZ=Etc/UTC 8 | 9 | # Directory configuration. This .env file should be in $DOCKER_APP_DIR/.env 10 | # You MUST use absolute paths, otherwise each bind mount would be created relative to each compose file, and not 11 | # the current directory 12 | DOCKER_DATA_DIR=/opt/docker/data 13 | DOCKER_APP_DIR=/opt/docker/apps 14 | 15 | # The process user ID and group ID to use for applicable containers. 16 | # Run 'id' to see your UID and GID 17 | # Ensure that any pre-existing folders within the DOCKER_DATA_DIR (i.e. folders that were included within the template repository) 18 | # have the correct permissions. 19 | # You can run 20 | # sudo chown $PUID:$PGID -R $DOCKER_DATA_DIR 21 | # replacing the variables with the actual values e.g sudo chown 1000:1000 -R /opt/docker/data 22 | PUID=1000 23 | PGID=1000 24 | 25 | 26 | # ========================================================= 27 | # PROFILE CONFIGURATION 28 | # ========================================================= 29 | 30 | # This compose project is split up into profiles to allow you to only run the services you want to use. 31 | # Every single service in this project has its own profile, there are also profiles for a group of services. 32 | 33 | # There is a 'required' profile that contains services that are considered required and you should not remove this 34 | # profile. This profile contains authelia and traefik. These two services are the core of the template as traefik 35 | # allows external access while authelia provides authentication. 36 | 37 | # From there, you can add other apps by adding the relevant profile to the COMPOSE_PROFILES variable below. 38 | # e.g. If you wanted to add aiostreams and mediaflow proxy, you would add the 'aiostreams' and 'mediaflow' profiles to the COMPOSE_PROFILES variable. 39 | # like so: COMPOSE_PROFILES="required,aiostreams,mediaflow" 40 | 41 | # You can also add the 'all' profile which will include every service in the template. 42 | # This can be useful if you prefer to manually edit the root compose.yaml file to remove services from the include list or removing the profiles. 43 | # 44 | # If you set the COMPOSE_PROFILES variable here, all future 'docker compose' commands will abide by this variable. 45 | # You can, however, override this variable by using the --profile flag with docker compose commands. 46 | # This is useful when you want to run commands for a specific service e.g. restarting mediafusion only with docker compose --profile mediafusion restart 47 | # That command will only restart mediafusion and its related services (scheduler, browserless, redis, mongo) 48 | COMPOSE_PROFILES="required" 49 | 50 | # Other than modifying the profiles, you may also look at the compose.yaml file in the root of $DOCKER_APP_DIR 51 | # This file 'includes' all the other compose.yaml files. You can remove a specific file from the list to remove that from the final 52 | # compose.yaml. e.g. you could remove the line '- gluetun/compose.yaml' and any services in that file (gluetun and gost) will not be included 53 | # in the compose. 54 | # Ensure that you don't remove files that other included files may rely on. 55 | 56 | 57 | # ============================================================ 58 | # TRAEFIK 59 | # ============================================================ 60 | # Traefik is the reverse proxy which provides external access to our apps. 61 | 62 | # Email provided to Let's Encrypt for notifications 63 | LETSENCRYPT_EMAIL= 64 | # The domain name to use for all services that are going to be exposed with Traefik. 65 | # This will be the default domain used for all services that are exposed with Traefik. 66 | # You can modify the domain used for specific services by editing the app specific hostname variables below. 67 | # I would recommend providing a second domain here (e.g. 'DOMAIN2=example.io') and then editing the app specific hostname variables to use `DOMAIN2` instead of `DOMAIN`. 68 | DOMAIN=example.com 69 | 70 | 71 | # ========================================================= 72 | # AUTHELIA 73 | # ========================================================= 74 | # Authelia provides authentication for our apps. It supports access control policies, passkeys, webauthn and 2FA. 75 | 76 | # These should all be different random strings of at least 64 characters. 77 | # You can use the following command to generate them: 78 | # echo "$(openssl rand -base64 64 | tr -d '=/' | tr -d '\n')" 79 | AUTHELIA_SESSION_SECRET="" 80 | AUTHELIA_STORAGE_ENCRYPTION_KEY="" 81 | AUTHELIA_JWT_SECRET="" 82 | 83 | # You can find additional configuration for Authelia in Authelia's .env file which will also 84 | # tell you how to add users 85 | # Currently there is only one user (user1 with password 'password') and it has access to everything. 86 | # If you would like to configure access control policies, you will need to edit the access_control key 87 | # in the ${DOCKER_DATA_DIR}/data/authelia/config/configuration.yml file. 88 | 89 | # ========================================================== 90 | # CLOUDFLARE DDNS 91 | # ========================================================== 92 | # If you would like to use the Cloudflare DDNS service to automatically create the DNS A/AAAA records for your services, 93 | # you must: 94 | # - Be using your own domain (This will NOT work with services like Afraid.org and DuckDNS). 95 | # - Have a Cloudflare account and have your domain added to it 96 | # - Have your domain set to use Cloudflare's nameservers. 97 | # - Add 'cloudflare-ddns' to the 'COMPOSE_PROFILES' variable above. (or use the 'all' profile) 98 | # Then, obtain a cloudflare API token at (https://dash.cloudflare.com/profile/api-tokens) using the 'Edit zone DNS' template and 99 | # provide it here. 100 | CLOUDFLARE_API_TOKEN= 101 | 102 | # WARNING: if you do not want to use Cloudflare DDNS, you must make sure to manually add the DNS A records for each subdomain you choose to use. 103 | 104 | 105 | # The required configuration for this .env is now done, you can add other services to the COMPOSE_PROFILES variable above. 106 | # Some apps will require additional configuration in their own .env files - which will be located in the same directory as their compose.yaml file in the app's folder 107 | # You can optionally also edit the subdomains below 108 | 109 | # These values are the subdomains that Traefik will use to route traffic to the services. 110 | # You can modify these values to suit your needs, but ensure that they are unique and do not conflict with other services. 111 | ADDON_MANAGER_HOSTNAME=addon-manager.${DOMAIN?} 112 | AIOSTREAMS_HOSTNAME=aiostreams.${DOMAIN} 113 | AIOSTREMIO_HOSTNAME=aiostremio.${DOMAIN} 114 | ANIME_KITSU_HOSTNAME=kitsu.${DOMAIN} 115 | AUTHELIA_HOSTNAME=auth.${DOMAIN} 116 | AUTOSYNC_HOSTNAME=autosync.${DOMAIN} 117 | BAZARR_HOSTNAME=bazarr.${DOMAIN} 118 | BAZARR4K_HOSTNAME=4k.bazarr.${DOMAIN} 119 | BESZEL_HOSTNAME=beszel.${DOMAIN} 120 | COMET_HOSTNAME=comet.${DOMAIN} 121 | DASHDOT_HOSTNAME=dash.${DOMAIN} 122 | DOCKGE_HOSTNAME=dockge.${DOMAIN} 123 | DOZZLE_HOSTNAME=dozzle.${DOMAIN} 124 | EASYNEWS_PLUS_HOSTNAME=easynews-plus.${DOMAIN} 125 | EASYNEWS_PLUS_PLUS_HOSTNAME=easynews-plus-plus.${DOMAIN} 126 | HONEY_HOSTNAME=${DOMAIN} 127 | HUNTARR_HOSTNAME=huntarr.${DOMAIN} 128 | JACKETT_HOSTNAME=jackett.${DOMAIN} 129 | JACKETTIO_HOSTNAME=jackettio.${DOMAIN} 130 | JELLYFIN_HOSTNAME=jellyfin.${DOMAIN} 131 | JELLYSEER_HOSTNAME=jellyseer.${DOMAIN} 132 | LIBRESPEED_HOSTNAME=speedtest.${DOMAIN} 133 | MEDIAFLOW_PROXY_HOSTNAME=mediaflow-proxy.${DOMAIN} 134 | MEDIAFUSION_HOSTNAME=mediafusion.${DOMAIN} 135 | MINECRAFT_HOSTNAME=mc.${DOMAIN} 136 | NZBHYDRA2_HOSTNAME=nzbhydra2.${DOMAIN} 137 | OMG_TV_STREMIO_ADDON_HOSTNAME=omg-tv-addon.${DOMAIN} 138 | OVERSEERR_HOSTNAME=overseerr.${DOMAIN} 139 | PLAUSIBLE_HOSTNAME=plausible.${DOMAIN} 140 | PLEX_HOSTNAME=plex.${DOMAIN} 141 | PORTAINER_HOSTNAME=portainer.${DOMAIN} 142 | PROWLARR_HOSTNAME=prowlarr.${DOMAIN} 143 | RADARR_HOSTNAME=radarr.${DOMAIN} 144 | RADARR4K_HOSTNAME=4k.radarr.${DOMAIN} 145 | RADARRANIME_HOSTNAME=anime.radarr.${DOMAIN} 146 | SEANIME_HOSTNAME=seanime.${DOMAIN} 147 | SEARXNG_HOSTNAME=searxng.${DOMAIN} 148 | SONARR_HOSTNAME=sonarr.${DOMAIN} 149 | SONARR4K_HOSTNAME=4k.sonarr.${DOMAIN} 150 | SONARRANIME_HOSTNAME=anime.sonarr.${DOMAIN} 151 | SPEEDTEST_TRACKER_HOSTNAME=speedtest-tracker.${DOMAIN} 152 | STREAMYSTATS_HOSTNAME=streamystats.${DOMAIN} 153 | STREMIO_CATALOG_PROVIDERS_HOSTNAME=stremio-catalogues.${DOMAIN} 154 | STREMIO_JACKETT_HOSTNAME=stremio-jackett.${DOMAIN} 155 | STREMIO_SERVER_HOSTNAME=stremio-server.${DOMAIN} 156 | STREMIO_TRAKT_ADDON_HOSTNAME=stremio-trakt.${DOMAIN} 157 | STREMTHRU_HOSTNAME=stremthru.${DOMAIN} 158 | TAUTULLI_HOSTNAME=tautulli.${DOMAIN} 159 | TMDB_ADDON_HOSTNAME=tmdb.${DOMAIN} 160 | TORBOX_MANAGER_HOSTNAME=tbm.${DOMAIN} 161 | TRAEFIK_HOSTNAME=traefik.${DOMAIN} 162 | UPTIME_KUMA_HOSTNAME=status.${DOMAIN} 163 | VAULTWARDEN_HOSTNAME=vaultwarden.${DOMAIN} 164 | YAMTRACK_HOSTNAME=yamtrack.${DOMAIN} 165 | ZILEAN_HOSTNAME=zilean.${DOMAIN} 166 | ZIPLINE_HOSTNAME=zipline.${DOMAIN} 167 | ZURG_HOSTNAME=zurg.${DOMAIN} 168 | 169 | # This is the list of all the domains for which Cloudflare DDNS will create A/AAAA records for. 170 | DOMAINS=${ADDON_MANAGER_HOSTNAME},${AIOSTREAMS_HOSTNAME},${AIOSTREMIO_HOSTNAME},${ANIME_KITSU_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_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} 171 | 172 | # ==================================================== 173 | # DOCKER COMPOSE CONFIGURATION 174 | # ==================================================== 175 | # This is the name of the compose project. 176 | # Reference: https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_project_name 177 | COMPOSE_PROJECT_NAME=aio 178 | # When set to true, any containers that are not defined within this compose file will be removed when the stack is stopped or removed. 179 | # Reference: https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_remove_orphans 180 | COMPOSE_REMOVE_ORPHANS=true 181 | # Delegate building to bake for improved performance. 182 | COMPOSE_BAKE=true 183 | # Whether to change the name of the network that all containers run on or to connect to an external network. 184 | # Reference: https://docs.docker.com/compose/how-tos/networking/#use-a-pre-existing-network 185 | DOCKER_NETWORK=aio_network 186 | DOCKER_NETWORK_EXTERNAL=false 187 | -------------------------------------------------------------------------------- /apps/addon-manager/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | addon-manager: 3 | image: reddravenn/stremio-addon-manager:latest 4 | container_name: addon-manager 5 | restart: unless-stopped 6 | expose: 7 | - 80 8 | labels: 9 | - "traefik.enable=true" 10 | - "traefik.http.routers.addon-manager.rule=Host(`${ADDON_MANAGER_HOSTNAME?}`)" 11 | - "traefik.http.routers.addon-manager.entrypoints=websecure" 12 | - "traefik.http.routers.addon-manager.tls.certresolver=letsencrypt" 13 | - "traefik.http.routers.addon-manager.middlewares=authelia@docker" 14 | profiles: 15 | - addon-manager 16 | - stremio 17 | - all 18 | -------------------------------------------------------------------------------- /apps/aiostreams/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | aiostreams: 3 | image: ghcr.io/viren070/aiostreams:latest 4 | container_name: aiostreams 5 | restart: unless-stopped 6 | expose: 7 | - 3000 8 | env_file: 9 | - .env 10 | labels: 11 | - "traefik.enable=true" 12 | - "traefik.http.routers.aiostreams.rule=Host(`${AIOSTREAMS_HOSTNAME?}`)" 13 | - "traefik.http.routers.aiostreams.entrypoints=websecure" 14 | - "traefik.http.routers.aiostreams.tls.certresolver=letsencrypt" 15 | - "traefik.http.routers.aiostreams.middlewares=authelia@docker" 16 | healthcheck: 17 | test: wget -qO- http://localhost:3000/health 18 | interval: 1m 19 | timeout: 10s 20 | retries: 5 21 | start_period: 10s 22 | profiles: 23 | - aiostreams 24 | - stremio 25 | - all 26 | -------------------------------------------------------------------------------- /apps/aiostremio/.env: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------- 2 | # AIOSTREMIO 3 | # --------------------------------------------------------- 4 | # 5 | # The AIOSTREMIO_ADMIN_USERNAME and AIOSTREMIO_ADMIN_PASSWORD are the credentials that you will use to access the AIOStremio dashboard. 6 | # 7 | # The main configuration for AIOStremio is stored within ./data/aiostremio/config.json 8 | # Without this file, AIOStremio will be stuck in a crash loop, so ensure this file exists and is configured correctly. 9 | # You can use the template provided in the AIOStremio repository: 10 | # https://github.com/Viren070/AIOStremio/blob/main/config.json.example 11 | # 12 | # The DEBRID_API_KEY is the API key for the debrid service you want to use by default. 13 | # You can also set addon specific debrid API keys through the config.json file. 14 | # --------------------------------------------------------- 15 | ADMIN_USERNAME= 16 | ADMIN_PASSWORD= 17 | MEDIAFLOW_API_PASSWORD= 18 | DEBRID_API_KEY= 19 | 20 | REDIS_HOST=aiostremio_redis 21 | REDIS_PORT=6379 22 | REDIS_PASSWORD= 23 | -------------------------------------------------------------------------------- /apps/aiostremio/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | aiostremio: 3 | image: viren070/aiostremio:latest 4 | container_name: aiostremio 5 | restart: unless-stopped 6 | expose: 7 | - 8469 8 | volumes: 9 | - ${DOCKER_DATA_DIR}/aiostremio:/app/data 10 | - ${DOCKER_DATA_DIR}/aiostremio/db:/app/db 11 | env_file: 12 | - .env 13 | labels: 14 | - "traefik.enable=true" 15 | - "traefik.http.routers.aiostremio.rule=Host(`${AIOSTREMIO_HOSTNAME?}`)" 16 | - "traefik.http.routers.aiostremio.entrypoints=websecure" 17 | - "traefik.http.routers.aiostremio.tls.certresolver=letsencrypt" 18 | - "traefik.http.routers.aiostremio.middlewares=authelia@docker" 19 | profiles: 20 | - aiostremio 21 | - stremio 22 | - all 23 | depends_on: 24 | aiostremio_redis: 25 | condition: service_healthy 26 | 27 | aiostremio_redis: 28 | image: redis:latest 29 | container_name: aiostremio_redis 30 | restart: unless-stopped 31 | volumes: 32 | - ${DOCKER_DATA_DIR}/aiostremio/cache:/data 33 | command: redis-server --appendonly yes --save 60 1 34 | healthcheck: 35 | test: ["CMD", "redis-cli", "ping"] 36 | interval: 10s 37 | timeout: 5s 38 | retries: 5 39 | profiles: 40 | - aiostremio 41 | - stremio 42 | - all 43 | -------------------------------------------------------------------------------- /apps/anime-kitsu/.env: -------------------------------------------------------------------------------- 1 | FANART_APIKEY= -------------------------------------------------------------------------------- /apps/anime-kitsu/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | anime-kitsu: 3 | build: 4 | context: https://github.com/TheBeastLT/stremio-kitsu-anime.git 5 | dockerfile: Dockerfile 6 | image: anime-kitsu:latest 7 | container_name: anime-kitsu 8 | expose: 9 | - 7000 10 | environment: 11 | - PORT=7000 12 | - ADDON_URL=https://${ANIME_KITSU_HOSTNAME} 13 | - FANART_APIKEY=${FANART_APIKEY} 14 | - META_TTL=86400 15 | - CATALOG_TTL=86400 16 | - CACHE_MAX_AGE=43200 17 | - MONGO_URI=mongodb://anime-kitsu_mongo:27017/anime-kitsu 18 | labels: 19 | - "traefik.enable=true" 20 | - "traefik.http.routers.anime-kitsu.rule=Host(`${ANIME_KITSU_HOSTNAME}`)" 21 | - "traefik.http.services.anime-kitsu.loadbalancer.server.port=7000" 22 | - "traefik.http.routers.anime-kitsu.entrypoints=websecure" 23 | - "traefik.http.routers.anime-kitsu.tls=true" 24 | - "traefik.http.routers.anime-kitsu.tls.certresolver=letsencrypt" 25 | - "traefik.http.routers.anime-kitsu.middlewares=authelia@docker" 26 | volumes: 27 | - ${DOCKER_DATA_DIR}/anime-kitsu/imdb_mapping.json:/home/node/app/static/data/imdb_mapping.json 28 | profiles: 29 | - anime-kitsu 30 | - stremio 31 | - all 32 | 33 | anime-kitsu_mongo: 34 | image: mongo:latest 35 | container_name: anime-kitsu_mongo 36 | restart: unless-stopped 37 | volumes: 38 | - ${DOCKER_DATA_DIR}/anime-kitsu/db:/data/db 39 | healthcheck: 40 | test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet 41 | interval: 10s 42 | timeout: 10s 43 | retries: 5 44 | start_period: 40s 45 | profiles: 46 | - anime-kitsu 47 | - stremio 48 | - all 49 | 50 | 51 | -------------------------------------------------------------------------------- /apps/authelia/.env: -------------------------------------------------------------------------------- 1 | # __| |_____________________________________________________________| |__ 2 | # __ _____________________________________________________________ __ 3 | # | | | | 4 | # | | █████╗ ██╗ ██╗████████╗██╗ ██╗███████╗██╗ ██╗ █████╗ | | 5 | # | |██╔══██╗██║ ██║╚══██╔══╝██║ ██║██╔════╝██║ ██║██╔══██╗| | 6 | # | |███████║██║ ██║ ██║ ███████║█████╗ ██║ ██║███████║| | 7 | # | |██╔══██║██║ ██║ ██║ ██╔══██║██╔══╝ ██║ ██║██╔══██║| | 8 | # | |██║ ██║╚██████╔╝ ██║ ██║ ██║███████╗███████╗██║██║ ██║| | 9 | # | |╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚═╝| | 10 | # __| |_____________________________________________________________| |__ 11 | # __ _____________________________________________________________ __ 12 | # | | | | 13 | 14 | # Authelia is the authentication server for our services. 15 | # It allows us to expose our services to the internet in a secure way. 16 | # When accessing a service, if authelia is configured as a middleware for that service, Traefik will redirect the user to authelia for authentication. 17 | # Once authenticated, the user will be redirected back to the service they were trying to access. 18 | # 19 | # Note: Due to the way Stremio addons work, they cannot be protected by Authelia. 20 | # This is because the addons need to be publicly accessible in order for Stremio (and other stremio addon clients) to be able to access them. 21 | 22 | # The display name for WebAuthn that shows in the browser. 23 | AUTHELIA_WEBAUTHN_DISPLAY_NAME="Authelia" 24 | 25 | # The valid users for Authelia are stored in the users.yml file. 26 | # This is located in `${DOCKER_DATA_DIR}/data/authelia/config/users.yml` 27 | # You must add your users to this file in order to be able to access secured services. 28 | 29 | # Note: When you first login with a user, Authelia will ask for a code that it says it sent to you. 30 | # This will be located in the notification.txt file in the same directory as the users.yml file. 31 | # You can run this command to view the file, replacing ${DOCKER_DATA_DIR} with its actual value: 32 | # cat ${DOCKER_DATA_DIR}/data/authelia/config/notification.txt 33 | 34 | # A list of domains to apply page specific rules to. 35 | # Although we can't fully protect Stremio addons, we can still add authentication to specific pages like the configuration pages. 36 | # All the domains within this comma separated list will have specific pages protected with Authelia. 37 | # Do NOT include non-stremio addon domains here. It would mean that those services would not be fully protected, or in most cases not protected at all. 38 | STREMIO_ADDON_HOSTNAMES=${AIOSTREAMS_HOSTNAME},${AIOSTREMIO_HOSTNAME},${ANIME_KITSU_HOSTNAME},${COMET_HOSTNAME},${EASYNEWS_PLUS_HOSTNAME},${EASYNEWS_PLUS_PLUS_HOSTNAME},${MEDIAFUSION_HOSTNAME},${JACKETTIO_HOSTNAME},${STREMIO_JACKETT_HOSTNAME},${STREMTHRU_HOSTNAME},${OMG_TV_STREMIO_ADDON_HOSTNAME},${STREMIO_CATALOG_PROVIDERS_HOSTNAME},${STREMIO_TRAKT_ADDON_HOSTNAME},${TMDB_ADDON_HOSTNAME} -------------------------------------------------------------------------------- /apps/authelia/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | authelia: 3 | container_name: 'authelia' 4 | image: 'authelia/authelia' 5 | restart: 'unless-stopped' 6 | user: $PUID:$PGID 7 | environment: 8 | TZ: ${TZ:-Etc/UTC} 9 | X_AUTHELIA_CONFIG_FILTERS: template 10 | TEMPLATE_AUTHELIA_SESSION_SECRET: ${AUTHELIA_SESSION_SECRET?} 11 | TEMPLATE_DOMAIN: ${DOMAIN?} 12 | TEMPLATE_AUTHELIA_HOSTNAME: ${AUTHELIA_HOSTNAME?} 13 | TEMPLATE_AUTHELIA_STORAGE_ENCRYPTION_KEY: ${AUTHELIA_STORAGE_ENCRYPTION_KEY?} 14 | TEMPLATE_AUTHELIA_WEBAUTHN_DISPLAY_NAME: ${AUTHELIA_WEBAUTHN_DISPLAY_NAME?} 15 | TEMPLATE_AUTHELIA_JWT_SECRET: ${AUTHELIA_JWT_SECRET?} 16 | TEMPLATE_STREMIO_ADDON_HOSTNAMES: ${STREMIO_ADDON_HOSTNAMES?} 17 | labels: 18 | - "traefik.enable=true" 19 | - "traefik.http.routers.authelia.rule=Host(`${AUTHELIA_HOSTNAME?}`)" 20 | - "traefik.http.routers.authelia.entryPoints=websecure" 21 | - "traefik.http.routers.authelia.tls.certresolver=letsencrypt" 22 | - "traefik.http.services.authelia.loadbalancer.server.port=9091" 23 | - "traefik.http.middlewares.authelia.forwardAuth.address=http://authelia:9091/api/authz/forward-auth" 24 | - "traefik.http.middlewares.authelia.forwardAuth.trustForwardHeader=true" 25 | - "traefik.http.middlewares.authelia.forwardAuth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Email,Remote-Name" 26 | volumes: 27 | - '${DOCKER_DATA_DIR}/authelia/config:/config' 28 | depends_on: 29 | authelia_redis: 30 | condition: service_healthy 31 | authelia_postgres: 32 | condition: service_healthy 33 | profiles: 34 | - authelia 35 | - required 36 | - all 37 | 38 | authelia_redis: 39 | image: redis:latest 40 | container_name: authelia_redis 41 | restart: unless-stopped 42 | volumes: 43 | - ${DOCKER_DATA_DIR}/authelia/cache:/data 44 | command: redis-server --appendonly yes --save 60 1 45 | healthcheck: 46 | test: ["CMD", "redis-cli", "ping"] 47 | interval: 10s 48 | timeout: 5s 49 | retries: 5 50 | profiles: 51 | - authelia 52 | - required 53 | - all 54 | 55 | authelia_postgres: 56 | image: postgres:17-alpine 57 | restart: unless-stopped 58 | container_name: authelia_postgres 59 | volumes: 60 | - ${DOCKER_DATA_DIR}/authelia/db:/var/lib/postgresql/data 61 | environment: 62 | POSTGRES_USER: authelia 63 | POSTGRES_PASSWORD: authelia 64 | POSTGRES_DB: authelia 65 | healthcheck: 66 | test: ["CMD-SHELL", "pg_isready -U authelia -d authelia"] 67 | start_period: 1m 68 | interval: 20s 69 | timeout: 5s 70 | retries: 5 71 | profiles: 72 | - authelia 73 | - required 74 | - all 75 | -------------------------------------------------------------------------------- /apps/autosync/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | autosync: 3 | image: ghcr.io/pukabyte/autosync:latest 4 | container_name: autosync 5 | restart: unless-stopped 6 | expose: 7 | - 3536 8 | environment: 9 | - TZ=${TZ:-Etc/UTC} 10 | - PUID=${PUID} 11 | - PGID=${PGID} 12 | - UMASK=022 13 | labels: 14 | - "traefik.enable=true" 15 | - "traefik.http.routers.autosync.rule=Host(`${AUTOSYNC_HOSTNAME?}`)" 16 | - "traefik.http.routers.autosync.entrypoints=websecure" 17 | - "traefik.http.routers.autosync.tls.certresolver=letsencrypt" 18 | - "traefik.http.routers.autosync.middlewares=authelia@docker" 19 | - "traefik.http.services.autosync.loadbalancer.server.port=3536" 20 | volumes: 21 | - ${DOCKER_DATA_DIR}/autosync/config.yaml:/app/config.yaml 22 | - /etc/localtime:/etc/localtime:ro 23 | - /mnt:/mnt 24 | depends_on: 25 | sonarr: 26 | condition: service_healthy 27 | sonarr4k: 28 | condition: service_healthy 29 | sonarranime: 30 | condition: service_healthy 31 | radarr: 32 | condition: service_healthy 33 | radarr4k: 34 | condition: service_healthy 35 | radarranime: 36 | condition: service_healthy 37 | profiles: 38 | - all 39 | - autosync 40 | - debrid_media_server 41 | -------------------------------------------------------------------------------- /apps/bazarr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | bazarr: 3 | image: ghcr.io/hotio/bazarr 4 | container_name: bazarr 5 | restart: unless-stopped 6 | expose: 7 | - 6767 8 | environment: 9 | - PUID=${PUID} 10 | - PGID=${PGID} 11 | - TZ=${TZ:-UTC} 12 | volumes: 13 | - ${DOCKER_DATA_DIR}/bazarr/default/config:/config 14 | - ${DOCKER_DATA_DIR}/bazarr/default/data:/data 15 | - /mnt:/mnt 16 | labels: 17 | - "traefik.enable=true" 18 | - "traefik.http.routers.bazarr.rule=Host(`${BAZARR_HOSTNAME?}`)" 19 | - "traefik.http.routers.bazarr.entrypoints=websecure" 20 | - "traefik.http.routers.bazarr.tls.certresolver=letsencrypt" 21 | - "traefik.http.routers.bazarr.middlewares=authelia@docker" 22 | - "traefik.http.services.bazarr.loadbalancer.server.port=6767" 23 | profiles: 24 | - all 25 | - bazarr 26 | - debrid_media_server 27 | depends_on: 28 | - rclone 29 | - sonarr 30 | - radarr 31 | 32 | 33 | bazarr4k: 34 | image: ghcr.io/hotio/bazarr 35 | container_name: bazarr4k 36 | restart: unless-stopped 37 | expose: 38 | - 6767 39 | environment: 40 | - PUID=${PUID} 41 | - PGID=${PGID} 42 | - TZ=${TZ:-UTC} 43 | volumes: 44 | - ${DOCKER_DATA_DIR}/bazarr/4k/config:/config 45 | - ${DOCKER_DATA_DIR}/bazarr/4k/data:/data 46 | - /mnt:/mnt 47 | labels: 48 | - "traefik.enable=true" 49 | - "traefik.http.routers.bazarr4k.rule=Host(`${BAZARR4K_HOSTNAME?}`)" 50 | - "traefik.http.routers.bazarr4k.entrypoints=websecure" 51 | - "traefik.http.routers.bazarr4k.tls.certresolver=letsencrypt" 52 | - "traefik.http.routers.bazarr4k.middlewares=authelia@docker" 53 | - "traefik.http.services.bazarr4k.loadbalancer.server.port=6767" 54 | profiles: 55 | - all 56 | - bazarr 57 | - debrid_media_server 58 | depends_on: 59 | - rclone 60 | - sonarr4k 61 | - radarr4k 62 | -------------------------------------------------------------------------------- /apps/beszel/.env: -------------------------------------------------------------------------------- 1 | # For beszel to work correctly, you first need to start the hub only. 2 | # Do this by running (you must already have traefik and authelia running): 3 | # docker compose up -d beszel 4 | 5 | # After the hub is up, you need to go to the web interface and click '+ Add System' in the top right corner. 6 | # It will give you a public key. Copy that key and paste it below. 7 | BESZEL_AGENT_KEY="" 8 | 9 | # Now, start the agent using the command below: 10 | # docker compose up -d beszel_agent 11 | 12 | # After the agent is up, go back to the web interface to the 'Add System' dialog. 13 | # Set the name to whatever you want 14 | # Set the 'Host / IP' to /beszel_socket/beszel.sock 15 | # Then, click 'Add System' 16 | 17 | # You should now see the agent in the list of systems. -------------------------------------------------------------------------------- /apps/beszel/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | beszel: 3 | image: henrygd/beszel 4 | container_name: beszel 5 | restart: unless-stopped 6 | expose: 7 | - 8090 8 | volumes: 9 | - ${DOCKER_DATA_DIR}/beszel/data:/beszel_data 10 | - ${DOCKER_DATA_DIR}/beszel/socket:/beszel_socket 11 | labels: 12 | - "traefik.enable=true" 13 | - "traefik.http.routers.beszel.rule=Host(`${BESZEL_HOSTNAME?}`)" 14 | - "traefik.http.routers.beszel.entrypoints=websecure" 15 | - "traefik.http.routers.beszel.tls.certresolver=letsencrypt" 16 | - "traefik.http.routers.beszel.middlewares=authelia@docker" 17 | profiles: 18 | - beszel 19 | - all 20 | 21 | beszel_agent: 22 | image: henrygd/beszel-agent:latest 23 | container_name: beszel_agent 24 | restart: unless-stopped 25 | network_mode: host 26 | volumes: 27 | - ${DOCKER_DATA_DIR}/beszel/socket:/beszel_socket 28 | - /var/run/docker.sock:/var/run/docker.sock:ro 29 | environment: 30 | LISTEN: /beszel_socket/beszel.sock 31 | KEY: '${BESZEL_AGENT_KEY}' 32 | profiles: 33 | - beszel 34 | - all -------------------------------------------------------------------------------- /apps/byparr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | byparr: 3 | image: ghcr.io/thephaseless/byparr 4 | container_name: byparr 5 | restart: unless-stopped 6 | environment: 7 | - LOG_LEVEL=INFO 8 | volumes: 9 | - ${DOCKER_DATA_DIR}/byparr/screenshots:/app/screenshots 10 | healthcheck: 11 | test: curl -f http://localhost:8191/health 12 | interval: 5m 13 | timeout: 10s 14 | retries: 3 15 | start_period: 10s 16 | profiles: 17 | - byparr 18 | - stremio 19 | - debrid_media_server 20 | - all 21 | -------------------------------------------------------------------------------- /apps/cloudflare-ddns/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | cloudflare-ddns: 3 | image: favonia/cloudflare-ddns:1 4 | container_name: cloudflare-ddns 5 | restart: unless-stopped 6 | user: "${PUID}:${PGID}" 7 | network_mode: host 8 | read_only: true 9 | cap_drop: [all] 10 | security_opt: [no-new-privileges:true] 11 | environment: 12 | - CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN} 13 | # Your Cloudflare API token 14 | - DOMAINS=${DOMAINS} 15 | # Your domains (separated by commas) 16 | - PROXIED=false 17 | # Tell Cloudflare to cache webpages and hide your IP (optional) 18 | profiles: 19 | - cloudflare-ddns 20 | - all 21 | -------------------------------------------------------------------------------- /apps/comet/.env: -------------------------------------------------------------------------------- 1 | #=================================================# 2 | # ██████╗ ██████╗ ███╗ ███╗███████╗████████╗ # 3 | # ██╔════╝██╔═══██╗████╗ ████║██╔════╝╚══██╔══╝ # 4 | # ██║ ██║ ██║██╔████╔██║█████╗ ██║ # 5 | # ██║ ██║ ██║██║╚██╔╝██║██╔══╝ ██║ # 6 | # ╚██████╗╚██████╔╝██║ ╚═╝ ██║███████╗ ██║ # 7 | # ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ # 8 | #=================================================# 9 | 10 | # ============================== # 11 | # Stremio Addon Configuration # 12 | # ============================== # 13 | ADDON_ID=stremio.comet.fast 14 | ADDON_NAME=Comet 15 | 16 | # ============================== # 17 | # FastAPI Server Configuration # 18 | # ============================== # 19 | FASTAPI_HOST=0.0.0.0 20 | FASTAPI_PORT=2020 21 | FASTAPI_WORKERS=-1 22 | USE_GUNICORN=True # Will use uvicorn if False or if on Windows 23 | 24 | # ============================== # 25 | # Dashboard Settings # 26 | # ============================== # 27 | DASHBOARD_ADMIN_PASSWORD=CHANGE_ME # The password to access the dashboard 28 | 29 | # ============================== # 30 | # Database Configuration # 31 | # ============================== # 32 | # The database type to use. If using SQLite, the path to the database file is required. 33 | # If using PostgreSQL, the URL to the database is required. 34 | # Postgres should only be used if you need concurrency e.g. mutliple instances of Comet, or using 35 | # multiple debrid services with Comet. 36 | DATABASE_TYPE=sqlite # Options: sqlite, postgresql 37 | DATABASE_URL=comet:comet@comet_postgres:5432/comet # For PostgreSQL 38 | DATABASE_PATH=data/comet.db # Only relevant for SQLite 39 | 40 | # ============================== # 41 | # Cache Settings (Seconds) # 42 | # ============================== # 43 | METADATA_CACHE_TTL=2592000 # 30 days 44 | TORRENT_CACHE_TTL=1296000 # 15 days 45 | DEBRID_CACHE_TTL=86400 # 1 day 46 | 47 | # ============================== # 48 | # Debrid Proxy Configuration # 49 | # ============================== # 50 | DEBRID_PROXY_URL=http://warp:1080 # Bypass Debrid Services and Torrentio IP blacklist 51 | 52 | # ============================== # 53 | # Indexer Manager Settings # 54 | # ============================== # 55 | INDEXER_MANAGER_TYPE=none # Options: jackett, prowlarr, none 56 | INDEXER_MANAGER_URL=http://jackett:9117 57 | INDEXER_MANAGER_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 58 | INDEXER_MANAGER_TIMEOUT=60 # Max time to get search results (seconds) 59 | INDEXER_MANAGER_INDEXERS='["EXAMPLE1_CHANGETHIS", "EXAMPLE2_CHANGETHIS"]' # Jackett/Prowlarr indexers 60 | 61 | # ============================== # 62 | # Torrent Settings # 63 | # ============================== # 64 | GET_TORRENT_TIMEOUT=5 # Max time to obtain torrent info hash (seconds) 65 | DOWNLOAD_TORRENT_FILES=True # Enable torrent file retrieval (instead of magnet link only) 66 | 67 | # ============================== # 68 | # Scraping Configuration # 69 | # ============================== # 70 | # To scrape the public instance of Comet. 71 | SCRAPE_COMET=true 72 | COMET_URL=https://comet.elfhosted.com 73 | 74 | # Whether to scrape Zilean, a DMM hashlist scraper. 75 | SCRAPE_ZILEAN=true 76 | ZILEAN_URL=http://zilean:8181 77 | # You can instead use the public, unratelimited, elfhosted instance of Zilean if not hosting your own: 78 | # ZILEAN_URL=https://zilean.elfhosted.com 79 | 80 | SCRAPE_TORRENTIO=true 81 | TORRENTIO_URL=https://torrentio.strem.fun 82 | 83 | SCRAPE_MEDIAFUSION=true 84 | MEDIAFUSION_URL=http://mediafusion:8000 85 | # You can instead use the public elfhosted instance of MediaFusion if not hosting your own: 86 | # MEDIAFUSION_URL=https://mediafusion.elfhosted.com 87 | 88 | 89 | # ============================== # 90 | # StremThru Integration # 91 | # ============================== # 92 | # StremThru is used to provide debrid capability to the addon, and is required for the addon to work. 93 | # It provides cache information too. 94 | STREMTHRU_URL=http://stremthru:8080 95 | # You can instead use this public instance of StremThru which has access to the ElfHosted cache, hosted by 96 | # the developer of StremThru: 97 | # STREMTHRU_URL=https://stremthru.13377001.xyz 98 | 99 | # ============================== # 100 | # Debrid Stream Proxy Settings # 101 | # ============================== # 102 | PROXY_DEBRID_STREAM=False 103 | PROXY_DEBRID_STREAM_PASSWORD=CHANGE_ME 104 | PROXY_DEBRID_STREAM_MAX_CONNECTIONS=-1 # -1 to disable connection limits 105 | PROXY_DEBRID_STREAM_DEBRID_DEFAULT_SERVICE=realdebrid 106 | PROXY_DEBRID_STREAM_DEBRID_DEFAULT_APIKEY=CHANGE_ME 107 | 108 | # ============================== # 109 | # Content Filtering # 110 | # ============================== # 111 | REMOVE_ADULT_CONTENT=False 112 | 113 | # ============================== # 114 | # UI Customization # 115 | # ============================== # 116 | CUSTOM_HEADER_HTML=None 117 | 118 | -------------------------------------------------------------------------------- /apps/comet/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | comet: 3 | container_name: comet 4 | image: g0ldyy/comet:latest 5 | restart: unless-stopped 6 | expose: 7 | - 2020 8 | env_file: 9 | - .env 10 | labels: 11 | - traefik.enable=true 12 | - traefik.http.routers.comet.rule=Host(`${COMET_HOSTNAME?}`) 13 | - traefik.http.routers.comet.entrypoints=websecure 14 | - traefik.http.routers.comet.tls.certresolver=letsencrypt 15 | - traefik.http.routers.comet.middlewares=authelia@docker 16 | volumes: 17 | - ${DOCKER_DATA_DIR}/comet:/app/data 18 | healthcheck: 19 | test: wget -qO- http://127.0.0.1:2020/health 20 | interval: 1m 21 | timeout: 10s 22 | retries: 5 23 | start_period: 10s 24 | profiles: 25 | - comet 26 | - stremio 27 | - all 28 | 29 | # If you would like to use postgres instead of sqlite, uncomment the followling lines, 30 | # and set the DATABASE_TYPE to postgres and DATABASE_URL to 31 | # comet_postgres: 32 | # image: postgres:latest 33 | # container_name: comet_postgres 34 | # restart: unless-stopped 35 | # volumes: 36 | # - ${DOCKER_DATA_DIR}/comet/postgres:/var/lib/postgresql/data 37 | # environment: 38 | # - POSTGRES_USER=comet 39 | # - POSTGRES_PASSWORD=comet 40 | # - POSTGRES_DB=comet 41 | # healthcheck: 42 | # test: ["CMD", "pg_isready", "-U", "comet"] 43 | # interval: 10s 44 | # timeout: 5s 45 | # retries: 5 46 | # profiles: 47 | # - comet 48 | # - stremio 49 | # - all 50 | -------------------------------------------------------------------------------- /apps/compose.yaml: -------------------------------------------------------------------------------- 1 | include: 2 | - authelia/compose.yaml 3 | - addon-manager/compose.yaml 4 | - aiostreams/compose.yaml 5 | - aiostremio/compose.yaml 6 | - anime-kitsu/compose.yaml 7 | - autosync/compose.yaml 8 | - bazarr/compose.yaml 9 | - beszel/compose.yaml 10 | - byparr/compose.yaml 11 | - cloudflare-ddns/compose.yaml 12 | - comet/compose.yaml 13 | - dash/compose.yaml 14 | - dockge/compose.yaml 15 | - dozzle/compose.yaml 16 | - easynews-plus/compose.yaml 17 | - easynews-plus-plus/compose.yaml 18 | - gluetun/compose.yaml 19 | - honey/compose.yaml 20 | - huntarr/compose.yaml 21 | - jackett/compose.yaml 22 | - jackettio/compose.yaml 23 | - jellyfin/compose.yaml 24 | - jellyseer/compose.yaml 25 | - kometa/compose.yaml 26 | - librespeed/compose.yaml 27 | - mediaflow-proxy/compose.yaml 28 | - mediafusion/compose.yaml 29 | - minecraft/compose.yaml 30 | - nzbhydra2/compose.yaml 31 | - omg-tv-addon/compose.yaml 32 | - overseerr/compose.yaml 33 | - plausible/compose.yaml 34 | - plex/compose.yaml 35 | - plex-trakt-sync/compose.yaml 36 | - portainer/compose.yaml 37 | - prowlarr/compose.yaml 38 | - radarr/compose.yaml 39 | - realdebrid-account-monitor/compose.yaml 40 | - recyclarr/compose.yaml 41 | - seanime/compose.yaml 42 | - searxng/compose.yaml 43 | - sonarr/compose.yaml 44 | - speedtest-tracker/compose.yaml 45 | - sshbot/compose.yaml 46 | - streamystats/compose.yaml 47 | - stremio-catalog-providers/compose.yaml 48 | - stremio-jackett/compose.yaml 49 | - stremio-server/compose.yaml 50 | - stremio-trakt-addon/compose.yaml 51 | - stremthru/compose.yaml 52 | - tautulli/compose.yaml 53 | - tmdb-addon/compose.yaml 54 | - torbox-manager/compose.yaml 55 | - torbox-media-center/compose.yaml 56 | - traefik/compose.yaml 57 | - tweakio/compose.yaml 58 | - uptime-kuma/compose.yaml 59 | - vaultwarden/compose.yaml 60 | - warp/compose.yaml 61 | - watchtower/compose.yaml 62 | - wests-scripts/compose.yaml 63 | - yamtrack/compose.yaml 64 | - zilean/compose.yaml 65 | - zipline/compose.yaml 66 | - zurg/compose.yaml 67 | 68 | networks: 69 | default: 70 | name: ${DOCKER_NETWORK:-aio_default} 71 | external: ${DOCKER_NETWORK_EXTERNAL:-false} 72 | -------------------------------------------------------------------------------- /apps/dash/.env: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------- 2 | # DASH DOT - DASHBOARD 3 | # --------------------------------------------------------- 4 | # Dash Dot is a dashboard that you can use to monitor your VPS. It provides information about the CPU, RAM, Disk, and Network usage. 5 | # You will be able to access the dashboard at https://${DASHDOT_HOSTNAME} 6 | # --------------------------------------------------------- 7 | # This is the title of the page that shows up in the browser tab 8 | DASHDOT_PAGE_TITLE=dash. 9 | # Whether you want your domain name to show up in the dashboard 10 | # e.g. if your domain was dash.example.com, it would show example.com in the dashboard 11 | DASHDOT_SHOW_HOST=true 12 | # Customise the host shown (requires DASHDOT_SHOW_HOST to be true) 13 | DASHDOT_CUSTOM_HOST= 14 | 15 | DASHDOT_ALWAYS_SHOW_PERCENTAGES=true 16 | DASHDOT_ACCEPT_OOKLA_EULA=true 17 | DASHDOT_NETWORK_SPEED_AS_BYTES=false 18 | -------------------------------------------------------------------------------- /apps/dash/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | # Start page for your serve 3 | dash: 4 | image: mauricenino/dashdot:latest 5 | container_name: dash 6 | restart: unless-stopped 7 | expose: 8 | - 3001 9 | privileged: true 10 | env_file: 11 | - .env 12 | volumes: 13 | - /:/mnt/host:ro 14 | labels: 15 | - "traefik.enable=true" 16 | - "traefik.http.routers.dash.rule=Host(`${DASHDOT_HOSTNAME?}`)" 17 | - "traefik.http.routers.dash.entrypoints=websecure" 18 | - "traefik.http.routers.dash.tls.certresolver=letsencrypt" 19 | - "traefik.http.routers.dash.middlewares=authelia@docker" 20 | profiles: 21 | - dash 22 | - all 23 | -------------------------------------------------------------------------------- /apps/dockge/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | dockge: 3 | image: louislam/dockge:1 4 | container_name: dockge 5 | restart: unless-stopped 6 | expose: 7 | - 5001 8 | environment: 9 | # Tell Dockge where to find the stacks 10 | - DOCKGE_STACKS_DIR=${DOCKER_APP_DIR} 11 | - DOCKGE_ENABLE_CONSOLE=true 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.dockge.rule=Host(`${DOCKGE_HOSTNAME?}`)" 15 | - "traefik.http.routers.dockge.entrypoints=websecure" 16 | - "traefik.http.routers.dockge.tls.certresolver=letsencrypt" 17 | - "traefik.http.routers.dockge.middlewares=authelia@docker" 18 | volumes: 19 | - /var/run/docker.sock:/var/run/docker.sock 20 | - ${DOCKER_DATA_DIR}/dockge:/app/data 21 | # Stacks Directory 22 | # ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH. 23 | # ⚠️ 1. FULL path only. No relative path (MUST) 24 | # ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST) 25 | - ${DOCKER_APP_DIR}:${DOCKER_APP_DIR} 26 | profiles: 27 | - dockge 28 | - all -------------------------------------------------------------------------------- /apps/dozzle/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | dozzle: 3 | image: amir20/dozzle:latest 4 | container_name: dozzle 5 | restart: unless-stopped 6 | expose: 7 | - 8080 8 | environment: 9 | - DOZZLE_ENABLE_ACTIONS=true 10 | - DOZZLE_NO_ANALYTICS=true 11 | volumes: 12 | - /var/run/docker.sock:/var/run/docker.sock 13 | labels: 14 | - "traefik.enable=true" 15 | - "traefik.http.routers.dozzle.rule=Host(`${DOZZLE_HOSTNAME?}`)" 16 | - "traefik.http.routers.dozzle.entrypoints=websecure" 17 | - "traefik.http.routers.dozzle.tls.certresolver=letsencrypt" 18 | - "traefik.http.routers.dozzle.middlewares=authelia@docker" 19 | healthcheck: 20 | test: ["CMD", "/dozzle", "healthcheck"] 21 | interval: 3s 22 | timeout: 30s 23 | retries: 5 24 | start_period: 30s 25 | profiles: 26 | - dozzle 27 | - all 28 | -------------------------------------------------------------------------------- /apps/easynews-plus-plus/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | easynews-plus-plus: 3 | image: ghcr.io/pantelx/easynews-plus-plus:latest 4 | container_name: easynews-plus-plus 5 | restart: unless-stopped 6 | expose: 7 | - 1337 8 | environment: 9 | - EASYNEWS_LOG_LEVEL=TRACE 10 | labels: 11 | - "traefik.enable=true" 12 | - "traefik.http.routers.easynews-plus-plus.rule=Host(`${EASYNEWS_PLUS_PLUS_HOSTNAME}`)" 13 | - "traefik.http.services.easynews-plus-plus.loadbalancer.server.port=1337" 14 | - "traefik.http.routers.easynews-plus-plus.entrypoints=websecure" 15 | - "traefik.http.routers.easynews-plus-plus.tls=true" 16 | - "traefik.http.routers.easynews-plus-plus.tls.certresolver=letsencrypt" 17 | - "traefik.http.routers.easynews-plus-plus.middlewares=authelia@docker" 18 | volumes: 19 | - ${DOCKER_DATA_DIR}/easynews-plus-plus/custom-titles.json:/app/custom-titles.json 20 | profiles: 21 | - all 22 | - easynews-plus-plus 23 | -------------------------------------------------------------------------------- /apps/easynews-plus/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | easynews-plus: 3 | image: ghcr.io/sleeyax/stremio-easynews-addon:latest 4 | container_name: easynews-plus 5 | restart: unless-stopped 6 | expose: 7 | - 1337 8 | labels: 9 | - "traefik.enable=true" 10 | - "traefik.http.routers.easynews-plus.rule=Host(`${EASYNEWS_PLUS_HOSTNAME?}`)" 11 | - "traefik.http.routers.easynews-plus.entrypoints=websecure" 12 | - "traefik.http.routers.easynews-plus.tls.certresolver=letsencrypt" 13 | - "traefik.http.routers.easynews-plus.middlewares=authelia@docker" 14 | profiles: 15 | - easynews-plus 16 | - stremio 17 | - all -------------------------------------------------------------------------------- /apps/gluetun/.env: -------------------------------------------------------------------------------- 1 | # This file is used to configure the gluetun container. 2 | # It is currently setup for ProtonVPN, as it is free. If you would like to configure gluetun 3 | # for another provider, please see the Gluetun wiki: https://github.com/qdm12/gluetun-wiki/tree/main/setup/providers 4 | 5 | VPN_SERVICE_PROVIDER=protonvpn 6 | SERVER_COUNTRIES=Netherlands 7 | # If you are using a paid ProtonVPN account, you can set this to true to only use free servers. 8 | FREE_ONLY=true 9 | # Server list updater 10 | # See https://github.com/qdm12/gluetun-wiki/blob/main/setup/servers.md#update-the-vpn-servers-list 11 | UPDATER_PERIOD=24h 12 | 13 | # VPN Authentication 14 | # If you want to use WireGuard, you will need the wireguard private key. 15 | # Follow this guide: https://protonvpn.com/support/wireguard-configurations/ 16 | # Or obtain it directly from here: https://account.proton.me/u/0/vpn/WireGuard 17 | 18 | VPN_TYPE=wireguard 19 | WIREGUARD_PRIVATE_KEY= 20 | 21 | # If you want to use OpenVPN, you need the OpenVPN username specific to your ProtonVPN account. 22 | # Change the VPN_TYPE to openvpn and set the username and password below. 23 | # Get the credentials from here: https://account.proton.me/u/0/vpn/OpenVpnIKEv2 24 | # OPENVPN_USER= 25 | # OPENVPN_PASSWORD= 26 | # 27 | 28 | 29 | # With this setup, you can now use gluetun:8080 as a HTTP/SOCKS5 proxy. 30 | -------------------------------------------------------------------------------- /apps/gluetun/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | gluetun: 3 | image: qmcgaw/gluetun 4 | container_name: gluetun 5 | restart: unless-stopped 6 | cap_add: 7 | - NET_ADMIN 8 | devices: 9 | - /dev/net/tun:/dev/net/tun 10 | env_file: 11 | - .env 12 | volumes: 13 | - ${DOCKER_DATA_DIR}/gluetun:/gluetun 14 | healthcheck: 15 | test: ["CMD", "/gluetun-entrypoint", "healthcheck"] 16 | interval: 60s 17 | timeout: 5s 18 | retries: 3 19 | start_period: 1m 20 | profiles: 21 | - gluetun 22 | - all 23 | 24 | # Use Gost as a proxy because its better. 25 | gost: 26 | image: ginuerzh/gost 27 | container_name: gost 28 | restart: unless-stopped 29 | network_mode: service:gluetun 30 | command: "-L :8080" 31 | depends_on: 32 | gluetun: 33 | condition: service_healthy 34 | restart: true 35 | profiles: 36 | - gluetun 37 | - all 38 | 39 | 40 | -------------------------------------------------------------------------------- /apps/honey/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | honey: 3 | image: ghcr.io/dani3l0/honey:latest 4 | container_name: honey 5 | restart: unless-stopped 6 | user: $PUID:$PGID 7 | volumes: 8 | - ${DOCKER_DATA_DIR}/honey:/app/dist/config 9 | - ${DOCKER_DATA_DIR}/honey/img:/app/dist/img/custom 10 | expose: 11 | - 4173 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.honey.rule=Host(`${HONEY_HOSTNAME?}`)" 15 | - "traefik.http.routers.honey.entrypoints=websecure" 16 | - "traefik.http.routers.honey.tls.certresolver=letsencrypt" 17 | - "traefik.http.routers.honey.middlewares=authelia@docker" 18 | profiles: 19 | - honey 20 | - all 21 | -------------------------------------------------------------------------------- /apps/huntarr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | huntarr: 3 | image: huntarr/huntarr:latest 4 | container_name: huntarr 5 | restart: unless-stopped 6 | expose: 7 | - 9705 8 | environment: 9 | - TZ=${TZ} 10 | - PUID=${PUID} 11 | - PGID=${PGID} 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.huntarr.rule=Host(`${HUNTARR_HOSTNAME?}`)" 15 | - "traefik.http.routers.huntarr.entrypoints=websecure" 16 | - "traefik.http.routers.huntarr.tls.certresolver=letsencrypt" 17 | - "traefik.http.routers.huntarr.middlewares=authelia@docker" 18 | volumes: 19 | - ${DOCKER_DATA_DIR?}/huntarr:/config 20 | profiles: 21 | - huntarr 22 | - all -------------------------------------------------------------------------------- /apps/jackett/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | jackett: 3 | image: linuxserver/jackett:latest 4 | container_name: jackett 5 | environment: 6 | - PUID=${PUID} 7 | - PGID=${PGID} 8 | - TZ=${TZ:-UTC} 9 | expose: 10 | - 9117 11 | volumes: 12 | - ${DOCKER_DATA_DIR}/jackett:/config 13 | restart: unless-stopped 14 | labels: 15 | - "traefik.enable=true" 16 | - "traefik.http.routers.jackett.rule=Host(`${JACKETT_HOSTNAME?}`)" 17 | - "traefik.http.routers.jackett.entrypoints=websecure" 18 | - "traefik.http.routers.jackett.tls.certresolver=letsencrypt" 19 | - "traefik.http.routers.jackett.middlewares=authelia@docker" 20 | healthcheck: 21 | test: curl -f http://localhost:9117/health 22 | interval: 30s 23 | timeout: 10s 24 | retries: 3 25 | start_period: 30s 26 | profiles: 27 | - jackett 28 | - stremio 29 | - all 30 | - indexers 31 | -------------------------------------------------------------------------------- /apps/jackettio/.env: -------------------------------------------------------------------------------- 1 | # Jackett instance details. If you haven't run your instance yet, you can leave these blank. 2 | # Once jackett is running you can find the API key in the web UI at the top right corner of the page. 3 | JACKETT_URL=http://jackett:9117 4 | JACKETT_API_KEY= 5 | # https://www.themoviedb.org/settings/api 6 | TMDB_ACCESS_TOKEN= 7 | -------------------------------------------------------------------------------- /apps/jackettio/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | jackettio: 3 | image: ghcr.io/telkaoss/jackettio:latest 4 | container_name: jackettio 5 | restart: unless-stopped 6 | user: $PUID:$PGID 7 | expose: 8 | - 4000 9 | environment: 10 | - JACKETT_URL=${JACKETT_URL?} 11 | - JACKETT_API_KEY=${JACKETT_API_KEY?} 12 | - TMDB_ACCESS_TOKEN=${TMDB_ACCESS_TOKEN?} 13 | - DATA_FOLDER=/data 14 | volumes: 15 | - ${DOCKER_DATA_DIR}/jackettio:/data 16 | labels: 17 | - "traefik.enable=true" 18 | - "traefik.http.routers.jackettio.rule=Host(`${JACKETTIO_HOSTNAME?}`)" 19 | - "traefik.http.routers.jackettio.entrypoints=websecure" 20 | - "traefik.http.routers.jackettio.tls.certresolver=letsencrypt" 21 | - "traefik.http.routers.jackettio.middlewares=authelia@docker" 22 | profiles: 23 | - jackettio 24 | - stremio 25 | - all 26 | 27 | -------------------------------------------------------------------------------- /apps/jellyfin/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | jellyfin: 3 | image: lscr.io/linuxserver/jellyfin:latest 4 | restart: unless-stopped 5 | container_name: jellyfin 6 | expose: 7 | - 8096 8 | environment: 9 | - TZ=${TZ:-UTC} 10 | - PUID=${PUID} 11 | - PGID=${PGID} 12 | volumes: 13 | - ${DOCKER_DATA_DIR}/jellyfin:/config 14 | - /mnt:/mnt 15 | labels: 16 | - "traefik.enable=true" 17 | - "traefik.http.routers.jellyfin.rule=Host(`${JELLYFIN_HOSTNAME?}`)" 18 | - "traefik.http.routers.jellyfin.tls=true" 19 | - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" 20 | - "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt" 21 | depends_on: 22 | - rclone 23 | profiles: 24 | - jellyfin 25 | - debrid_media_server 26 | - all 27 | -------------------------------------------------------------------------------- /apps/jellyseer/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | jellyseer: 3 | image: fallenbagel/jellyseerr:latest 4 | container_name: jellyseer 5 | restart: unless-stopped 6 | expose: 7 | - 5055 8 | environment: 9 | - TZ=${TZ:-UTC} 10 | - LOG_LEVEL=debug 11 | labels: 12 | - "traefik.enable=true" 13 | - "traefik.http.routers.jellyseer.rule=Host(`${JELLYSEER_HOSTNAME?}`)" 14 | - "traefik.http.routers.jellyseer.entrypoints=websecure" 15 | - "traefik.http.routers.jellyseer.tls.certresolver=letsencrypt" 16 | volumes: 17 | - ${DOCKER_DATA_DIR}/jellyseer:/app/config 18 | depends_on: 19 | - rclone 20 | profiles: 21 | - jellyseer 22 | - debrid_media_server 23 | - all 24 | -------------------------------------------------------------------------------- /apps/kometa/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | kometa: 3 | image: lscr.io/linuxserver/kometa:latest 4 | container_name: kometa 5 | environment: 6 | - PUID=${PUID} 7 | - PGID=${PGID} 8 | - TZ=${TZ:-Etc/UTC} 9 | - KOMETA_RUN=True 10 | volumes: 11 | - ${DOCKER_DATA_DIR}/kometa:/config 12 | profiles: 13 | - kometa 14 | - all 15 | 16 | kometa_scheduled: 17 | image: lscr.io/linuxserver/kometa:latest 18 | container_name: kometa_scheduled 19 | restart: unless-stopped 20 | environment: 21 | - PUID=${PUID} 22 | - PGID=${PGID} 23 | - TZ=${TZ:-Etc/UTC} 24 | - KOMETA_TIME=00:00,02:00,04:00,06:00,08:00,10:00,12:00,14:00,16:00,18:00,20:00,22:00 25 | - KOMETA_RUN=False 26 | volumes: 27 | - ${DOCKER_DATA_DIR}/kometa:/config 28 | profiles: 29 | - kometa 30 | - all 31 | -------------------------------------------------------------------------------- /apps/librespeed/.env: -------------------------------------------------------------------------------- 1 | LIBRESPEED_TITLE=LibreSpeed -------------------------------------------------------------------------------- /apps/librespeed/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | librespeed: 3 | image: ghcr.io/librespeed/speedtest:latest 4 | container_name: librespeed 5 | restart: unless-stopped 6 | expose: 7 | - 8080 8 | environment: 9 | MODE: standalone 10 | TITLE: ${LIBRESPEED_TITLE:-LibreSpeed} 11 | TELEMETRY: "false" 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.librespeed.rule=Host(`${LIBRESPEED_HOSTNAME?}`)" 15 | - "traefik.http.routers.librespeed.entrypoints=websecure" 16 | - "traefik.http.routers.librespeed.tls.certresolver=letsencrypt" 17 | - "traefik.http.services.librespeed.loadbalancer.server.port=8080" 18 | volumes: 19 | - ${DOCKER_DATA_DIR}/librespeed:/database 20 | profiles: 21 | - librespeed 22 | - all -------------------------------------------------------------------------------- /apps/mediaflow-proxy/.env: -------------------------------------------------------------------------------- 1 | API_PASSWORD= 2 | # Whether to use a proxy or not. 3 | # You can use http://warp:8080 for warp and http://gluetun:8080 for gluetun. 4 | PROXY_URL=http://warp:1080 5 | # Whether to route ALL traffic through the proxy. 6 | # ALL_PROXY=true 7 | TRANSPORT_ROUTES={ "https://torrentio.strem.fun": { "proxy": true } } 8 | -------------------------------------------------------------------------------- /apps/mediaflow-proxy/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | mediaflow-proxy: 3 | image: mhdzumair/mediaflow-proxy 4 | container_name: mediaflow-proxy 5 | restart: unless-stopped 6 | expose: 7 | - 8888 8 | env_file: 9 | - .env 10 | labels: 11 | - "traefik.enable=true" 12 | - "traefik.http.routers.mediaflow.rule=Host(`${MEDIAFLOW_PROXY_HOSTNAME?}`)" 13 | - "traefik.http.routers.mediaflow.entrypoints=websecure" 14 | - "traefik.http.routers.mediaflow.tls.certresolver=letsencrypt" 15 | - "traefik.http.services.mediaflow.loadbalancer.server.port=8888" 16 | healthcheck: 17 | test: python3 -c "import urllib.request; print(urllib.request.urlopen('http://127.0.0.1:8888/health').read().decode())" 18 | interval: 1m 19 | timeout: 10s 20 | retries: 5 21 | start_period: 10s 22 | profiles: 23 | - mediaflow-proxy 24 | - stremio 25 | - all 26 | -------------------------------------------------------------------------------- /apps/mediafusion/.env: -------------------------------------------------------------------------------- 1 | # __| |_____________________________________________________________________________________| |__ 2 | # __ _____________________________________________________________________________________ __ 3 | # | | | | 4 | # | |███╗ ███╗███████╗██████╗ ██╗ █████╗ ███████╗██╗ ██╗███████╗██╗ ██████╗ ███╗ ██╗| | 5 | # | |████╗ ████║██╔════╝██╔══██╗██║██╔══██╗██╔════╝██║ ██║██╔════╝██║██╔═══██╗████╗ ██║| | 6 | # | |██╔████╔██║█████╗ ██║ ██║██║███████║█████╗ ██║ ██║███████╗██║██║ ██║██╔██╗ ██║| | 7 | # | |██║╚██╔╝██║██╔══╝ ██║ ██║██║██╔══██║██╔══╝ ██║ ██║╚════██║██║██║ ██║██║╚██╗██║| | 8 | # | |██║ ╚═╝ ██║███████╗██████╔╝██║██║ ██║██║ ╚██████╔╝███████║██║╚██████╔╝██║ ╚████║| | 9 | # | |╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═══╝| | 10 | # __| |_____________________________________________________________________________________| |__ 11 | # __ _____________________________________________________________________________________ __ 12 | # | | | | 13 | 14 | 15 | 16 | # ======================================================== 17 | # CORE APPLICATION SETTINGS 18 | # ======================================================== 19 | HOST_URL=https://${MEDIAFUSION_HOSTNAME?} 20 | POSTER_HOST_URL=https://${MEDIAFUSION_HOSTNAME} 21 | # # openssl rand -hex 16 22 | SECRET_KEY= 23 | # random password for API 24 | API_PASSWORD= 25 | METADATA_PRIMARY_SOURCE=tmdb 26 | 27 | # ======================================================== 28 | # DATABASE AND CACHE SETTINGS 29 | # ======================================================== 30 | MONGO_URI=mongodb://mediafusion_mongodb:27017/mediafusion 31 | REDIS_URL=redis://mediafusion_redis:6379 32 | 33 | # ======================================================== 34 | # EXTERNAL SERVICE SETTINGS 35 | # ======================================================== 36 | REQUESTS_PROXY_URL=http://warp:1080 37 | FLARESOLVERR_URL=http://byparr:8191 38 | # https://www.themoviedb.org/settings/api 39 | TMDB_API_KEY= 40 | 41 | # ======================================================== 42 | # PROWLARR SETTINGS 43 | # ======================================================== 44 | IS_SCRAP_FROM_PROWLARR=False 45 | PROWLARR_API_KEY= 46 | PROWLARR_URL=http://prowlarr:9696 47 | PROWLARR_IMMEDIATE_MAX_PROCESS=30 48 | PROWLARR_IMMEDIATE_MAX_PROCESS_TIME=120 49 | PROWLARR_SEARCH_INTERVAL_HOUR=24 50 | PROWLARR_FEED_SCRAPE_INTERVAL_HOUR=2 51 | PROWLARR_LIVE_TITLE_SEARCH=true 52 | 53 | # ======================================================== 54 | # JACKETT SETTINGS 55 | # ======================================================== 56 | IS_SCRAP_FROM_JACKETT=False 57 | JACKETT_URL=http://jackett:9117 58 | JACKETT_API_KEY= 59 | JACKETT_IMMEDIATE_MAX_PROCESS=30 60 | JACKETT_IMMEDIATE_MAX_PROCESS_TIME=120 61 | JACKETT_SEARCH_INTERVAL_HOUR=24 62 | JACKETT_FEED_SCRAPE_INTERVAL_HOUR=1 63 | JACKETT_LIVE_TITLE_SEARCH=true 64 | 65 | # ======================================================== 66 | # ZILEAN SETTINGS 67 | # ======================================================== 68 | IS_SCRAP_FROM_ZILEAN=True 69 | ZILEAN_SEARCH_INTERVAL_HOUR=1 70 | ZILEAN_URL=http://zilean:8181 71 | 72 | # ======================================================== 73 | # TORRENTIO SETTINGS 74 | # ======================================================== 75 | IS_SCRAP_FROM_TORRENTIO=true 76 | TORRENTIO_SEARCH_INTERVAL_DAYS=1 77 | TORRENTIO_URL=https://torrentio.strem.fun 78 | 79 | # ======================================================== 80 | # MEDIAFUSION SETTINGS 81 | # ======================================================== 82 | IS_SCRAP_FROM_MEDIAFUSION=true 83 | MEDIAFUSION_SEARCH_INTERVAL_DAYS=1 84 | MEDIAFUSION_URL=https://mediafusion.elfhosted.com 85 | 86 | # ======================================================== 87 | # BT4G SETTINGS 88 | # ======================================================== 89 | IS_SCRAP_FROM_BT4G=true 90 | BT4G_URL=https://bt4gprx.com 91 | BT4G_SEARCH_INTERVAL_HOUR=18 92 | BT4G_SEARCH_TIMEOUT=30 93 | BT4G_IMMEDIATE_MAX_PROCESS=30 94 | BT4G_IMMEDIATE_MAX_PROCESS_TIME=30 95 | 96 | # ======================================================== 97 | # FEATURE TOGGLES 98 | # ======================================================== 99 | IS_SCRAP_FROM_YTS=False 100 | ENABLE_RATE_LIMIT=False 101 | STORE_STREMTHRU_MAGNET_CACHE=True 102 | SCRAPE_WITH_AKA_TITLES=False 103 | 104 | # ======================================================== 105 | # SCHEDULER SETTINGS 106 | # ======================================================== 107 | 108 | BACKGROUND_SEARCH_INTERVAL_HOURS=24 109 | TAMILMV_SCHEDULER_CRONTAB="13 */8 * * *" 110 | TAMIL_BLASTERS_SCHEDULER_CRONTAB="20 */8 * * *" 111 | TAMILULTRA_SCHEDULER_CRONTAB="33 */8 * * *" 112 | -------------------------------------------------------------------------------- /apps/mediafusion/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | mediafusion: 3 | image: mhdzumair/mediafusion:latest 4 | container_name: mediafusion 5 | restart: unless-stopped 6 | expose: 7 | - 8000 8 | env_file: 9 | - .env 10 | healthcheck: 11 | test: ["CMD", "curl", "-f", "http://localhost:8000/health"] 12 | interval: 1m 13 | timeout: 10s 14 | retries: 5 15 | start_period: 10s 16 | depends_on: 17 | mediafusion_mongodb: 18 | condition: service_healthy 19 | mediafusion_redis: 20 | condition: service_healthy 21 | labels: 22 | - "traefik.enable=true" 23 | - "traefik.http.routers.mediafusion.rule=Host(`${MEDIAFUSION_HOSTNAME?}`)" 24 | - "traefik.http.routers.mediafusion.entrypoints=websecure" 25 | - "traefik.http.routers.mediafusion.tls.certresolver=letsencrypt" 26 | - "traefik.http.routers.mediafusion.middlewares=authelia@docker" 27 | profiles: 28 | - mediafusion 29 | - stremio 30 | - all 31 | 32 | mediafusion_scheduler: 33 | image: mhdzumair/mediafusion:latest 34 | container_name: mediafusion_scheduler 35 | command: ["dramatiq", "api.task", "-p", "1", "-t", "4"] 36 | restart: unless-stopped 37 | env_file: 38 | - .env 39 | depends_on: 40 | mediafusion_mongodb: 41 | condition: service_healthy 42 | mediafusion_redis: 43 | condition: service_healthy 44 | profiles: 45 | - mediafusion 46 | - stremio 47 | - all 48 | 49 | browserless: 50 | image: ghcr.io/browserless/chromium 51 | container_name: browserless 52 | environment: 53 | - TIMEOUT=-1 54 | restart: unless-stopped 55 | healthcheck: 56 | test: ["CMD", "curl", "-f", "http://localhost:3000/json/version"] 57 | interval: 30s 58 | timeout: 10s 59 | retries: 3 60 | profiles: 61 | - mediafusion 62 | - stremio 63 | - all 64 | 65 | mediafusion_mongodb: 66 | image: mongo:latest 67 | container_name: mediafusion_mongodb 68 | restart: unless-stopped 69 | volumes: 70 | - ${DOCKER_DATA_DIR}/mediafusion/db:/data/db 71 | healthcheck: 72 | test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet 73 | interval: 10s 74 | timeout: 10s 75 | retries: 5 76 | start_period: 40s 77 | profiles: 78 | - mediafusion 79 | - stremio 80 | - all 81 | 82 | mediafusion_redis: 83 | image: redis:latest 84 | container_name: mediafusion_redis 85 | restart: unless-stopped 86 | volumes: 87 | - ${DOCKER_DATA_DIR}/mediafusion/cache:/data 88 | command: redis-server --appendonly yes --save 60 1 89 | healthcheck: 90 | test: ["CMD", "redis-cli", "ping"] 91 | interval: 10s 92 | timeout: 5s 93 | retries: 5 94 | profiles: 95 | - mediafusion 96 | - stremio 97 | - all 98 | -------------------------------------------------------------------------------- /apps/minecraft/.env: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------- 2 | # MINECRAFT 3 | # --------------------------------------------------------- 4 | # Profiles: minecraft, all 5 | # 6 | # Although I will provide some environment variables for configuration here, 7 | # You should use https://setupmc.com/java-server/ to generate the configuration for your Minecraft server if you 8 | # want to add mods/plugins/modpacks 9 | # 10 | # Just remember to add back the container_name and change the volume to - ${DOCKER_DATA_DIR}/minecraft:/data 11 | # You should also add back the profiles if you still want the minecraft service to integrate with the profiles of the compose.yaml file. 12 | # 13 | # The icon can be a URL to an image that you want to use as the server icon, or a path to an image on your server. 14 | # Your MINECRAFT_SERVER_WHITELIST should be a comma separated list of the usernames that you want to whitelist. 15 | # 16 | # The MOTD is the message that will be displayed when you hover over the server in the server list. 17 | # 18 | # MINECRAFT_SERVER_MEMORY is the amount of memory that you want to allocate to the server. I recommmend at least 8G, but if 19 | # you don't have that much memory, you can reduce it. 20 | # 21 | # I've set the paper server type as the default, but you can change it to spigot or vanilla if you want. 22 | # Paper is a heavily improved version of Spigot, with better performance and more features, and no downsides. 23 | # I do not recommend changing this unless you know what you are doing. 24 | # 25 | # The view distance is the number of chunks that the server will load around each player. 26 | # The higher the view distance, the more resources the server will use. 27 | # If you lack memory/resources, you can reduce this value. 28 | # 29 | # MINECRAFT_SERVER_OP allows you to set the username of the player that will be given operator permissions. 30 | # If you would like to add more operators, please edit the compose.yaml file and add them there on a new line. 31 | # 32 | # _______________________________________________________ 33 | # 34 | # !!!! IMPORTANT - PORT AND DNS SETUP !!!! 35 | # _______________________________________________________ 36 | # 37 | # For you to access the Minecraft server, you will need to open the port 25565 on your server. 38 | # You will use the public IP address of your server to connect to the Minecraft server. 39 | # 40 | # If you want to be able to access the minecraft server at a subdomain e.g. mc.example.com, you will need to set up a DNS record for that subdomain. 41 | # 42 | # You must first have an A record for the subdomain pointing to your server's IP address. 43 | # If you have a wildcard DNS record, you do not need to do this. Though, it does mean 44 | # that all subdomains will point to your server. 45 | # --------------------------------------------------------- 46 | MINECRAFT_SERVER_ICON= 47 | MINECRAFT_SERVER_OVERRIDE_ICON=false 48 | MINECRAFT_SERVER_MOTD= 49 | MINECRAFT_SERVER_OP= 50 | MINECRAFT_SERVER_MEMORY=8G 51 | MINECRAFT_SERVER_TYPE=PAPER 52 | MINECRAFT_SERVER_VIEW_DISTANCE=16 53 | MINECRAFT_SERVRE_ENABLE_WHITELIST=false 54 | MINECRAFT_SERVER_WHITELIST= 55 | -------------------------------------------------------------------------------- /apps/minecraft/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | minecraft: 3 | image: itzg/minecraft-server:latest 4 | tty: true 5 | stdin_open: true 6 | container_name: minecraft 7 | ports: 8 | - "25565:25565" 9 | environment: 10 | UID: ${PUID} 11 | PGID: ${PGID} 12 | EULA: "TRUE" 13 | TYPE: ${MINECRAFT_SERVER_TYPE:-PAPER} 14 | MEMORY: ${MINECRAFT_SERVER_MEMORY:-8G} 15 | MOTD: ${MINECRAFT_SERVER_MOTD:-"A Minecraft Server"} 16 | OVERRIDE_ICON: ${MINECRAFT_SERVER_OVERRIDE_ICON:-} 17 | ICON: ${MINECRAFT_SERVER_ICON:-} 18 | USE_AIKAR_FLAGS: "TRUE" 19 | TZ: ${TZ:-UTC} 20 | DIFFICULTY: "2" 21 | VIEW_DISTANCE: ${MINECRAFT_SERVER_VIEW_DISTANCE:-10} 22 | OPS: |- 23 | ${MINECRAFT_SERVER_OP:-} 24 | ENABLE_WHITE_LIST: ${MINECRAFT_SERVER_ENABLE_WHITE_LIST:-false} 25 | WHITELIST: ${MINECRAFT_SERVER_WHITELIST:-} 26 | volumes: 27 | - "${DOCKER_DATA_DIR}/minecraft:/data" 28 | profiles: 29 | - minecraft 30 | - all 31 | -------------------------------------------------------------------------------- /apps/nzbhydra2/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | nzbhydra2: 3 | image: ghcr.io/hotio/nzbhydra2:latest 4 | container_name: nzbhydra2 5 | restart: unless-stopped 6 | expose: 7 | - 5076 8 | environment: 9 | - PUID=${PUID} 10 | - PGID=${PGID} 11 | - UMASK=002 12 | - TZ=${TZ:-UTC} 13 | volumes: 14 | - ${DOCKER_DATA_DIR}/nzbhydra:/config 15 | labels: 16 | - "traefik.enable=true" 17 | - "traefik.http.routers.nzbhydra2.rule=Host(`${NZBHYDRA2_HOSTNAME?}`)" 18 | - "traefik.http.routers.nzbhydra2.entrypoints=websecure" 19 | - "traefik.http.routers.nzbhydra2.tls.certresolver=letsencrypt" 20 | - "traefik.http.routers.nzbhydra2.middlewares=authelia@docker" 21 | profiles: 22 | - nzbhydra2 23 | - all 24 | - indexers 25 | -------------------------------------------------------------------------------- /apps/omg-tv-addon/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | omg-tv-stremio-addon: 3 | build: 4 | context: https://github.com/mccoy88f/OMG-Premium-TV.git 5 | dockerfile: Dockerfile 6 | image: omg-tv-stremio-addon 7 | container_name: omg-tv-stremio-addon 8 | restart: unless-stopped 9 | expose: 10 | - 7860 11 | environment: 12 | - PORT=7860 13 | - HOST=0.0.0.0 14 | labels: 15 | - "traefik.enable=true" 16 | - "traefik.http.routers.omg-tv-stremio-addon.rule=Host(`${OMG_TV_STREMIO_ADDON_HOSTNAME?}`)" 17 | - "traefik.http.routers.omg-tv-stremio-addon.entrypoints=websecure" 18 | - "traefik.http.routers.omg-tv-stremio-addon.tls.certresolver=letsencrypt" 19 | - "traefik.http.routers.omg-tv-stremio-addon.middlewares=authelia@docker" 20 | - "traefik.http.services.omg-tv-stremio-addon.loadbalancer.server.port=7860" 21 | profiles: 22 | - omg-tv-stremio-addon 23 | - stremio 24 | - all 25 | -------------------------------------------------------------------------------- /apps/overseerr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | overseerr: 3 | image: sctx/overseerr:latest 4 | container_name: overseerr 5 | restart: unless-stopped 6 | environment: 7 | - LOG_LEVEL=debug 8 | - TZ=${TZ:-UTC} 9 | - PORT=5055 10 | expose: 11 | - 5055 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.overseerr.rule=Host(`${OVERSEERR_HOSTNAME?}`)" 15 | - "traefik.http.routers.overseerr.entrypoints=websecure" 16 | - "traefik.http.routers.overseerr.tls.certresolver=letsencrypt" 17 | volumes: 18 | - ${DOCKER_DATA_DIR}/overseerr:/app/config 19 | profiles: 20 | - overseerr 21 | - debrid_media_server 22 | - all 23 | -------------------------------------------------------------------------------- /apps/plausible/.env: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------- 2 | # PLAUSIBLE 3 | # --------------------------------------------------------- 4 | # Profiles: plausible, all 5 | # 6 | # The PLAUSIBLE_SECRET_KEY_BASE is a secret key that you can generate using the following command: 7 | # openssl rand -base64 48 8 | # --------------------------------------------------------- 9 | 10 | PLAUSIBLE_SECRET_KEY_BASE= 11 | 12 | # When you first run the container, it will be stuck on a crash loop due to some permission issues as a result of using bind mounts. 13 | # To fix it, run the following command: 14 | # sudo chown -R 999:70 ${DOCKER_DATA_DIR}/plausible/data 15 | 16 | -------------------------------------------------------------------------------- /apps/plausible/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | plausible: 3 | image: ghcr.io/plausible/community-edition:latest 4 | container_name: plausible 5 | restart: unless-stopped 6 | command: sh -c "/entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" 7 | ulimits: 8 | nofile: 9 | soft: 65535 10 | hard: 65535 11 | expose: 12 | - 8000 13 | environment: 14 | TMPDIR: /var/lib/plausible/tmp 15 | BASE_URL: https://${PLAUSIBLE_HOSTNAME?} 16 | SECRET_KEY_BASE: ${PLAUSIBLE_SECRET_KEY_BASE?} 17 | HTTP_PORT: 8000 18 | DATABASE_URL: "postgres://plausible:plausible@plausible_postgres:5432/plausible" 19 | CLICKHOUSE_DATABASE_URL: "http://plausible_clickhouse:8123/plausible_events_db" 20 | labels: 21 | - "traefik.enable=true" 22 | - "traefik.http.routers.plausible.rule=Host(`${PLAUSIBLE_HOSTNAME?}`)" 23 | - "traefik.http.routers.plausible.entrypoints=websecure" 24 | - "traefik.http.routers.plausible.tls.certresolver=letsencrypt" 25 | - "traefik.http.services.plausible.loadbalancer.server.port=8000" 26 | volumes: 27 | - ${DOCKER_DATA_DIR}/plausible/data:/var/lib/plausible 28 | depends_on: 29 | plausible_postgres: 30 | condition: service_healthy 31 | plausible_clickhouse: 32 | condition: service_healthy 33 | profiles: 34 | - plausible 35 | - all 36 | 37 | plausible_clickhouse: 38 | image: clickhouse/clickhouse-server:24.3.3.102-alpine 39 | restart: unless-stopped 40 | container_name: plausible_clickhouse 41 | volumes: 42 | - ${DOCKER_DATA_DIR}/plausible/clickhouse/db:/var/lib/clickhouse 43 | - ${DOCKER_DATA_DIR}/plausible/clickhouse/logs:/var/log/clickhouse-server 44 | - ${DOCKER_DATA_DIR}/plausible/clickhouse/logs.xml:/etc/clickhouse-server/config.d/logs.xml:ro 45 | - ${DOCKER_DATA_DIR}/plausible/clickhouse/ipv4-only.xml:/etc/clickhouse-server/config.d/ipv4-only.xml:ro 46 | - ${DOCKER_DATA_DIR}/plausible/clickhouse/low-resources.xml:/etc/clickhouse-server/config.d/low-resources.xml:ro 47 | ulimits: 48 | nofile: 49 | soft: 262144 50 | hard: 262144 51 | healthcheck: 52 | test: ["CMD-SHELL", "wget --no-verbose --tries=1 -O - http://127.0.0.1:8123/ping || exit 1"] 53 | start_period: 1m 54 | profiles: 55 | - plausible 56 | - all 57 | 58 | plausible_postgres: 59 | image: postgres:16-alpine 60 | restart: unless-stopped 61 | container_name: plausible_postgres 62 | volumes: 63 | - ${DOCKER_DATA_DIR}/plausible/postgres:/var/lib/postgresql/data 64 | environment: 65 | POSTGRES_USER: plausible 66 | POSTGRES_PASSWORD: plausible 67 | healthcheck: 68 | test: ["CMD-SHELL", "pg_isready -U plausible"] 69 | start_period: 1m 70 | profiles: 71 | - plausible 72 | - all 73 | 74 | 75 | -------------------------------------------------------------------------------- /apps/plex-trakt-sync/compose.yaml: -------------------------------------------------------------------------------- 1 | x-plextraktsync: 2 | &plextraktsync 3 | image: ghcr.io/taxel/plextraktsync 4 | container_name: plextraktsync 5 | restart: on-failure:2 6 | volumes: 7 | - ${DOCKER_DATA_DIR}/plextraktsync/1:/app/config 8 | environment: 9 | - PUID=${PUID} 10 | - PGID=${PGID} 11 | - TZ=${TZ:-Etc/UTC} 12 | profiles: 13 | - plextraktsync 14 | - all 15 | 16 | x-plextraktsync_sync: 17 | &plextraktsync_sync 18 | <<: *plextraktsync 19 | command: sync 20 | 21 | 22 | x-plextraktsync_scrobble: 23 | &plextraktsync_scrobble 24 | <<: *plextraktsync 25 | command: watch 26 | 27 | 28 | 29 | services: 30 | plextraktsync_scheduler: 31 | image: mcuadros/ofelia:0.3 32 | container_name: plextraktsync_scheduler 33 | restart: unless-stopped 34 | command: daemon --docker 35 | volumes: 36 | - /var/run/docker.sock:/var/run/docker.sock:ro 37 | labels: 38 | ofelia.job-run.plextraktsync-1.schedule: "@every 6h" 39 | ofelia.job-run.plextraktsync-1.container: "plextraktsync_1_sync" 40 | # ofelia.job-run.plextraktsync-2.schedule: "@every 6h" 41 | # ofelia.job-run.plextraktsync-2.container: "plextraktsync_2_sync" 42 | profiles: 43 | - plextraktsync 44 | - all 45 | 46 | plextraktsync_1_sync: 47 | <<: *plextraktsync_sync 48 | container_name: plextraktsync_1_sync 49 | 50 | 51 | plextraktsync_1_scrobble: 52 | <<: *plextraktsync_scrobble 53 | container_name: plextraktsync_1_scrobble 54 | 55 | # plextraktsync_2_sync: 56 | # <<: *plextraktsync_sync 57 | # container_name: plextraktsync_2_sync 58 | # volumes: 59 | # - ${DOCKER_DATA_DIR}/plextraktsync/2:/app/config 60 | # profiles: 61 | # - plextraktsync_2 62 | # - all 63 | 64 | # plextraktsync_2_scrobble: 65 | # <<: *plextraktsync_scrobble 66 | # container_name: plextraktsync_2_scrobble 67 | # volumes: 68 | # - ${DOCKER_DATA_DIR}/plextraktsync/2:/app/config 69 | # profiles: 70 | # - plextraktsync_2 71 | # - all 72 | 73 | -------------------------------------------------------------------------------- /apps/plex/.env: -------------------------------------------------------------------------------- 1 | # Claim token for Plex. You can get it from https://www.plex.tv/claim 2 | # It is only valid for 5 minutes, so after generating one, you must set it here and start your container. 3 | # For the inital setup, you may need to have port 32400 open to access the web interface through the server IP, rather 4 | # than through the hostname. i.e. http://:32400 5 | # Once the setup is complete, you can use the hostname to access the web interface. 6 | PLEX_CLAIM= 7 | 8 | 9 | # Note: If you decide to use west's plex requests, you will have to disable traefik from here 10 | # (or leave it enabled through a different domain) 11 | # You can do this by setting the PLEX_TRAEFIK variable to false. 12 | # You would then enable traefik for plex_requests_nginx 13 | PLEX_TRAEFIK_ENABLE=true 14 | -------------------------------------------------------------------------------- /apps/plex/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | plex: 3 | image: plexinc/pms-docker:latest 4 | container_name: plex 5 | restart: unless-stopped 6 | ports: 7 | - 1900/udp 8 | - "32400:32400/tcp" 9 | - 32410/udp 10 | - 32412/udp 11 | - 32413/udp 12 | - 32414/udp 13 | - 32469/tcp 14 | - 8324/tcp 15 | expose: 16 | - 32400 17 | environment: 18 | - PLEX_UID=${PUID} 19 | - PLEX_GID=${PGID} 20 | - PLEX_CLAIM=${PLEX_CLAIM} 21 | - TZ=${TZ:-UTC} 22 | volumes: 23 | - /dev/shm:/dev/shm 24 | - ${DOCKER_DATA_DIR}/plex/transcodes:/transcode 25 | - /mnt:/mnt 26 | - ${DOCKER_DATA_DIR}/plex/config:/config 27 | labels: 28 | - "traefik.enable=${PLEX_TRAEFIK_ENABLE:-true}" 29 | - "traefik.http.routers.plex.rule=Host(`${PLEX_HOSTNAME?}`)" 30 | - "traefik.http.routers.plex.entrypoints=websecure" 31 | - "traefik.http.routers.plex.tls.certresolver=letsencrypt" 32 | - "traefik.http.services.plex.loadbalancer.server.port=32400" 33 | healthcheck: 34 | test: curl --connect-timeout 15 --silent --show-error --fail http://localhost:32400/identity 35 | interval: 1m 36 | timeout: 15s 37 | retries: 3 38 | start_period: 1m 39 | depends_on: 40 | - rclone 41 | profiles: 42 | - all 43 | - plex 44 | - debrid_media_server 45 | -------------------------------------------------------------------------------- /apps/portainer/.env: -------------------------------------------------------------------------------- 1 | PORTAINER_HOSTNAME= -------------------------------------------------------------------------------- /apps/portainer/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | portainer: 3 | image: portainer/portainer-ce:latest 4 | container_name: portainer 5 | restart: unless-stopped 6 | expose: 7 | - 9000 8 | labels: 9 | - "traefik.enable=true" 10 | - "traefik.http.routers.portainer.rule=Host(`${PORTAINER_HOSTNAME?}`)" 11 | - "traefik.http.routers.portainer.entrypoints=websecure" 12 | - "traefik.http.routers.portainer.tls.certresolver=letsencrypt" 13 | - "traefik.http.services.portainer.loadbalancer.server.port=9000" 14 | - "traefik.http.routers.portainer.middlewares=authelia@docker" 15 | volumes: 16 | - /var/run/docker.sock:/var/run/docker.sock 17 | - ${DOCKER_DATA_DIR}/portainer:/data 18 | profiles: 19 | - portainer 20 | - all -------------------------------------------------------------------------------- /apps/prowlarr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | prowlarr: 3 | image: ghcr.io/hotio/prowlarr:latest 4 | container_name: prowlarr 5 | environment: 6 | - PUID=${PUID} 7 | - PGID=${PGID} 8 | - UMASK=002 9 | - TZ=${TZ:-UTC} 10 | expose: 11 | - 9696 12 | volumes: 13 | - ${DOCKER_DATA_DIR}/prowlarr:/config 14 | restart: unless-stopped 15 | labels: 16 | - "traefik.enable=true" 17 | - "traefik.http.routers.prowlarr.rule=Host(`${PROWLARR_HOSTNAME?}`)" 18 | - "traefik.http.routers.prowlarr.entrypoints=websecure" 19 | - "traefik.http.routers.prowlarr.tls.certresolver=letsencrypt" 20 | - "traefik.http.routers.prowlarr.middlewares=authelia@docker" 21 | healthcheck: 22 | test: curl -f http://localhost:9696/ping 23 | interval: 30s 24 | timeout: 10s 25 | retries: 3 26 | start_period: 30s 27 | profiles: 28 | - prowlarr 29 | - stremio 30 | - debrid_media_server 31 | - all 32 | -------------------------------------------------------------------------------- /apps/radarr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | radarr: 3 | container_name: radarr 4 | environment: 5 | - PUID=${PUID} 6 | - PGID=${PGID} 7 | expose: 8 | - 7878 9 | image: ghcr.io/hotio/radarr:release 10 | restart: unless-stopped 11 | volumes: 12 | - /mnt:/mnt 13 | - ${DOCKER_DATA_DIR}/radarr/default/:/config 14 | - /usr/bin/rclone:/usr/bin/rclone 15 | labels: 16 | - "traefik.enable=true" 17 | - "traefik.http.routers.radarr.rule=Host(`${RADARR_HOSTNAME}`)" 18 | - "traefik.http.routers.radarr.entrypoints=websecure" 19 | - "traefik.http.routers.radarr.tls.certresolver=letsencrypt" 20 | - "traefik.http.routers.radarr.middlewares=authelia@docker" 21 | - "traefik.http.services.radarr.loadbalancer.server.port=7878" 22 | depends_on: 23 | - rclone 24 | healthcheck: 25 | test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] 26 | interval: 1m 27 | timeout: 10s 28 | retries: 5 29 | start_period: 10s 30 | profiles: 31 | - debrid_media_server 32 | - radarr 33 | - all 34 | 35 | 36 | radarr4k: 37 | container_name: radarr4k 38 | expose: 39 | - 7878 40 | environment: 41 | - PUID=${PUID} 42 | - PGID=${PGID} 43 | image: ghcr.io/hotio/radarr:release 44 | restart: unless-stopped 45 | volumes: 46 | - /mnt:/mnt 47 | - ${DOCKER_DATA_DIR}/radarr/4k:/config 48 | - /usr/bin/rclone:/usr/bin/rclone 49 | labels: 50 | - "traefik.enable=true" 51 | - "traefik.http.routers.radarr4k.rule=Host(`${RADARR4K_HOSTNAME}`)" 52 | - "traefik.http.routers.radarr4k.entrypoints=websecure" 53 | - "traefik.http.routers.radarr4k.tls.certresolver=letsencrypt" 54 | - "traefik.http.routers.radarr4k.middlewares=authelia@docker" 55 | - "traefik.http.services.radarr4k.loadbalancer.server.port=7878" 56 | depends_on: 57 | - rclone 58 | healthcheck: 59 | test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] 60 | interval: 1m 61 | timeout: 10s 62 | retries: 5 63 | start_period: 10s 64 | profiles: 65 | - debrid_media_server 66 | - radarr 67 | - all 68 | 69 | radarranime: 70 | container_name: radarranime 71 | expose: 72 | - 7878 73 | image: ghcr.io/hotio/radarr:release 74 | environment: 75 | - PUID=${PUID} 76 | - PGID=${PGID} 77 | restart: unless-stopped 78 | volumes: 79 | - /mnt:/mnt 80 | - ${DOCKER_DATA_DIR}/radarr/anime:/config 81 | - /usr/bin/rclone:/usr/bin/rclone 82 | labels: 83 | - "traefik.enable=true" 84 | - "traefik.http.routers.radarranime.rule=Host(`${RADARRANIME_HOSTNAME}`)" 85 | - "traefik.http.routers.radarranime.entrypoints=websecure" 86 | - "traefik.http.routers.radarranime.tls.certresolver=letsencrypt" 87 | - "traefik.http.routers.radarranime.middlewares=authelia@docker" 88 | - "traefik.http.services.radarranime.loadbalancer.server.port=7878" 89 | depends_on: 90 | - rclone 91 | healthcheck: 92 | test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] 93 | interval: 1m 94 | timeout: 10s 95 | retries: 5 96 | start_period: 10s 97 | profiles: 98 | - debrid_media_server 99 | - radarr 100 | - all 101 | -------------------------------------------------------------------------------- /apps/realdebrid-account-monitor/.env: -------------------------------------------------------------------------------- 1 | # This is a service that allows you to monitor your real debrid accounts and traffic. 2 | 3 | # A list of your real debrid api keys. e.g. ["key1", "key2"] 4 | # You can get your api key from https://real-debrid.com/apitoken 5 | TOKENS=[] 6 | # How often to check the accounts for traffic. This is a cron schedule. 7 | # e.g. every hour: 0 * * * * 8 | CRON_SCHEDULE='0 * * * *' 9 | 10 | # The timezone to use for the cron schedule. 11 | TZ=${TZ:-Etc/UTC} 12 | 13 | 14 | # Note: this is built from a python file included in the template, so you can modify it to do whatever you want -------------------------------------------------------------------------------- /apps/realdebrid-account-monitor/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use an official lightweight Python image 2 | FROM python:3.13-slim 3 | 4 | # Set the working directory 5 | WORKDIR /app 6 | 7 | # Copy files 8 | COPY main.py . 9 | 10 | # Install dependencies 11 | RUN pip install croniter python-dotenv requests schedule 12 | 13 | # Command to run the script 14 | CMD ["python", "main.py"] 15 | -------------------------------------------------------------------------------- /apps/realdebrid-account-monitor/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | realdebrid-account-monitor: 3 | build: 4 | context: . 5 | image: realdebrid-account-monitor 6 | container_name: realdebrid-account-monitor 7 | env_file: 8 | - .env 9 | volumes: 10 | - ${DOCKER_DATA_DIR}/realdebrid-account-monitor:/app/data 11 | restart: unless-stopped 12 | profiles: 13 | - all 14 | - realdebrid-account-monitor 15 | 16 | 17 | -------------------------------------------------------------------------------- /apps/realdebrid-account-monitor/main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import schedule 3 | import time 4 | import datetime 5 | import os 6 | import logging 7 | from dotenv import load_dotenv 8 | from croniter import croniter 9 | import pytz 10 | import re 11 | 12 | # Configuration 13 | load_dotenv() 14 | 15 | TOKENS = eval(os.getenv("TOKENS", "[]")) 16 | BASE_API = "https://api.real-debrid.com/rest/1.0" 17 | ENDPOINTS = {"traffic": "/traffic/details", "user": "/user"} 18 | INTERVAL_HOURS = int(os.getenv("INTERVAL_HOURS", 1)) 19 | INTERVAL_SECONDS = int(os.getenv("INTERVAL_SECONDS", 0)) 20 | CRON_SCHEDULE = os.getenv("CRON_SCHEDULE", None) 21 | REALDEBRID_TIMEZONE_STRING = "Europe/Paris" 22 | CRONTAB_TIMEZONE_STRING = os.getenv("TZ", "UTC") 23 | # Set up logging 24 | logging.basicConfig( 25 | level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" 26 | ) 27 | logger = logging.getLogger(__name__) 28 | 29 | # time.tzset() # ensure croniter uses the correct timezone 30 | # use Europe/Paris as the default timezone as Real-Debrid is based in France 31 | crontab_timezone = pytz.timezone(CRONTAB_TIMEZONE_STRING) 32 | realdebrid_timezone = pytz.timezone(REALDEBRID_TIMEZONE_STRING) 33 | 34 | 35 | # set up a file to write datapoints to for traffic 36 | TRAFFIC_FILE_PATH = os.getenv("TRAFFIC_FILE_PATH", os.path.join("data", "traffic_data.csv")) 37 | if not os.path.exists(TRAFFIC_FILE_PATH): 38 | os.makedirs(os.path.dirname(TRAFFIC_FILE_PATH), exist_ok=True) 39 | with open(TRAFFIC_FILE_PATH, "w") as f: 40 | f.write("username,datetime,traffic\n") 41 | 42 | 43 | def sanitised_token(token): 44 | # simply replace all but the first character and last 5 characters with * 45 | return token[0] + "*" * (len(token) - 6) + token[-5:] 46 | 47 | 48 | def format_bytes(bytes): 49 | for unit in ["B", "KB", "MB", "GB", "TB"]: 50 | if bytes < 1024: 51 | return f"{bytes:.2f} {unit}" 52 | bytes /= 1024 53 | return f"{bytes:.2f} PB" 54 | 55 | 56 | def format_seconds(seconds): 57 | # format seconds into a string like "date (x days from now)" 58 | if seconds < 0: 59 | return "Expired" 60 | elif seconds < 60: 61 | return f"{seconds} seconds" 62 | elif seconds < 3600: 63 | return f"{seconds // 60} minutes" 64 | elif seconds < 86400: 65 | return f"{seconds // 3600} hours" 66 | elif seconds < 2592000: 67 | return f"{seconds // 86400} days" 68 | elif seconds < 31536000: 69 | # return x months, y days 70 | months = seconds // 2592000 71 | days = (seconds % 2592000) // 86400 72 | return f"{months} months, {days} days" 73 | else: 74 | # return x years, y months 75 | years = seconds // 31536000 76 | months = (seconds % 31536000) // 2592000 77 | return f"{years} years, {months} months" 78 | 79 | 80 | def get_traffic(token): 81 | today = datetime.datetime.now(realdebrid_timezone).strftime("%Y-%m-%d") 82 | params = { 83 | "start": today, 84 | } 85 | try: 86 | response = requests.get( 87 | f"{BASE_API}{ENDPOINTS['traffic']}", 88 | params=params, 89 | headers={"Authorization": f"Bearer {token}"}, 90 | ) 91 | data = response.json() 92 | except Exception as e: 93 | logger.error(f"Failed to get traffic data for {sanitised_token(token)}: {e}") 94 | return None 95 | if response.status_code == 200: 96 | if today in data: 97 | traffic_bytes = data[today]["bytes"] 98 | return traffic_bytes 99 | elif data == []: 100 | return 0 101 | else: 102 | return None 103 | else: 104 | error, error_code = data.get("error", "Unknown error"), data.get("error_code", "Unknown error code") 105 | logger.error( 106 | f"Failed to get traffic data for {sanitised_token(token)}: {response.status_code} - {error} ({error_code}) " 107 | ) 108 | return None 109 | 110 | 111 | def get_user_details(token): 112 | try: 113 | response = requests.get( 114 | f"{BASE_API}{ENDPOINTS['user']}", 115 | headers={"Authorization": f"Bearer {token}"}, 116 | ) 117 | data = response.json() 118 | except Exception as e: 119 | logger.error(f"Failed to get user details for {sanitised_token(token)}: {e}") 120 | return None 121 | if response.status_code != 200: 122 | error, error_code = data.get("error", "Unknown error"), data.get("error_code", "Unknown error code") 123 | logger.error( 124 | f"Failed to get user details for {sanitised_token(token)}: {error} ({error_code})" 125 | ) 126 | return None 127 | return data 128 | 129 | 130 | def get_account_data(): 131 | if len(TOKENS) == 0: 132 | logger.error("No tokens found in configuration") 133 | return 134 | lines = [""] 135 | logger.info("Checking account data for {} tokens...".format(len(TOKENS))) 136 | for token in TOKENS: 137 | user = get_user_details(token) 138 | if user is None: 139 | continue 140 | premium = user["type"] == "premium" 141 | if not premium: 142 | logger.error(f"Token {sanitised_token(token)} is not a premium account") 143 | continue 144 | # 'premium' is seconds that the account is premium for 145 | expires_in = user["premium"] 146 | expiry_date = user["expiration"].split("T")[0] 147 | traffic = get_traffic(token) 148 | if traffic is None: 149 | continue 150 | # write the traffic data to a file 151 | with open(TRAFFIC_FILE_PATH, "a") as f: 152 | f.write(f"{user['username']},{datetime.datetime.now(realdebrid_timezone)},{traffic}\n") 153 | 154 | lines.append(f" {user['username']}: ") 155 | lines.append(f" ├─ Type: {user["type"].capitalize()}") 156 | if premium: 157 | lines.append( 158 | f" ├─ Premium until: {expiry_date} | {format_seconds(expires_in)} from now" 159 | ) 160 | lines.append(f" ├─ Traffic today: {format_bytes(traffic)}") 161 | lines.append(f" └─ Fidelity Points: {user['points']:,}") 162 | lines.append("") 163 | 164 | 165 | time.sleep(0.5) 166 | 167 | return lines 168 | 169 | def generate_traffic_summary(): 170 | with open(TRAFFIC_FILE_PATH, "r") as f: 171 | lines = f.readlines() 172 | traffic_data = {} 173 | user_last_traffic = {} 174 | 175 | current_date = datetime.datetime.now(realdebrid_timezone).strftime("%Y-%m-%d") 176 | for line in lines[1:]: 177 | username, datetime_str, traffic = line.strip().split(",") 178 | date_str, time_str = datetime_str.split(" ") 179 | 180 | if date_str == current_date: 181 | realdebrid_datetime = datetime.datetime.fromisoformat(datetime_str) 182 | crontab_datetime = realdebrid_datetime.astimezone(crontab_timezone) 183 | hour = crontab_datetime.strftime("%H") 184 | traffic_value = float(traffic.split(" ")[0]) 185 | 186 | # Calculate hourly traffic per user 187 | if username in user_last_traffic: 188 | hour_traffic = max(0, traffic_value - user_last_traffic[username]) 189 | else: 190 | hour_traffic = traffic_value # First occurrence, take as initial traffic 191 | 192 | # Update hourly traffic sum 193 | traffic_data[hour] = traffic_data.get(hour, 0) + hour_traffic 194 | 195 | # Store last recorded traffic for this user 196 | user_last_traffic[username] = traffic_value 197 | 198 | # Prepare output log 199 | lines = [""] 200 | total_traffic = 0 201 | lines.append(" Traffic Summary:") 202 | for hour in sorted(traffic_data.keys()): 203 | traffic = traffic_data[hour] 204 | total_traffic += traffic 205 | lines.append(f" ├─ {hour}:00 - {format_bytes(traffic)}") 206 | lines.append(f" └─ Total Today: {format_bytes(total_traffic)}") 207 | lines.append("") 208 | return lines 209 | 210 | def print_account_summaries(): 211 | lines = [""] 212 | lines.extend( 213 | [ 214 | "=" * 60, 215 | f"Real Debrid Account Summary - {datetime.datetime.now(crontab_timezone).strftime("%H:%M")}".center(60), 216 | "=" * 60, 217 | "", 218 | ] 219 | ) 220 | lines.extend(get_account_data()) 221 | lines.extend(generate_traffic_summary()) 222 | lines.append("=" * 60) 223 | lines.append("") 224 | logger.info("\n".join(lines)) 225 | 226 | if not CRON_SCHEDULE: 227 | if INTERVAL_HOURS: 228 | schedule.every(INTERVAL_HOURS).hours.do(print_account_data) 229 | elif INTERVAL_SECONDS: 230 | schedule.every(INTERVAL_SECONDS).seconds.do(print_account_data) 231 | 232 | 233 | if __name__ == "__main__": 234 | if CRON_SCHEDULE: 235 | base_time = datetime.datetime.now(crontab_timezone) 236 | cron = croniter(CRON_SCHEDULE, base_time) 237 | while True: 238 | next_run = cron.get_next(datetime.datetime) 239 | logger.info(f"Next run scheduled for {next_run} {CRONTAB_TIMEZONE_STRING}") 240 | sleep_duration = (next_run - datetime.datetime.now(crontab_timezone)).total_seconds() 241 | if sleep_duration > 0: 242 | time.sleep(sleep_duration) 243 | print_account_summaries() 244 | base_time = next_run 245 | cron = croniter(CRON_SCHEDULE, base_time) 246 | 247 | while not CRON_SCHEDULE and (INTERVAL_HOURS or INTERVAL_SECONDS): 248 | schedule.run_pending() 249 | time.sleep(1) 250 | -------------------------------------------------------------------------------- /apps/recyclarr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | recyclarr: 3 | image: ghcr.io/recyclarr/recyclarr:latest 4 | container_name: recyclarr 5 | user: $PUID:$PGID 6 | restart: unless-stopped 7 | environment: 8 | - TZ=${TZ:-UTC} 9 | volumes: 10 | - ${DOCKER_DATA_DIR}/recyclarr:/config 11 | depends_on: 12 | - sonarr 13 | - sonarr4k 14 | - sonarranime 15 | - radarr 16 | - radarr4k 17 | - radarranime 18 | profiles: 19 | - all 20 | - recyclarr 21 | - debrid_media_server 22 | -------------------------------------------------------------------------------- /apps/seanime/.env: -------------------------------------------------------------------------------- 1 | # Seanime requires no extra environment variables. 2 | # However, after running the container, you will have to edit the host within the config.toml file. 3 | # As otherwise, it only binds to localhost and will not be accessible. 4 | # 5 | # You can do this by running the following command: 6 | # sudo sed -i 's/127.0.0.1/0.0.0.0/' ${DOCKER_DATA_DIR}/seanime/config.toml 7 | 8 | # Note: If you are planning on using this for local media, you will not be able to use an external player 9 | # as we have set up a password for seanime. 10 | -------------------------------------------------------------------------------- /apps/seanime/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | seanime: 3 | image: umagistr/seanime 4 | container_name: seanime 5 | volumes: 6 | - /mnt/user/anime:/anime 7 | - /mnt/user/downloads:/downloads 8 | - /mnt:/mnt 9 | - ${DOCKER_DATA_DIR}/seanime:/root/.config/Seanime 10 | expose: 11 | - 43211 12 | restart: unless-stopped 13 | labels: 14 | - "traefik.enable=true" 15 | - "traefik.http.routers.seanime.rule=Host(`${SEANIME_HOSTNAME?}`)" 16 | - "traefik.http.routers.seanime.entrypoints=websecure" 17 | - "traefik.http.routers.seanime.tls.certresolver=letsencrypt" 18 | - "traefik.http.routers.seanime.middlewares=authelia@docker" 19 | healthcheck: 20 | test: wget -qO- http://localhost:43211/api/v1/status 21 | interval: 5m 22 | timeout: 10s 23 | retries: 5 24 | start_period: 10s 25 | profiles: 26 | - seanime 27 | - all 28 | -------------------------------------------------------------------------------- /apps/searxng/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | searxng: 3 | container_name: searxng 4 | image: docker.io/searxng/searxng:latest 5 | restart: unless-stopped 6 | expose: 7 | - 8080 8 | volumes: 9 | - ${DOCKER_DATA_DIR}/searxng:/etc/searxng:rw 10 | environment: 11 | - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/ 12 | - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4} 13 | - UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4} 14 | logging: 15 | driver: "json-file" 16 | options: 17 | max-size: "1m" 18 | max-file: "1" 19 | labels: 20 | - "traefik.enable=true" 21 | - "traefik.http.routers.searxng.rule=Host(`${SEARXNG_HOSTNAME}`)" 22 | - "traefik.http.routers.searxng.entrypoints=websecure" 23 | - "traefik.http.routers.searxng.tls.certresolver=letsencrypt" 24 | - "traefik.http.routers.searxng.middlewares=authelia@docker" 25 | profiles: 26 | - searxng 27 | - all 28 | -------------------------------------------------------------------------------- /apps/sonarr/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | sonarr: 3 | container_name: sonarr 4 | expose: 5 | - 8989 6 | image: ghcr.io/hotio/sonarr:release 7 | restart: unless-stopped 8 | environment: 9 | - PUID=${PUID} 10 | - PGID=${PGID} 11 | labels: 12 | - "traefik.enable=true" 13 | - "traefik.http.routers.sonarr.rule=Host(`${SONARR_HOSTNAME}`)" 14 | - "traefik.http.routers.sonarr.entrypoints=websecure" 15 | - "traefik.http.routers.sonarr.tls.certresolver=letsencrypt" 16 | - "traefik.http.routers.sonarr.middlewares=authelia@docker" 17 | - "traefik.http.services.sonarr.loadbalancer.server.port=8989" 18 | volumes: 19 | - /mnt:/mnt 20 | - ${DOCKER_DATA_DIR}/sonarr/default:/config 21 | - /usr/bin/rclone:/usr/bin/rclone 22 | depends_on: 23 | - rclone 24 | healthcheck: 25 | test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] 26 | interval: 1m 27 | timeout: 10s 28 | retries: 5 29 | start_period: 10s 30 | profiles: 31 | - debrid_media_server 32 | - all 33 | 34 | sonarr4k: 35 | container_name: sonarr4k 36 | environment: 37 | - PUID=${PUID} 38 | - PGID=${PGID} 39 | expose: 40 | - 8989 41 | image: ghcr.io/hotio/sonarr:release 42 | restart: unless-stopped 43 | labels: 44 | - "traefik.enable=true" 45 | - "traefik.http.routers.sonarr4k.rule=Host(`${SONARR4K_HOSTNAME}`)" 46 | - "traefik.http.routers.sonarr4k.entrypoints=websecure" 47 | - "traefik.http.routers.sonarr4k.tls.certresolver=letsencrypt" 48 | - "traefik.http.routers.sonarr4k.middlewares=authelia@docker" 49 | - "traefik.http.services.sonarr4k.loadbalancer.server.port=8989" 50 | volumes: 51 | - /mnt:/mnt 52 | - ${DOCKER_DATA_DIR}/sonarr/4k:/config 53 | - /usr/bin/rclone:/usr/bin/rclone 54 | depends_on: 55 | - rclone 56 | healthcheck: 57 | test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] 58 | interval: 1m 59 | timeout: 10s 60 | retries: 5 61 | start_period: 10s 62 | profiles: 63 | - sonarr 64 | - debrid_media_server 65 | - all 66 | 67 | 68 | sonarranime: 69 | container_name: sonarranime 70 | expose: 71 | - 8989 72 | image: ghcr.io/hotio/sonarr:release 73 | environment: 74 | - PUID=${PUID} 75 | - PGID=${PGID} 76 | restart: unless-stopped 77 | labels: 78 | - "traefik.enable=true" 79 | - "traefik.http.routers.sonarranime.rule=Host(`${SONARRANIME_HOSTNAME}`)" 80 | - "traefik.http.routers.sonarranime.entrypoints=websecure" 81 | - "traefik.http.routers.sonarranime.tls.certresolver=letsencrypt" 82 | - "traefik.http.routers.sonarranime.middlewares=authelia@docker" 83 | - "traefik.http.services.sonarranime.loadbalancer.server.port=8989" 84 | volumes: 85 | - /mnt:/mnt 86 | - ${DOCKER_DATA_DIR}/sonarr/anime:/config 87 | - /usr/bin/rclone:/usr/bin/rclone 88 | depends_on: 89 | - sonarr 90 | - rclone 91 | healthcheck: 92 | test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] 93 | interval: 1m 94 | timeout: 10s 95 | retries: 5 96 | start_period: 10s 97 | profiles: 98 | - debrid_media_server 99 | - all 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /apps/speedtest-tracker/.env: -------------------------------------------------------------------------------- 1 | # Run this command to generate one, include the base64 prefix: 2 | # echo -n 'base64:'; openssl rand -base64 32; 3 | APP_KEY="" -------------------------------------------------------------------------------- /apps/speedtest-tracker/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | speedtest-tracker: 3 | image: lscr.io/linuxserver/speedtest-tracker:latest 4 | container_name: speedtest-tracker 5 | restart: unless-stopped 6 | environment: 7 | - PUID=${PUID} 8 | - PGID=${PGID} 9 | - TZ=${TZ:-Etc/UTC} 10 | - DISPLAY_TIMEZONE=${TZ:-Etc/UTC} 11 | - APP_KEY=${APP_KEY?} 12 | - DB_CONNECTION=sqlite 13 | - PUBLIC_DASHBOARD=true 14 | - APP_URL=https://${SPEEDTEST_TRACKER_HOSTNAME?} 15 | - ASSET_URL=https://${SPEEDTEST_TRACKER_HOSTNAME?} 16 | labels: 17 | - "traefik.enable=true" 18 | - "traefik.http.routers.speedtest-tracker.rule=Host(`${SPEEDTEST_TRACKER_HOSTNAME?}`)" 19 | - "traefik.http.routers.speedtest-tracker.entrypoints=websecure" 20 | - "traefik.http.routers.speedtest-tracker.tls.certresolver=letsencrypt" 21 | - "traefik.http.routers.speedtest-tracker.middlewares=authelia@docker" 22 | - "traefik.http.services.speedtest-tracker.loadbalancer.server.port=80" 23 | volumes: 24 | - ${DOCKER_DATA_DIR}/speedtest-tracker:/config 25 | profiles: 26 | - speedtest-tracker 27 | - all 28 | 29 | -------------------------------------------------------------------------------- /apps/sshbot/.env: -------------------------------------------------------------------------------- 1 | # This is a discord bot that allows you to manage your VPS via commands. It also allows discord to be used as a terminal. 2 | # You should only use this if you understand the risks of using discord as an interface to your VPS; You are allowing Discord to see the 3 | # commands you run and what you use your VPS for. 4 | # If you are using key-based authentication, I would recommend running this bot on a separate machine, preferably local, as otherwise 5 | # you would have to add your private key to your VPS, which is not recommended. 6 | 7 | # Discord Bot Configuration 8 | DISCORD_TOKEN=your_discord_bot_token_here 9 | 10 | # SSH Connection details 11 | SSH_HOST=your_vps_host 12 | SSH_PORT=22 13 | 14 | # SSH Authentication Details 15 | SSH_USERNAME=your_ssh_username 16 | 17 | # You may either use password authentication: 18 | 19 | SSH_PASSWORD=your_ssh_password 20 | 21 | # Or key-based authentication, you can either provide the path to the private key here, or modify the compose.yaml file and provide the contents 22 | # of the private key in the SSH_PRIVATE_KEY variable. 23 | SSH_PRIVATE_KEY_PATH=/path/to/your/private/key 24 | # If you have a passphrase for your private key, you can provide it here. 25 | SSH_KEY_PASSPHRASE=your_key_passphrase -------------------------------------------------------------------------------- /apps/sshbot/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | sshbot: 3 | image: nhyyeb/sshbot:latest 4 | container_name: sshbot 5 | restart: unless-stopped 6 | env_file: 7 | - .env 8 | environment: 9 | TZ: ${TZ:-UTC} 10 | # SSH_PRIVATE_KEY: | 11 | # -----BEGIN OPENSSH PRIVATE KEY----- 12 | # your_key_line_1 13 | # your_key_line_2 14 | # your_key_line_3 15 | # -----END OPENSSH PRIVATE KEY----- 16 | profiles: 17 | - sshbot 18 | - all 19 | 20 | -------------------------------------------------------------------------------- /apps/streamystats/.env: -------------------------------------------------------------------------------- 1 | # Use the command below to generate a random secret key for your application. 2 | # openssl rand -hex 64 3 | SECRET_KEY_BASE="" -------------------------------------------------------------------------------- /apps/streamystats/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | streamystats_frontend: 3 | image: fredrikburmester/streamystats-nextjs:edge 4 | container_name: streamystats_frontend 5 | restart: unless-stopped 6 | expose: 7 | - 3000 8 | environment: 9 | API_URL: "http://streamystats_backend:4000/api" 10 | labels: 11 | - "traefik.enable=true" 12 | - "traefik.http.routers.streamystats_frontend.rule=Host(`${STREAMYSTATS_HOSTNAME?}`)" 13 | - "traefik.http.routers.streamystats_frontend.entrypoints=websecure" 14 | - "traefik.http.routers.streamystats_frontend.tls.certresolver=letsencrypt" 15 | - "traefik.http.routers.streamystats_frontend.middlewares=authelia@docker" 16 | - "traefik.http.services.streamystats_frontend.loadbalancer.server.port=3000" 17 | depends_on: 18 | - streamystats_backend 19 | profiles: 20 | - streamystats 21 | - all 22 | 23 | streamystats_backend: 24 | image: fredrikburmester/streamystats-phoenix:edge 25 | container_name: streamystats_backend 26 | restart: unless-stopped 27 | expose: 28 | - 4000 29 | environment: 30 | DATABASE_URL: "postgres://streamystats:streamystats@streamystats_postgres:5432/streamystats" 31 | SECRET_KEY_BASE: ${SECRET_KEY_BASE} 32 | depends_on: 33 | streamystats_postgres: 34 | condition: service_healthy 35 | profiles: 36 | - streamystats 37 | - all 38 | 39 | streamystats_postgres: 40 | image: pgvector/pgvector:pg16 41 | container_name: streamystats_postgres 42 | restart: unless-stopped 43 | expose: 44 | - 5432 45 | environment: 46 | POSTGRES_USER: streamystats 47 | POSTGRES_PASSWORD: streamystats 48 | POSTGRES_DB: streamystats 49 | PGDATA: /var/lib/postgresql/data/pgdata 50 | volumes: 51 | - ${DOCKER_DATA_DIR}/streamystats:/var/lib/postgresql/data 52 | healthcheck: 53 | test: ["CMD", "pg_isready", "-U", "streamystats", "-d", "streamystats"] 54 | interval: 10s 55 | timeout: 5s 56 | retries: 5 57 | profiles: 58 | - streamystats 59 | - all 60 | 61 | -------------------------------------------------------------------------------- /apps/stremio-catalog-providers/.env: -------------------------------------------------------------------------------- 1 | # We need to obtain a Trakt Client ID and secret in order for the addons to work. 2 | # To obtain these credentials: 3 | # 1. Create an account/Log in on Trakt.tv/ (https://trakt.tv). 4 | # 2. Go to the applications section (https://trakt.tv/oauth/applications). 5 | # 3. Create a new application by filling in the required information (name, description, etc.). 6 | # - For the "Redirect URL", add the following URLs (replacing the ${*_HOSTNAME} with your actual hostname): 7 | # - https://${STREMIO_CATALOG_PROVIDERS_HOSTNAME}/callback 8 | # 9 | TRAKT_CLIENT_ID= 10 | TRAKT_CLIENT_SECRET= 11 | -------------------------------------------------------------------------------- /apps/stremio-catalog-providers/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | stremio-catalog-providers: 3 | image: reddravenn/stremio-catalog-providers 4 | container_name: stremio-catalog-providers 5 | expose: 6 | - 7000 7 | environment: 8 | PORT: 7000 9 | BASE_URL: https://${STREMIO_CATALOG_PROVIDERS_HOSTNAME?} 10 | DB_USER: postgres 11 | DB_HOST: stremio-catalog-providers_postgres 12 | DB_NAME: stremio_catalog_db 13 | DB_PASSWORD: postgres 14 | DB_PORT: 5432 15 | DB_MAX_CONNECTIONS: 20 16 | DB_IDLE_TIMEOUT: 30000 17 | DB_CONNECTION_TIMEOUT: 2000 18 | REDIS_HOST: stremio-catalog-providers_redis 19 | REDIS_PORT: 6379 20 | REDIS_PASSWORD: 21 | TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID?} 22 | TRAKT_CLIENT_SECRET: ${TRAKT_CLIENT_SECRET?} 23 | TRAKT_HISTORY_FETCH_INTERVAL: 1d 24 | CACHE_CATALOG_CONTENT_DURATION_DAYS: 1 25 | CACHE_POSTER_CONTENT_DURATION_DAYS: 7 26 | LOG_LEVEL: info 27 | LOG_INTERVAL_DELETION: 3d 28 | NODE_ENV: production 29 | depends_on: 30 | stremio-catalog-providers_postgres: 31 | condition: service_healthy 32 | stremio-catalog-providers_redis: 33 | condition: service_healthy 34 | volumes: 35 | - ${DOCKER_DATA_DIR}/stremio-catalog-providers/logs:/usr/src/app/log 36 | labels: 37 | - "traefik.enable=true" 38 | - "traefik.http.routers.ravenn-catalogs.rule=Host(`${STREMIO_CATALOG_PROVIDERS_HOSTNAME?}`)" 39 | - "traefik.http.routers.ravenn-catalogs.entrypoints=websecure" 40 | - "traefik.http.routers.ravenn-catalogs.tls.certresolver=letsencrypt" 41 | - "traefik.http.routers.ravenn-catalogs.middlewares=authelia@docker" 42 | profiles: 43 | - stremio-catalog-providers 44 | - stremio 45 | - all 46 | 47 | stremio-catalog-providers_postgres: 48 | container_name: stremio-catalog-providers_postgres 49 | image: postgres:16.4 50 | environment: 51 | POSTGRES_DB: stremio_catalog_db 52 | POSTGRES_USER: postgres 53 | POSTGRES_PASSWORD: postgres 54 | volumes: 55 | - ${DOCKER_DATA_DIR}/stremio-catalog-providers/db:/var/lib/postgresql/data 56 | expose: 57 | - 5432 58 | healthcheck: 59 | test: ["CMD-SHELL", "pg_isready -U postgres -d stremio_catalog_db"] 60 | interval: 30s 61 | timeout: 10s 62 | retries: 5 63 | start_period: 10s 64 | profiles: 65 | - stremio-catalog-providers 66 | - stremio 67 | - all 68 | 69 | stremio-catalog-providers_redis: 70 | container_name: stremio-catalog-providers_redis 71 | image: redis:6 72 | expose: 73 | - 6379 74 | volumes: 75 | - ${DOCKER_DATA_DIR}/stremio-catalog-providers/cache:/data 76 | healthcheck: 77 | test: ["CMD", "redis-cli", "ping"] 78 | interval: 30s 79 | timeout: 10s 80 | retries: 5 81 | profiles: 82 | - stremio-catalog-providers 83 | - stremio 84 | - all 85 | -------------------------------------------------------------------------------- /apps/stremio-jackett/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | stremio-jackett: 3 | image: belmeg/stremio-addon-jackett 4 | container_name: stremio-jackett 5 | restart: unless-stopped 6 | expose: 7 | - 3000 8 | environment: 9 | - PUID=${PUID} 10 | - PGID=${PGID} 11 | - TZ=${TZ:-UTC} # Add timezone support 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.stremiojackett.rule=Host(`${STREMIO_JACKETT_HOSTNAME?}`)" 15 | - "traefik.http.routers.stremiojackett.entrypoints=websecure" 16 | - "traefik.http.routers.stremiojackett.tls.certresolver=letsencrypt" 17 | - "traefik.http.routers.stremiojackett.middlewares=authelia@docker" 18 | profiles: 19 | - stremio-jackett 20 | - stremio 21 | - all 22 | -------------------------------------------------------------------------------- /apps/stremio-server/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | stremio-server: 3 | image: stremio/server:latest 4 | container_name: stremio-server 5 | expose: 6 | - 11470 7 | restart: unless-stopped 8 | labels: 9 | - "traefik.enable=true" 10 | - "traefik.http.routers.stremio-server.rule=Host(`${STREMIO_SERVER_HOSTNAME?}`)" 11 | - "traefik.http.routers.stremio-server.entrypoints=websecure" 12 | - "traefik.http.routers.stremio-server.tls.certresolver=letsencrypt" 13 | profiles: 14 | - stremio-server 15 | - stremio 16 | - all 17 | -------------------------------------------------------------------------------- /apps/stremio-trakt-addon/.env: -------------------------------------------------------------------------------- 1 | # We need to obtain a Trakt Client ID and secret in order for the addons to work. 2 | # To obtain these credentials: 3 | # 1. Create an account/Log in on Trakt.tv/ (https://trakt.tv). 4 | # 2. Go to the applications section (https://trakt.tv/oauth/applications). 5 | # 3. Create a new application (or use an existing application) by filling in the required information (name, description, etc.). 6 | # - For the "Redirect URL", add the following URLs (replacing the ${*_HOSTNAME} with your actual hostname): 7 | # - https://${STREMIO_TRAKT_ADDON_HOSTNAME}/callback 8 | # 9 | # Note: you can only use an existing application, if you are not using a device code auth flow for that application. 10 | TRAKT_CLIENT_ID= 11 | TRAKT_CLIENT_SECRET= 12 | -------------------------------------------------------------------------------- /apps/stremio-trakt-addon/compose.yaml: -------------------------------------------------------------------------------- 1 | 2 | services: 3 | stremio-trakt-addon: 4 | image: reddravenn/stremio-trakt-addon 5 | container_name: stremio-trakt-addon 6 | expose: 7 | - 7000 8 | environment: 9 | PORT: 7000 10 | BASE_URL: https://${STREMIO_TRAKT_ADDON_HOSTNAME?} 11 | DB_USER: postgres 12 | DB_HOST: stremio-trakt-addon_postgres 13 | DB_NAME: stremio_trakt_db 14 | DB_PASSWORD: postgres 15 | DB_PORT: 5432 16 | DB_MAX_CONNECTIONS: 20 17 | DB_IDLE_TIMEOUT: 30000 18 | DB_CONNECTION_TIMEOUT: 2000 19 | REDIS_HOST: stremio-trakt-addon_redis 20 | REDIS_PORT: 6379 21 | REDIS_PASSWORD: 22 | TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID?} 23 | TRAKT_CLIENT_SECRET: ${TRAKT_CLIENT_SECRET?} 24 | TMDB_CACHE_DURATION: 1d 25 | TRAKT_CACHE_DURATION: 1d 26 | TRAKT_HISTORY_FETCH_INTERVAL: 1d 27 | LOG_LEVEL: info 28 | LOG_INTERVAL_DELETION: 3d 29 | NODE_ENV: production 30 | restart: unless-stopped 31 | depends_on: 32 | stremio-trakt-addon_postgres: 33 | condition: service_healthy 34 | stremio-trakt-addon_redis: 35 | condition: service_healthy 36 | volumes: 37 | - ${DOCKER_DATA_DIR}/stremio-trakt-addon/cache:/usr/src/app/cache 38 | - ${DOCKER_DATA_DIR}/stremio-trakt-addon/log:/usr/src/app/log 39 | labels: 40 | - "traefik.enable=true" 41 | - "traefik.http.routers.ravenn-trakt.rule=Host(`${STREMIO_TRAKT_ADDON_HOSTNAME?}`)" 42 | - "traefik.http.routers.ravenn-trakt.entrypoints=websecure" 43 | - "traefik.http.routers.ravenn-trakt.tls.certresolver=letsencrypt" 44 | - "traefik.http.routers.ravenn-trakt.middlewares=authelia@docker" 45 | profiles: 46 | - stremio-trakt-addon 47 | - stremio 48 | - all 49 | 50 | stremio-trakt-addon_postgres: 51 | container_name: stremio-trakt-addon_postgres 52 | image: postgres:16.4 53 | restart: unless-stopped 54 | environment: 55 | POSTGRES_DB: stremio_trakt_db 56 | POSTGRES_USER: postgres 57 | POSTGRES_PASSWORD: postgres 58 | volumes: 59 | - ${DOCKER_DATA_DIR}/stremio-trakt-addon/db:/var/lib/postgresql/data 60 | expose: 61 | - 5432 62 | healthcheck: 63 | test: ["CMD-SHELL", "pg_isready -U postgres -d stremio_trakt_db"] 64 | interval: 30s 65 | timeout: 10s 66 | retries: 5 67 | start_period: 10s 68 | profiles: 69 | - stremio-trakt-addon 70 | - stremio 71 | - all 72 | 73 | stremio-trakt-addon_redis: 74 | container_name: stremio-trakt-addon_redis 75 | image: redis:6 76 | restart: unless-stopped 77 | expose: 78 | - 6379 79 | volumes: 80 | - ${DOCKER_DATA_DIR}/stremio-trakt-addon/redis:/data 81 | healthcheck: 82 | test: ["CMD", "redis-cli", "ping"] 83 | interval: 30s 84 | timeout: 10s 85 | retries: 5 86 | profiles: 87 | - stremio-trakt-addon 88 | - stremio 89 | - all 90 | -------------------------------------------------------------------------------- /apps/stremthru/.env: -------------------------------------------------------------------------------- 1 | # ////////////////////////////////////////////////////////////////////////////////////// 2 | # // // 3 | # // // 4 | # // ███████╗████████╗██████╗ ███████╗███╗ ███╗████████╗██╗ ██╗██████╗ ██╗ ██╗ // 5 | # // ██╔════╝╚══██╔══╝██╔══██╗██╔════╝████╗ ████║╚══██╔══╝██║ ██║██╔══██╗██║ ██║ // 6 | # // ███████╗ ██║ ██████╔╝█████╗ ██╔████╔██║ ██║ ███████║██████╔╝██║ ██║ // 7 | # // ╚════██║ ██║ ██╔══██╗██╔══╝ ██║╚██╔╝██║ ██║ ██╔══██║██╔══██╗██║ ██║ // 8 | # // ███████║ ██║ ██║ ██║███████╗██║ ╚═╝ ██║ ██║ ██║ ██║██║ ██║╚██████╔╝ // 9 | # // ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ // 10 | # // // 11 | # // // 12 | # ////////////////////////////////////////////////////////////////////////////////////// 13 | 14 | 15 | # ============================= 16 | # LOGGING CONFIGURATION 17 | # ================================ 18 | 19 | # The level of information to log. The options are: DEBUG, INFO, WARN, ERROR 20 | STREMTHRU_LOG_LEVEL=INFO 21 | # The format of the log output. The options are: json, text 22 | STREMTHRU_LOG_FORMAT=json 23 | 24 | # ============================ 25 | # PROXY CONFIGURATION 26 | # ================================ 27 | 28 | # A list of user credentials for the proxy. In a comma separated list of username:password pairs. 29 | STREMTHRU_PROXY_AUTH=user1:pass1,user2:pass2 30 | # A list of admin users. Should be a comma separated list of usernames that must be defined above in the STREMTHRU_PROXY_AUTH variable. 31 | # If you do not set this, all users will be admins. 32 | # STREMTHRU_AUTH_ADMIN= 33 | 34 | # A list of store credentials per user. In a comma separated list of username:store_name:store_token. 35 | # You can also use * as the username to apply to all users. 36 | # This lets you use different API keys for different users. 37 | # e.g. something like *:realdebrid:abc...xyz would mean for all users, this API key would be used for Real Debrid. 38 | # (Not needed if using StremThru as a external proxy within other apps/addons like AIOStreams) 39 | STREMTHRU_STORE_AUTH=*:realdebrid:abc...xyz 40 | 41 | # A list of proxy configurations per store. This lets you control what is proxied based on what store its from. 42 | # The format is a comma separated list of : 43 | # You can use * to apply to all stores. 44 | # e.g. *:true,premiumize:false would mean all stores are proxied, except for premiumize. 45 | # (Does not affect proxying of stream links generated by other apps/addons like AIOStreams) 46 | STREMTHRU_STORE_CONTENT_PROXY=*:true,easydebrid:false,premiumize:false 47 | 48 | # This is the maximum number of connections to the proxy per user. 49 | # In the format of a comma separated list of : pairs. 50 | # e.g. user1:10,user2:5 would mean user1 can have 10 connections, and user2 can have 5 connections. 51 | # If you want to set a limit for all users, use * as the username. 52 | # A connection limit of 0 means no limit. 53 | # (This DOES affect the proxying of stream links generated by other apps/addons like AIOStreams) 54 | STREMTHRU_CONTENT_PROXY_CONNECTION_LIMIT=*:0 55 | 56 | 57 | # ============================ 58 | # TUNNEL CONFIGURATION 59 | # ================================ 60 | # This is the configuration for the tunnel. 61 | # The tunnel is separate to the actual proxying of your addons. It lets you configure a 62 | # HTTP proxy to use for requests. Configuring a hostname to not be tunneled doesn't affect the proxying of the addon itself, 63 | # only that it won't also be tunneled through the HTTP proxy. 64 | # 65 | # If you do not need a tunnel, you can comment out the STREMTHRU_HTTP_PROXY variable. 66 | # 67 | # This is the URL of the tunnel. 68 | # warp: http://warp:1080 or gluetun: http://gluetun:8080 69 | # (Must have the warp or gluetun profile running to use it as a tunnel) 70 | STREMTHRU_HTTP_PROXY=http://warp:1080 71 | 72 | # This allows you to configure what to use the tunnel for. 73 | # The format is :,:,:. 74 | # * represents all domains. 75 | # The following configuration only routes requests to torrentio.strem.fun through the tunnel. 76 | # This is necessary when Torrentio blocks your VPS and we want to access the original RD link. 77 | # It wouldn't use the tunnel for the actual playback link, only to get access to the streaming link through Torrentio. 78 | STREMTHRU_TUNNEL=*:false,torrentio.strem.fun:true 79 | # This setting is the same as above, but has a higher priority, and used specifically to configure specific stores. 80 | # The format is :. 81 | # Using api as the value means only the api access will be routed through the tunnel, not the playback links. 82 | # Using true would route everything for that store through the tunnel. 83 | STREMTHRU_STORE_TUNNEL=realdebrid:api 84 | 85 | # In most cases, the defaults above are fine. If you want to route everything through the tunnel (e.g. route everything through a VPN), 86 | # simply leave the STREMTHRU_TUNNEL and STREMTHRU_STORE_TUNNEL variables blank. 87 | 88 | # ============================= 89 | # FEATURE CONFIGURATION 90 | # ================================ 91 | 92 | # This lets you enable or disable features in StremThru. 93 | # The format is a comma separated list of features, optionally prefixed with a - to disable them. 94 | # List of features: 95 | # - dmm_hashlist - Whether to scrape DMM hashlists for torrents. 96 | # - imdb_title 97 | # - stremio_sidekick 98 | # - stremio_store 99 | # - stremio_wrap 100 | # e.g. -dmm_hashlist,-imdb_title would disable the DMM hashlists and IMDB title features. 101 | # STREMTHRU_FEATURE= 102 | 103 | # ============================= 104 | # DATABASE CONFIGURATION 105 | # ================================ 106 | STREMTHRU_DATABASE_URI=sqlite://./data/stremthru.db 107 | STREMTHRU_REDIS_URI=redis://stremthru_redis:6379 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /apps/stremthru/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | stremthru: 3 | image: muniftanjim/stremthru:latest 4 | container_name: stremthru 5 | restart: unless-stopped 6 | expose: 7 | - 8080 8 | env_file: 9 | - .env 10 | depends_on: 11 | stremthru_redis: 12 | condition: service_healthy 13 | volumes: 14 | - ${DOCKER_DATA_DIR}/stremthru:/app/data 15 | labels: 16 | - "traefik.enable=true" 17 | - "traefik.http.routers.stremthru.rule=Host(`${STREMTHRU_HOSTNAME?}`)" 18 | - "traefik.http.routers.stremthru.entrypoints=websecure" 19 | - "traefik.http.routers.stremthru.tls.certresolver=letsencrypt" 20 | - "traefik.http.routers.stremthru.middlewares=authelia@docker" 21 | - "traefik.http.services.stremthru.loadbalancer.server.port=8080" 22 | profiles: 23 | - stremthru 24 | - stremio 25 | - all 26 | 27 | stremthru_redis: 28 | image: redis:latest 29 | container_name: stremthru_redis 30 | restart: unless-stopped 31 | volumes: 32 | - ${DOCKER_DATA_DIR}/stremthru/cache:/data 33 | command: redis-server --appendonly yes --save 60 1 34 | healthcheck: 35 | test: ["CMD", "redis-cli", "ping"] 36 | interval: 10s 37 | timeout: 5s 38 | retries: 5 39 | profiles: 40 | - stremthru 41 | - stremio 42 | - all 43 | 44 | -------------------------------------------------------------------------------- /apps/tautulli/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | tautulli: 3 | image: ghcr.io/tautulli/tautulli 4 | container_name: tautulli 5 | restart: unless-stopped 6 | expose: 7 | - 8181 8 | volumes: 9 | - ${DOCKER_DATA_DIR}/tautulli:/config 10 | environment: 11 | - PUID=${PUID} 12 | - PGID=${PGID} 13 | - TZ=${TZ:-UTC} 14 | labels: 15 | - "traefik.enable=true" 16 | - "traefik.http.routers.tautulli.rule=Host(`${TAUTULLI_HOSTNAME?}`)" 17 | - "traefik.http.routers.tautulli.entrypoints=websecure" 18 | - "traefik.http.routers.tautulli.tls.certresolver=letsencrypt" 19 | profiles: 20 | - all 21 | - tautulli 22 | - debrid_media_server 23 | -------------------------------------------------------------------------------- /apps/tmdb-addon/.env: -------------------------------------------------------------------------------- 1 | # Get your API key from https://www.themoviedb.org/settings/api 2 | TMDB_API_KEY= 3 | # Get your API key from https://fanart.tv/get-an-api-key/ 4 | FANART_API_KEY= 5 | 6 | # Tip: The information that TMDb and Fanart.tv ask from you does not need to be real. 7 | -------------------------------------------------------------------------------- /apps/tmdb-addon/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | tmdb-addon: 3 | image: viren070/tmdb-addon:latest 4 | container_name: tmdb-addon 5 | restart: unless-stopped 6 | expose: 7 | - 3232 8 | environment: 9 | - PORT=3232 10 | - TMDB_API=${TMDB_API_KEY?} # https://www.themoviedb.org/settings/api 11 | - FANART_API=${FANART_API_KEY?} # https://fanart.tv/get-an-api-key/ 12 | - HOST_NAME=${TMDB_ADDON_HOSTNAME?} 13 | - MONGODB_URI=mongodb://mongodb:27017/tmdb 14 | - META_TTL=604800 # 1 week 15 | - CATALOG_TTL=86400 # 1 day 16 | - NO_CACHE=false # Enable cache, set to true to disable 17 | labels: 18 | - "traefik.enable=true" 19 | - "traefik.http.routers.tmdb.rule=Host(`${TMDB_ADDON_HOSTNAME?}`)" 20 | - "traefik.http.routers.tmdb.entrypoints=websecure" 21 | - "traefik.http.routers.tmdb.tls.certresolver=letsencrypt" 22 | - "traefik.http.routers.tmdb.middlewares=authelia@docker" 23 | - "traefik.http.services.tmdb.loadbalancer.server.port=3232" 24 | depends_on: 25 | tmdb-addon_mongo: 26 | condition: service_healthy 27 | profiles: 28 | - tmdb-addon 29 | - stremio 30 | - all 31 | 32 | tmdb-addon_mongo: 33 | image: mongo:latest 34 | container_name: tmdb-addon_mongo 35 | restart: unless-stopped 36 | volumes: 37 | - ${DOCKER_DATA_DIR}/tmdb-addon/db:/data/db 38 | healthcheck: 39 | test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet 40 | interval: 10s 41 | timeout: 10s 42 | retries: 5 43 | start_period: 40s 44 | profiles: 45 | - tmdb-addon 46 | - stremio 47 | - all 48 | -------------------------------------------------------------------------------- /apps/torbox-manager/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | torbox-manager: 3 | image: charleeislegend/torbox-manager:latest 4 | container_name: torbox-manager 5 | expose: 6 | - 3000 7 | restart: unless-stopped 8 | labels: 9 | - "traefik.enable=true" 10 | - "traefik.http.routers.tbm.rule=Host(`${TORBOX_MANAGER_HOSTNAME?}`)" 11 | - "traefik.http.routers.tbm.entrypoints=websecure" 12 | - "traefik.http.routers.tbm.tls.certresolver=letsencrypt" 13 | - "traefik.http.routers.tbm.middlewares=authelia@docker" 14 | profiles: 15 | - torbox-manager 16 | - all 17 | -------------------------------------------------------------------------------- /apps/torbox-media-center/.env: -------------------------------------------------------------------------------- 1 | # Your Torbox API key, you can get it from https://torbox.app/settings 2 | TORBOX_API_KEY= 3 | 4 | # Where you want to mount the files to. You can change this to 5 | # something like /mnt/media/torbox, for example. 6 | TORBOX_MOUNT_PATH=${DOCKER_DATA_DIR?}/torbox 7 | 8 | # The method to mount the files. You can use either strm or fuse 9 | # strm will work with media servers that support .strm files such as Jellyfin/Emby. 10 | # fuse is provided as a fallback method for platforms like Plex, Infuse, VLC. 11 | # 12 | # So, use strm if you are using Jellyfin/Emby, and fuse if using anything else. 13 | TORBOX_MOUNT_METHOD=strm -------------------------------------------------------------------------------- /apps/torbox-media-center/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | torbox-media-center: 3 | image: anonymoussystems/torbox-media-center:main 4 | container_name: torbox-media-center 5 | stdin_open: true 6 | tty: true 7 | restart: unless-stopped 8 | environment: 9 | - TORBOX_API_KEY=${TORBOX_API_KEY} 10 | - MOUNT_METHOD=${TORBOX_MOUNT_METHOD} 11 | - MOUNT_PATH=/torbox 12 | volumes: 13 | - ${TORBOX_MOUNT_PATH}:/torbox 14 | profiles: 15 | - debrid_media_server 16 | - all 17 | -------------------------------------------------------------------------------- /apps/traefik/.env: -------------------------------------------------------------------------------- 1 | # https://www.authelia.com/integration/proxies/traefik/#trusted-proxies 2 | TRUSTED_IPS=192.168.1.1 -------------------------------------------------------------------------------- /apps/traefik/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | traefik: 3 | image: traefik:v3 4 | container_name: traefik 5 | restart: unless-stopped 6 | environment: 7 | - TZ=${TZ:-UTC} 8 | ports: 9 | - 443:443 10 | - 80:80 11 | command: 12 | - '--api=true' 13 | - '--api.dashboard=true' 14 | - '--api.insecure=false' 15 | - '--global.sendAnonymousUsage=false' 16 | - '--global.checkNewVersion=false' 17 | - '--log=true' 18 | - '--log.level=DEBUG' 19 | - "--providers.docker=true" 20 | - "--providers.docker.exposedbydefault=false" 21 | - "--providers.docker.network=${DOCKER_NETWORK?}" 22 | 23 | - "--entryPoints.web.address=:80" 24 | - "--entryPoints.websecure.address=:443" 25 | 26 | 27 | - "--entryPoints.web.forwardedHeaders.insecure=false" 28 | - "--entryPoints.web.proxyProtocol.insecure=false" 29 | 30 | - "--entryPoints.web.http.redirections.entryPoint.to=websecure" 31 | - "--entryPoints.web.http.redirections.entryPoint.scheme=https" 32 | - "--entryPoints.web.forwardedHeaders.trustedIPs=${TRUSTED_IPS}" 33 | - "--entryPoints.web.proxyProtocol.trustedIPs=${TRUSTED_IPS}" 34 | 35 | 36 | - "--entryPoints.websecure.forwardedHeaders.insecure=false" 37 | - "--entryPoints.websecure.proxyProtocol.insecure=false" 38 | - "--entryPoints.websecure.forwardedHeaders.trustedIPs=${TRUSTED_IPS}" 39 | - "--entryPoints.websecure.proxyProtocol.trustedIPs=${TRUSTED_IPS}" 40 | 41 | - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" 42 | - "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL?}" 43 | - "--certificatesresolvers.letsencrypt.acme.storage=/config/acme.json" 44 | - "--log.level=INFO" 45 | - "--ping" 46 | volumes: 47 | - "/var/run/docker.sock:/var/run/docker.sock" 48 | - "${DOCKER_DATA_DIR}/traefik:/config" 49 | labels: 50 | - "traefik.enable=true" 51 | - "traefik.http.routers.api.rule=Host(`${TRAEFIK_HOSTNAME?}`)" 52 | - "traefik.http.routers.api.entrypoints=websecure" 53 | - "traefik.http.routers.api.tls.certresolver=letsencrypt" 54 | - "traefik.http.routers.api.service=api@internal" 55 | - "traefik.http.routers.api.middlewares=authelia@docker" 56 | healthcheck: 57 | test: ["CMD", "traefik", "healthcheck", "--ping"] 58 | interval: 10s 59 | timeout: 5s 60 | retries: 3 61 | depends_on: 62 | authelia: 63 | condition: service_healthy 64 | profiles: 65 | - traefik 66 | - required 67 | - all 68 | -------------------------------------------------------------------------------- /apps/tweakio/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | tweakio: 3 | image: varthe/tweakio:latest 4 | container_name: tweakio 5 | restart: unless-stopped 6 | # Run this container in the same network as warp, so it can access Torrentio 7 | # If not blocked by Torrentio, you can remove this line. 8 | # Will need to be accesssed at http://warp:3185 if using warp. 9 | network_mode: service:warp 10 | user: $PUID:$PGID 11 | volumes: 12 | - ${DOCKER_DATA_DIR}/tweakio/config.yaml:/app/config.yaml 13 | profiles: 14 | - all 15 | - debrid_media_server 16 | - tweakio 17 | depends_on: 18 | warp: 19 | condition: service_healthy 20 | restart: true 21 | -------------------------------------------------------------------------------- /apps/uptime-kuma/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | uptime-kuma: 3 | image: louislam/uptime-kuma:latest 4 | container_name: kuma 5 | restart: unless-stopped 6 | # environment: 7 | # PUID: ${PUID} 8 | # PGID: ${PGID} 9 | expose: 10 | - 3001 11 | labels: 12 | - "traefik.enable=true" 13 | - "traefik.http.routers.uptime-kuma.rule=Host(`${UPTIME_KUMA_HOSTNAME?}`)" 14 | - "traefik.http.routers.uptime-kuma.entrypoints=websecure" 15 | - "traefik.http.routers.uptime-kuma.tls.certresolver=letsencrypt" 16 | - "traefik.http.routers.uptime-kuma.middlewares=authelia@docker" 17 | volumes: 18 | - ${DOCKER_DATA_DIR}/uptime-kuma:/app/data 19 | - /var/run/docker.sock:/var/run/docker.sock 20 | profiles: 21 | - uptime-kuma 22 | - all 23 | -------------------------------------------------------------------------------- /apps/vaultwarden/.env: -------------------------------------------------------------------------------- 1 | VAULTWARDEN_ADMIN_TOKEN= 2 | # Whether to allow signups or not. Set to true to allow signups, false to disable signups. 3 | # You can set it to false after you have created your account. 4 | VAULTWARDEN_SIGNUPS_ALLOWED=true -------------------------------------------------------------------------------- /apps/vaultwarden/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | vaultwarden: 3 | image: vaultwarden/server:latest 4 | container_name: vaultwarden 5 | restart: unless-stopped 6 | expose: 7 | - 80 8 | environment: 9 | DOMAIN: "https://${VAULTWARDEN_HOSTNAME?}" 10 | SIGNUPS_ALLOWED: ${VAULTWARDEN_SIGNUPS_ALLOWED:-true} 11 | ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN?} 12 | volumes: 13 | - ${DOCKER_DATA_DIR}/vaultwarden:/data/ 14 | labels: 15 | - "traefik.enable=true" 16 | - "traefik.http.routers.vaultwarden.rule=Host(`${VAULTWARDEN_HOSTNAME?}`)" 17 | - "traefik.http.routers.vaultwarden.entrypoints=websecure" 18 | - "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt" 19 | profiles: 20 | - vaultwarden 21 | - all 22 | -------------------------------------------------------------------------------- /apps/warp/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | warp: 3 | image: caomingjun/warp 4 | container_name: warp 5 | restart: unless-stopped 6 | device_cgroup_rules: 7 | - 'c 10:200 rwm' 8 | expose: 9 | - 1080 10 | environment: 11 | - WARP_SLEEP=5 12 | cap_add: 13 | - NET_ADMIN 14 | sysctls: 15 | - net.ipv6.conf.all.disable_ipv6=0 16 | - net.ipv4.conf.all.src_valid_mark=1 17 | volumes: 18 | - ${DOCKER_DATA_DIR}/warp:/var/lib/cloudflare-warp 19 | healthcheck: 20 | test: curl -x "socks5h://127.0.0.1:1080" -fsSL "https://www.cloudflare.com/cdn-cgi/trace" | grep -qE "warp=(plus|on)" || exit 1 21 | interval: 1m 22 | timeout: 5s 23 | retries: 3 24 | start_period: 5s 25 | profiles: 26 | - warp 27 | - stremio 28 | - all 29 | - debrid_media_server 30 | -------------------------------------------------------------------------------- /apps/watchtower/.env: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------- 2 | # WATCHTOWER 3 | # --------------------------------------------------------- 4 | # The AUTO_UPDATE_SCHEDULE is a cron expression that is used to schedule the auto update of the containers. 5 | # It is different from a normal cron expression, as it has an additional field at the beginning for seconds. 6 | # See https://pkg.go.dev/github.com/robfig/cron@v1.2.0#hdr-CRON_Expression_Format 7 | # 8 | # The AUTO_UPDATE_NOTIFICATION_URL is the URL that will be used to send notifications about the auto update. 9 | # You can find more information about the available services at https://containrrr.dev/shoutrrr/v0.8/services/overview/ 10 | # Make sure the format of the AUTO_UPDATE_NOTIFICATION_URL is correct. 11 | 12 | # e.g. For discord, the format is discord://token@id 13 | # Discord webhook URLs are in the format https://discord.com/api/webhooks// 14 | # So the URL would be discord://@ 15 | # --------------------------------------------------------- 16 | AUTO_UPDATE_SCHEDULE=0 0 6 * * * 17 | AUTO_UPDATE_NOTIFICATION_URL= 18 | -------------------------------------------------------------------------------- /apps/watchtower/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | watchtower: 3 | image: containrrr/watchtower 4 | container_name: watchtower 5 | restart: unless-stopped 6 | environment: 7 | TZ: ${TZ:-UTC} 8 | WATCHTOWER_CLEANUP: "true" 9 | WATCHTOWER_SCHEDULE: ${AUTO_UPDATE_SCHEDULE:-0 0 6 * * *} # Run at 6am daily 10 | WATCHTOWER_NOTIFICATION_URL: ${AUTO_UPDATE_NOTIFICATION_URL:-} 11 | WATCHTOWER_NOTIFICATION_REPORT: "true" 12 | WATCHTOWER_NOTIFICATION_TEMPLATE: | 13 | {{- if .Report -}} 14 | {{- with .Report -}} 15 | {{- if ( or .Updated .Failed ) -}} 16 | {{len .Scanned}} Scanned, {{len .Updated}} Updated, {{len .Failed}} Failed 17 | {{- range .Updated}} 18 | - {{.Name}} ({{.ImageName}}): {{.CurrentImageID.ShortID}} updated to {{.LatestImageID.ShortID}} 19 | {{- end -}} 20 | {{- range .Skipped}} 21 | - {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}} 22 | {{- end -}} 23 | {{- range .Failed}} 24 | - {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}} 25 | {{- end -}} 26 | {{- end -}} 27 | {{- end -}} 28 | {{- else -}} 29 | {{range .Entries -}}{{.Message}}{{"\n"}}{{- end -}} 30 | {{- end -}} 31 | volumes: 32 | - /var/run/docker.sock:/var/run/docker.sock 33 | profiles: 34 | - watchtower 35 | - all 36 | -------------------------------------------------------------------------------- /apps/wests-scripts/.env: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------# 2 | # ███████╗ ██████╗██████╗ ██╗██████╗ ████████╗███████╗ # 3 | # ██╔════╝██╔════╝██╔══██╗██║██╔══██╗╚══██╔══╝██╔════╝ # 4 | # ███████╗██║ ██████╔╝██║██████╔╝ ██║ ███████╗ # 5 | # ╚════██║██║ ██╔══██╗██║██╔═══╝ ██║ ╚════██║ # 6 | # ███████║╚██████╗██║ ██║██║██║ ██║ ███████║ # 7 | # ╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚══════╝ # 8 | #------------------------------------------------------# 9 | 10 | #--------# 11 | # SERVER # 12 | #--------# 13 | SERVER_DOMAIN= 14 | 15 | #-------------------------------------------------------------------# 16 | # PLEX - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, PLEX REFRESH # 17 | #-------------------------------------------------------------------# 18 | 19 | PLEX_HOST="https://plex.tv/" 20 | PLEX_METADATA_HOST="https://metadata.provider.plex.tv/" 21 | # This server host cannot be http://plex:32400, it will not work. 22 | # You will need to use the internal IP address of the server. 23 | # You can also use the docker IP. If you run docker inspect plex, you will see the IP address of the container. 24 | # It must also NOT have a trailing slash. (a slash at the end of the URL) 25 | PLEX_SERVER_HOST= 26 | # To obtain your machine ID, visit https://${PLEX_HOSTNAME}/?X-Plex-Token=YourTokenHere 27 | # Obtaining a plex token: https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/ 28 | PLEX_SERVER_MACHINE_ID= 29 | # To obtain your server token look at the file located in ${DOCKER_DATA_DIR/plex/config/Library/Application Support/Plex Media Server/Preferences.xml 30 | # for the PlexOnlineToken 31 | PLEX_SERVER_API_KEY= 32 | # To obtain your library ID: https://support.plex.tv/articles/201638786-plex-media-server-url-commands/#:~:text=Listing%20Defined%20Libraries 33 | PLEX_SERVER_MOVIE_LIBRARY_ID= 34 | PLEX_SERVER_TV_SHOW_LIBRARY_ID= 35 | # This would be the path to your plex server files. 36 | PLEX_SERVER_PATH=${DOCKER_DATA_DIR}/plex/config/Library/Application Support/Plex Media Server 37 | 38 | #-------------------------------------------------------------------------# 39 | # OVERSEERR - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, RECLAIM SPACE # 40 | #-------------------------------------------------------------------------# 41 | 42 | OVERSEERR_HOST=http://overseerr:5055 43 | OVERSEERR_API_KEY= 44 | 45 | #------------------------------------------------------------------------------------# 46 | # SONARR - BLACKHOLE, REPAIR, IMPORT TORRENT FOLDER, RECLAIM SPACE, ADD NEXT EPISODE # 47 | #------------------------------------------------------------------------------------# 48 | 49 | SONARR_HOST=http://sonarr:8989 50 | SONARR_API_KEY= 51 | SONARR_ROOT_FOLDER="/mnt/media/TV" 52 | 53 | SONARR_HOST_4K=http://sonarr4k:8989 54 | SONARR_API_KEY_4K= 55 | SONARR_ROOT_FOLDER_4K="/mnt/media/TV - 4K" 56 | 57 | SONARR_HOST_ANIME=http://sonarranime:8989 58 | SONARR_API_KEY_ANIME= 59 | SONARR_ROOT_FOLDER_ANIME="/mnt/media/TV - Anime" 60 | 61 | #------------------------------------------------------------------# 62 | # RADARR - BLACKHOLE, REPAIR, IMPORT TORRENT FOLDER, RECLAIM SPACE # 63 | #------------------------------------------------------------------# 64 | 65 | RADARR_HOST=http://radarr:7878 66 | RADARR_API_KEY= 67 | RADARR_ROOT_FOLDER="/mnt/media/Movies" 68 | 69 | RADARR_HOST_4K=http://radarr4k:7878 70 | RADARR_API_KEY_4K= 71 | RADARR_ROOT_FOLDER_4K="/mnt/media/Movies - 4K" 72 | 73 | RADARR_HOST_ANIME=http://radarranime:7878 74 | RADARR_API_KEY_ANIME= 75 | RADARR_ROOT_FOLDER_ANIME="/mnt/media/Movies - Anime" 76 | 77 | 78 | #-------------------------------# 79 | # REALDEBRID - BLACKHOLE, REPAIR # 80 | #-------------------------------# 81 | 82 | REALDEBRID_ENABLED=true 83 | REALDEBRID_HOST="https://api.real-debrid.com/rest/1.0/" 84 | REALDEBRID_API_KEY= 85 | REALDEBRID_MOUNT_TORRENTS_PATH="/mnt/remote/realdebrid/__all__" 86 | 87 | #-----------------------# 88 | # BLACKHOLE - BLACKHOLE # 89 | #-----------------------# 90 | 91 | BLACKHOLE_BASE_WATCH_PATH="/mnt/symlinks" 92 | BLACKHOLE_RADARR_PATH="radarr" 93 | BLACKHOLE_SONARR_PATH="sonarr" 94 | BLACKHOLE_FAIL_IF_NOT_CACHED=true 95 | BLACKHOLE_RD_MOUNT_REFRESH_SECONDS=200 96 | BLACKHOLE_WAIT_FOR_TORRENT_TIMEOUT=300 97 | BLACKHOLE_HISTORY_PAGE_SIZE=500 98 | 99 | 100 | #-----------------------------------------------------------------------------------------------# 101 | # DISCORD - BLACKHOLE, WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, MONITOR RAM, RECLAIM SPACE # 102 | #-----------------------------------------------------------------------------------------------# 103 | 104 | DISCORD_ENABLED=false 105 | DISCORD_UPDATE_ENABLED=false 106 | DISCORD_WEBHOOK_URL= 107 | 108 | #-------------------------------------# 109 | # WATCHLIST - WATCHLIST, PLEX REQUEST # 110 | #-------------------------------------# 111 | # No changes necessary. 112 | 113 | WATCHLIST_PLEX_PRODUCT="Plex Request Authentication" 114 | WATCHLIST_PLEX_VERSION="1.0.0" 115 | WATCHLIST_PLEX_CLIENT_IDENTIFIER="576101fc-b425-4685-91cb-5d3c1671fd2b" 116 | 117 | 118 | #-----------------# 119 | # REPAIR - REPAIR # 120 | #-----------------# 121 | 122 | REPAIR_REPAIR_INTERVAL="10m" 123 | REPAIR_RUN_INTERVAL="1d" 124 | 125 | #-----------------------# 126 | # GENERAL CONFIGURATION # 127 | #-----------------------# 128 | 129 | PYTHONUNBUFFERED=TRUE 130 | PUID=${PUID} 131 | PGID=${PGID} 132 | UMASK=002 133 | -------------------------------------------------------------------------------- /apps/wests-scripts/blackhole/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | blackhole: 3 | image: ghcr.io/westsurname/scripts/blackhole:latest 4 | container_name: blackhole 5 | user: "${PUID}:${PGID}" 6 | volumes: 7 | - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} 8 | - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} 9 | - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} 10 | - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} 11 | - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/default/logs:/app/logs 12 | - /mnt:/mnt 13 | env_file: 14 | - ../.env 15 | environment: 16 | - PUID=${PUID} 17 | - PGID=${PGID} 18 | - UMASK=002 19 | - SONARR_HOST=${SONARR_HOST} 20 | - SONARR_API_KEY=${SONARR_API_KEY} 21 | - RADARR_HOST=${RADARR_HOST} 22 | - RADARR_API_KEY=${RADARR_API_KEY} 23 | - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} 24 | restart: unless-stopped 25 | depends_on: 26 | rclone: 27 | condition: service_started 28 | sonarr: 29 | condition: service_healthy 30 | radarr: 31 | condition: service_healthy 32 | profiles: 33 | - debrid_media_server 34 | - all 35 | 36 | 37 | blackhole4k: 38 | image: ghcr.io/westsurname/scripts/blackhole:latest 39 | container_name: blackhole4k 40 | user: "${PUID}:${PGID}" 41 | volumes: 42 | - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} 43 | - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} 44 | - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} 45 | - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} 46 | - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/4k/logs:/app/logs 47 | - /mnt:/mnt 48 | env_file: 49 | - ../.env 50 | environment: 51 | - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} 52 | - PUID=${PUID} 53 | - PGID=${PGID} 54 | - UMASK=002 55 | - SONARR_HOST=${SONARR_HOST_4K} 56 | - SONARR_API_KEY=${SONARR_API_KEY_4K} 57 | - RADARR_HOST=${RADARR_HOST_4K} 58 | - RADARR_API_KEY=${RADARR_API_KEY_4K} 59 | - SONARR_ROOT_FOLDER=${SONARR_ROOT_FOLDER_4K} 60 | - RADARR_ROOT_FOLDER=${RADARR_ROOT_FOLDER_4K} 61 | restart: unless-stopped 62 | depends_on: 63 | rclone: 64 | condition: service_started 65 | sonarr4k: 66 | condition: service_healthy 67 | radarr4k: 68 | condition: service_healthy 69 | profiles: 70 | - debrid_media_server 71 | - all 72 | 73 | 74 | 75 | blackholeanime: 76 | image: ghcr.io/westsurname/scripts/blackhole:latest 77 | container_name: blackholeanime 78 | user: "${PUID}:${PGID}" 79 | volumes: 80 | - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} 81 | - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} 82 | - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} 83 | - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} 84 | - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/anime/logs:/app/logs 85 | - /mnt:/mnt 86 | env_file: 87 | - ../.env 88 | environment: 89 | - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} 90 | - PUID=${PUID} 91 | - PGID=${PGID} 92 | - UMASK=002 93 | - SONARR_HOST=${SONARR_HOST_ANIME} 94 | - SONARR_API_KEY=${SONARR_API_KEY_ANIME} 95 | - RADARR_HOST=${RADARR_HOST_ANIME} 96 | - RADARR_API_KEY=${RADARR_API_KEY_ANIME} 97 | - SONARR_ROOT_FOLDER=${SONARR_ROOT_FOLDER_ANIME} 98 | - RADARR_ROOT_FOLDER=${RADARR_ROOT_FOLDER_ANIME} 99 | 100 | restart: unless-stopped 101 | depends_on: 102 | rclone: 103 | condition: service_started 104 | sonarranime: 105 | condition: service_healthy 106 | radarranime: 107 | condition: service_healthy 108 | profiles: 109 | - debrid_media_server 110 | - all 111 | 112 | 113 | -------------------------------------------------------------------------------- /apps/wests-scripts/compose.yaml: -------------------------------------------------------------------------------- 1 | include: 2 | - blackhole/compose.yaml 3 | - repair/compose.yaml 4 | # The below are optional and can be uncommented if needed 5 | # You must have plex setup already before using these. 6 | # - plex_authentication/compose.yaml 7 | # - plex_watchlist/compose.yaml 8 | # - plex_requests/compose.yaml 9 | -------------------------------------------------------------------------------- /apps/wests-scripts/plex_authentication/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | plex_authentication: 3 | image: ghcr.io/westsurname/scripts/plex_authentication:latest 4 | container_name: plex_authentication_service 5 | restart: unless-stopped 6 | volumes: 7 | - ${DOCKER_DATA_DIR}/wests-scripts/shared/tokens.json:/app/shared/tokens.json 8 | - ${DOCKER_DATA_DIR}/wests-scripts/sockets:/app/sockets 9 | env_file: 10 | - ../.env 11 | profiles: 12 | - all 13 | - plex_request 14 | - plex_watchlist 15 | -------------------------------------------------------------------------------- /apps/wests-scripts/plex_requests/.env: -------------------------------------------------------------------------------- 1 | PLEX_HOSTNAME= -------------------------------------------------------------------------------- /apps/wests-scripts/plex_requests/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | plex_request: 3 | image: ghcr.io/westsurname/scripts/plex_request:latest 4 | container_name: plex_request_service 5 | volumes: 6 | - ${DOCKER_DATA_DIR}/wests-scripts/shared/tokens.json:/app/shared/tokens.json 7 | - ${DOCKER_DATA_DIR}/wests-scripts/sockets:/app/sockets 8 | env_file: 9 | - ../.env 10 | restart: unless-stopped 11 | depends_on: 12 | plex: 13 | condition: service_healthy 14 | profiles: 15 | - all 16 | - plex_request 17 | 18 | # This puts plex behind a custom nginx reverse proxy, which is required for the plex_request script to work. 19 | # It allows it to intercept requests and modify the data to show a request button on all clients. 20 | # You should disable the traefik router for plex in /opt/docker/apps/plex/.env 21 | # by setting the PLEX_TRAEFIK_ENABLE to false. You can also set the PLEX_HOSTNAME to the same as the one you set for the original plex container. 22 | plex_request_nginx: 23 | image: ghcr.io/westsurname/scripts/plex_request_nginx:latest 24 | container_name: plex_request_nginx_service 25 | volumes: 26 | - ${PLEX_SERVER_PATH}:/plex:ro 27 | - ${DOCKER_DATA_DIR}/wests-scripts/sockets:/app/sockets 28 | expose: 29 | - 8000 30 | env_file: 31 | - ../.env 32 | restart: unless-stopped 33 | labels: 34 | - "traefik.enable=true" 35 | - "traefik.http.routers.plexrequest.rule=Host(`${PLEX_HOSTNAME?}`)" 36 | - "traefik.http.routers.plexrequest.entrypoints=websecure" 37 | - "traefik.http.routers.plexrequest.tls.certresolver=letsencrypt" 38 | - "traefik.http.services.plexrequest.loadbalancer.server.port=8000" 39 | depends_on: 40 | - plex_request 41 | - plex_authentication 42 | profiles: 43 | - all 44 | - plex_request 45 | 46 | -------------------------------------------------------------------------------- /apps/wests-scripts/plex_watchlist/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | watchlist: 3 | container_name: plex_watchlist_service 4 | image: ghcr.io/westsurname/scripts/watchlist:latest 5 | volumes: 6 | - ${DOCKER_DATA_DIR}/wests-scripts/shared/tokens.json:/app/shared/tokens.json 7 | env_file: 8 | - ../.env 9 | restart: unless-stopped 10 | depends_on: 11 | plex: 12 | condition: service_healthy 13 | plex_authentication: 14 | condition: service_started 15 | profiles: 16 | - all 17 | - plex_watchlist -------------------------------------------------------------------------------- /apps/wests-scripts/repair/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | repair: 3 | image: ghcr.io/westsurname/scripts/scripts:latest 4 | container_name: repair 5 | command: python repair.py --no-confirm 6 | restart: unless-stopped 7 | env_file: 8 | - ../.env 9 | environment: 10 | - SONARR_HOST=${SONARR_HOST} 11 | - SONARR_API_KEY=${SONARR_API_KEY} 12 | - RADARR_HOST=${RADARR_HOST} 13 | - RADARR_API_KEY=${RADARR_API_KEY} 14 | volumes: 15 | - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} 16 | - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} 17 | - ${SONARR_ROOT_FOLDER}:${SONARR_ROOT_FOLDER} 18 | - ${RADARR_ROOT_FOLDER}:${RADARR_ROOT_FOLDER} 19 | depends_on: 20 | rclone: 21 | condition: service_started 22 | sonarr: 23 | condition: service_healthy 24 | radarr: 25 | condition: service_healthy 26 | profiles: 27 | - debrid_media_server 28 | - all 29 | 30 | repair4k: 31 | image: ghcr.io/westsurname/scripts/scripts:latest 32 | container_name: repair4k 33 | command: python repair.py --no-confirm 34 | restart: unless-stopped 35 | env_file: 36 | - ../.env 37 | environment: 38 | - SONARR_HOST=${SONARR_HOST_4K} 39 | - SONARR_API_KEY=${SONARR_API_KEY_4K} 40 | - RADARR_HOST=${RADARR_HOST_4K} 41 | - RADARR_API_KEY=${RADARR_API_KEY_4K} 42 | volumes: 43 | - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} 44 | - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} 45 | - ${SONARR_ROOT_FOLDER_4K}:${SONARR_ROOT_FOLDER_4K} 46 | - ${RADARR_ROOT_FOLDER_4K}:${RADARR_ROOT_FOLDER_4K} 47 | depends_on: 48 | rclone: 49 | condition: service_started 50 | sonarr4k: 51 | condition: service_healthy 52 | radarr4k: 53 | condition: service_healthy 54 | profiles: 55 | - debrid_media_server 56 | - all 57 | 58 | repairanime: 59 | image: ghcr.io/westsurname/scripts/scripts:latest 60 | container_name: repairanime 61 | command: python repair.py --no-confirm 62 | restart: unless-stopped 63 | env_file: 64 | - ../.env 65 | environment: 66 | - SONARR_HOST=${SONARR_HOST_ANIME} 67 | - SONARR_API_KEY=${SONARR_API_KEY_ANIME} 68 | - RADARR_HOST=${RADARR_HOST_ANIME} 69 | - RADARR_API_KEY=${RADARR_API_KEY_ANIME} 70 | volumes: 71 | - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} 72 | - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} 73 | - ${SONARR_ROOT_FOLDER_ANIME}:${SONARR_ROOT_FOLDER_ANIME} 74 | - ${RADARR_ROOT_FOLDER_ANIME}:${RADARR_ROOT_FOLDER_ANIME} 75 | depends_on: 76 | rclone: 77 | condition: service_started 78 | sonarranime: 79 | condition: service_healthy 80 | radarranime: 81 | condition: service_healthy 82 | profiles: 83 | - debrid_media_server 84 | - all 85 | -------------------------------------------------------------------------------- /apps/yamtrack/.env: -------------------------------------------------------------------------------- 1 | # ███████████████████████████████████████████████████████████████████████████ 2 | # █▌ ▐█ 3 | # █▌ ██╗ ██╗ █████╗ ███╗ ███╗████████╗██████╗ █████╗ ██████╗██╗ ██╗ ▐█ 4 | # █▌ ╚██╗ ██╔╝██╔══██╗████╗ ████║╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██║ ██╔╝ ▐█ 5 | # █▌ ╚████╔╝ ███████║██╔████╔██║ ██║ ██████╔╝███████║██║ █████╔╝ ▐█ 6 | # █▌ ╚██╔╝ ██╔══██║██║╚██╔╝██║ ██║ ██╔══██╗██╔══██║██║ ██╔═██╗ ▐█ 7 | # █▌ ██║ ██║ ██║██║ ╚═╝ ██║ ██║ ██║ ██║██║ ██║╚██████╗██║ ██╗ ▐█ 8 | # █▌ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ▐█ 9 | # █▌ ▐█ 10 | # ███████████████████████████████████████████████████████████████████████████ 11 | 12 | # This file is used to configure Yamtrack. 13 | 14 | # ========================== 15 | # Application Settings 16 | # ========================== 17 | URLS=https://${YAMTRACK_HOSTNAME} 18 | # Whether to enable or disable registration. If you don't want to allow registration, set this to False. 19 | REGISTRATION=True 20 | 21 | 22 | # ========================== 23 | # Database Settings 24 | # ========================== 25 | # The redis URL for Yamtrack, do not change this. 26 | REDIS_URL=redis://yamtrack_redis:6379 27 | # A cryptographic key, generate one using the command below 28 | # echo "$(openssl rand -base64 64 | tr -d '=/' | tr -d '\n')" 29 | SECRET= 30 | 31 | # ========================== 32 | # Media Sources 33 | # ========================== 34 | # Configuration for the media sources that Yamtrack uses 35 | 36 | # ------------------- 37 | # TMDB 38 | # ------------------- 39 | # Settings for https://www.themoviedb.org/ 40 | # Used for movies, TV shows, and anime 41 | # 42 | # TMDB API Key, can be obtained at https://www.themoviedb.org/settings/api 43 | TMDB_API= 44 | # Whether to enable adult content. 45 | TMDB_NSFW=False 46 | # The language to use for TMDB. Provide a ISO 639-1 language code (e.g. en, fr, de), 47 | # optionally followed by a specific ISO-3166-1 country code (e.g. US, GB, FR) 48 | # e.g en or en-US 49 | # ISO 639-1: https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes (Set 1 Column) 50 | # ISO-3166-1: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes (A-2 Column) 51 | TMDB_LANGUAGE=en-US 52 | 53 | 54 | # ------------------- 55 | # MyAnimeList 56 | # ------------------- 57 | # Settings for https://myanimelist.net/ 58 | # Used for anime and manga 59 | # 60 | # The Client ID to use for MAL. A default one is provided and can be used without issues. 61 | # However, you can create your own application at https://myanimelist.net/apiconfig/create 62 | # Use the 'Other' application type and the redirect URL can be set to anything e.g https://github.com/FuzzyGrim/Yamtrack 63 | # MAL_API= 64 | # Whether to enable adult content on MAL. 65 | MAL_NSFW=False 66 | 67 | 68 | # ------------------- 69 | # MangaUpdates 70 | # ------------------- 71 | # Settings for https://www.mangaupdates.com/ 72 | # Used for manga. 73 | # 74 | # Whether to enable adult content on MangaUpdates. 75 | MU_NSFW=False 76 | 77 | 78 | # ------------------- 79 | # IGDB 80 | # ------------------- 81 | # Settings for https://www.igdb.com/ 82 | # Used for games. 83 | # 84 | # The Client ID and secret to use for IGDB. A default one is provided, but it is recommended to create your own application as it has lower rate limits. 85 | # You will need a Twitch account, follow the steps at https://api-docs.igdb.com/#account-creation 86 | # to get a Twitch Application client ID and secret. 87 | # IGDB_ID= 88 | # IGDB_SECRET= 89 | # Whether to enable adult content on IGDB. 90 | IGDB_NSFW=False 91 | 92 | # ========================= 93 | # MEDIA IMPORTING 94 | # ========================= 95 | # These settings allow you to control the applications used to import media into Yamtrack from other sources. 96 | 97 | # ------------------- 98 | # Trakt 99 | # ------------------- 100 | 101 | # The Trakt Client ID. A default one is provided. 102 | # However, you can create your own application at https://trakt.tv/oauth/applications/new 103 | # The redirect URL can be set to anything e.g https://github.com/FuzzyGrim/Yamtrack 104 | # TRAKT_ID= 105 | 106 | # -------------------- 107 | # Simkl 108 | # -------------------- 109 | 110 | # The Simkl Client ID. A default one is provided. 111 | # However, you can create your own application at https://simkl.com/settings/developer/new/custom-search/ 112 | # SIMKL_ID= 113 | # SIMKL_SECRET= 114 | 115 | # ========================= 116 | # GENERAL SETTINGS 117 | # ========================= 118 | # These settings are defined in the main .env file. 119 | TZ=${TZ} 120 | PUID=${PUID} 121 | PGID=${PGID} -------------------------------------------------------------------------------- /apps/yamtrack/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | yamtrack: 3 | image: ghcr.io/fuzzygrim/yamtrack 4 | container_name: yamtrack 5 | restart: unless-stopped 6 | expose: 7 | - 8000 8 | env_file: 9 | - .env 10 | labels: 11 | - "traefik.enable=true" 12 | - "traefik.http.routers.yamtrack.rule=Host(`${YAMTRACK_HOSTNAME?}`)" 13 | - "traefik.http.routers.yamtrack.entrypoints=websecure" 14 | - "traefik.http.routers.yamtrack.tls.certresolver=letsencrypt" 15 | - "traefik.http.routers.yamtrack.middlewares=authelia@docker" 16 | volumes: 17 | - ${DOCKER_DATA_DIR}/yamtrack/db:/yamtrack/db 18 | depends_on: 19 | - yamtrack_redis 20 | profiles: 21 | - yamtrack 22 | - all 23 | 24 | 25 | yamtrack_redis: 26 | image: redis:7-alpine 27 | container_name: yamtrack-redis 28 | restart: unless-stopped 29 | healthcheck: 30 | test: ["CMD", "redis-cli", "ping"] 31 | interval: 10s 32 | timeout: 5s 33 | retries: 5 34 | volumes: 35 | - ${DOCKER_DATA_DIR}/yamtrack/cache:/data 36 | profiles: 37 | - yamtrack 38 | - all 39 | 40 | 41 | -------------------------------------------------------------------------------- /apps/zilean/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | zilean: 3 | image: ipromknight/zilean:latest 4 | restart: unless-stopped 5 | container_name: zilean 6 | tty: true 7 | expose: 8 | - 8181 9 | environment: 10 | Zilean__EnableDashboard: true 11 | Zilean__Database__ConnectionString: Host=zilean_postgres;Database=zilean;Username=zilean;Password=postgres;Include Error Detail=true;Timeout=30;CommandTimeout=3600 12 | Zilean__Imdb__UseAllCores: true 13 | Zilean__Imdb__UseLucene: true 14 | Zilean__Parsing__BatchSize: 100000 15 | Zilean__Dmm_ScrapeSchedule: 32 * * * * 16 | labels: 17 | - "traefik.enable=true" 18 | - "traefik.http.routers.zilean.rule=Host(`${ZILEAN_HOSTNAME?}`)" 19 | - "traefik.http.routers.zilean.entrypoints=websecure" 20 | - "traefik.http.routers.zilean.tls.certresolver=letsencrypt" 21 | - "traefik.http.routers.zilean.middlewares=authelia@docker" 22 | - "traefik.http.services.zilean.loadbalancer.server.port=8181" 23 | volumes: 24 | - ${DOCKER_DATA_DIR}/zilean/tmp:/tmp 25 | depends_on: 26 | zilean_postgres: 27 | condition: service_healthy 28 | healthcheck: 29 | test: curl --connect-timeout 10 --silent --show-error --fail http://localhost:8181/healthchecks/ping 30 | timeout: 60s 31 | interval: 30s 32 | retries: 10 33 | profiles: 34 | - zilean 35 | - stremio 36 | - debrid_media_server 37 | - all 38 | 39 | zilean_postgres: 40 | image: postgres:17.2-alpine 41 | container_name: zilean_postgres 42 | restart: unless-stopped 43 | shm_size: 2G 44 | environment: 45 | PGDATA: /var/lib/postgresql/data/pgdata 46 | POSTGRES_USER: zilean 47 | POSTGRES_PASSWORD: postgres 48 | POSTGRES_DB: zilean 49 | volumes: 50 | - ${DOCKER_DATA_DIR}/zilean/db:/var/lib/postgresql/data/pgdata 51 | healthcheck: 52 | test: [ "CMD-SHELL", "pg_isready -U zilean -d zilean" ] 53 | interval: 30s 54 | timeout: 5s 55 | retries: 5 56 | profiles: 57 | - zilean 58 | - stremio 59 | - debrid_media_server 60 | - all 61 | -------------------------------------------------------------------------------- /apps/zipline/.env: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------- 2 | # ZIPLINE 3 | # --------------------------------------------------------- 4 | # Profiles: zipline, all 5 | # 6 | # Zipline is a ShareX / File upload server 7 | # 8 | # To generate the CORE_SECRET, run the following command: 9 | # openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n'; echo 10 | # 11 | # Once you fill these values in and start the container, head to the dashboard and create an admin user 12 | # Most of the configuration for Zipline is done through the web interface. 13 | # 14 | # Within the server settings 15 | # Set the 'Default domain' under 'Core' to the value you set for ZIPLINE_HOSTNAME in the root .env which is zipline.${DOMAIN} by default 16 | # Also enable Return HTTPS URLs 17 | ZIPLINE_CORE_SECRET= -------------------------------------------------------------------------------- /apps/zipline/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | zipline: 3 | image: ghcr.io/diced/zipline:v4 4 | container_name: zipline 5 | restart: unless-stopped 6 | user: $PUID:$PGID 7 | expose: 8 | - 3000 9 | environment: 10 | - DATABASE_URL=postgres://zipline:postgres@zipline_postgres:5432/zipline 11 | - CORE_SECRET=${ZIPLINE_CORE_SECRET?} 12 | depends_on: 13 | zipline_postgres: 14 | condition: service_healthy 15 | volumes: 16 | - '${DOCKER_DATA_DIR}/zipline/uploads:/zipline/uploads' 17 | - '${DOCKER_DATA_DIR}/zipline/public:/zipline/public' 18 | - '${DOCKER_DATA_DIR}/zipline/themes:/zipline/themes' 19 | labels: 20 | - "traefik.enable=true" 21 | - "traefik.http.routers.zipline.rule=Host(`${ZIPLINE_HOSTNAME?}`)" 22 | - "traefik.http.routers.zipline.entrypoints=websecure" 23 | - "traefik.http.routers.zipline.tls.certresolver=letsencrypt" 24 | profiles: 25 | - zipline 26 | - all 27 | 28 | zipline_postgres: 29 | image: postgres:16 30 | restart: unless-stopped 31 | container_name: zipline_postgres 32 | volumes: 33 | - ${DOCKER_DATA_DIR}/zipline/db:/var/lib/postgresql/data 34 | environment: 35 | POSTGRES_USER: zipline 36 | POSTGRES_PASSWORD: postgres 37 | POSTGRES_DB: zipline 38 | healthcheck: 39 | test: ["CMD-SHELL", "pg_isready -U zipline"] 40 | start_period: 1m 41 | profiles: 42 | - zipline 43 | - all 44 | -------------------------------------------------------------------------------- /apps/zurg/.env: -------------------------------------------------------------------------------- 1 | 2 | # Controls which Zurg version to use 3 | # If using the public zurg, leave these as is. 4 | ZURG_REPO=zurg-testing 5 | ZURG_VERSION=v0.9.3-final 6 | ZURG_CONFIG_VERSION=v0.9 7 | 8 | # If you are a sponsor, you can use the private zurg repo, along with a later version of the config. 9 | # ZURG_REPO=zurg 10 | # ZURG_VERSION=v0.10.0-rc.4-1 11 | # ZURG_CONFIG_VERSION=v0.10 12 | 13 | # If you would like nightly builds, you can use the latest tag. 14 | # Or a specific tag e.g. 2025.03.24.0030-nightly 15 | 16 | # To pull from a private repo, you can run the following command after creating a github token (classic) with the read:packages scope: 17 | # echo "${GITHUB_TOKEN}" | docker login ghcr.io -u "${GITHUB_USERNAME}" --password-stdin && docker pull ghcr.io/debridmediamanager/zurg:${ZURG_VERSION} 18 | # (replace ${GITHUB_TOKEN} and ${GITHUB_USERNAME} with your github token and username respectively, and ${ZURG_VERSION} with the version you want to pull) 19 | -------------------------------------------------------------------------------- /apps/zurg/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | zurg: 3 | image: ghcr.io/debridmediamanager/${ZURG_REPO:-zurg-testing}:${ZURG_VERSION:-v0.9.3-final} 4 | container_name: zurg 5 | restart: unless-stopped 6 | healthcheck: 7 | test: curl -f localhost:9999/dav/version.txt || exit 1 8 | volumes: 9 | - ${DOCKER_DATA_DIR}/zurg/config-${ZURG_CONFIG_VERSION:-v0.9}.yml:/app/config.yml 10 | - ${DOCKER_DATA_DIR}/zurg/data:/app/data 11 | - ${DOCKER_DATA_DIR}/zurg/logs:/app/logs 12 | labels: 13 | - "traefik.enable=true" 14 | - "traefik.http.routers.zurg.rule=Host(`${ZURG_HOSTNAME?}`)" 15 | - "traefik.http.routers.zurg.entrypoints=websecure" 16 | - "traefik.http.routers.zurg.tls.certresolver=letsencrypt" 17 | - "traefik.http.routers.zurg.middlewares=authelia@docker" 18 | profiles: 19 | - all 20 | - zurg 21 | - debrid_media_server 22 | 23 | rclone: 24 | image: rclone/rclone:latest 25 | container_name: rclone 26 | restart: unless-stopped 27 | environment: 28 | TZ: ${TZ:-UTC} 29 | PUID: ${PUID} 30 | PGID: ${PGID} 31 | volumes: 32 | - /mnt/remote/realdebrid:/data:rshared 33 | - ${DOCKER_DATA_DIR}/zurg/rclone.conf:/config/rclone/rclone.conf 34 | - /mnt:/mnt 35 | cap_add: 36 | - SYS_ADMIN 37 | security_opt: 38 | - apparmor:unconfined 39 | devices: 40 | - /dev/fuse:/dev/fuse:rwm 41 | depends_on: 42 | zurg: 43 | condition: service_healthy 44 | restart: true 45 | command: > 46 | mount zurg: /data 47 | --allow-non-empty 48 | --allow-other 49 | --uid=${PUID} 50 | --gid=${PGID} 51 | --umask=002 52 | --attr-timeout 10y 53 | --buffer-size 64M 54 | --dir-cache-time 120s 55 | --poll-interval 60s 56 | --vfs-cache-max-age 2M 57 | --vfs-cache-max-size 30G 58 | --vfs-cache-min-free-space 1G 59 | --vfs-cache-mode full 60 | --vfs-cache-poll-interval 30s 61 | --vfs-disk-space-total-size 32G 62 | --vfs-fast-fingerprint 63 | --vfs-read-ahead 64M 64 | --vfs-read-chunk-size 1M 65 | --vfs-read-chunk-size-limit 32M 66 | --vfs-read-wait 40ms 67 | --vfs-refresh 68 | --transfers 16 69 | --checkers 16 70 | --multi-thread-streams 8 71 | profiles: 72 | - all 73 | - zurg 74 | - debrid_media_server 75 | -------------------------------------------------------------------------------- /data/aiostremio/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "debrid_service": "torbox", 3 | "addon_config": { 4 | "torrentio": { 5 | "debrid_service": "", 6 | "debrid_api_key": "" 7 | }, 8 | "comet": { 9 | "base_url": "https://comet.elfhosted.com", 10 | "debrid_service": "", 11 | "debrid_api_key": "" 12 | }, 13 | "debridio": { 14 | "debrid_service": "easydebrid", 15 | "debrid_api_key": "" 16 | }, 17 | "peerflix": { 18 | "debrid_service": "", 19 | "debrid_api_key": "" 20 | } 21 | }, 22 | "addon_url": "https://aiostremio.yourdomain.com", 23 | "mediaflow_url": "http://mediaflow-proxy:8888", 24 | "external_mediaflow_url": "https://mediaflow.your-domain.com", 25 | "mediaflow_enabled": true, 26 | "cache_ttl_seconds": 604800, 27 | "buffer_size_mb": 256, 28 | "chunk_size_mb": 4 29 | } -------------------------------------------------------------------------------- /data/authelia/config/assets/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Viren070/docker-compose-template/e11f4d45c05935d1dcc144d2c4855e4e95412062/data/authelia/config/assets/empty -------------------------------------------------------------------------------- /data/authelia/config/certificates/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Viren070/docker-compose-template/e11f4d45c05935d1dcc144d2c4855e4e95412062/data/authelia/config/certificates/empty -------------------------------------------------------------------------------- /data/authelia/config/users.yml: -------------------------------------------------------------------------------- 1 | # yamllint disable rule:line-length 2 | --- 3 | ############################################################### 4 | # Users Database # 5 | ############################################################### 6 | 7 | # This file can be used if you do not have an LDAP set up. 8 | 9 | users: 10 | ## change this to the username you want to use 11 | user1: 12 | disabled: false 13 | ## change this to the display name you want to use 14 | displayname: "User" 15 | ## Generate the argon 2 password hash using the following command 16 | ## sudo docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password 'yourpassword' 17 | ## (currently the password is 'password') 18 | password: "$argon2id$v=19$m=65536,t=3,p=4$9WCjag9NY9e/8OYGnPV1rg$OtXfECdXxgY+nI0ELWyRlSGKYV0a5QeW+r6mL1nXmoo" 19 | email: authelia@authelia.com 20 | groups: 21 | - admins 22 | - dev 23 | ... 24 | # yamllint enable rule:line-length 25 | -------------------------------------------------------------------------------- /data/autosync/config.yml: -------------------------------------------------------------------------------- 1 | log_level: DEBUG 2 | sync_delay: 5s 3 | sync_interval: 2s 4 | webhook_events: 5 | sonarr: 6 | - Grab 7 | - Download 8 | - Rename 9 | - SeriesDelete 10 | - SeriesAdd 11 | - EpisodeFileDelete 12 | - Import 13 | radarr: 14 | - Grab 15 | - Download 16 | - Rename 17 | - MovieAdded 18 | - MovieDelete 19 | - MovieFileDelete 20 | - Import 21 | media_servers: 22 | - name: xenos 23 | type: jellyfin 24 | url: http://jellyfin:8096 25 | api_key: 26 | enabled: true 27 | - name: Xenos 28 | type: plex 29 | url: http://plex:32400 30 | enabled: true 31 | token: 32 | instances: 33 | - name: Sonarr 1080p 34 | type: sonarr 35 | url: http://sonarr:8989 36 | api_key: 37 | root_folder_path: /mnt/media/TV 38 | quality_profile_id: 7 39 | search_on_sync: true 40 | enabled_events: 41 | - SeriesAdd 42 | language_profile_id: 1 43 | season_folder: false 44 | - name: Sonarr 4K 45 | type: sonarr 46 | url: http://sonarr4k:8989 47 | api_key: 48 | root_folder_path: /mnt/media/TV - 4K 49 | quality_profile_id: 7 50 | search_on_sync: true 51 | enabled_events: 52 | - SeriesAdd 53 | language_profile_id: 1 54 | season_folder: false 55 | - name: Radarr 1080p 56 | type: radarr 57 | url: http://radarr:7878 58 | api_key: 59 | root_folder_path: /mnt/media/Movies 60 | quality_profile_id: 7 61 | search_on_sync: true 62 | enabled_events: 63 | - MovieAdded 64 | - name: Radarr 4K 65 | type: radarr 66 | url: http://radarr4k:7878 67 | api_key: 68 | root_folder_path: /mnt/media/Movies - 4K 69 | quality_profile_id: 7 70 | search_on_sync: true 71 | enabled_events: 72 | - MovieAdded 73 | -------------------------------------------------------------------------------- /data/easynews-plus-plus/custom-titles.json: -------------------------------------------------------------------------------- 1 | { 2 | "Walking Dead": ["The Walking Dead"], 3 | "Money Heist": ["Haus des Geldes", "La Casa de Papel"], 4 | "Mufasa: The Lion King": ["Mufasa: Der Koenig der Loewen"], 5 | "The Lion King": ["Der König der Löwen", "Der Koenig der Loewen"], 6 | "Avengers: Endgame": ["Avengers: Endspiel"], 7 | "Avengers: Infinity War": ["Avengers: Infinity Krieg"], 8 | "Star Wars": ["Krieg der Sterne"], 9 | "The Godfather": ["Der Pate"], 10 | "The Dark Knight": ["Der dunkle Ritter"], 11 | "Pulp Fiction": ["Pulp Fiction"], 12 | "Fight Club": ["Fight Club", "Kampfklub"], 13 | "Forrest Gump": ["Forrest Gump"], 14 | "Inception": ["Inception", "Anfang"], 15 | "The Matrix": ["Die Matrix", "Matrix"], 16 | "The Lord of the Rings": ["Der Herr der Ringe"], 17 | "The Shawshank Redemption": ["Die Verurteilten"], 18 | "Schindler's List": ["Schindlers Liste"], 19 | "Pirates of the Caribbean": ["Fluch der Karibik"], 20 | "The Hunger Games": ["Die Tribute von Panem"], 21 | "Fast and Furious": ["Fast & Furious", "The Fast and the Furious"], 22 | "The Avengers": ["Marvel's The Avengers", "Die Rächer"], 23 | "Finding Nemo": ["Findet Nemo"], 24 | "Inside Out": ["Alles steht Kopf"], 25 | "Frozen": ["Die Eiskönigin"], 26 | "Moana": ["Vaiana"], 27 | "Wreck-It Ralph": ["Ralph reichts"], 28 | "The Super Mario Bros. Movie": ["Der Super Mario Bros. Film"], 29 | "The Little Mermaid": ["Arielle, die Meerjungfrau"], 30 | "Fast X": ["Fast & Furious 10", "Fast X"], 31 | "Avatar: The Way of Water": ["Avatar: Der Weg des Wassers"], 32 | "House of the Dragon": ["House of the Dragon", "Haus des Drachen"], 33 | "The Mandalorian": ["The Mandalorian", "Der Mandalorianer"], 34 | "Wednesday": ["Wednesday", "Addams Family: Wednesday"], 35 | "Help! My House Is Haunted": ["Help My House Is Haunted"], 36 | "Rain or Shine": ["Just between Lovers"], 37 | "To the Left of the Father": ["Lavoura Arcaica"] 38 | } -------------------------------------------------------------------------------- /data/honey/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "ui": { 3 | "name": "Dashboard", 4 | "desc": "Nice and sweet place for all your self-hosted services.", 5 | "icon": "img/icon.png", 6 | "wallpaper": "img/background.jpg", 7 | "wallpaper_dark": "img/background-dark.jpg", 8 | "dark_mode": "Auto", 9 | "open_new_tab": true, 10 | "ping_dots": false, 11 | "blur": true, 12 | "animations": true, 13 | "trusted_domains": ["yourdomain.com"] 14 | }, 15 | "services": [ 16 | { 17 | "name": "dash.", 18 | "desc": "Personal dashboard.", 19 | "href": "https://dash.yourdomain.com", 20 | "icon": "https://getdashdot.com/img/logo512.png" 21 | }, 22 | { 23 | "name": "Dozzle", 24 | "desc": "Docker logs in the browser.", 25 | "href": "https://dozzle.yourdomain.com", 26 | "icon": "https://raw.githubusercontent.com/amir20/dozzle/19bb8659135e4232523d45ff8e948a0907b2701c/docs/public/logo.svg" 27 | }, 28 | { 29 | "name": "Uptime Kuma", 30 | "desc": "Self-hosted uptime monitor.", 31 | "href": "https://kuma.yourdomain.com", 32 | "icon": "https://raw.githubusercontent.com/louislam/uptime-kuma/refs/heads/master/public/favicon.ico" 33 | }, 34 | { 35 | "name": "Status Page", 36 | "desc": "Status page for all services.", 37 | "href": "https://status.yourdomain.com", 38 | "icon": "https://raw.githubusercontent.com/louislam/uptime-kuma/refs/heads/master/public/favicon.ico" 39 | }, 40 | { 41 | "name": "Jellyfin", 42 | "desc": "Media server", 43 | "href": "https://jellyfin.yourdomain.com", 44 | "icon": "https://raw.githubusercontent.com/jellyfin/jellyfin-ux/refs/heads/master/branding/tizen/icon.png" 45 | }, 46 | { 47 | "name": "JellySeer", 48 | "desc": "Jellyfin Media manager", 49 | "href": "https://jellyseer.yourdomain.com", 50 | "icon": "https://raw.githubusercontent.com/fallenbagel/jellyseerr/refs/heads/develop/public/android-chrome-512x512.png" 51 | }, 52 | { 53 | "name": "Plex", 54 | "desc": "Media server", 55 | "href": "https://plex.yourdomain.com", 56 | "icon": "https://global.synologydownload.com/download/Package/img/PlexMediaServer/1.40.4.8840-72008840/thumb_256.png" 57 | }, 58 | { 59 | "name": "Seanime", 60 | "desc": "Anime streaming service.", 61 | "href": "https://seanime.yourdomain.com", 62 | "icon": "https://raw.githubusercontent.com/5rahim/seanime/refs/heads/main/seanime-web/public/logo.png" 63 | }, 64 | { 65 | "name": "AIOStreams", 66 | "desc": "All-in-one streaming service.", 67 | "href": "https://aiostreams.yourdomain.com", 68 | "icon": "https://raw.githubusercontent.com/Viren070/AIOStreams/refs/heads/main/packages/frontend/public/assets/logo.png" 69 | }, 70 | { 71 | "name": "AIOStremio", 72 | "desc": "All-in-one streaming service.", 73 | "href": "https://aiostremio.yourdomain.com", 74 | "icon": "" 75 | }, 76 | { 77 | "name": "Comet", 78 | "desc": "Torrent streaming service.", 79 | "href": "https://comet.yourdomain.com", 80 | "icon": "https://i.imgur.com/jmVoVMu.jpeg" 81 | }, 82 | { 83 | "name": "MediaFusion", 84 | "desc": "Media manager.", 85 | "href": "https://mediafusion.yourdomain.com", 86 | "icon": "https://raw.githubusercontent.com/mhdzumair/MediaFusion/main/resources/images/mediafusion_logo.png" 87 | }, 88 | { 89 | "name": "Stremio-Jackett", 90 | "desc": "Stremio add-on for Jackett.", 91 | "href": "https://stremio-jackett.yourdomain.com", 92 | "icon": "https://raw.githubusercontent.com/Jackett/Jackett/refs/heads/master/src/Jackett.Common/Content/jacket_medium.png" 93 | }, 94 | { 95 | "name": "Jackettio", 96 | "desc": "Stremio add-on for Jackett.", 97 | "href": "https://jackettio.yourdomain.com", 98 | "icon": "https://raw.githubusercontent.com/Jackett/Jackett/refs/heads/master/src/Jackett.Common/Content/jacket_medium.png" 99 | }, 100 | { 101 | "name": "Easynews+", 102 | "desc": "Easynews add-on for Stremio.", 103 | "href": "https://easynews-plus.yourdomain.com", 104 | "icon": "https://pbs.twimg.com/profile_images/479627852757733376/8v9zH7Yo_400x400.jpeg" 105 | }, 106 | { 107 | "name": "TMDB Addon", 108 | "desc": "Stremio add-on for TMDB.", 109 | "href": "https://tmdb-addon.yourdomain.com", 110 | "icon": "https://raw.githubusercontent.com/mrcanelas/tmdb-addon/refs/heads/main/public/logo.png" 111 | }, 112 | { 113 | "name": "Stremio Catalog Providers", 114 | "desc": "Stremio add-on for catalog providers.", 115 | "href": "https://catalog-providers.yourdomain.com", 116 | "icon": "https://raw.githubusercontent.com/redd-ravenn/stremio-catalog-providers/refs/heads/main/public/assets/logo.png" 117 | }, 118 | { 119 | "name": "Stremio Trakt Addon", 120 | "desc": "Stremio add-on for Trakt.", 121 | "href": "https://trakt-addon.yourdomain.com", 122 | "icon": "https://raw.githubusercontent.com/redd-ravenn/stremio-catalog-providers/refs/heads/main/public/assets/logoTrakt.png" 123 | }, 124 | { 125 | "name": "MediaFlow", 126 | "desc": "Stremio add-on for torrents.", 127 | "href": "https://mediaflow.yourdomain.com", 128 | "icon": "https://mediaflow.yourdomain.com/logo.png" 129 | }, 130 | { 131 | "name": "StremThru", 132 | "desc": "Stremio add-on for torrents.", 133 | "href": "https://stremthru.yourdomain.com", 134 | "icon": "https://emojiapi.dev/api/v1/sparkles/256.png" 135 | }, 136 | { 137 | "name": "Stremio Addon Manager", 138 | "desc": "Stremio add-on for torrents.", 139 | "href": "https://addon-manager.yourdomain.com", 140 | "icon": "https://addon-manager.yourdomain.com/logo.png" 141 | }, 142 | { 143 | "name": "Stremio Server", 144 | "desc": "Stremio add-on for torrents.", 145 | "href": "https://stremio-server.yourdomain.com", 146 | "icon": "https://www.stremio.com/website/stremio-purple-small.png" 147 | }, 148 | { 149 | "name": "Prowlarr", 150 | "desc": "Indexer manager.", 151 | "href": "https://prowlarr.yourdomain.com", 152 | "icon": "https://raw.githubusercontent.com/Prowlarr/Prowlarr/refs/heads/develop/Logo/512.png" 153 | }, 154 | { 155 | "name": "Jackett", 156 | "desc": "Torrent indexer.", 157 | "href": "https://jackett.yourdomain.com", 158 | "icon": "https://raw.githubusercontent.com/Jackett/Jackett/refs/heads/master/src/Jackett.Common/Content/jacket_medium.png" 159 | }, 160 | { 161 | "name": "NZBHydra2", 162 | "desc": "Usenet indexer.", 163 | "href": "https://nzbhydra.yourdomain.com", 164 | "icon": "https://raw.githubusercontent.com/theotherp/nzbhydra2/refs/heads/master/core/ui-src/img/logo.png" 165 | }, 166 | { 167 | "name": "SearXNG", 168 | "desc": "Privacy-respecting search engine.", 169 | "href": "https://searxng.yourdomain.com", 170 | "icon": "https://raw.githubusercontent.com/searxng/searxng/refs/heads/master/searx/static/themes/simple/img/favicon.png" 171 | }, 172 | { 173 | "name": "Plausible", 174 | "desc": "Privacy-friendly analytics.", 175 | "href": "https://plausible.yourdomain.com", 176 | "icon": "https://raw.githubusercontent.com/plausible/docs/master/static/img/plausible-analytics-icon-top.png" 177 | }, 178 | { 179 | "name": "Vaultwarden", 180 | "desc": "Password Manager", 181 | "href": "https://vaultwarden.yourdomain.com", 182 | "icon": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/6edceb5f7acfee8ffe1ae2f07afd76dc588dda60/resources/vaultwarden-icon.svg" 183 | } 184 | 185 | ] 186 | } 187 | -------------------------------------------------------------------------------- /data/kometa/config.yml: -------------------------------------------------------------------------------- 1 | ## This file is a template remove the .template to use the file 2 | 3 | ## Plex and TMDb are the two connections which are required for the script to run 4 | plex: # Can be individually specified per library as well; REQUIRED for the script to run 5 | url: http://plex:32400 6 | token: 7 | timeout: 60 8 | db_cache: 40 9 | clean_bundles: false 10 | empty_trash: false 11 | optimize: false 12 | verify_ssl: true 13 | tmdb: 14 | apikey: 15 | cache_expiration: 60 16 | language: en 17 | region: 18 | 19 | ## At least one library has to be configured for the script to do anything meaningful 20 | libraries: # This is called out once within the config.yml file 21 | Movies: # These are names of libraries in your Plex 22 | remove_overlays: false # Set this to true to remove all overlays 23 | overlay_files: 24 | - file: config/overlays/media_info.yml 25 | - file: config/overlays/audience_rating.yml 26 | Series: 27 | remove_overlays: false # Set this to true to remove all overlays 28 | 29 | overlay_files: 30 | - file: config/overlays/media_info.yml 31 | template_variables: 32 | builder_level: episode 33 | - file: config/overlays/audience_rating.yml 34 | template_variables: 35 | builder_level: episode 36 | Movies (4K): # These are names of libraries in your Plex 37 | remove_overlays: false # Set this to true to remove all overlays 38 | overlay_files: 39 | - file: config/overlays/media_info.yml 40 | - file: config/overlays/audience_rating.yml 41 | Series (4K): 42 | remove_overlays: false # Set this to true to remove all overlays 43 | 44 | overlay_files: 45 | - file: config/overlays/media_info.yml 46 | template_variables: 47 | builder_level: episode 48 | - file: config/overlays/audience_rating.yml 49 | template_variables: 50 | builder_level: episode 51 | Anime: # These are names of libraries in your Plex 52 | remove_overlays: false # Set this to true to remove all overlays 53 | overlay_files: 54 | - file: config/overlays/media_info.yml 55 | template_variables: 56 | builder_level: episode 57 | - file: config/overlays/audience_rating.yml 58 | template_variables: 59 | builder_level: episode 60 | Anime (Movies): 61 | remove_overlays: false # Set this to true to remove all overlays 62 | 63 | overlay_files: 64 | - file: config/overlays/media_info.yml 65 | - file: config/overlays/audience_rating.yml 66 | 67 | settings: 68 | run_order: 69 | - operations 70 | - metadata 71 | - collections 72 | - overlays 73 | cache: true 74 | cache_expiration: 60 75 | asset_folders: true 76 | asset_depth: 0 77 | create_asset_folders: false 78 | prioritize_assets: false 79 | dimensional_asset_rename: false 80 | download_url_assets: false 81 | show_missing_season_assets: false 82 | show_missing_episode_assets: false 83 | show_asset_not_needed: true 84 | sync_mode: append 85 | minimum_items: 1 86 | default_collection_order: release 87 | delete_below_minimum: true 88 | delete_not_scheduled: false 89 | run_again_delay: 2 90 | missing_only_released: false 91 | only_filter_missing: false 92 | show_unmanaged: true 93 | show_unconfigured: true 94 | show_filtered: false 95 | show_unfiltered: false 96 | show_options: true 97 | show_missing: true 98 | show_missing_assets: true 99 | save_report: false 100 | tvdb_language: eng 101 | ignore_ids: 102 | ignore_imdb_ids: 103 | item_refresh_delay: 0 104 | playlist_sync_to_users: 105 | playlist_exclude_users: 106 | playlist_report: false 107 | verify_ssl: true 108 | custom_repo: 109 | overlay_artwork_filetype: webp_lossy 110 | overlay_artwork_quality: 90 111 | # webhooks: # Can be individually specified per library as well 112 | # changes: 113 | # delete: 114 | # error: 115 | # run_end: 116 | # run_start: 117 | # version: 118 | # tautulli: # Can be individually specified per library as well 119 | # url: http://192.168.1.12:8181 120 | # apikey: Enter Tautulli API Key 121 | # github: 122 | # token: Enter GitHub Personal Access Token 123 | # omdb: 124 | # apikey: Enter OMDb API Key 125 | # cache_expiration: 60 126 | # mdblist: 127 | # apikey: Enter MDBList API Key 128 | # cache_expiration: 60 129 | # notifiarr: 130 | # apikey: Enter Notifiarr API Key 131 | # gotify: 132 | # url: http://192.168.1.12:80 133 | # token: Enter Gotify Token 134 | # ntfy: 135 | # url: http://192.168.1.12:80 136 | # token: Enter ntfy Access Token 137 | # topic: Enter ntfy Topic 138 | # anidb: # Not required for AniDB builders unless you want mature content 139 | # username: Enter AniDB Username 140 | # password: Enter AniDB Password 141 | # cache_expiration: 60 142 | # client: Enter AniDB Client 143 | # language: en 144 | # version: 1 145 | # radarr: # Can be individually specified per library as well 146 | # url: http://192.168.1.12:7878 147 | # token: Enter Radarr API Key 148 | # add_missing: false 149 | # add_existing: false 150 | # upgrade_existing: false 151 | # monitor_existing: false 152 | # root_folder_path: "S:/Movies" 153 | # monitor: true 154 | # availability: announced 155 | # quality_profile: HD-1080p 156 | # tag: 157 | # search: false 158 | # radarr_path: 159 | # plex_path: 160 | # ignore_cache: false 161 | # sonarr: # Can be individually specified per library as well 162 | # url: http://192.168.1.12:8989 163 | # token: Enter Sonarr API Key 164 | # add_missing: false 165 | # add_existing: false 166 | # upgrade_existing: false 167 | # monitor_existing: false 168 | # root_folder_path: "S:/TV Shows" 169 | # monitor: all 170 | # quality_profile: HD-1080p 171 | # language_profile: English 172 | # series_type: standard 173 | # season_folder: true 174 | # tag: 175 | # search: false 176 | # cutoff_search: false 177 | # sonarr_path: 178 | # plex_path: 179 | # ignore_cache: false 180 | # trakt: 181 | # client_id: Enter Trakt Client ID 182 | # client_secret: Enter Trakt Client Secret 183 | # pin: 184 | # authorization: 185 | # # authorization section is autofilled by the script 186 | # access_token: 187 | # created_at: 188 | # expires_in: 189 | # refresh_token: 190 | # scope: public 191 | # token_type: 192 | # mal: 193 | # client_id: Enter MyAnimeList Client ID 194 | # client_secret: Enter MyAnimeList Client Secret 195 | # cache_expiration: 60 196 | # localhost_url: 197 | # authorization: 198 | # # authorization section is autofilled by the script 199 | # access_token: 200 | # expires_in: 201 | # refresh_token: 202 | # token_type: 203 | -------------------------------------------------------------------------------- /data/plausible/clickhouse/ip4-only.xml: -------------------------------------------------------------------------------- 1 | 2 | 0.0.0.0 3 | -------------------------------------------------------------------------------- /data/plausible/clickhouse/logs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | warning 4 | true 5 | 6 | 7 | 8 | system 9 | query_log
10 | 7500 11 | 12 | ENGINE = MergeTree 13 | PARTITION BY event_date 14 | ORDER BY (event_time) 15 | TTL event_date + interval 30 day 16 | SETTINGS ttl_only_drop_parts=1 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
-------------------------------------------------------------------------------- /data/plausible/clickhouse/low-resources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 524288000 6 | 7 | 8 | 9 | 10 | 1 11 | 12 | 8192 13 | 14 | 1 15 | 17 | 0 18 | 20 | 0 21 | 22 | 23 | -------------------------------------------------------------------------------- /data/prowlarr/Definitions/Custom/52btCustom.yml: -------------------------------------------------------------------------------- 1 | --- 2 | id: 52btCustom 3 | name: 52BTCustom 4 | description: "A Fixed Variant of 52BT; 52BT is a CHINESE Public tracker for TV / MOVIES / MUSIC / GENERAL" 5 | language: zh-CN 6 | type: public 7 | encoding: UTF-8 8 | requestDelay: 2 9 | links: 10 | # Old nonfunctional links were moved to legacy-links, new link replaced 11 | - https://www.529056.xyz/ 12 | legacylinks: 13 | - https://www.529053.xyz/ 14 | - https://www.529055.xyz/ 15 | - https://529050.xyz/ 16 | - https://529048.xyz/ 17 | - https://529049.xyz/ 18 | - https://www.529052.xyz/ 19 | 20 | caps: 21 | categorymappings: 22 | - {id: 影视, cat: TV, desc: 影视} 23 | - {id: 影视, cat: Movies, desc: 影视} 24 | - {id: 音乐, cat: Audio, desc: 音乐} 25 | - {id: 图像, cat: Other, desc: 图像} 26 | - {id: 文档书籍, cat: Books, desc: 文档书籍} 27 | - {id: 压缩文件, cat: Other, desc: 压缩文件} 28 | - {id: 安装包, cat: PC, desc: 安装包} 29 | - {id: 其他, cat: Other, desc: 其他} 30 | 31 | modes: 32 | search: [q] 33 | tv-search: [q, season, ep] 34 | movie-search: [q] 35 | music-search: [q] 36 | book-search: [q] 37 | 38 | settings: 39 | - name: cat-id 40 | type: select 41 | label: Category 42 | default: 0 43 | options: 44 | 0: All categories 45 | 1: Film and Television 46 | 2: Music 47 | 3: Images 48 | 4: Books 49 | 5: Zip Files 50 | 6: Software 51 | 7: Other 52 | - name: sort 53 | type: select 54 | label: Sort requested from site 55 | default: 2 56 | options: 57 | 2: created 58 | 1: size 59 | 0: relevance 60 | - name: info_flaresolverr 61 | type: info_flaresolverr 62 | 63 | search: 64 | paths: 65 | - path: "search-{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}-{{ .Config.cat-id }}-{{ .Config.sort }}-1.html" 66 | - path: "search-{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}-{{ .Config.cat-id }}-{{ .Config.sort }}-2.html" 67 | error: 68 | - selector: :root:contains("Internal Server Error") 69 | 70 | rows: 71 | selector: div.ssbox 72 | 73 | fields: 74 | categorydesc: 75 | selector: div.title > h3 > span 76 | filters: 77 | - name: re_replace 78 | args: ["([\\[\\]]+)", ""] 79 | title: 80 | selector: a[href^="/hash/"] 81 | details: 82 | selector: a[href^="/hash/"] 83 | attribute: href 84 | infohash: 85 | selector: a[href^="magnet:?xt="] 86 | attribute: href 87 | filters: 88 | - name: regexp 89 | args: ([A-F|a-f|0-9]{40}) 90 | date: 91 | selector: div.sbar > span:contains("添加时间:") > b 92 | filters: 93 | - name: append 94 | args: " +08:00" # CST 95 | - name: dateparse 96 | args: "yyyy-MM-dd zzz" 97 | size: 98 | selector: div.sbar > span:contains("大小:") > b 99 | seeders: 100 | text: 1 101 | leechers: 102 | text: 1 103 | downloadvolumefactor: 104 | text: 0 105 | uploadvolumefactor: 106 | text: 1 107 | # engine n/a 108 | -------------------------------------------------------------------------------- /data/prowlarr/Definitions/Custom/debridio.yml: -------------------------------------------------------------------------------- 1 | id: debridio 2 | name: Debridio 3 | description: "Debridio API for *arr apps. This will not work with Stremio addons but will work for Jellyfin, Plex, and other similar apps." 4 | language: en-US 5 | type: private 6 | encoding: UTF-8 7 | followredirect: false 8 | testlinktorrent: false 9 | requestDelay: 2 10 | links: 11 | - https://debapi.debridio.com/ 12 | 13 | caps: 14 | categories: 15 | Movies: Movies 16 | TV: TV 17 | 18 | modes: 19 | search: [q] 20 | movie-search: [q, imdbid] 21 | tv-search: [q, imdbid] 22 | allowrawsearch: false 23 | settings: 24 | - name: api_token 25 | type: password 26 | label: Debridio.com API Key 27 | default: "" 28 | - name: default_movie_query 29 | label: "Default Movie Imdb Query" 30 | type: text 31 | default: "tt0137523" 32 | - name: default_tv_query 33 | type: text 34 | label: "Default TV Imdb Query" 35 | default: "tt18482892" 36 | 37 | 38 | search: 39 | paths: 40 | - path: /{{ .Config.api_token }}/search/{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Config.default_movie_query }}{{ end }} 41 | method: get 42 | response: 43 | type: json 44 | categories: [Movies] 45 | 46 | - path: /{{ .Config.api_token }}/search/{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Config.default_movie_query }}{{ end }} 47 | method: get 48 | response: 49 | type: json 50 | categories: [TV] 51 | 52 | rows: 53 | selector: "$" 54 | 55 | fields: 56 | title: 57 | selector: name 58 | infohash: 59 | selector: hash 60 | size: 61 | selector: size 62 | seeders: 63 | selector: seeders 64 | leechers: 65 | text: "0" 66 | category_is_tv_show: 67 | text: "{{ .Result.title }}" 68 | filters: 69 | - name: regexp 70 | args: "\\b(S\\d+(?:E\\d+)?)\\b" 71 | category: 72 | text: "{{ if .Result.category_is_tv_show }}TV{{ else }}Movies{{ end }}" 73 | indexer: 74 | selector: indexer -------------------------------------------------------------------------------- /data/prowlarr/Definitions/Custom/torbox.yml: -------------------------------------------------------------------------------- 1 | --- 2 | id: torbox-torrents 3 | name: TorBox Torrents 4 | description: "Torbox Torrents (300 requests/min)" 5 | language: en-US 6 | type: public 7 | encoding: UTF-8 8 | followredirect: false 9 | testlinktorrent: false 10 | requestDelay: 2 11 | links: 12 | - https://search-api.torbox.app 13 | caps: 14 | categories: 15 | Movies: Movies 16 | TV: TV 17 | modes: 18 | search: [q] 19 | tv-search: [q, imdbid, season, ep] 20 | movie-search: [q, imdbid] 21 | allowrawsearch: false 22 | 23 | settings: 24 | - name: apikey 25 | type: password 26 | label: Torbox API Key 27 | default: "" 28 | - name: validation_label 29 | type: info 30 | label: Validation settings optional 31 | - name: validate_imdb_movie_label 32 | type: info 33 | label: The following help to validate an indexer in Sonarr by confirming that the show returns results 34 | - name: validate_imdb_movie 35 | type: text 36 | label: IMDB ID of Movie to use for Radarr validation (must exist in indexer) 37 | default: "tt0137523" # Fight Club 38 | - name: validate_imdb_tv_label 39 | type: info 40 | label: The following help to validate an indexer in Sonarr by confirming that the show returns results 41 | - name: validate_imdb_tv 42 | type: text 43 | label: IMDB ID TV show to use for Sonarr validation (must exist in indexer) 44 | default: "tt9288030" # Reacher S02E01 45 | 46 | search: 47 | headers: 48 | Authorization: ["Bearer {{ .Config.apikey }}"] 49 | User-Agent: 50 | [ 51 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0", 52 | ] 53 | paths: 54 | - path: "{{ if .Query.IMDBID }}torrents/imdb:{{ .Query.IMDBID }}{{ else }}torrents/imdb:{{ .Config.validate_imdb_movie }}{{ end }}" 55 | method: get 56 | response: 57 | type: json 58 | noResultsMessage: "Could not find metadata. Please try again later." 59 | categories: [Movies] 60 | - path: "{{ if .Query.IMDBID }}torrents/imdb:{{ .Query.IMDBID }}{{else}}torrents/imdb:{{ .Config.validate_imdb_tv }}{{ end }}?season={{ if .Query.Season }}{{ .Query.Season }}{{ else }}1{{ end }}&episode={{ if .Query.Ep }}{{ .Query.Ep }}{{ else }}1{{ end }}" 61 | method: get 62 | response: 63 | type: json 64 | noResultsMessage: "Could not find metadata. Please try again later." 65 | categories: [TV] 66 | 67 | rows: 68 | selector: data.torrents 69 | count: 70 | selector: data.total_torrents 71 | 72 | fields: 73 | title: 74 | selector: raw_title 75 | size: 76 | selector: size 77 | category_is_tv_show: 78 | text: "{{ .Result.title }}" 79 | filters: 80 | - name: regexp 81 | args: "\\b(S\\d+(?:E\\d+)?)\\b" 82 | category: 83 | text: "{{ if .Result.category_is_tv_show }}TV{{ else }}Movies{{ end }}" 84 | details: 85 | text: "{{ .Config.sitelink }}" 86 | magnet: 87 | selector: magnet 88 | year: 89 | selector: title 90 | filters: 91 | - name: regexp 92 | args: "(\\b(19|20)\\d\\d\\b)" 93 | date_in_days: 94 | selector: age 95 | date: 96 | text: "{{ .Result.date_in_days }} days" 97 | filters: 98 | - name: timeago 99 | seeders: 100 | selector: last_known_seeders -------------------------------------------------------------------------------- /data/prowlarr/Definitions/Custom/zilean.yml: -------------------------------------------------------------------------------- 1 | id: zilean 2 | name: Zilean 3 | description: "A custom indexer for Zilean the unofficial DMM indexer using it's Torznab Endpoint" 4 | language: en-US 5 | type: public 6 | encoding: UTF-8 7 | followredirect: false 8 | testlinktorrent: false 9 | requestDelay: 2 10 | links: 11 | # Torznab Endpoint is used for better performance 12 | - http://zilean:8181 13 | - https://zilean.elfhosted.com 14 | 15 | caps: 16 | categories: 17 | Movies: Movies 18 | TV: TV 19 | modes: 20 | search: [q] 21 | movie-search: [q, imdbid] 22 | tv-search: [q, season, ep] 23 | allowrawsearch: false 24 | 25 | settings: [] 26 | 27 | search: 28 | paths: 29 | - path: /dmm/filtered 30 | method: get 31 | response: 32 | type: json 33 | 34 | inputs: 35 | $raw: "{{ if .Query.IMDBID }}ImdbId={{ .Query.IMDBID }}{{ else }}Query={{ .Keywords }}{{ end }}" 36 | Season: "{{ if .Query.Season }}{{ .Query.Season }}{{ else }}{{ end }}" 37 | Episode: "{{ if .Query.Ep }}{{ .Query.Ep }}{{ else }}{{ end }}" 38 | 39 | keywordsfilters: 40 | - name: re_replace 41 | args: ["\\bS\\d+(?:E\\d+)?\\b", ""] # Remove season and episode info 42 | - name: re_replace 43 | args: ["\\b(19|20)\\d{2}\\b", ""] # Remove year info 44 | - name: re_replace 45 | args: ["[\\[\\]()]", ""] # Remove brackets 46 | - name: re_replace 47 | args: ["^$", "limitless"] 48 | 49 | rows: 50 | selector: $ 51 | missingAttributeEqualsNoResults: true 52 | 53 | fields: 54 | title: 55 | selector: raw_title 56 | year: 57 | selector: year 58 | category: 59 | selector: category 60 | filters: 61 | - name: replace 62 | args: ["tvSeries", "TV"] 63 | - name: replace 64 | args: ["movie", "Movies"] 65 | infohash: 66 | selector: info_hash 67 | size: 68 | selector: size 69 | quality: 70 | selector: resolution 71 | filters: 72 | - name: replace 73 | args: ["4k", "2160p"] 74 | codec: 75 | selector: codec 76 | episode: 77 | selector: episodes 78 | season: 79 | selector: seasons 80 | language: 81 | selector: languages 82 | seeders: 83 | text: "30" 84 | leechers: 85 | text: "10" 86 | date: 87 | text: "Apr. 18th '11" 88 | filters: 89 | - name: re_replace 90 | args: ["st|nd|rd|th", ""] 91 | - name: replace 92 | args: ["'", ""] 93 | - name: dateparse 94 | args: "MMM. d yy" 95 | downloadvolumefactor: 96 | text: "1" 97 | uploadvolumefactor: 98 | text: "1" -------------------------------------------------------------------------------- /data/recyclarr/secrets.yml: -------------------------------------------------------------------------------- 1 | radarr_1080_base_url: http://radarr:7878 2 | radarr_1080_api_key: 3 | 4 | radarr_4k_base_url: http://radarr4k:7878 5 | radarr_4k_api_key: 6 | 7 | radarr_anime_base_url: http://radarranime:7878 8 | radarr_anime_api_key: 9 | 10 | sonarr_1080_base_url: http://sonarr:8989 11 | sonarr_1080_api_key: 12 | 13 | sonarr_4k_base_url: http://sonarr4k:8989 14 | sonarr_4k_api_key: 15 | 16 | sonarr_anime_base_url: http://sonarranime:8989 17 | sonarr_anime_api_key: -------------------------------------------------------------------------------- /data/tweakio/config.yaml: -------------------------------------------------------------------------------- 1 | torrentio: 2 | base_url: https://torrentio.strem.fun/ 3 | options: "providers=yts,eztv,rarbg,1337x,thepiratebay,kickasstorrents,torrentgalaxy,magnetdl,horriblesubs,nyaasi,tokyotosho,anidex|sort=qualitysize|qualityfilter=scr,cam" 4 | 5 | tmdb: 6 | api_key: "" # If empty, defaults to 10 episodes for everything 7 | cache_size: 1000 -------------------------------------------------------------------------------- /data/wests-scripts/shared/tokens.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /data/zurg/config-v0.10.yml: -------------------------------------------------------------------------------- 1 | # =================================== # 2 | # ███████╗██╗ ██╗██████╗ ██████╗ # 3 | # ╚══███╔╝██║ ██║██╔══██╗██╔════╝ # 4 | # ███╔╝ ██║ ██║██████╔╝██║ ███╗ # 5 | # ███╔╝ ██║ ██║██╔══██╗██║ ██║ # 6 | # ███████╗╚██████╔╝██║ ██║╚██████╔╝ # 7 | # ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ # 8 | # =================================== # 9 | 10 | # ============================================================================== 11 | # BASIC CONFIGURATION 12 | # ============================================================================== 13 | # Zurg configuration version 14 | zurg: v1 15 | 16 | # Your Real-Debrid API token 17 | # Get it from https://real-debrid.com/apitoken 18 | token: 19 | 20 | # If you have other Real-Debrid tokens, you can uncomment the lines below and add them here 21 | # download_tokens: 22 | # - MY_TOKEN_2 23 | # - MY_TOKEN_3 24 | # ============================================================================== 25 | # CORE SETTINGS 26 | # ============================================================================== 27 | 28 | host: "[::]" 29 | port: 9999 30 | # proxy: "http://warp:1080" 31 | force_ipv6: false 32 | number_of_hosts: 3 33 | 34 | # ============================================================================== 35 | # PERFORMANCE AND RATE LIMITS 36 | # ============================================================================== 37 | 38 | concurrent_workers: 32 39 | api_rate_limit_per_minute: 60 40 | torrents_rate_limit_per_minute: 25 41 | api_timeout_secs: 15 42 | download_timeout_secs: 10 43 | retries_until_failed: 2 44 | retry_503_errors: false 45 | fetch_torrents_page_size: 1000 46 | 47 | # ============================================================================== 48 | # FILE MANAGEMENT 49 | # ============================================================================== 50 | 51 | # Enable automatic torrent repair 52 | enable_repair: true 53 | 54 | # Action for RAR files: extract, delete, or none (default: "none") 55 | rar_action: none 56 | 57 | # Additional file extensions to consider as playable 58 | # addl_playable_extensions: 59 | # - m3u 60 | # - jpg 61 | 62 | # If a torrent contains any file with these extensions, delete the torrent 63 | # delete_torrent_if_extensions_found: 64 | # - zipx 65 | # - rar 66 | 67 | # Even when files are not selected in the torrent, if the file is playable (video or addl_playable_extensions), it will be selected 68 | force_select_playable_files: false 69 | 70 | # Retain the torrent name extension which is used for directory names (useful for single file torrents) 71 | retain_folder_name_extension: true 72 | 73 | # Retain the name value of a torrent from real-debrid (if false, will use original_name instead) 74 | retain_rd_torrent_name: true 75 | 76 | # Delete torrents that have encountered an error 77 | delete_error_torrents: false 78 | 79 | # Hide torrents that are broken (unplayable) 80 | hide_broken_torrents: false 81 | 82 | # Will ignore rename values in the torrent 83 | ignore_renames: true 84 | 85 | # Whether to safe .STRM files 86 | save_strm_files: false 87 | 88 | # ============================================================================== 89 | # SCHEDULING AND UPDATES 90 | # ============================================================================== 91 | 92 | # How often to check for changes in the library (default: 15 seconds) 93 | check_for_changes_every_secs: 20 94 | 95 | # How often to check for broken torrents and repair them (default: 60 minutes) 96 | repair_every_mins: 60 97 | 98 | # How often to check for new downloads (unrestricted links, file locker links) (default: 720 minutes) 99 | downloads_every_mins: 720 100 | 101 | # How often to dump your library torrents to the dump folder for backup (default: 1440 minutes) 102 | dump_torrents_every_mins: 1440 103 | 104 | # Command to run when the library is updated (useful for plex refresh) 105 | # on_library_update: "sh plex_update.sh \"$@\"" 106 | 107 | 108 | 109 | # ============================================================================== 110 | # MEDIA ANALYSIS 111 | # ============================================================================== 112 | 113 | 114 | auto_analyze_new_torrents: false 115 | cache_network_test_results: true 116 | 117 | 118 | # ============================================================================== 119 | # ADVANCED SETTINGS 120 | # ============================================================================== 121 | 122 | disable_stream_proxy: false 123 | -------------------------------------------------------------------------------- /data/zurg/config-v0.9.yml: -------------------------------------------------------------------------------- 1 | # =================================== # 2 | # ███████╗██╗ ██╗██████╗ ██████╗ # 3 | # ╚══███╔╝██║ ██║██╔══██╗██╔════╝ # 4 | # ███╔╝ ██║ ██║██████╔╝██║ ███╗ # 5 | # ███╔╝ ██║ ██║██╔══██╗██║ ██║ # 6 | # ███████╗╚██████╔╝██║ ██║╚██████╔╝ # 7 | # ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ # 8 | # =================================== # 9 | 10 | 11 | # Zurg configuration version 12 | zurg: v1 13 | 14 | # Provide your Real-Debrid API token 15 | token: YOUR_RD_API_TOKEN # https://real-debrid.com/apitoken 16 | 17 | # Host and port settings 18 | host: "[::]" 19 | port: 9999 20 | 21 | concurrent_workers: 32 22 | 23 | # Checking for changes in Real-Debrid API more frequently (every 60 seconds) 24 | check_for_changes_every_secs: 15 25 | 26 | # File handling and renaming settings 27 | retain_rd_torrent_name: true 28 | retain_folder_name_extension: true 29 | expose_full_path: true 30 | 31 | # Torrent management settings 32 | enable_repair: true 33 | auto_delete_rar_torrents: false 34 | 35 | # Streaming and download link verification settings 36 | serve_from_rclone: false 37 | verify_download_link: false 38 | 39 | # Network and API settings 40 | force_ipv6: false -------------------------------------------------------------------------------- /data/zurg/rclone.conf: -------------------------------------------------------------------------------- 1 | [zurg] 2 | type = webdav 3 | url = http://zurg:9999/dav 4 | vendor = other 5 | pacer_min_sleep = 0 6 | --------------------------------------------------------------------------------