diff --git a/.env b/.env deleted file mode 100644 index 28bcfe6..0000000 --- a/.env +++ /dev/null @@ -1,794 +0,0 @@ -# This file is used to store all the environment variables that are used in the compose.yaml file. -# This file should be in the same directory as the compose.yaml file. - -# Your HOSTNAME values should be the domain name that you are using to access the services. -# e.g. AIOSTREAMS_HOSTNAME=aiostreams.example.com -# - -# ========================================================= -# PROFILE CONFIGURATION -# ========================================================= -# -# As this compose.yaml is split up into profiles, you can choose which services you want to run by using profiles. -# If you only run -# docker compose up -d -# it will only start the default profile. -# -# If you only want to use the default profile, you can leave the COMPOSE_PROFILES variable empty. -# This will only include some basic services used for monitoring and managing the other services and server management. -# This is useful if you aren't interested in any of the additional services I have included in this template. -# -# If you want to make use of the additional profiles, you can do one of the following: -# -# You should set the profiles that you want to use by setting the COMPOSE_PROFILES variable below using a space separated list. -# e.g. COMPOSE_PROFILES="stremio seanime" -# -# You can also use the --profile flag to specify which profile you want to use when running the compose file, but this will need to be specified -# each time, even when you want to down the containers. -# -# Note: For the profiles you are using, it is REQUIRED for you to fill in every environment variable that is needed by that profile. -# You can edit the compose.yaml to remove a service from a profile by just removing the profile from the profiles list for that service -# e.g. profiles: ["stremio", "all"] -> profiles: ["all"] -# Now, when you use the --profile flag with stremio, that service will not be started. -# If you remove the profiles list altogether, the service will always be started, regardless of the profile(s) you use. -# -# Find a list of the available profiles and the services they include at: https://guides.viren070.me/selfhosting/template -# You can also look at the compose.yaml file to see which services are included in each profile. -COMPOSE_PROFILES= - - -# ========================================================= -# DEFAULT PROFILE (REQUIRED) -# ========================================================= -# This profile is used to set the environment variables for the services in the default profile. -# It includes things like, traefik, dozzle, watchtower, uptime kuma - - -# --------------------------------------------------------- -# TRAEFIK -# --------------------------------------------------------- -# Traefik is a reverse proxy that is used to route traffic to the correct services. -# This is the most important service, as it is the entry point for all the other services. -# -# I will once again remind you to ensure that you set up DNS records for all the domain names that you are using. -# You can also use a wildcard DNS record to route all subdomains to your server. -# -# Also make sure that both port 80 and 443 are open on your server. -# --------------------------------------------------------- -# This is the email that will be used to register with Let's Encrypt for SSL certificates. -# This is what allows you to access the services over HTTPS, which is required for Stremio Addons. -LETSENCRYPT_EMAIL= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# DOZZLE -# --------------------------------------------------------- -# Dozzle is a log viewer for Docker. It is used to view the logs of the containers. -# This will be helpful for debugging purposes. -# You will be able to access the logs at https://${DOZZLE_HOSTNAME} -# -# The DOZZLE_HASHED_PASSWORD must be a bcrypt hash of the password you want to use. -# You can generate a bcrypt hash by running the following command in your terminal, replacing with your desired password. -# (removing the < and > as well): -# -# htpasswd -niBb user | cut -d ":" -f 2 | sed 's/\$/\$\$/g' -# -# If you get an error about htpasswd not being found, you can install apache2-utils, use this command. -# sudo apt-get install apache2-utils -# -# Then, rerun the htpasswd command above. -# You would use the password before hashing when logging in to Dozzle. -# -# Note that this command will output the hash with any $ characters already escaped, so you can copy and paste it directly into the .env file. -# --------------------------------------------------------- -DOZZLE_USERNAME= -DOZZLE_HASHED_PASSWORD= -# e.g. dozzle.example.com -DOZZLE_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# WATCHTOWER -# --------------------------------------------------------- -# The AUTO_UPDATE_SCHEDULE is a cron expression that is used to schedule the auto update of the containers. -# It is different from a normal cron expression, as it has an additional field at the beginning for seconds. -# See https://pkg.go.dev/github.com/robfig/cron@v1.2.0#hdr-CRON_Expression_Format -# -# The AUTO_UPDATE_NOTIFICATION_URL is the URL that will be used to send notifications about the auto update. -# You can find more information about the available services at https://containrrr.dev/shoutrrr/v0.8/services/overview/ -# Make sure the format of the AUTO_UPDATE_NOTIFICATION_URL is correct. - -# e.g. For discord, the format is discord://token@id -# Discord webhook URLs are in the format https://discord.com/api/webhooks// -# So the URL would be discord://@ -# --------------------------------------------------------- -AUTO_UPDATE_SCHEDULE=0 0 */8 * * * # This will run the auto update every 8 hours -AUTO_UPDATE_NOTIFICATION_URL= - - -# --------------------------------------------------------- -# UPTIME KUMA -# --------------------------------------------------------- -# Uptime Kuma is a self-hosted monitoring tool that provides uptime monitoring for your services. -# You will be able to access the dashboard at https://${UPTIME_KUMA_HOSTNAME} -# -# I have configured uptime kuma with 2 domains, one for the main dashboard and one for the status page. -# If you set up a status page on uptime kuma, you can add the STATUS_PAGE_HOSTNAME as the domain name. -# This will allow you to directly access the status page at https://${STATUS_PAGE_HOSTNAME} -# rather than https://${UPTIME_KUMA_HOSTNAME}/status/ -# --------------------------------------------------------- -# e.g. kuma.example.com -UPTIME_KUMA_HOSTNAME= -# e.g. status.example.com (when creating a status page on kuma, you can add this hostname as the domain name) -STATUS_PAGE_HOSTNAME= - - -# --------------------------------------------------------- -# FLAME and/or HONEY - START PAGE -# --------------------------------------------------------- -# The start page is a custom start page that you can use to access all your services. -# You can choose to use either Flame or Honey or both. -# If you choose to only use one, you must remove the other from the compose.yaml file. -# Honey: https://github.com/dani3l0/honey (showcase: https://honeyy.vercel.app/) -# Flame: https://github.com/pawelmalak/flame -# -# Flame will come preconfigured with all the services that are available in the compose.yaml file. -# (Settings (bottom left icon) > App > Log in > Docker > Set 'Use Docker API' to True) -# Honey looks far better and is more compact, but you will need to manually add the services to it. -# -# Luckily, I have provided my configuration for Honey, so you can use that. -# If you followed the instructions correctly and ran the install.sh, you should have a file called config.json in the ./data/honey directory. -# You will simply need to adjust the URLs to match your domain names. -# -# To make this slightly easier, you can run the following command to replace the domain names with your domain names, any subdomains will need to be checked -# to see if they are correct. Just replace mydomain.com with your domain name. -# sed -i "s/yourdomain.com/mydomain.com/g" ./data/honey/config.json -# -# You can also reorder the services list as you like, and remove any services that you don't use or don't want to show up on the start page. -# -# You can access the start page at https://${FLAME_HOSTNAME} or https://${HONEY_HOSTNAME} -# -# I've personally set HONEY_HOSTNAME to my main domain name, so that I can access the start page at the root of my domain. -# e.g. if my domain was example.com, I would access the start page at https://example.com -# This does require a separate DNS record, so make sure you set that up. It would just be another A record -# pointing to your server's IP address but using the root (e.g. example.com) as the name, on Cloudflare, this can be denoted by @. -# --------------------------------------------------------- -FLAME_HOSTNAME= -FLAME_PASSWORD= - -HONEY_HOSTNAME= - -# --------------------------------------------------------- -# DASH DOT - DASHBOARD -# --------------------------------------------------------- -# Dash Dot is a dashboard that you can use to monitor your VPS. It provides information about the CPU, RAM, Disk, and Network usage. -# You will be able to access the dashboard at https://${DASHDOT_HOSTNAME} -# --------------------------------------------------------- -# e.g. dashdot.example.com -DASHDOT_HOSTNAME= -# This is the title of the page that shows up in the browser tab -DASHDOT_PAGE_TITLE= -# Whether you want your domain name to show up in the dashboard -# e.g. if your domain was dashdot.example.com, it would show example.com in the dashboard -DASHDOT_SHOW_HOST= -# Whether you want to use a custom host for the dashboard, instaed of the default above. Requires DASHDOT_SHOW_HOST to be set to true -DASHDOT_CUSTOM_HOST= - - -# ========================================================= -# ADDITIONAL PROFILES (OPTIONAL) -# ========================================================= -# These environment variables are used to set the environment variables for the services in the additional profiles. -# The available profiles are: -# - stremio -# - plausible -# - seanime -# - searxng -# - zipline -# - vaultwarden -# - minecraft -# - nzbhydra2 -# - debrid_media_server -# - all -# -# The 'all' profile includes all the services from the default profile and all the additional profiles. -# Note: the 'debrid_media_server' profile includes services that are mostly commented out in the compose.yaml file. -# This is because there may be issues with my current setup. Check the compose.yaml file for more information. -# ======================================================== - - -# ========================================================= -# STREMIO PROFILE -# ========================================================= -# These environment variables are used to set the environment variables for the services in the stremio profile. -# The stremio profile includes all the services that are required to run a Stremio setup. - - - -# --------------------------------------------------------- -# EXTERNAL SERVICES -# --------------------------------------------------------- -# -# Get your API key and Access token from https://www.themoviedb.org/settings/api -# Needed by: AIOStreams (for default stremio jackett tmdb api key only), MediaFusion, TMDB Addon -TMDB_API_KEY= -# Needed by: Jackettio -TMDB_ACCESS_TOKEN= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# AIOSTREAMS -# --------------------------------------------------------- -# Profiles: all, stremio -# -# To generate the AIOSTREAMS_SECRET_KEY, run the following command in your terminal: -# openssl rand -hex 32 -# -# The AIOSTREAMS_API_KEY is a random password that you can set to whatever you like. It protects your AIOStreams instance from unauthorized access -# by requiring an API key to configure and use the addon. -# -# --------------------------------------------------------- -AIOSTREAMS_HOSTNAME= -AIOSTREAMS_API_KEY= -AIOSTREAMS_SECRET_KEY= - -# This environment variable is used to give AIOStreams access to the a proxy to make requests to addons through. -# This is only needed when your VPS is blocked by Torrentio -# You can run -# curl -s -w "\n%{http_code}\n" "https://torrentio.strem.fun/manifest.json" -# to check if your VPS is blocked by Torrentio. -# If you get a 403 error, you will need to set this environment variable. -# Otherwise, you can get rid of it, or set it to an empty string. -AIOSTREAMS_ADDON_PROXY=http://warp:1080 - -# The following environment variables allow AIOStreams to use our self hosted addons instead of the public ones. -# If you are not hosting the other addons, you must remove these environment variables. -AIOSTREAMS_COMET_URL=http://comet:2020/ -# We have to force a hostname for Comet, as the internal URL that is returned by Comet is not accessible publicly for streaming. -AIOSTREAMS_FORCE_COMET_HOSTNAME=${COMET_HOSTNAME:-} -AIOSTREAMS_COMET_INDEXERS=${COMET_INDEXERS:-} -AIOSTREAMS_MEDIAFUSION_URL=http://mediafusion:8000/ -AIOSTREAMS_JACKETTIO_URL=http://jackettio:4000/ -# replace with the indexers you want to use for the default Jackettio configuration e.g. ["therarbg", "thepiratebay"] -AIOSTREAMS_JACKETT_INDEXERS=[] -AIOSTREAMS_STREMIO_JACKETT_URL=http://stremio-jackett:3000/ -AIOSTREAMS_JACKETT_API_KEY=${JACKETT_API_KEY:-} -AIOSTREAMS_EASYNEWS_PLUS_URL=http://easynews-plus:1337/ -# --------------------------------------------------------- - - - -# --------------------------------------------------------- -# AIOSTREMIO -# --------------------------------------------------------- -# Profiles: all, stremio -# -# The AIOSTREMIO_ADMIN_USERNAME and AIOSTREMIO_ADMIN_PASSWORD are the credentials that you will use to access the AIOStremio dashboard. -# -# The main configuration for AIOStremio is stored within ./data/aiostremio/config.json -# Without this file, AIOStremio will be stuck in a crash loop, so ensure you create this file -# You can use the template provided in the AIOStremio repository: -# https://github.com/Viren070/AIOStremio/blob/main/config.json.example -# -# The DEBRID_API_KEY is the API key for the debrid service you want to use by default. -# You can also set addon specific debrid API keys through the config.json file. -# --------------------------------------------------------- -AIOSTREMIO_HOSTNAME= -AIOSTREMIO_ADMIN_USERNAME= -AIOSTREMIO_ADMIN_PASSWORD= -DEBRID_API_KEY= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# COMET -# --------------------------------------------------------- -# Profiles: all, stremio -# -# The COMET_ADMIN_PASSWORD is a random password that you can set to whatever you like. It allows you to access the dashboard of Comet, which currently -# only shows active connections to the proxy service of Comet. -# -# The COMET_INDEXERS is a list of the indexers that you want to use with Comet. -# -# We can either use Prowlarr or Jackett as the indexer. If you would like to use Jackett instead, -# Set COMET_INDEXER_TYPE=jackett and COMET_INDEXER_URL=http://jackett:9117 and COMET_INDEXER_API_KEY=${JACKETT_API_KEY:-} -# -# For COMET_INDEXERS, you can add the names of the indexers that you want to use. This should just be the names of the indexers as you see them on the dashboards -# of Prowlarr or Jackett. -# --------------------------------------------------------- -COMET_ADMIN_PASSWORD= -COMET_HOSTNAME= -COMET_INDEXER_TYPE=prowlarr # or jackett -COMET_INDEXER_URL=http://prowlarr:9696 # or http://jackett:9117 -COMET_INDEXER_API_KEY=${PROWLARR_API_KEY:-} # or ${JACKETT_API_KEY:-} -COMET_INDEXERS=[] # e.g ["therarbg", "thepiratebay"] -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# MEDIAFLOW PROXY -# --------------------------------------------------------- -# Profiles: all, stremio -# -# The MEDIAFLOW_API_PASSWORD is a random password that you can set to whatever you like. It is used to protect the MediaFlow Proxy service. -# --------------------------------------------------------- -MEDIAFLOW_API_PASSWORD= -MEDIAFLOW_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# MEDIAFUSION -# --------------------------------------------------------- -# Profiles: all, stremio -# -# The MEDIAFUSION_API_PASSWORD is a random password that you can set to whatever you like. It is used to protect the MediaFusion service. -# The MEDIAFUSION_SECRET_KEY is a secret key that you can generate using the following command: -# openssl rand -hex 16 -# -# The core configuration for MediaFusion is stored within ./data/mediafusion/.env -# It does not require any changing, but if you would like to adjust the settings, you can do so in the .env file. -# --------------------------------------------------------- -MEDIAFUSION_API_PASSWORD= -MEDIAFUSION_HOSTNAME= -MEDIAFUSION_SECRET_KEY= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# STREMIO JACKETT -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -STREMIO_JACKETT_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# JACKETTIO -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -JACKETTIO_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# STREMTHRU -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -STREMTHRU_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# EASYNEWS PLUS -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -EASYNEWS_PLUS_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# PROWLARR -# --------------------------------------------------------- -# Profiles: all, stremio, debrid_media_server -# -# The PROWLARR_API_KEY is the API key that you can find in the Prowlarr dashboard. -# On your first run, you can leave this blank, after you have started the containers, you can find the API key in the Prowlarr dashboard. -# You can also run the following command to get the API key: -# sudo docker exec -i prowlarr cat /config/config.xml | grep -oP '(?<=).*(?=)' -# -# Make sure you add authentication to Prowlarr by setting up a username and password with the Login Form option, -# you will be asked to do so when you first access the Prowlarr dashboard. -# --------------------------------------------------------- -PROWLARR_API_KEY= -PROWLARR_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# JACKETT -# --------------------------------------------------------- -# Profiles: all, stremio, debrid_media_server -# -# The JACKETT_API_KEY is the API key that you can find in the Jackett dashboard. -# On your first run, you can leave this blank, after you have started the containers, you can find the API key in the Jackett dashboard. -# You can also run the following command to get the API key (after the container is running): -# sudo docker exec -i jackett cat /config/Jackett/ServerConfig.json | jq -r '.APIKey' -# -# Make sure you add authentication to Jackett by setting up an admin password in the Jackett dashboard. -# --------------------------------------------------------- -JACKETT_API_KEY= -JACKETT_HOSTNAME= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# TMDB ADDON -# --------------------------------------------------------- -# Profiles: all, stremio -# -# You can get your FANAART_API_KEY from https://fanart.tv/get-an-api-key/ -# --------------------------------------------------------- -TMDB_ADDON_HOSTNAME= -FANART_API_KEY= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# STREMIO SERVER -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -STREMIO_SERVER_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# ADDON MANAGER -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -ADDON_MANAGER_HOSTNAME= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# STREMIO CATALOGS & STREMIO TRAKT ADDONS -# --------------------------------------------------------- -# Profiles: all, stremio -# -# For these two addons, we need to obtain a Trakt Client ID and secret in order for the addons to work. -# To obtain these credentials: -# 1. Create an account on Trakt.tv (https://trakt.tv). -# 2. Go to the applications section (https://trakt.tv/oauth/applications). -# 3. Create a new application by filling in the required information (name, description, etc.). -# - For the "Redirect URL", add the following URLs (replacing the ${*_HOSTNAME} with your actual hostname): -# - https://${RAVENN_TRAKT_HOSTNAME}/callback -# - https://${RAVENN_CATALOGS_HOSTNAME}/callback -# -# -# For these two addons, after your inital compose up, you need to create the databases in postgres -# You can do this by running the following commands: -# docker exec -it ravenn-postgres psql -U postgres -# CREATE DATABASE stremio_trakt_db; -# CREATE DATABASE stremio_catalog_db; -# \q -# -# --------------------------------------------------------- -RAVENN_CATALOGS_HOSTNAME= -RAVENN_TRAKT_HOSTNAME= -TRAKT_CLIENT_ID= -TRAKT_CLIENT_SECRET= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# OMG TV STREMIO ADDON -# --------------------------------------------------------- -# Profiles: all, stremio -# --------------------------------------------------------- -OMG_TV_STREMIO_ADDON_HOSTNAME= -# --------------------------------------------------------- - -# ========================================================= -# NZBHYDRA2 PROFILE -# ========================================================= -# These environment variables are used to set the environment variables for the services in the nzbhydra2 profile. -# The nzbhydra2 profile only includes nzbhydra2. - -# --------------------------------------------------------- -# NZBHYDRA2 -# --------------------------------------------------------- -# Profiles: all, nzbhydra2 -# -# Make sure you add authentication to NZBHydra2 by setting up a username and password in the NZBHydra2 dashboard -# at Config > Authorization. -# Set Auth type to Login Form, and check all switches. -# Then, Add a new admin user with a username and password and make sure you remember these. -# --------------------------------------------------------- -NZBHYDRA2_HOSTNAME= -# --------------------------------------------------------- - -# ========================================================= -# SEANIME PROFILE -# ========================================================= -# These environment variables are used to set the environment variables for the services in the seanime profile. -# The seanime profile only includes seanime. - - -# --------------------------------------------------------- -# SEANIME -# --------------------------------------------------------- -# Profiles: seanime, all -# -# The SEANIME_HASHED_PASSWORD is the hash of the password that you will use to access the Seanime service. -# To get the hash for SEANIME_HASHED_PASSWORD, run the following command in your terminal, replacing with your desired password. -# -# htpasswd -niBb user | cut -d ":" -f 2 | sed 's/\$/\$\$/g' -# -# If you get an error about htpasswd not being found, you can install apache2-utils, use this command. -# sudo apt-get install apache2-utils -# -# Then, rerun the htpasswd command above. -# You would use the password before hashing when logging in to Seanime. -# -# IMPORTANT: Once you have the container running, you need to edit Seanime's config.toml file in order to set the correct host. -# Run the following command to do this. -# sudo sed -i 's/127.0.0.1/0.0.0.0/' ./data/seanime/config.toml -# Then, restart the container by running `sudo docker restart seanime -# -# Note: If you are planning on using this for local media, you will not be able to use an external player -# as we have set up a password for seanime. Unless you can find a way to pass basic http auth credentials to the player -# so that it can access the streaming URL from Seanime. -# --------------------------------------------------------- -SEANIME_HOSTNAME= -SEANIME_USERNAME= -SEANIME_HASHED_PASSWORD= -# --------------------------------------------------------- - - -# ========================================================= -# SEARXNG PROFILE -# ========================================================= -# These environment variables are used to set the environment variables for the services in the searxng profile. -# The searxng profile only includes searxng. - -# --------------------------------------------------------- -# SEARXNG -# --------------------------------------------------------- -# Profiles: searxng, all -# --------------------------------------------------------- -SEARXNG_HOSTNAME= -# --------------------------------------------------------- - -# ========================================================= -# PLAUSIBLE PROFILE -# ========================================================= -# These environment variables are used to set the environment variables for the services in the plausible profile. -# The plausible profile only includes plausible. - -# --------------------------------------------------------- -# PLAUSIBLE -# --------------------------------------------------------- -# Profiles: plausible, all -# -# The PLAUSIBLE_SECRET_KEY_BASE is a secret key that you can generate using the following command: -# openssl rand -base64 48 -# --------------------------------------------------------- -PLAUSIBLE_HOSTNAME= -PLAUSIBLE_SECRET_KEY_BASE= -# --------------------------------------------------------- - - -# --------------------------------------------------------- -# ZIPLINE -# --------------------------------------------------------- -# Profiles: zipline, all -# -# Zipline is a ShareX / File upload server -# -# To generate a POSTGRES password, run the following command in your terminal: -# openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n'; echo -# -# To generate the CORE_SECRET, run the following command: -# openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n'; echo -# -# Once you fill these values in and start the container, head to the dashboard and create an admin user -# Most of the configuration for Zipline is done through the web interface. -# -# Within the server settings -# Set the 'Default domain' under 'Core' to the value you set for ZIPLINE_HOSTNAME -# Also enable Return HTTPS URLs -# --------------------------------------------------------- -ZIPLINE_CORE_SECRET= -ZIPLINE_POSTGRES_PASSWORD= -ZIPLINE_HOSTNAME= - -# --------------------------------------------------------- -# VAULTWARDEN -# --------------------------------------------------------- -# Profiles: vaultwarden, all -# -# After you have started the container, you will need to set up the admin user by just visiting the hostname you set below. -# -# The admin token can be generated with this command: -# openssl rand -base64 48 -# -# However, for further security, you should secure the token by storing a hash of it instead using Argon2. -# First, install argon2 with the following command: -# sudo apt install argon2 -# -# Then, run this command, replacing YourPreviouslyGeneratedTokenHere with the token generated using the openssl command earlier. -# echo -n "YourPreviouslyGeneratedTokenHere" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 | sed 's/\$/\$\$/g' -# -# Store the output of the above command in the environment variable below. Note, to log in at the /admin page, you need to use the original admin token -# before hashing -# -# Once you have created your own account, it is recommended that you disable signups by setting the 'VAULTWARDEN_SIGNUPS_ALLOWED' environment variable -# to false. -# --------------------------------------------------------- -VAULTWARDEN_HOSTNAME= -VAULTWARDEN_SIGNUPS_ALLOWED=true -VAULTWARDEN_ADMIN_TOKEN= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# MINECRAFT -# --------------------------------------------------------- -# Profiles: minecraft, all -# -# Although I will provide some environment variables for configuration here, -# You should use https://setupmc.com/java-server/ to generate the configuration for your Minecraft server if you -# want to add mods/plugins/modpacks -# -# Just remember to add back the container_name and change the volume to - ./data/minecraft:/data -# You should also add back the profiles if you still want the minecraft service to integrate with the profiles of the compose.yaml file. -# -# 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. -# Your MINECRAFT_SERVER_WHITELIST should be a comma separated list of the usernames that you want to whitelist. -# -# The MOTD is the message that will be displayed when you hover over the server in the server list. -# -# MINECRAFT_SERVER_MEMORY is the amount of memory that you want to allocate to the server. I recommmend at least 8G, but if -# you don't have that much memory, you can reduce it. -# -# I've set the paper server type as the default, but you can change it to spigot or vanilla if you want. -# Paper is a heavily improved version of Spigot, with better performance and more features, and no downsides. -# I do not recommend changing this unless you know what you are doing. -# -# The view distance is the number of chunks that the server will load around each player. -# The higher the view distance, the more resources the server will use. -# If you lack memory/resources, you can reduce this value. -# -# MINECRAFT_SERVER_OP allows you to set the username of the player that will be given operator permissions. -# If you would like to add more operators, please edit the compose.yaml file and add them there on a new line. -# -# _______________________________________________________ -# -# !!!! IMPORTANT - PORT AND DNS SETUP !!!! -# _______________________________________________________ -# -# For you to access the Minecraft server, you will need to open the port 25565 on your server. -# You will use the public IP address of your server to connect to the Minecraft server. -# -# 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. -# -# You must first have an A record for the subdomain pointing to your server's IP address. -# If you have a wildcard DNS record, you do not need to do this. Though, it does mean -# that all subdomains will point to your server. -# --------------------------------------------------------- -MINECRAFT_SERVER_ICON= -MINECRAFT_SERVER_OVERRIDE_ICON=false -MINECRAFT_SERVER_MOTD= -MINECRAFT_SERVER_OP= -MINECRAFT_SERVER_MEMORY=8G -MINECRAFT_SERVER_TYPE=PAPER -MINECRAFT_SERVER_VIEW_DISTANCE=16 -MINECRAFT_SERVRE_ENABLE_WHITELIST=false -MINECRAFT_SERVER_WHITELIST= - -# ========================================================= -# DEBRID MEDIA SERVER PROFILE -# ========================================================= -# This profile is used to set the environment variables for the services in the debrid_media_server profile. - -# --------------------------------------------------------- -# BLACKHOLE -# --------------------------------------------------------- -# These are the environment variables for the Blackhole service. This is the download client that manages creating symlinks and telling -# Sonarr/Radarr to import the files. -# -# The main configuration for Blackhole is stored in ./data/blackhole/.env -# You can find an example of the .env file at Savvy Guides: -# https://savvyguides.wiki/sailarrsguide/#blackhole-script -# --------------------------------------------------------- -REALDEBRID_MOUNT_TORRENTS_PATH="/mnt/remote/realdebrid/__all__" -BLACKHOLE_BASE_WATCH_PATH="/mnt/symlinks" -BLACKHOLE_RADARR_PATH="radarr" -BLACKHOLE_SONARR_PATH="sonarr" - -SONARR_ROOT_FOLDER="/mnt/plex/TV" -SONARR_HOST=http://sonarr:8989 -SONARR_API_KEY= - -SONARR_ROOT_FOLDER_4K="/mnt/plex/TV - 4K" -SONARR_HOST_4K=http://sonarr4k:8989 -SONARR_API_KEY_4K= - -SONARR_ROOT_FOLDER_ANIME="/mnt/plex/TV - Anime" -SONARR_HOST_ANIME=http://sonarranime:8989 -SONARR_API_KEY_ANIME= - -RADARR_ROOT_FOLDER="/mnt/plex/Movies" -RADARR_HOST=http://radarr:7878 -RADARR_API_KEY= - -RADARR_ROOT_FOLDER_4K="/mnt/plex/Movies - 4K" -RADARR_HOST_4K=http://radarr4k:7878 -RADARR_API_KEY_4K= - -RADARR_ROOT_FOLDER_ANIME="/mnt/plex/Movies - Anime" -RADARR_HOST_ANIME=http://radarranime:7878 -RADARR_API_KEY_ANIME= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# RADARR/SONARR -# --------------------------------------------------------- -# These are the environment variables for the Radarr and Sonarr services. These services are used to manage your media library. -# --------------------------------------------------------- -RADARR_HOSTNAME= -RADARR4K_HOSTNAME= -RADARRANIME_HOSTNAME= - -SONARR_HOSTNAME= -SONARR4K_HOSTNAME= -SONARRANIME_HOSTNAME= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# AUTOSYNC -# --------------------------------------------------------- -# These are the environment variables for the Autosync service. This service is used to automatically sync your multiple Radarr/Sonarr instances. -# -# Autosync has its own config.yaml that should be placed in ./data/autosync/config.yaml -# You can find an example of the config.yaml file at the GitHub repository: https://github.com/Pukabyte/autosync -# -# Note: There is no arm image for Autosync, so you may need to build the image yourself. -# --------------------------------------------------------- -AUTOSYNC_HOSTNAME= - -# --------------------------------------------------------- -# PLEX -# --------------------------------------------------------- -# These are the environment variables for the Plex service. Plex is a media server that allows you to stream your media to any device. -# -# The PLEX_CLAIM is the claim token that you can use to claim your server with Plex. You can get this from https://www.plex.tv/claim/ -# --------------------------------------------------------- -PLEX_CLAIM= -PLEX_HOSTNAME= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# JELLYFIN -# --------------------------------------------------------- -# These are the environment variables for the Jellyfin service. Jellyfin is a media server that allows you to stream your media to any device. -# --------------------------------------------------------- -JELLYFIN_HOSTNAME= -# --------------------------------------------------------- - -# --------------------------------------------------------- -# Jellyseer -# --------------------------------------------------------- -# These are the environment variables for the Jellyseer service. Jellyseer is a service that allows you to track your media consumption. -# --------------------------------------------------------- -JELLYSEER_HOSTNAME= -# --------------------------------------------------------- - -# ========================================================= -# GENERAL CONFIGURATION -# ========================================================= -# These are the default values for the environment variables that are used in the compose.yaml file. -# You should not change these values unless you know what you are doing. -# - - -# Timezone used for auto updates, and other services that require a timezone e.g. Prowlarr, Jackett, etc. -# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones -# Use the values in the TZ Identifier column -# Needed by: Prowlarr, Jackett, NZBHydra2, Plex, Watchtower, Stremio Jackett, Minecraft -TZ=UTC - -# The POSTGRES credentials can be left as is, as they are only accessed internally. -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres - -# The network that the containers will be connected to. -# You should change this if you want to use an external network or just change the name of the network. -DOCKER_NETWORK=aio_default -DOCKER_NETWORK_EXTERNAL=false diff --git a/README.md b/README.md index 13d5233..83d1141 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,47 @@ # Docker Compose VPS Template -A template compose.yaml to self host various applications on a server/VPS using Docker Compose with Traefik as a reverse proxy. +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. + +This is a template, so feel free to edit it by removing or adding services as you see fit. 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. A full start-to-finish guide, which assumes you start from scratch, can be found on my site [here](https://guides.viren070.me/selfhosting). - It will go through setting up an Oracle VPS for free, installing Docker, and then a guide on using this compose.yaml. -If you know what you're doing, then this is the general guide: +This is the general guide: + +Prerequisites: +- A VPS with Docker installed. +- Port 80 and 443 open. +- A domain with DNS records pointing to the VPS IP for each domain/subdomain you want to use. + - Domains from [DuckDNS](https://www.duckdns.org/) or [Afraid.org](https://afraid.org/) are free and can be used for this. + 1. Ensure docker is installed per https://get.docker.com 2. Clone this repository and cd into it: ``` - git clone https://github.com/Viren070/docker-compose-vps-template.git docker-apps - cd docker-apps + cd /opt + + git clone https://github.com/Viren070/docker-compose-vps-template.git docker + cd docker ``` 3. Open the .env file using: ``` + cd apps nano .env ``` 4. Fill in all the values, making sure to read all the comments, and filling in any other files that are mentioned. -5. Run this command: +5. Fill in the .env files within the services you are using, e.g. `seanime/.env` or `stremio/.env`. +6. 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`. +7. Run this command: ``` docker compose up -d ``` - - You can check the compose.yaml or the full guide above to see what profiles are available. - Ensure you defined the `COMPOSE_PROFILES` environment variable in the .env file, otherwise only the default services will be started. - You can also use the --profile flag e.g. docker compose --profile stremio --profile seanime up -d + - You can check the compose.yaml or the full guide above to see what profiles are available. - Ensure port 443 and port 80 is open - Ensure you have DNS records that handle each hostname you are making use of which will point the hostname to the public IP of your server - 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) diff --git a/apps/.env b/apps/.env new file mode 100644 index 0000000..ec18185 --- /dev/null +++ b/apps/.env @@ -0,0 +1,84 @@ +# This file is used to store the common configuration that applies to either most containers or +# configuration for the compose project itself. + +# The timezone to use, find your timezone database name from +# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# Use the value from the 'TZ identifier' column +TZ=Etc/UTC + +# Directory configuration. This .env file should be in $DOCKER_APP_DIR/.env +DOCKER_DATA_DIR=/opt/docker/data +DOCKER_APP_DIR=/opt/docker/apps + + + +# The process user ID and group ID to use for applicable containers. +# Run 'id' to see your UID and GID +# Ensure that any pre-existing folders within the DOCKER_DATA_DIR (i.e. folders that were included within the template repository) +# have the correct permissions. +# You can run +# sudo chown $PUID:$PGID -R $DOCKER_DATA_DIR +# replacing the variables with the actual values e.g sudo chown 1000:1000 -R /opt/docker/data +PUID=1000 +PGID=1000 + + +# ========================================================= +# PROFILE CONFIGURATION +# ========================================================= +# +# As this compose.yaml is split up into profiles, you can choose which services you want to run by using profiles. +# If you only run +# docker compose up -d +# it will only start the default profile. +# +# If you only want to use the default profile, you can leave the COMPOSE_PROFILES variable empty. +# This will only include some basic services used for monitoring and managing the other services and server management. +# This is useful if you aren't interested in any of the additional services I have included in this template. +# +# If you want to make use of the additional profiles, you can do one of the following: +# +# You should set the profiles that you want to use by setting the COMPOSE_PROFILES variable below using a space separated list. +# e.g. COMPOSE_PROFILES="stremio seanime" +# +# You can also use the --profile flag to specify which profile you want to use when running the compose file, but this will need to be specified +# each time, even when you want to down the containers. +# +# Note: For the profiles you are using, it is REQUIRED for you to fill in every environment variable that is needed by that profile. +# You can edit the compose.yaml to remove a service from a profile by just removing the profile from the profiles list for that service +# e.g. profiles: ["stremio", "all"] -> profiles: ["all"] +# Now, when you use the --profile flag with stremio, that service will not be started. +# If you remove the profiles list altogether, the service will always be started, regardless of the profile(s) you use or do not use +# +# Find a list of the available profiles and the services they include at: https://guides.viren070.me/selfhosting/template +# You can also look at the compose.yaml file to see which services are included in each profile. +COMPOSE_PROFILES="all" + +# Other than modifying the profiles, you may also look at the compose.yaml file in the root of $DOCKER_APP_DIR +# This file 'includes' all the other compose.yaml files. You can remove a specific file from the list to remove that from the final +# 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 +# in the compose. +# Ensure that you don't remove files that other included files may rely on. + +# ==================================================== +# DOCKER COMPOSE CONFIGURATION +# ==================================================== +# This is the name of the compose project. +# Reference: https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_project_name +COMPOSE_PROJECT_NAME=aio +# When set to true, any containers that are not defined within this compose file will be removed when the stack is stopped or removed. +# Reference: https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_remove_orphans +COMPOSE_REMOVE_ORPHANS=true +# Delegate building to bake for improved performance. +COMPOSE_BAKE=true +# Whether to change the name of the network that all containers run on or to connect to an external network. +# Reference: https://docs.docker.com/compose/how-tos/networking/#use-a-pre-existing-network +DOCKER_NETWORK=aio_network +DOCKER_NETWORK_EXTERNAL=false + +# Now, you need to fill in the other .env files within each folder for the apps you are using. +# You must, at least, fill out the .env in the default profile. + +# This includes: authelia, dash, dozzle, flame, honey, traefik, uptime kuma, watchtower +# As mentioned before, you can remove the relevant line in the root compose if you don't want to use some of these. +# e.g. you can get rid of/comment out the '- flame/compose.yaml' line if you don't want to use flame. \ No newline at end of file diff --git a/apps/addon-manager/.env b/apps/addon-manager/.env new file mode 100644 index 0000000..3598fef --- /dev/null +++ b/apps/addon-manager/.env @@ -0,0 +1 @@ +ADDON_MANAGER_HOSTNAME= diff --git a/apps/addon-manager/compose.yaml b/apps/addon-manager/compose.yaml new file mode 100644 index 0000000..af64e31 --- /dev/null +++ b/apps/addon-manager/compose.yaml @@ -0,0 +1,20 @@ +services: + addon-manager: + image: reddravenn/stremio-addon-manager:latest + container_name: addon-manager + restart: unless-stopped + expose: + - 80 + labels: + - "traefik.enable=true" + - "traefik.http.routers.addon-manager.rule=Host(`${ADDON_MANAGER_HOSTNAME?}`)" + - "traefik.http.routers.addon-manager.entrypoints=websecure" + - "traefik.http.routers.addon-manager.tls.certresolver=letsencrypt" + - "traefik.http.routers.addon-manager.middlewares=authelia@docker" + - "flame.type=app" + - "flame.name=Stremio Addon Manager" + - "flame.url=https://${ADDON_MANAGER_HOSTNAME?}" + profiles: + - addon-manager + - stremio + - all diff --git a/apps/aiostreams/.env b/apps/aiostreams/.env new file mode 100644 index 0000000..9e033a9 --- /dev/null +++ b/apps/aiostreams/.env @@ -0,0 +1,197 @@ +# ================================================================================= # +# █████╗ ██╗ ██████╗ ███████╗████████╗██████╗ ███████╗ █████╗ ███╗ ███╗███████╗ # +# ██╔══██╗██║██╔═══██╗██╔════╝╚══██╔══╝██╔══██╗██╔════╝██╔══██╗████╗ ████║██╔════╝ # +# ███████║██║██║ ██║███████╗ ██║ ██████╔╝█████╗ ███████║██╔████╔██║███████╗ # +# ██╔══██║██║██║ ██║╚════██║ ██║ ██╔══██╗██╔══╝ ██╔══██║██║╚██╔╝██║╚════██║ # +# ██║ ██║██║╚██████╔╝███████║ ██║ ██║ ██║███████╗██║ ██║██║ ╚═╝ ██║███████║ # +# ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ # +# ================================================================================= # + +# ============================================================================== +# TRAEFIK CONFIGURATION +# ============================================================================== +# The domain to use for AIOStreams. +AIOSTREAMS_HOSTNAME= + + +# ============================================================================== +# GENERAL ADDON CONFIGURATION +# ============================================================================== +ADDON_NAME="AIOStreams" +ADDON_ID="com.viren070.aiostreams" +# Set to true to generate a deterministic addon ID based on the configuration, useful for apps like Vidi that require a different addon ID for multiple installations +DETERMINISTIC_ADDON_ID=true +# The port on which the addon will listen on +PORT=3000 +# The secret key used for encrypting the addon's configuration +# You must use a 64 character **hex** string, use the following commands to generate one: +# Linux: openssl rand -hex 32 +# Windows: [System.Guid]::NewGuid().ToString("N").Substring(0, 32) + [System.Guid]::NewGuid().ToString("N").Substring(0, 32) +SECRET_KEY= +# The API key used to install and use the addon, leave empty to disable API key requirement +# Can be set to any string +API_KEY= + +# Controls whether the addon shows a dice emoji in its stream results +SHOW_DIE=false +# The log level of the addon, can be set to "debug", "info", "warn", "error" +LOG_LEVEL=debug +# The log format of the addon, can be set to "json" or "text" +LOG_FORMAT=text +# Whether to log sensitive information like API keys +LOG_SENSITIVE_INFO=true +# ============================================================================== + + +# ============================================================================== +# PROXY CONFIGURATION +# ============================================================================== +# The proxy URL to use for all requests made to upstream addons +# You only need to configure this if the server you are hosting the addon on +# is blocked by Torrentio. +# e.g. http://warp:1080 +# from https://github.com/cmj2002/warp-docker +ADDON_PROXY=http://warp:1080 +# Optionally, configure what domains to proxy +# Use a comma separated list of rules in the format string:boolean. +# The later in the list, the higher the priority. +# You can use wildcards (*) to match multiple domains +# e.g. ADDON_PROXY_CONFIG="*:false,*.strem.fun:true" +# This would only proxy requests to the strem.fun domain and any subdomains of it +ADDON_PROXY_CONFIG=*:false,*.strem.fun:true + + +# ============================================================================== +# CONFIGURATION LIMITS +# ============================================================================== +# The max number of addons that are allowed to be used through a single instance of the addon +MAX_ADDONS=100 +# The maximum number of keyword filters that can be used in a single instance of the addon +MAX_KEYWORD_FILTERS=100 +# To control the maximum size the size filter sliders can go up to in bytes +MAX_MOVIE_SIZE=161061273600 +MAX_EPISODE_SIZE=161061273600 +# The maximum timeout that can be set for an addon through the override option +MAX_TIMEOUT=50000 +MIN_TIMEOUT=1000 +# ============================================================================== + +# ============================================================================== +# MEDIAFLOW CONFIGURATION +# ============================================================================== +# The timeout for requesting the IP from MediaFlow +# When we fail to get the IP from MediaFlow, no streams will be fetched and only an error message will be shown +MEDIAFLOW_IP_TIMEOUT=30000 +# If you set a default mediaflow configuration, it will force the addon to use MediaFlow for all instances +# A user can override the mediaflow instance to use a different one +DEFAULT_MEDIAFLOW_URL= +DEFAULT_MEDIAFLOW_API_PASSWORD= +DEFAULT_MEDIAFLOW_PUBLIC_IP= +# ============================================================================== + + +# ============================================================================== +# ADDON CONSTANTS +# ============================================================================== +# The default timeout for all requests. If other timeouts are not set, this will be used +DEFAULT_TIMEOUT=5000 + +# Note: all URLs must end in a trailing slash + +# ----------- COMET ------------ +# The URL of the Comet instance to use. You can provide a url to a self hosted instance of Comet or the public instance +COMET_URL=https://comet.elfhosted.com/ +# COMET_URL=http://comet:2020/ +# The default timeout for all requests to the Comet API. If left empty, either the DEFAULT_TIMEOUT or the overriden timeout will be used +DEFAULT_COMET_TIMOUT= +# The following environment variables should only be set if you are using an internal URL for 'COMET_URL' e.g. http://comet:3000/ +# and want the comet streams to be accessible from outside the network +# i.e. you would set these to the public URL of the comet instance. For this template, you would use the value of COMET_HOSTNAME in comet/.env in +# FORCE_COMET_HOSTNAME and https in FORCE_COMET_PROTOCOL. +# Otherwise, leave them empty +FORCE_COMET_HOSTNAME= +FORCE_COMET_PORT= +FORCE_COMET_PROTOCOL= +# ------------------------------------- + +# ----------- MEDIAFUSION ------------ +# The URL of the MediaFusion instance to use. You can provide a url to a self hosted instance of MediaFusion or the public instance +MEDIAFUSION_URL=https://mediafusion.elfhosted.com/ +# MEDIAFUSION_URL=http://mediafusion:8000/ +DEFAULT_MEDIAFUSION_TIMEOUT= +# The timeout applied to the /encrypt-user-data endpoint of MediaFusion when auto generating the configuration +MEDIAFUSION_CONFIG_TIMEOUT=5000 +# If you are using a self hosted instance of MediaFusion protected with a 'API_PASSWORD', you must provide it here +# If you want to be able to make use of the auto configuration. If you are planning on overriding the URL at the config page, you can leave this empty +MEDIAFUSION_API_PASSWORD= +# ------------------------------------- + +# ----------- JACKETTIO ------------- +# The URL of the Jackettio instance to use. You can provide a url to a self hosted instance of Jackettio or the public instance +JACKETTIO_URL=https://jackettio.elfhosted.com/ +# JACKETTIO_URL=http://jackettio:4000/ +# The default indexers used when auto generating the configuration. Change if using a custom Jackettio instance, and you have different indexers +JACKETT_INDEXERS=["bitsearch", "eztv", "thepiratebay", "therarbg", "yts"] +DEFAULT_JACKETTIO_TIMEOUT= +# ------------------------------------- + +# ---------- STREMIO-JACKETT ---------- +# The URL of the Stremio-Jackett instance to use. You can provide a url to a self hosted instance of Stremio-Jackett or the public instance +STREMIO_JACKETT_URL=https://stremio-jackett.elfhosted.com/ +# STREMIO_JACKETT_URL=http://stremio-jackett:3000/ +# If using a self hosted instance, provide the Jackett URL and API key here +# JACKETT_URL=http://jackett:9117/ +JACKETT_URL= +JACKETT_API_KEY= +# Whether to enable the cache option for auto configurations +STREMIO_JACKETT_CACHE_ENABLED=true +DEFAULT_STREMIO_JACKETT_TIMEOUT= +# ------------------------------------- + +# --------- EASYNEWS+ ADDON --------- +# The URL of the EasyNews+ instance to use. You can provide a url to a self hosted instance of EasyNews+ or the public instance +EASYNEWS_PLUS_URL=https://b89262c192b0-stremio-easynews-addon.baby-beamup.club/ +# EASYNEWS_PLUS_URL=http://easynews-plus:1337/ +DEFAULT_EASYNEWS_PLUS_TIMEOUT= +# ------------------------------------- + +# ----------- TORRENTIO ------------- +TORRENTIO_URL=https://torrentio.strem.fun/ +DEFAULT_TORRENTIO_TIMEOUT= +# ------------------------------------- + +# -------- ORION STREMIO ADDON -------- +ORION_STREMIO_ADDON_URL=https://5a0d1888fa64-orion.baby-beamup.club/ +DEFAULT_ORION_STREMIO_ADDON_TIMEOUT= +# ------------------------------------- + +# ------------ PEERFLIX -------------- +PEERFLIX_URL=https://peerflix-addon.onrender.com/ +DEFAULT_PEERFLIX_TIMEOUT= +# ------------------------------------- + +# -------- TORBOX STREMIO ADDON -------- +TORBOX_STREMIO_URL=https://stremio.torbox.app/ +DEFAULT_TORBOX_STREMIO_TIMEOUT= +# -------------------------------------- + +# -------- EASYNEWS ADDON -------- +EASYNEWS_URL=https://ea627ddf0ee7-easynews.baby-beamup.club/ +DEFAULT_EASYNEWS_TIMEOUT= +# -------------------------------------- + +# ------------ DEBRIDIO ----------- +DEBRIDIO_URL=https://debridio.adobotec.com/ +DEFAULT_DEBRIDIO_TIMEOUT= +# -------------------------------------- + +# ------------- DMM Cast ---------------- +DEFAULT_DMM_CAST_TIMEOUT= +# -------------------------------------- + +# -------------- STREMIO GDRIVE ---------------- +DEFAULT_STREMIO_GDRIVE_TIMEOUT= +# -------------------------------------- +# ============================================================================== + + diff --git a/apps/aiostreams/compose.yaml b/apps/aiostreams/compose.yaml new file mode 100644 index 0000000..3e10f96 --- /dev/null +++ b/apps/aiostreams/compose.yaml @@ -0,0 +1,27 @@ +services: + aiostreams: + image: ghcr.io/viren070/aiostreams:latest + container_name: aiostreams + restart: unless-stopped + expose: + - 3000 + env_file: + - .env + labels: + - "traefik.enable=true" + - "traefik.http.routers.aiostreams.rule=Host(`${AIOSTREAMS_HOSTNAME?}`)" + - "traefik.http.routers.aiostreams.entrypoints=websecure" + - "traefik.http.routers.aiostreams.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=AIOStreams" + - "flame.url=https://${AIOSTREAMS_HOSTNAME}" + healthcheck: + test: wget -qO- http://localhost:3000/health + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - aiostreams + - stremio + - all diff --git a/apps/aiostremio/.env b/apps/aiostremio/.env new file mode 100644 index 0000000..2b18c85 --- /dev/null +++ b/apps/aiostremio/.env @@ -0,0 +1,25 @@ +# --------------------------------------------------------- +# AIOSTREMIO +# --------------------------------------------------------- +# Profiles: all, stremio +# +# The AIOSTREMIO_ADMIN_USERNAME and AIOSTREMIO_ADMIN_PASSWORD are the credentials that you will use to access the AIOStremio dashboard. +# +# The main configuration for AIOStremio is stored within ./data/aiostremio/config.json +# Without this file, AIOStremio will be stuck in a crash loop, so ensure this file exists and is configured correctly. +# You can use the template provided in the AIOStremio repository: +# https://github.com/Viren070/AIOStremio/blob/main/config.json.example +# +# The DEBRID_API_KEY is the API key for the debrid service you want to use by default. +# You can also set addon specific debrid API keys through the config.json file. +# --------------------------------------------------------- +AIOSTREMIO_HOSTNAME= + +ADMIN_USERNAME= +ADMIN_PASSWORD= +MEDIAFLOW_API_PASSWORD= +DEBRID_API_KEY= + +REDIS_HOST=aiostremio_redis +REDIS_PORT=6379 +REDIS_PASSWORD= diff --git a/apps/aiostremio/compose.yaml b/apps/aiostremio/compose.yaml new file mode 100644 index 0000000..810ceb0 --- /dev/null +++ b/apps/aiostremio/compose.yaml @@ -0,0 +1,43 @@ +services: + aiostremio: + image: viren070/aiostremio:latest + container_name: aiostremio + restart: unless-stopped + expose: + - 8469 + volumes: + - ${DOCKER_DATA_DIR}/aiostremio:/app/data + env_file: + - .env + labels: + - "traefik.enable=true" + - "traefik.http.routers.aiostremio.rule=Host(`${AIOSTREMIO_HOSTNAME?}`)" + - "traefik.http.routers.aiostremio.entrypoints=websecure" + - "traefik.http.routers.aiostremio.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=AIOStremio" + - "flame.url=https://${AIOSTREMIO_HOSTNAME}" + profiles: + - aiostremio + - stremio + - all + depends_on: + aiostremio_redis: + condition: service_healthy + + aiostremio_redis: + image: redis:latest + container_name: aiostremio_redis + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/aiostremio/cache:/data + command: redis-server --appendonly yes --save 60 1 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + profiles: + - aiostremio + - stremio + - all diff --git a/apps/authelia/.env b/apps/authelia/.env new file mode 100644 index 0000000..0a200d4 --- /dev/null +++ b/apps/authelia/.env @@ -0,0 +1,46 @@ +# __| |_____________________________________________________________| |__ +# __ _____________________________________________________________ __ +# | | | | +# | | █████╗ ██╗ ██╗████████╗██╗ ██╗███████╗██╗ ██╗ █████╗ | | +# | |██╔══██╗██║ ██║╚══██╔══╝██║ ██║██╔════╝██║ ██║██╔══██╗| | +# | |███████║██║ ██║ ██║ ███████║█████╗ ██║ ██║███████║| | +# | |██╔══██║██║ ██║ ██║ ██╔══██║██╔══╝ ██║ ██║██╔══██║| | +# | |██║ ██║╚██████╔╝ ██║ ██║ ██║███████╗███████╗██║██║ ██║| | +# | |╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚═╝| | +# __| |_____________________________________________________________| |__ +# __ _____________________________________________________________ __ +# | | | | + +# Authelia is the authentication server for our services. +# It allows us to expose our services to the internet in a secure way. +# When accessing a service, if authelia is configured as a middleware for that service, Traefik will redirect the user to authelia for authentication. +# Once authenticated, the user will be redirected back to the service they were trying to access. +# +# Note: Due to the way Stremio addons work, they cannot be protected by Authelia. +# 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. + + +# Your domain without the protocol (e.g. example.com) +DOMAIN= +# The display name for WebAuthn that shows in the browser. +AUTHELIA_WEBAUTHN_DISPLAY_NAME="Authelia" + +# These should all be different random strings of at least 64 characters. +# You can use the following command to generate them: +# echo "$(openssl rand -base64 64 | tr -d '=/' | tr -d '\n')" +AUTHELIA_SESSION_SECRET="" +AUTHELIA_STORAGE_ENCRYPTION_KEY="" +AUTHELIA_JWT_SECRET="" + +# The subdomain that Authelia uses. +# This is the subdomain that users are redirected to when they need to authenticate. +AUTHELIA_SUBDOMAIN=auth + +# The valid users for Authelia are stored in the users.yml file. +# This is located in `${DOCKER_DATA_DIR}/data/authelia/config/users.yml` +# You must add your users to this file in order to be able to access secured services. + +# Note: When you first login with a user, Authelia will ask for a code that it says it sent to you. +# This will be located in the notification.txt file in the same directory as the users.yml file. +# You can run this command to view the file, replacing ${DOCKER_DATA_DIR} with its actual value: +# cat ${DOCKER_DATA_DIR}/data/authelia/config/notification.txt diff --git a/apps/authelia/compose.yaml b/apps/authelia/compose.yaml new file mode 100644 index 0000000..8a7390f --- /dev/null +++ b/apps/authelia/compose.yaml @@ -0,0 +1,63 @@ +services: + authelia: + container_name: 'authelia' + image: 'authelia/authelia' + restart: 'unless-stopped' + user: $PUID:$PGID + volumes: + - '${DOCKER_DATA_DIR}/authelia/config:/config' + environment: + TZ: ${TZ:-UTC} + X_AUTHELIA_CONFIG_FILTERS: template + TEMPLATE_AUTHELIA_SESSION_SECRET: ${AUTHELIA_SESSION_SECRET?} + TEMPLATE_DOMAIN: ${DOMAIN?} + TEMPLATE_AUTHELIA_SUBDOMAIN: ${AUTHELIA_SUBDOMAIN?} + TEMPLATE_AUTHELIA_STORAGE_ENCRYPTION_KEY: ${AUTHELIA_STORAGE_ENCRYPTION_KEY?} + TEMPLATE_AUTHELIA_WEBAUTHN_DISPLAY_NAME: ${AUTHELIA_WEBAUTHN_DISPLAY_NAME?} + TEMPLATE_AUTHELIA_JWT_SECRET: ${AUTHELIA_JWT_SECRET?} + labels: + - "traefik.enable=true" + - "traefik.http.routers.authelia.rule=Host(`${AUTHELIA_SUBDOMAIN?}.${DOMAIN}`)" + - "traefik.http.routers.authelia.entryPoints=websecure" + - "traefik.http.routers.authelia.tls.certresolver=letsencrypt" + - "traefik.http.services.authelia.loadbalancer.server.port=9091" + + - "traefik.http.middlewares.authelia.forwardAuth.address=http://authelia:9091/api/authz/forward-auth" + - "traefik.http.middlewares.authelia.forwardAuth.trustForwardHeader=true" + - "traefik.http.middlewares.authelia.forwardAuth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Email,Remote-Name" + + depends_on: + authelia_redis: + condition: service_healthy + authelia_postgres: + condition: service_healthy + + authelia_redis: + image: redis:latest + container_name: authelia_redis + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/authelia/cache:/data + command: redis-server --appendonly yes --save 60 1 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + + authelia_postgres: + image: postgres:17-alpine + restart: unless-stopped + container_name: authelia_postgres + volumes: + - ${DOCKER_DATA_DIR}/authelia/db:/var/lib/postgresql/data + environment: + POSTGRES_USER: authelia + POSTGRES_PASSWORD: authelia + POSTGRES_DB: authelia + healthcheck: + test: ["CMD-SHELL", "pg_isready -U authelia -d authelia"] + start_period: 1m + interval: 20s + timeout: 5s + retries: 5 diff --git a/apps/autosync/.env b/apps/autosync/.env new file mode 100644 index 0000000..b3ab08f --- /dev/null +++ b/apps/autosync/.env @@ -0,0 +1,8 @@ +# AutoSync allows you to sync your libraries across multiple instances of Sonarr and Radarr. +# It also functions as an autoscan for your media servers, as it can send a scan to your media servers when a new file is added to the library +# through Sonarr/Radarr. +# +# Autosync requires no extra environment variables to run. +# +# However, you need to configure the config.yaml file in ${DOCKER_DATA_DIR}/data/autosync/config.yaml +# This can be done after starting up your sonarr/radarr instances. \ No newline at end of file diff --git a/apps/autosync/compose.yaml b/apps/autosync/compose.yaml new file mode 100644 index 0000000..4c12cdc --- /dev/null +++ b/apps/autosync/compose.yaml @@ -0,0 +1,34 @@ +services: + autosync: + image: ghcr.io/pukabyte/autosync:latest + container_name: autosync + restart: unless-stopped + expose: + - 3536 + environment: + - TZ=${TZ:-UTC} + - PUID=${PUID} + - PGID=${PGID} + - UMASK=022 + volumes: + - ${DOCKER_DATA_DIR}/autosync/config.yaml:/app/config.yaml + - /etc/localtime:/etc/localtime:ro + - /mnt:/mnt + depends_on: + plex: + condition: service_healthy + sonarr: + condition: service_healthy + sonarr4k: + condition: service_healthy + sonarranime: + condition: service_healthy + radarr: + condition: service_healthy + radarr4k: + condition: service_healthy + radarranime: + condition: service_healthy + profiles: + - autosync + - debrid_media_server diff --git a/apps/bazarr/.env b/apps/bazarr/.env new file mode 100644 index 0000000..73c66eb --- /dev/null +++ b/apps/bazarr/.env @@ -0,0 +1,2 @@ +BAZARR_HOSTNAME= +BAZARR4K_HOSTNAME= diff --git a/apps/bazarr/compose.yaml b/apps/bazarr/compose.yaml new file mode 100644 index 0000000..0112f19 --- /dev/null +++ b/apps/bazarr/compose.yaml @@ -0,0 +1,67 @@ +services: + bazarr: + image: ghcr.io/hotio/bazarr + container_name: bazarr + restart: unless-stopped + expose: + - 6767 + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ:-UTC} + volumes: + - ${DOCKER_DATA_DIR}/bazarr/default/config:/config + - ${DOCKER_DATA_DIR}/bazarr/default/data:/data + - /mnt:/mnt + labels: + - "traefik.enable=true" + - "traefik.http.routers.bazarr.rule=Host(`${BAZARR_HOSTNAME?}`)" + - "traefik.http.routers.bazarr.entrypoints=websecure" + - "traefik.http.routers.bazarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.bazarr.middlewares=authelia@docker" + - "traefik.http.services.bazarr.loadbalancer.server.port=6767" + - "flame.type=app" + - "flame.name=Bazarr" + - "flame.url=https://${BAZARR_HOSTNAME}" + profiles: + - all + - bazarr + - debrid_media_server + depends_on: + - rclone + - sonarr + - radarr + + + bazarr4k: + image: ghcr.io/hotio/bazarr + container_name: bazarr4k + restart: unless-stopped + expose: + - 6767 + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ:-UTC} + volumes: + - ${DOCKER_DATA_DIR}/bazarr/4k/config:/config + - ${DOCKER_DATA_DIR}/bazarr/4k/data:/data + - /mnt:/mnt + labels: + - "traefik.enable=true" + - "traefik.http.routers.bazarr4k.rule=Host(`${BAZARR4K_HOSTNAME?}`)" + - "traefik.http.routers.bazarr4k.entrypoints=websecure" + - "traefik.http.routers.bazarr4k.tls.certresolver=letsencrypt" + - "traefik.http.routers.bazarr4k.middlewares=authelia@docker" + - "traefik.http.services.bazarr4k.loadbalancer.server.port=6767" + - "flame.type=app" + - "flame.name=Bazarr" + - "flame.url=https://${BAZARR4K_HOSTNAME}" + profiles: + - all + - bazarr + - debrid_media_server + depends_on: + - rclone + - sonarr4k + - radarr4k diff --git a/apps/byparr/compose.yaml b/apps/byparr/compose.yaml new file mode 100644 index 0000000..4a8a954 --- /dev/null +++ b/apps/byparr/compose.yaml @@ -0,0 +1,20 @@ +services: + byparr: + image: ghcr.io/thephaseless/byparr + container_name: byparr + restart: unless-stopped + environment: + - LOG_LEVEL=INFO + volumes: + - ${DOCKER_DATA_DIR}/byparr/screenshots:/app/screenshots + healthcheck: + test: curl -f http://localhost:8191/health + interval: 5m + timeout: 10s + retries: 3 + start_period: 10s + profiles: + - byparr + - stremio + - debrid_media_server + - all diff --git a/apps/comet/.env b/apps/comet/.env new file mode 100644 index 0000000..dd0f5d5 --- /dev/null +++ b/apps/comet/.env @@ -0,0 +1,123 @@ +#=================================================# +# ██████╗ ██████╗ ███╗ ███╗███████╗████████╗ # +# ██╔════╝██╔═══██╗████╗ ████║██╔════╝╚══██╔══╝ # +# ██║ ██║ ██║██╔████╔██║█████╗ ██║ # +# ██║ ██║ ██║██║╚██╔╝██║██╔══╝ ██║ # +# ╚██████╗╚██████╔╝██║ ╚═╝ ██║███████╗ ██║ # +# ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ # +#=================================================# + +# =============================== # +# Traefik Configuration # +# =============================== # +# The domain to use for Comet. +COMET_HOSTNAME= + +# ============================== # +# Stremio Addon Configuration # +# ============================== # +ADDON_ID=stremio.comet.fast +ADDON_NAME=Comet + +# ============================== # +# FastAPI Server Configuration # +# ============================== # +FASTAPI_HOST=0.0.0.0 +FASTAPI_PORT=2020 +FASTAPI_WORKERS=-1 +USE_GUNICORN=True # Will use uvicorn if False or if on Windows + +# ============================== # +# Dashboard Settings # +# ============================== # +DASHBOARD_ADMIN_PASSWORD=CHANGE_ME # The password to access the dashboard + +# ============================== # +# Database Configuration # +# ============================== # +# The database type to use. If using SQLite, the path to the database file is required. +# If using PostgreSQL, the URL to the database is required. +# Postgres should only be used if you need concurrency e.g. mutliple instances of Comet, or using +# multiple debrid services with Comet. +DATABASE_TYPE=sqlite # Options: sqlite, postgresql +DATABASE_URL=postgres://comet:comet@comet_postgres:5432/comet # For PostgreSQL +DATABASE_PATH=data/comet.db # Only relevant for SQLite + +# ============================== # +# Cache Settings (Seconds) # +# ============================== # +METADATA_CACHE_TTL=2592000 # 30 days +TORRENT_CACHE_TTL=1296000 # 15 days +DEBRID_CACHE_TTL=86400 # 1 day + +# ============================== # +# Debrid Proxy Configuration # +# ============================== # +DEBRID_PROXY_URL=http://warp:1080 # Bypass Debrid Services and Torrentio IP blacklist + +# ============================== # +# Indexer Manager Settings # +# ============================== # +INDEXER_MANAGER_TYPE=none # Options: jackett, prowlarr, none +INDEXER_MANAGER_URL=http://jackett:9117 +INDEXER_MANAGER_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +INDEXER_MANAGER_TIMEOUT=60 # Max time to get search results (seconds) +INDEXER_MANAGER_INDEXERS='["EXAMPLE1_CHANGETHIS", "EXAMPLE2_CHANGETHIS"]' # Jackett/Prowlarr indexers + +# ============================== # +# Torrent Settings # +# ============================== # +GET_TORRENT_TIMEOUT=5 # Max time to obtain torrent info hash (seconds) +DOWNLOAD_TORRENT_FILES=True # Enable torrent file retrieval (instead of magnet link only) + +# ============================== # +# Scraping Configuration # +# ============================== # +# To scrape the public instance of Comet. +SCRAPE_COMET=true +COMET_URL=https://comet.elfhosted.com + +# Whether to scrape Zilean, a DMM hashlist scraper. +SCRAPE_ZILEAN=true +ZILEAN_URL=http://zilean:8181 +# You can instead use the public, unratelimited, elfhosted instance of Zilean if not hosting your own: +# ZILEAN_URL=https://zilean.elfhosted.com + +SCRAPE_TORRENTIO=true +TORRENTIO_URL=https://torrentio.strem.fun + +SCRAPE_MEDIAFUSION=true +MEDIAFUSION_URL=http://mediafusion:8000 +# You can instead use the public elfhosted instance of MediaFusion if not hosting your own: +# MEDIAFUSION_URL=https://mediafusion.elfhosted.com + + +# ============================== # +# StremThru Integration # +# ============================== # +# StremThru is used to provide debrid capability to the addon, and is required for the addon to work. +# It provides cache information too. +STREMTHRU_URL=http://stremthru:8080 +# You can instead use this public instance of StremThru which has access to the ElfHosted cache, hosted by +# the developer of StremThru: +# STREMTHRU_URL=https://stremthru.13377001.xyz + +# ============================== # +# Debrid Stream Proxy Settings # +# ============================== # +PROXY_DEBRID_STREAM=False +PROXY_DEBRID_STREAM_PASSWORD=CHANGE_ME +PROXY_DEBRID_STREAM_MAX_CONNECTIONS=-1 # -1 to disable connection limits +PROXY_DEBRID_STREAM_DEBRID_DEFAULT_SERVICE=realdebrid +PROXY_DEBRID_STREAM_DEBRID_DEFAULT_APIKEY=CHANGE_ME + +# ============================== # +# Content Filtering # +# ============================== # +REMOVE_ADULT_CONTENT=False + +# ============================== # +# UI Customization # +# ============================== # +CUSTOM_HEADER_HTML=None + diff --git a/apps/comet/compose.yaml b/apps/comet/compose.yaml new file mode 100644 index 0000000..4378852 --- /dev/null +++ b/apps/comet/compose.yaml @@ -0,0 +1,51 @@ +services: + comet: + container_name: comet + image: g0ldyy/comet:latest + restart: unless-stopped + expose: + - 2020 + env_file: + - .env + labels: + - "traefik.enable=true" + - "traefik.http.routers.comet.rule=Host(`${COMET_HOSTNAME}`)" + - "traefik.http.routers.comet.entrypoints=websecure" + - "traefik.http.routers.comet.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Comet" + - "flame.url=https://${COMET_HOSTNAME}" + volumes: + - ${DOCKER_DATA_DIR}/comet:/app/data + healthcheck: + test: wget -qO- http://127.0.0.1:2020/health + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - comet + - stremio + - all + + # If you would like to use postgres instead of sqlite, uncomment the followling lines, + # and set the DATABASE_TYPE to postgres and DATABASE_URL to + # comet_postgres: + # image: postgres:latest + # container_name: comet_postgres + # restart: unless-stopped + # volumes: + # - ${DOCKER_DATA_DIR}/comet/postgres:/var/lib/postgresql/data + # environment: + # - POSTGRES_USER=comet + # - POSTGRES_PASSWORD=comet + # - POSTGRES_DB=comet + # healthcheck: + # test: ["CMD", "pg_isready", "-U", "comet"] + # interval: 10s + # timeout: 5s + # retries: 5 + # profiles: + # - comet + # - stremio + # - all diff --git a/apps/compose.yaml b/apps/compose.yaml new file mode 100644 index 0000000..5641169 --- /dev/null +++ b/apps/compose.yaml @@ -0,0 +1,55 @@ + +include: + - radarr/compose.yaml + - sonarr/compose.yaml + - addon-manager/compose.yaml + - aiostreams/compose.yaml + - aiostremio/compose.yaml + - autosync/compose.yaml + - bazarr/compose.yaml + - byparr/compose.yaml + - comet/compose.yaml + - dash/compose.yaml + - dozzle/compose.yaml + - flame/compose.yaml + - gluetun/compose.yaml + - honey/compose.yaml + - jackett/compose.yaml + - jackettio/compose.yaml + - jellyfin/compose.yaml + - jellyseer/compose.yaml + - mediaflow-proxy/compose.yaml + - mediafusion/compose.yaml + - minecraft/compose.yaml + - nzbhydra2/compose.yaml + - omg-tv-addon/compose.yaml + - overseerr/compose.yaml + - plausible/compose.yaml + - plex/compose.yaml + - prowlarr/compose.yaml + - recyclarr/compose.yaml + - seanime/compose.yaml + - searxng/compose.yaml + - stremio-catalog-providers/compose.yaml + - stremio-jackett/compose.yaml + - stremio-server/compose.yaml + - stremio-trakt-addon/compose.yaml + - stremthru/compose.yaml + - tautulli/compose.yaml + - tmdb-addon/compose.yaml + - torbox-manager/compose.yaml + - traefik/compose.yaml + - tweakio/compose.yaml + - uptime-kuma/compose.yaml + - vaultwarden/compose.yaml + - warp/compose.yaml + - watchtower/compose.yaml + - wests-scripts/compose.yaml + - zilean/compose.yaml + - zipline/compose.yaml + - zurg/compose.yaml + +networks: + default: + name: ${DOCKER_NETWORK:-aio_default} + external: ${DOCKER_NETWORK_EXTERNAL:-false} diff --git a/apps/dash/.env b/apps/dash/.env new file mode 100644 index 0000000..73b948e --- /dev/null +++ b/apps/dash/.env @@ -0,0 +1,19 @@ +# --------------------------------------------------------- +# DASH DOT - DASHBOARD +# --------------------------------------------------------- +# Dash Dot is a dashboard that you can use to monitor your VPS. It provides information about the CPU, RAM, Disk, and Network usage. +# You will be able to access the dashboard at https://${DASHDOT_HOSTNAME} +# --------------------------------------------------------- +# e.g. dash.example.com +DASHDOT_HOSTNAME= +# This is the title of the page that shows up in the browser tab +DASHDOT_PAGE_TITLE=dash. +# Whether you want your domain name to show up in the dashboard +# e.g. if your domain was dash.example.com, it would show example.com in the dashboard +DASHDOT_SHOW_HOST=true +# Customise the host shown (requires DASHDOT_SHOW_HOST to be true) +DASHDOT_CUSTOM_HOST= + +DASHDOT_ALWAYS_SHOW_PERCENTAGES=true +DASHDOT_ACCEPT_OOKLA_EULA=true +DASHDOT_NETWORK_SPEED_AS_BYTES=false diff --git a/apps/dash/compose.yaml b/apps/dash/compose.yaml new file mode 100644 index 0000000..43593c3 --- /dev/null +++ b/apps/dash/compose.yaml @@ -0,0 +1,22 @@ +services: + # Start page for your serve + dash: + image: mauricenino/dashdot:latest + container_name: dash + restart: unless-stopped + expose: + - 3001 + privileged: true + env_file: + - .env + volumes: + - /:/mnt/host:ro + labels: + - "traefik.enable=true" + - "traefik.http.routers.dash.rule=Host(`${DASHDOT_HOSTNAME?}`)" + - "traefik.http.routers.dash.entrypoints=websecure" + - "traefik.http.routers.dash.tls.certresolver=letsencrypt" + - "traefik.http.routers.dash.middlewares=authelia@docker" + - "flame.type=app" + - "flame.name=Dash" + - "flame.url=https://${DASHDOT_HOSTNAME?}" diff --git a/apps/dozzle/.env b/apps/dozzle/.env new file mode 100644 index 0000000..b0bffa5 --- /dev/null +++ b/apps/dozzle/.env @@ -0,0 +1,9 @@ +# --------------------------------------------------------- +# DOZZLE +# --------------------------------------------------------- +# Dozzle is a log viewer for Docker. It is used to view the logs of the containers. +# This will be helpful for debugging purposes. +# You will be able to access the logs at https://${DOZZLE_HOSTNAME} +# --------------------------------------------------------- + +DOZZLE_HOSTNAME= diff --git a/apps/dozzle/compose.yaml b/apps/dozzle/compose.yaml new file mode 100644 index 0000000..6b99e60 --- /dev/null +++ b/apps/dozzle/compose.yaml @@ -0,0 +1,28 @@ +services: + dozzle: + image: amir20/dozzle:latest + container_name: dozzle + restart: unless-stopped + expose: + - 8080 + environment: + - DOZZLE_ENABLE_ACTIONS=true + - DOZZLE_NO_ANALYTICS=true + volumes: + - /var/run/docker.sock:/var/run/docker.sock + labels: + - "traefik.enable=true" + - "traefik.http.routers.dozzle.rule=Host(`${DOZZLE_HOSTNAME?}`)" + - "traefik.http.routers.dozzle.entrypoints=websecure" + - "traefik.http.routers.dozzle.tls.certresolver=letsencrypt" + - "traefik.http.routers.dozzle.middlewares=authelia@docker" + # - "traefik.http.middlewares.dozzle-auth.basicauth.users=${DOZZLE_USERNAME?}:${DOZZLE_HASHED_PASSWORD?}" + - "flame.type=app" + - "flame.name=Dozzle" + - "flame.url=https://${DOZZLE_HOSTNAME?}" + healthcheck: + test: ["CMD", "/dozzle", "healthcheck"] + interval: 3s + timeout: 30s + retries: 5 + start_period: 30s diff --git a/apps/flame/.env b/apps/flame/.env new file mode 100644 index 0000000..dd35d70 --- /dev/null +++ b/apps/flame/.env @@ -0,0 +1,12 @@ +# Flame is one of the start page services included in this template. The other is honey. I recommend honey. + +# Flame has the benefit of coming preconfigured with the services in this template and having more features, but honey has a nicer UI +# and is better for a start page to access our services. + + +# The domain to access flame at. I set the hostname for my start page to the root of my domain (e.g. example.com) +# but you can set it to a subdomain if you want. +FLAME_HOSTNAME= +# The password for logging in to flame. +# Flame is protected by Authelia, so this isn't necessary, but it is not possible to disable the password for flame. +PASSWORD= diff --git a/apps/flame/compose.yaml b/apps/flame/compose.yaml new file mode 100644 index 0000000..40e8482 --- /dev/null +++ b/apps/flame/compose.yaml @@ -0,0 +1,19 @@ +services: + # Start page for your server + flame: + image: pawelmalak/flame:multiarch + container_name: flame + restart: unless-stopped + expose: + - 5005 + env_file: + - .env + labels: + - "traefik.enable=true" + - "traefik.http.routers.flame.rule=Host(`${FLAME_HOSTNAME?}`)" + - "traefik.http.routers.flame.entrypoints=websecure" + - "traefik.http.routers.flame.tls.certresolver=letsencrypt" + - "traefik.http.routers.flame.middlewares=authelia@docker" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ${DOCKER_DATA_DIR:-.}/flame:/app/data diff --git a/apps/gluetun/.env b/apps/gluetun/.env new file mode 100644 index 0000000..7729484 --- /dev/null +++ b/apps/gluetun/.env @@ -0,0 +1,29 @@ +# This file is used to configure the gluetun container. +# It is currently setup for ProtonVPN, as it is free. If you would like to configure gluetun +# for another provider, please see the Gluetun wiki: https://github.com/qdm12/gluetun-wiki/tree/main/setup/providers + +VPN_SERVICE_PROVIDER=protonvpn +SERVER_COUNTRIES=Netherlands +# If you are using a paid ProtonVPN account, you can set this to true to only use free servers. +FREE_ONLY=true +# Server list updater +# See https://github.com/qdm12/gluetun-wiki/blob/main/setup/servers.md#update-the-vpn-servers-list +UPDATER_PERIOD=24h + +# VPN Authentication +# If you want to use WireGuard, you will need the wireguard private key. +# Follow this guide: https://protonvpn.com/support/wireguard-configurations/ +# Or obtain it directly from here: https://account.proton.me/u/0/vpn/WireGuard + +VPN_TYPE=wireguard +WIREGUARD_PRIVATE_KEY= + +# If you want to use OpenVPN, you need the OpenVPN username specific to your ProtonVPN account. +# Change the VPN_TYPE to openvpn and set the username and password below. +# Get the credentials from here: https://account.proton.me/u/0/vpn/OpenVpnIKEv2 +# OPENVPN_USER= +# OPENVPN_PASSWORD= +# + + +# With this setup, you can now use gluetun:8080 as a HTTP/SOCKS5 proxy. diff --git a/apps/gluetun/compose.yaml b/apps/gluetun/compose.yaml new file mode 100644 index 0000000..99d0a22 --- /dev/null +++ b/apps/gluetun/compose.yaml @@ -0,0 +1,38 @@ +services: + gluetun: + image: qmcgaw/gluetun + container_name: gluetun + restart: unless-stopped + cap_add: + - NET_ADMIN + devices: + - /dev/net/tun:/dev/net/tun + env_file: + - .env + volumes: + - ${DOCKER_DATA_DIR}/gluetun:/gluetun + healthcheck: + test: ["CMD", "/gluetun-entrypoint", "healthcheck"] + interval: 60s + timeout: 5s + retries: 3 + start_period: 1m + profiles: + - gluetun + - all + + # Use Gost as a proxy because its better. + gost: + image: ginuerzh/gost + container_name: gost + restart: unless-stopped + network_mode: service:gluetun + command: "-L :8080" + depends_on: + gluetun: + condition: service_healthy + profiles: + - gluetun + - all + + diff --git a/apps/honey/.env b/apps/honey/.env new file mode 100644 index 0000000..5d3c085 --- /dev/null +++ b/apps/honey/.env @@ -0,0 +1,5 @@ +# Honey is one of the start page services included in this template. The other is flame. I recommend honey. + +# The domain to access honey at. I set the hostname for my start page to the root of my domain (e.g. example.com) +# but you can set it to a subdomain if you want. +HONEY_HOSTNAME= \ No newline at end of file diff --git a/apps/honey/compose.yaml b/apps/honey/compose.yaml new file mode 100644 index 0000000..c9f22d6 --- /dev/null +++ b/apps/honey/compose.yaml @@ -0,0 +1,20 @@ +services: + honey: + image: ghcr.io/dani3l0/honey:latest + container_name: honey + restart: unless-stopped + user: $PUID:$PGID + volumes: + - ${DOCKER_DATA_DIR}/honey:/app/dist/config + - ${DOCKER_DATA_DIR}/honey/img:/app/dist/img/custom + expose: + - 4173 + labels: + - "traefik.enable=true" + - "traefik.http.routers.honey.rule=Host(`${HONEY_HOSTNAME?}`)" + - "traefik.http.routers.honey.entrypoints=websecure" + - "traefik.http.routers.honey.tls.certresolver=letsencrypt" + - "traefik.http.routers.honey.middlewares=authelia@docker" + - "flame.type=app" + - "flame.name=Honey" + - "flame.url=https://${HONEY_HOSTNAME?}" diff --git a/apps/jackett/.env b/apps/jackett/.env new file mode 100644 index 0000000..3515d5f --- /dev/null +++ b/apps/jackett/.env @@ -0,0 +1 @@ +JACKETT_HOSTNAME= diff --git a/apps/jackett/compose.yaml b/apps/jackett/compose.yaml new file mode 100644 index 0000000..8364341 --- /dev/null +++ b/apps/jackett/compose.yaml @@ -0,0 +1,33 @@ +services: + jackett: + image: linuxserver/jackett:latest + container_name: jackett + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ:-UTC} + expose: + - 9117 + volumes: + - ${DOCKER_DATA_DIR}/jackett:/config + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.jackett.rule=Host(`${JACKETT_HOSTNAME?}`)" + - "traefik.http.routers.jackett.entrypoints=websecure" + - "traefik.http.routers.jackett.tls.certresolver=letsencrypt" + - "traefik.http.routers.jackett.middlewares=authelia@docker" + - "flame.type=app" + - "flame.name=Jackett" + - "flame.url=https://${JACKETT_HOSTNAME}" + healthcheck: + test: curl -f http://localhost:9117/health + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + profiles: + - jackett + - stremio + - all + - indexers diff --git a/apps/jackettio/.env b/apps/jackettio/.env new file mode 100644 index 0000000..008aab3 --- /dev/null +++ b/apps/jackettio/.env @@ -0,0 +1,8 @@ +JACKETTIO_HOSTNAME= + +# Jackett instance details. If you haven't run your instance yet, you can leave these blank. +# Once jackett is running you can find the API key in the web UI at the top right corner of the page. +JACKETT_URL=http://jackett:9117 +JACKETT_API_KEY= +# https://www.themoviedb.org/settings/api +TMDB_ACCESS_TOKEN= diff --git a/apps/jackettio/compose.yaml b/apps/jackettio/compose.yaml new file mode 100644 index 0000000..3dee014 --- /dev/null +++ b/apps/jackettio/compose.yaml @@ -0,0 +1,25 @@ +services: + jackettio: + image: arvida42/jackettio:latest + container_name: jackettio + restart: unless-stopped + user: $PUID:$PGID + expose: + - 4000 + env_file: + - .env + volumes: + - ${DOCKER_DATA_DIR}/jackettio:/data + labels: + - "traefik.enable=true" + - "traefik.http.routers.jackettio.rule=Host(`${JACKETTIO_HOSTNAME?}`)" + - "traefik.http.routers.jackettio.entrypoints=websecure" + - "traefik.http.routers.jackettio.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Jackettio" + - "flame.url=https://${JACKETTIO_HOSTNAME}" + profiles: + - jackettio + - stremio + - all + diff --git a/apps/jellyfin/.env b/apps/jellyfin/.env new file mode 100644 index 0000000..91c9e0c --- /dev/null +++ b/apps/jellyfin/.env @@ -0,0 +1 @@ +JELLYFIN_HOSTNAME= diff --git a/apps/jellyfin/compose.yaml b/apps/jellyfin/compose.yaml new file mode 100644 index 0000000..5b96cc2 --- /dev/null +++ b/apps/jellyfin/compose.yaml @@ -0,0 +1,29 @@ +services: + jellyfin: + image: lscr.io/linuxserver/jellyfin:latest + restart: unless-stopped + container_name: jellyfin + expose: + - 8096 + environment: + - TZ=${TZ:-UTC} + - PUID=${PUID} + - PGID=${PGID} + volumes: + - ${DOCKER_DATA_DIR}/jellyfin:/config + - /mnt:/mnt + labels: + - "traefik.enable=true" + - "traefik.http.routers.jellyfin.rule=Host(`${JELLYFIN_HOSTNAME}`)" + - "traefik.http.routers.jellyfin.tls=true" + - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" + - "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Jellyfin" + - "flame.url=https://${JELLYFIN_HOSTNAME}" + depends_on: + - rclone + profiles: + - jellyfin + - debrid_media_server + - all diff --git a/apps/jellyseer/.env b/apps/jellyseer/.env new file mode 100644 index 0000000..f4d1948 --- /dev/null +++ b/apps/jellyseer/.env @@ -0,0 +1 @@ +JELLYSEER_HOSTNAME= diff --git a/apps/jellyseer/compose.yaml b/apps/jellyseer/compose.yaml new file mode 100644 index 0000000..05a5e80 --- /dev/null +++ b/apps/jellyseer/compose.yaml @@ -0,0 +1,26 @@ +services: + jellyseer: + image: fallenbagel/jellyseerr:latest + container_name: jellyseer + restart: unless-stopped + expose: + - 5055 + environment: + - TZ=${TZ:-UTC} + - LOG_LEVEL=debug + labels: + - "traefik.enable=true" + - "traefik.http.routers.jellyseer.rule=Host(`${JELLYSEER_HOSTNAME}`)" + - "traefik.http.routers.jellyseer.entrypoints=websecure" + - "traefik.http.routers.jellyseer.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Jellyseer" + - "flame.url=https://${JELLYSEER_HOSTNAME}" + volumes: + - ${DOCKER_DATA_DIR}/jellyseer:/app/config + depends_on: + - rclone + profiles: + - jellyseer + - debrid_media_server + - all diff --git a/apps/mediaflow-proxy/.env b/apps/mediaflow-proxy/.env new file mode 100644 index 0000000..541794c --- /dev/null +++ b/apps/mediaflow-proxy/.env @@ -0,0 +1,5 @@ +MEDIAFLOW_HOSTNAME= + +API_PASSWORD= +PROXY_URL=http://warp:1080 +TRANSPORT_ROUTES="{ "https://torrentio.strem.fun": { "proxy": true } }" diff --git a/apps/mediaflow-proxy/compose.yaml b/apps/mediaflow-proxy/compose.yaml new file mode 100644 index 0000000..6bc252e --- /dev/null +++ b/apps/mediaflow-proxy/compose.yaml @@ -0,0 +1,27 @@ +services: + mediaflow-proxy: + image: mhdzumair/mediaflow-proxy + container_name: mediaflow-proxy + restart: unless-stopped + expose: + - 8888 + env_file: + - .env + labels: + - "traefik.enable=true" + - "traefik.http.routers.mediaflow.rule=Host(`${MEDIAFLOW_HOSTNAME}`)" + - "traefik.http.routers.mediaflow.entrypoints=websecure" + - "traefik.http.routers.mediaflow.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=MediaFlow Proxy" + - "flame.url=https://${MEDIAFLOW_HOSTNAME}" + healthcheck: + test: python3 -c "import urllib.request; print(urllib.request.urlopen('http://127.0.0.1:8888/health').read().decode())" + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - mediaflow-proxy + - stremio + - all diff --git a/data/mediafusion/.env b/apps/mediafusion/.env similarity index 57% rename from data/mediafusion/.env rename to apps/mediafusion/.env index 2279be6..027bca1 100644 --- a/data/mediafusion/.env +++ b/apps/mediafusion/.env @@ -1,12 +1,28 @@ -# this file should be placed in ./data/mediafusion/.env +# __| |_____________________________________________________________________________________| |__ +# __ _____________________________________________________________________________________ __ +# | | | | +# | |███╗ ███╗███████╗██████╗ ██╗ █████╗ ███████╗██╗ ██╗███████╗██╗ ██████╗ ███╗ ██╗| | +# | |████╗ ████║██╔════╝██╔══██╗██║██╔══██╗██╔════╝██║ ██║██╔════╝██║██╔═══██╗████╗ ██║| | +# | |██╔████╔██║█████╗ ██║ ██║██║███████║█████╗ ██║ ██║███████╗██║██║ ██║██╔██╗ ██║| | +# | |██║╚██╔╝██║██╔══╝ ██║ ██║██║██╔══██║██╔══╝ ██║ ██║╚════██║██║██║ ██║██║╚██╗██║| | +# | |██║ ╚═╝ ██║███████╗██████╔╝██║██║ ██║██║ ╚██████╔╝███████║██║╚██████╔╝██║ ╚████║| | +# | |╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═══╝| | +# __| |_____________________________________________________________________________________| |__ +# __ _____________________________________________________________________________________ __ +# | | | | + + +MEDIAFUSION_HOSTNAME= # ======================================================== # CORE APPLICATION SETTINGS # ======================================================== HOST_URL=https://${MEDIAFUSION_HOSTNAME} POSTER_HOST_URL=https://${MEDIAFUSION_HOSTNAME} -SECRET_KEY=${MEDIAFUSION_SECRET_KEY} # openssl rand -hex 32 -API_PASSWORD=${MEDIAFUSION_API_PASSWORD} # random password for API +# # openssl rand -hex 32 +SECRET_KEY= +# random password for API +API_PASSWORD= METADATA_PRIMARY_SOURCE=tmdb # ======================================================== @@ -20,13 +36,14 @@ REDIS_URL=redis://redis:6379 # ======================================================== REQUESTS_PROXY_URL=http://warp:1080 FLARESOLVERR_URL=http://byparr:8191 -TMDB_API_KEY=${TMDB_API_KEY} # https://www.themoviedb.org/settings/api +# https://www.themoviedb.org/settings/api +TMDB_API_KEY= # ======================================================== # PROWLARR SETTINGS # ======================================================== -IS_SCRAP_FROM_PROWLARR=True -PROWLARR_API_KEY=${PROWLARR_API_KEY:-} +IS_SCRAP_FROM_PROWLARR=False +PROWLARR_API_KEY= PROWLARR_URL=http://prowlarr:9696 PROWLARR_IMMEDIATE_MAX_PROCESS=30 PROWLARR_IMMEDIATE_MAX_PROCESS_TIME=120 @@ -37,9 +54,9 @@ PROWLARR_LIVE_TITLE_SEARCH=true # ======================================================== # JACKETT SETTINGS # ======================================================== -IS_SCRAP_FROM_JACKETT=True +IS_SCRAP_FROM_JACKETT=False JACKETT_URL=http://jackett:9117 -JACKETT_API_KEY=${JACKETT_API_KEY:-} +JACKETT_API_KEY= JACKETT_IMMEDIATE_MAX_PROCESS=30 JACKETT_IMMEDIATE_MAX_PROCESS_TIME=120 JACKETT_SEARCH_INTERVAL_HOUR=24 diff --git a/apps/mediafusion/compose.yaml b/apps/mediafusion/compose.yaml new file mode 100644 index 0000000..f281289 --- /dev/null +++ b/apps/mediafusion/compose.yaml @@ -0,0 +1,99 @@ +services: + mediafusion: + image: mhdzumair/mediafusion:latest + container_name: mediafusion + restart: unless-stopped + expose: + - 8000 + env_file: + - .env + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + depends_on: + mediafusion_mongodb: + condition: service_healthy + mediafusion_redis: + condition: service_healthy + labels: + - "traefik.enable=true" + - "traefik.http.routers.mediafusion.rule=Host(`${MEDIAFUSION_HOSTNAME?}`)" + - "traefik.http.routers.mediafusion.entrypoints=websecure" + - "traefik.http.routers.mediafusion.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=MediaFusion" + - "flame.url=https://${MEDIAFUSION_HOSTNAME?}" + profiles: + - mediafusion + - stremio + - all + + mediafusion_scheduler: + image: mhdzumair/mediafusion:latest + container_name: mediafusion_scheduler + command: ["dramatiq", "api.task", "-p", "1", "-t", "4"] + restart: unless-stopped + env_file: + - .env + depends_on: + mediafusion_mongodb: + condition: service_healthy + mediafusion_redis: + condition: service_healthy + profiles: + - mediafusion + - stremio + - all + + browserless: + image: ghcr.io/browserless/chromium + container_name: browserless + environment: + - TIMEOUT=-1 + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/json/version"] + interval: 30s + timeout: 10s + retries: 3 + profiles: + - mediafusion + - stremio + - all + + mediafusion_mongodb: + image: mongo:latest + container_name: mediafusion_mongodb + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/mediafusion/db:/data/db + healthcheck: + test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet + interval: 10s + timeout: 10s + retries: 5 + start_period: 40s + profiles: + - mediafusion + - stremio + - all + + mediafusion_redis: + image: redis:latest + container_name: mediafusion_redis + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/mediafusion/cache:/data + command: redis-server --appendonly yes --save 60 1 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + profiles: + - mediafusion + - stremio + - all diff --git a/apps/minecraft/.env b/apps/minecraft/.env new file mode 100644 index 0000000..a329485 --- /dev/null +++ b/apps/minecraft/.env @@ -0,0 +1,54 @@ +# --------------------------------------------------------- +# MINECRAFT +# --------------------------------------------------------- +# Profiles: minecraft, all +# +# Although I will provide some environment variables for configuration here, +# You should use https://setupmc.com/java-server/ to generate the configuration for your Minecraft server if you +# want to add mods/plugins/modpacks +# +# Just remember to add back the container_name and change the volume to - ${DOCKER_DATA_DIR}/minecraft:/data +# You should also add back the profiles if you still want the minecraft service to integrate with the profiles of the compose.yaml file. +# +# 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. +# Your MINECRAFT_SERVER_WHITELIST should be a comma separated list of the usernames that you want to whitelist. +# +# The MOTD is the message that will be displayed when you hover over the server in the server list. +# +# MINECRAFT_SERVER_MEMORY is the amount of memory that you want to allocate to the server. I recommmend at least 8G, but if +# you don't have that much memory, you can reduce it. +# +# I've set the paper server type as the default, but you can change it to spigot or vanilla if you want. +# Paper is a heavily improved version of Spigot, with better performance and more features, and no downsides. +# I do not recommend changing this unless you know what you are doing. +# +# The view distance is the number of chunks that the server will load around each player. +# The higher the view distance, the more resources the server will use. +# If you lack memory/resources, you can reduce this value. +# +# MINECRAFT_SERVER_OP allows you to set the username of the player that will be given operator permissions. +# If you would like to add more operators, please edit the compose.yaml file and add them there on a new line. +# +# _______________________________________________________ +# +# !!!! IMPORTANT - PORT AND DNS SETUP !!!! +# _______________________________________________________ +# +# For you to access the Minecraft server, you will need to open the port 25565 on your server. +# You will use the public IP address of your server to connect to the Minecraft server. +# +# 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. +# +# You must first have an A record for the subdomain pointing to your server's IP address. +# If you have a wildcard DNS record, you do not need to do this. Though, it does mean +# that all subdomains will point to your server. +# --------------------------------------------------------- +MINECRAFT_SERVER_ICON= +MINECRAFT_SERVER_OVERRIDE_ICON=false +MINECRAFT_SERVER_MOTD= +MINECRAFT_SERVER_OP= +MINECRAFT_SERVER_MEMORY=8G +MINECRAFT_SERVER_TYPE=PAPER +MINECRAFT_SERVER_VIEW_DISTANCE=16 +MINECRAFT_SERVRE_ENABLE_WHITELIST=false +MINECRAFT_SERVER_WHITELIST= diff --git a/apps/minecraft/compose.yaml b/apps/minecraft/compose.yaml new file mode 100644 index 0000000..c896786 --- /dev/null +++ b/apps/minecraft/compose.yaml @@ -0,0 +1,30 @@ +services: + minecraft: + image: itzg/minecraft-server:latest + tty: true + stdin_open: true + container_name: minecraft + ports: + - "25565:25565" + environment: + UID: ${PUID} + PGID: ${PGID} + EULA: "TRUE" + TYPE: ${MINECRAFT_SERVER_TYPE:-PAPER} + MEMORY: ${MINECRAFT_SERVER_MEMORY:-8G} + MOTD: ${MINECRAFT_SERVER_MOTD:-"A Minecraft Server"} + OVERRIDE_ICON: ${MINECRAFT_SERVER_OVERRIDE_ICON:-} + ICON: ${MINECRAFT_SERVER_ICON:-} + USE_AIKAR_FLAGS: "TRUE" + TZ: ${TZ:-UTC} + DIFFICULTY: "2" + VIEW_DISTANCE: ${MINECRAFT_SERVER_VIEW_DISTANCE:-10} + OPS: |- + ${MINECRAFT_SERVER_OP:-} + ENABLE_WHITE_LIST: ${MINECRAFT_SERVER_ENABLE_WHITE_LIST:-false} + WHITELIST: ${MINECRAFT_SERVER_WHITELIST:-} + volumes: + - "${DOCKER_DATA_DIR}/minecraft:/data" + profiles: + - minecraft + - all diff --git a/apps/nzbhydra2/.env b/apps/nzbhydra2/.env new file mode 100644 index 0000000..38fecb2 --- /dev/null +++ b/apps/nzbhydra2/.env @@ -0,0 +1 @@ +NZBHYDRA2_HOSTNAME= diff --git a/apps/nzbhydra2/compose.yaml b/apps/nzbhydra2/compose.yaml new file mode 100644 index 0000000..32cdf2a --- /dev/null +++ b/apps/nzbhydra2/compose.yaml @@ -0,0 +1,26 @@ +services: + nzbhydra2: + image: ghcr.io/hotio/nzbhydra2:latest + container_name: nzbhydra2 + restart: unless-stopped + expose: + - 5076 + environment: + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + - TZ=${TZ:-UTC} + volumes: + - ${DOCKER_DATA_DIR}/nzbhydra:/config + labels: + - "traefik.enable=true" + - "traefik.http.routers.nzbhydra2.rule=Host(`${NZBHYDRA2_HOSTNAME?}`)" + - "traefik.http.routers.nzbhydra2.entrypoints=websecure" + - "traefik.http.routers.nzbhydra2.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=NZBHydra2" + - "flame.url=https://${NZBHYDRA2_HOSTNAME}" + profiles: + - nzbhydra2 + - all + - indexers diff --git a/apps/omg-tv-addon/.env b/apps/omg-tv-addon/.env new file mode 100644 index 0000000..e7b039a --- /dev/null +++ b/apps/omg-tv-addon/.env @@ -0,0 +1 @@ +OMG_TV_STREMIO_ADDON_HOSTNAME= diff --git a/apps/omg-tv-addon/compose.yaml b/apps/omg-tv-addon/compose.yaml new file mode 100644 index 0000000..98d79ff --- /dev/null +++ b/apps/omg-tv-addon/compose.yaml @@ -0,0 +1,26 @@ +services: + omg-tv-stremio-addon: + build: + context: https://github.com/mccoy88f/OMG-Premium-TV.git + dockerfile: Dockerfile + image: omg-tv-stremio-addon + container_name: omg-tv-stremio-addon + restart: unless-stopped + expose: + - 7860 + environment: + - PORT=7860 + - HOST=0.0.0.0 + labels: + - "traefik.enable=true" + - "traefik.http.routers.omg-tv-stremio-addon.rule=Host(`${OMG_TV_STREMIO_ADDON_HOSTNAME?}`)" + - "traefik.http.routers.omg-tv-stremio-addon.entrypoints=websecure" + - "traefik.http.routers.omg-tv-stremio-addon.tls.certresolver=letsencrypt" + - "traefik.http.services.omg-tv-stremio-addon.loadbalancer.server.port=7860" + - "flame.type=app" + - "flame.name=OMG TV Stremio Addon" + - "flame.url=https://${OMG_TV_STREMIO_ADDON_HOSTNAME}" + profiles: + - omg-tv-stremio-addon + - stremio + - all diff --git a/apps/overseerr/.env b/apps/overseerr/.env new file mode 100644 index 0000000..0272dd9 --- /dev/null +++ b/apps/overseerr/.env @@ -0,0 +1 @@ +OVERSEERR_HOSTNAME= diff --git a/apps/overseerr/compose.yaml b/apps/overseerr/compose.yaml new file mode 100644 index 0000000..6d52b2f --- /dev/null +++ b/apps/overseerr/compose.yaml @@ -0,0 +1,22 @@ +services: + overseerr: + image: sctx/overseerr:latest + container_name: overseerr + restart: unless-stopped + environment: + - LOG_LEVEL=debug + - TZ=${TZ:-UTC} + - PORT=5055 + expose: + - 5055 + labels: + - "traefik.enable=true" + - "traefik.http.routers.overseerr.rule=Host(`${OVERSEERR_HOSTNAME?}`)" + - "traefik.http.routers.overseerr.entrypoints=websecure" + - "traefik.http.routers.overseerr.tls.certresolver=letsencrypt" + volumes: + - ${DOCKER_DATA_DIR}/overseerr:/app/config + profiles: + - overseerr + - debrid_media_server + - all diff --git a/apps/plausible/.env b/apps/plausible/.env new file mode 100644 index 0000000..c2fa7f8 --- /dev/null +++ b/apps/plausible/.env @@ -0,0 +1,16 @@ +# --------------------------------------------------------- +# PLAUSIBLE +# --------------------------------------------------------- +# Profiles: plausible, all +# +# The PLAUSIBLE_SECRET_KEY_BASE is a secret key that you can generate using the following command: +# openssl rand -base64 48 +# --------------------------------------------------------- + +PLAUSIBLE_HOSTNAME= +PLAUSIBLE_SECRET_KEY_BASE= + +# 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. +# To fix it, run the following command: +# sudo chown -R 999:70 ${DOCKER_DATA_DIR}/plausible/data + diff --git a/apps/plausible/compose.yaml b/apps/plausible/compose.yaml new file mode 100644 index 0000000..a4a1c90 --- /dev/null +++ b/apps/plausible/compose.yaml @@ -0,0 +1,77 @@ +services: + plausible: + image: ghcr.io/plausible/community-edition:latest + container_name: plausible + restart: unless-stopped + command: sh -c "/entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" + ulimits: + nofile: + soft: 65535 + hard: 65535 + expose: + - 8000 + environment: + TMPDIR: /var/lib/plausible/tmp + BASE_URL: https://${PLAUSIBLE_HOSTNAME?} + SECRET_KEY_BASE: ${PLAUSIBLE_SECRET_KEY_BASE?} + HTTP_PORT: 8000 + DATABASE_URL: "postgres://plausible:plausible@plausible_postgres:5432/plausible" + CLICKHOUSE_DATABASE_URL: "http://plausible_clickhouse:8123/plausible_events_db" + labels: + - "traefik.enable=true" + - "traefik.http.routers.plausible.rule=Host(`${PLAUSIBLE_HOSTNAME}`)" + - "traefik.http.routers.plausible.entrypoints=websecure" + - "traefik.http.routers.plausible.tls.certresolver=letsencrypt" + - "traefik.http.services.plausible.loadbalancer.server.port=8000" + - "flame.type=app" + - "flame.name=Plausible" + - "flame.url=https://${PLAUSIBLE_HOSTNAME}" + volumes: + - ${DOCKER_DATA_DIR}/plausible/data:/var/lib/plausible + depends_on: + plausible_postgres: + condition: service_healthy + plausible_clickhouse: + condition: service_healthy + profiles: + - plausible + - all + + plausible_clickhouse: + image: clickhouse/clickhouse-server:24.3.3.102-alpine + restart: unless-stopped + container_name: plausible_clickhouse + volumes: + - ${DOCKER_DATA_DIR}/plausible/clickhouse/db:/var/lib/clickhouse + - ${DOCKER_DATA_DIR}/plausible/clickhouse/logs:/var/log/clickhouse-server + - ${DOCKER_DATA_DIR}/plausible/clickhouse/logs.xml:/etc/clickhouse-server/config.d/logs.xml:ro + - ${DOCKER_DATA_DIR}/plausible/clickhouse/ipv4-only.xml:/etc/clickhouse-server/config.d/ipv4-only.xml:ro + - ${DOCKER_DATA_DIR}/plausible/clickhouse/low-resources.xml:/etc/clickhouse-server/config.d/low-resources.xml:ro + ulimits: + nofile: + soft: 262144 + hard: 262144 + healthcheck: + test: ["CMD-SHELL", "wget --no-verbose --tries=1 -O - http://127.0.0.1:8123/ping || exit 1"] + start_period: 1m + profiles: + - plausible + - all + + plausible_postgres: + image: postgres:16-alpine + restart: unless-stopped + container_name: plausible_postgres + volumes: + - ${DOCKER_DATA_DIR}/plausible/postgres:/var/lib/postgresql/data + environment: + POSTGRES_USER: plausible + POSTGRES_PASSWORD: plausible + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + start_period: 1m + profiles: + - plausible + - all + + diff --git a/apps/plex/.env b/apps/plex/.env new file mode 100644 index 0000000..1b2aec3 --- /dev/null +++ b/apps/plex/.env @@ -0,0 +1,15 @@ +PLEX_HOSTNAME= + +# Claim token for Plex. You can get it from https://www.plex.tv/claim +# It is only valid for 5 minutes, so after generating one, you must set it here and start your container. +# For the inital setup, you may need to have port 32400 open to access the web interface through the server IP, rather +# than through the hostname. i.e. http://:32400 +# Once the setup is complete, you can use the hostname to access the web interface. +PLEX_CLAIM= + + +# Note: If you decide to use west's plex requests, you will have to disable traefik from here +# (or leave it enabled through a different domain) +# You can do this by setting the PLEX_TRAEFIK variable to false. +# You would then enable traefik for plex_requests_nginx +PLEX_TRAEFIK_ENABLE=true diff --git a/apps/plex/compose.yaml b/apps/plex/compose.yaml new file mode 100644 index 0000000..7443f4b --- /dev/null +++ b/apps/plex/compose.yaml @@ -0,0 +1,45 @@ +services: + plex: + image: plexinc/pms-docker:latest + container_name: plex + restart: unless-stopped + ports: + - 1900/udp + - "32400:32400/tcp" + - 32410/udp + - 32412/udp + - 32413/udp + - 32414/udp + - 32469/tcp + - 8324/tcp + expose: + - 32400 + environment: + - PLEX_UID=${PUID} + - PLEX_GID=${PGID} + - PLEX_CLAIM=${PLEX_CLAIM} + - TZ=${TZ:-UTC} + volumes: + - /dev/shm:/dev/shm + - ${DOCKER_DATA_DIR}/plex/transcodes:/transcode + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/plex/config:/config + labels: + - "traefik.enable=${PLEX_TRAEFIK_ENABLE:-true}" + - "traefik.http.routers.plex.rule=Host(`${PLEX_HOSTNAME?}`)" + - "traefik.http.routers.plex.entrypoints=websecure" + - "traefik.http.routers.plex.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Plex" + - "flame.url=https://${PLEX_HOSTNAME}" + healthcheck: + test: curl --connect-timeout 15 --silent --show-error --fail http://localhost:32400/identity + interval: 1m + timeout: 15s + retries: 3 + start_period: 1m + depends_on: + - rclone + profiles: + - plex + - debrid_media_server diff --git a/apps/prowlarr/.env b/apps/prowlarr/.env new file mode 100644 index 0000000..86dd72e --- /dev/null +++ b/apps/prowlarr/.env @@ -0,0 +1 @@ +PROWLARR_HOSTNAME= diff --git a/apps/prowlarr/compose.yaml b/apps/prowlarr/compose.yaml new file mode 100644 index 0000000..7017485 --- /dev/null +++ b/apps/prowlarr/compose.yaml @@ -0,0 +1,31 @@ +services: + prowlarr: + image: ghcr.io/hotio/prowlarr:latest + container_name: prowlarr + environment: + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + - TZ=${TZ:-UTC} + expose: + - 9696 + volumes: + - ${DOCKER_DATA_DIR}/prowlarr/config:/config + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.prowlarr.rule=Host(`${PROWLARR_HOSTNAME?}`)" + - "traefik.http.routers.prowlarr.entrypoints=websecure" + - "traefik.http.routers.prowlarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.prowlarr.middlewares=authelia@docker" + healthcheck: + test: curl -f http://localhost:9696/ping + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + profiles: + - prowlarr + - stremio + - debrid_media_server + - all diff --git a/apps/radarr/.env b/apps/radarr/.env new file mode 100644 index 0000000..dfa3eda --- /dev/null +++ b/apps/radarr/.env @@ -0,0 +1,3 @@ +RADARR_HOSTNAME= +RADARR4K_HOSTNAME= +RADARRANIME_HOSTNAME= diff --git a/apps/radarr/compose.yaml b/apps/radarr/compose.yaml new file mode 100644 index 0000000..a34fefe --- /dev/null +++ b/apps/radarr/compose.yaml @@ -0,0 +1,109 @@ +services: + radarr: + container_name: radarr + environment: + - PUID=${PUID} + - PGID=${PGID} + expose: + - 7878 + image: ghcr.io/hotio/radarr:release + restart: unless-stopped + volumes: + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/radarr/default/:/config + - /usr/bin/rclone:/usr/bin/rclone + labels: + - "traefik.enable=true" + - "traefik.http.routers.radarr.rule=Host(`${RADARR_HOSTNAME}`)" + - "traefik.http.routers.radarr.entrypoints=websecure" + - "traefik.http.routers.radarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.radarr.middlewares=authelia@docker" + - "traefik.http.services.radarr.loadbalancer.server.port=7878" + - "flame.type=app" + - "flame.name=Radarr" + - "flame.url=https://${RADARR_HOSTNAME}" + depends_on: + - rclone + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - debrid_media_server + - radarr + - all + + + radarr4k: + container_name: radarr4k + expose: + - 7878 + environment: + - PUID=${PUID} + - PGID=${PGID} + image: ghcr.io/hotio/radarr:release + restart: unless-stopped + volumes: + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/radarr/4k:/config + - /usr/bin/rclone:/usr/bin/rclone + labels: + - "traefik.enable=true" + - "traefik.http.routers.radarr4k.rule=Host(`${RADARR4K_HOSTNAME}`)" + - "traefik.http.routers.radarr4k.entrypoints=websecure" + - "traefik.http.routers.radarr4k.tls.certresolver=letsencrypt" + - "traefik.http.routers.radarr4k.middlewares=authelia@docker" + - "traefik.http.services.radarr4k.loadbalancer.server.port=7878" + - "flame.type=app" + - "flame.name=Radarr4k" + - "flame.url=https://${RADARR4K_HOSTNAME}" + depends_on: + - rclone + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - debrid_media_server + - radarr + - all + + radarranime: + container_name: radarranime + expose: + - 7878 + image: ghcr.io/hotio/radarr:release + environment: + - PUID=${PUID} + - PGID=${PGID} + restart: unless-stopped + volumes: + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/radarr/anime:/config + - /usr/bin/rclone:/usr/bin/rclone + labels: + - "traefik.enable=true" + - "traefik.http.routers.radarranime.rule=Host(`${RADARRANIME_HOSTNAME}`)" + - "traefik.http.routers.radarranime.entrypoints=websecure" + - "traefik.http.routers.radarranime.tls.certresolver=letsencrypt" + - "traefik.http.routers.radarranime.middlewares=authelia@docker" + - "traefik.http.services.radarranime.loadbalancer.server.port=7878" + - "flame.type=app" + - "flame.name=RadarrAnime" + - "flame.url=https://${RADARRANIME_HOSTNAME}" + depends_on: + - rclone + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - debrid_media_server + - radarr + - all diff --git a/apps/realdebrid-account-monitor/.env b/apps/realdebrid-account-monitor/.env new file mode 100644 index 0000000..702a7ad --- /dev/null +++ b/apps/realdebrid-account-monitor/.env @@ -0,0 +1,11 @@ +# This is a service that allows you to monitor your real debrid accounts and traffic. + +# A list of your real debrid api keys. e.g. ["key1", "key2"] +# You can get your api key from https://real-debrid.com/apitoken +TOKENS=[] +# How often to check the accounts for traffic. This is a cron schedule. +# e.g. every hour: 0 * * * * +CRON_SCHEDULE='0 * * * *' + + +# Note: this is built from a python file included in the template, so you can modify it to do whatever you want \ No newline at end of file diff --git a/apps/realdebrid-account-monitor/Dockerfile b/apps/realdebrid-account-monitor/Dockerfile new file mode 100644 index 0000000..540ac74 --- /dev/null +++ b/apps/realdebrid-account-monitor/Dockerfile @@ -0,0 +1,14 @@ +# Use an official lightweight Python image +FROM python:3.13-slim + +# Set the working directory +WORKDIR /app + +# Copy files +COPY main.py . + +# Install dependencies +RUN pip install croniter python-dotenv requests schedule + +# Command to run the script +CMD ["python", "main.py"] diff --git a/apps/realdebrid-account-monitor/compose.yaml b/apps/realdebrid-account-monitor/compose.yaml new file mode 100644 index 0000000..af41a69 --- /dev/null +++ b/apps/realdebrid-account-monitor/compose.yaml @@ -0,0 +1,16 @@ +services: + rd_account_check: + build: + context: . + args: + - "--force-rm" + pull_policy: build + image: rd_account_check + container_name: rd_account_check + env_file: + - .env + volumes: + - ${DOCKER_DATA_DIR}/realdebrid-account-monitor/data:/app/data + restart: unless-stopped + + diff --git a/apps/realdebrid-account-monitor/main.py b/apps/realdebrid-account-monitor/main.py new file mode 100644 index 0000000..762eb60 --- /dev/null +++ b/apps/realdebrid-account-monitor/main.py @@ -0,0 +1,249 @@ +import requests +import schedule +import time +import datetime +import os +import logging +from dotenv import load_dotenv +from croniter import croniter +import pytz +import re + +# Configuration +load_dotenv() + +TOKENS = eval(os.getenv("TOKENS", "[]")) +BASE_API = "https://api.real-debrid.com/rest/1.0" +ENDPOINTS = {"traffic": "/traffic/details", "user": "/user"} +INTERVAL_HOURS = int(os.getenv("INTERVAL_HOURS", 1)) +INTERVAL_SECONDS = int(os.getenv("INTERVAL_SECONDS", 0)) +CRON_SCHEDULE = os.getenv("CRON_SCHEDULE", None) +REALDEBRID_TIMEZONE_STRING = "Europe/Paris" +CRONTAB_TIMEZONE_STRING = os.getenv("TZ", "UTC") +# Set up logging +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + +# time.tzset() # ensure croniter uses the correct timezone +# use Europe/Paris as the default timezone as Real-Debrid is based in France +crontab_timezone = pytz.timezone(CRONTAB_TIMEZONE_STRING) +realdebrid_timezone = pytz.timezone(REALDEBRID_TIMEZONE_STRING) + + +# set up a file to write datapoints to for traffic +TRAFFIC_FILE_PATH = os.getenv("TRAFFIC_FILE_PATH", os.path.join("data", "traffic_data.csv")) +if not os.path.exists(TRAFFIC_FILE_PATH): + os.makedirs(os.path.dirname(TRAFFIC_FILE_PATH), exist_ok=True) + with open(TRAFFIC_FILE_PATH, "w") as f: + f.write("username,datetime,traffic\n") + + +def sanitised_token(token): + # simply replace all but the first character and last 5 characters with * + return token[0] + "*" * (len(token) - 6) + token[-5:] + + +def format_bytes(bytes): + for unit in ["B", "KB", "MB", "GB", "TB"]: + if bytes < 1024: + return f"{bytes:.2f} {unit}" + bytes /= 1024 + return f"{bytes:.2f} PB" + + +def format_seconds(seconds): + # format seconds into a string like "date (x days from now)" + if seconds < 0: + return "Expired" + elif seconds < 60: + return f"{seconds} seconds" + elif seconds < 3600: + return f"{seconds // 60} minutes" + elif seconds < 86400: + return f"{seconds // 3600} hours" + elif seconds < 2592000: + return f"{seconds // 86400} days" + elif seconds < 31536000: + # return x months, y days + months = seconds // 2592000 + days = (seconds % 2592000) // 86400 + return f"{months} months, {days} days" + else: + # return x years, y months + years = seconds // 31536000 + months = (seconds % 31536000) // 2592000 + return f"{years} years, {months} months" + + +def get_traffic(token): + today = datetime.datetime.now(realdebrid_timezone).strftime("%Y-%m-%d") + params = { + "start": today, + } + try: + response = requests.get( + f"{BASE_API}{ENDPOINTS['traffic']}", + params=params, + headers={"Authorization": f"Bearer {token}"}, + ) + data = response.json() + except Exception as e: + logger.error(f"Failed to get traffic data for {sanitised_token(token)}: {e}") + return None + if response.status_code == 200: + if today in data: + traffic_bytes = data[today]["bytes"] + return traffic_bytes + elif data == []: + return 0 + else: + return None + else: + error, error_code = data.get("error", "Unknown error"), data.get("error_code", "Unknown error code") + logger.error( + f"Failed to get traffic data for {sanitised_token(token)}: {response.status_code} - {error} ({error_code}) " + ) + return None + + +def get_user_details(token): + try: + response = requests.get( + f"{BASE_API}{ENDPOINTS['user']}", + headers={"Authorization": f"Bearer {token}"}, + ) + data = response.json() + except Exception as e: + logger.error(f"Failed to get user details for {sanitised_token(token)}: {e}") + return None + if response.status_code != 200: + error, error_code = data.get("error", "Unknown error"), data.get("error_code", "Unknown error code") + logger.error( + f"Failed to get user details for {sanitised_token(token)}: {error} ({error_code})" + ) + return None + return data + + +def get_account_data(): + if len(TOKENS) == 0: + logger.error("No tokens found in configuration") + return + lines = [""] + logger.info("Checking account data for {} tokens...".format(len(TOKENS))) + for token in TOKENS: + user = get_user_details(token) + if user is None: + continue + premium = user["type"] == "premium" + if not premium: + logger.error(f"Token {sanitised_token(token)} is not a premium account") + continue + # 'premium' is seconds that the account is premium for + expires_in = user["premium"] + expiry_date = user["expiration"].split("T")[0] + traffic = get_traffic(token) + if traffic is None: + continue + # write the traffic data to a file + with open(TRAFFIC_FILE_PATH, "a") as f: + f.write(f"{user['username']},{datetime.datetime.now(realdebrid_timezone)},{traffic}\n") + + lines.append(f" {user['username']}: ") + lines.append(f" ├─ Type: {user["type"].capitalize()}") + if premium: + lines.append( + f" ├─ Premium until: {expiry_date} | {format_seconds(expires_in)} from now" + ) + lines.append(f" ├─ Traffic today: {format_bytes(traffic)}") + lines.append(f" └─ Fidelity Points: {user['points']:,}") + lines.append("") + + + time.sleep(0.5) + + return lines + +def generate_traffic_summary(): + with open(TRAFFIC_FILE_PATH, "r") as f: + lines = f.readlines() + traffic_data = {} + user_last_traffic = {} + + current_date = datetime.datetime.now(realdebrid_timezone).strftime("%Y-%m-%d") + for line in lines[1:]: + username, datetime_str, traffic = line.strip().split(",") + date_str, time_str = datetime_str.split(" ") + + if date_str == current_date: + realdebrid_datetime = datetime.datetime.fromisoformat(datetime_str) + crontab_datetime = realdebrid_datetime.astimezone(crontab_timezone) + hour = crontab_datetime.strftime("%H") + traffic_value = float(traffic.split(" ")[0]) + + # Calculate hourly traffic per user + if username in user_last_traffic: + hour_traffic = max(0, traffic_value - user_last_traffic[username]) + else: + hour_traffic = traffic_value # First occurrence, take as initial traffic + + # Update hourly traffic sum + traffic_data[hour] = traffic_data.get(hour, 0) + hour_traffic + + # Store last recorded traffic for this user + user_last_traffic[username] = traffic_value + + # Prepare output log + lines = [""] + total_traffic = 0 + lines.append(" Traffic Summary:") + for hour in sorted(traffic_data.keys()): + traffic = traffic_data[hour] + total_traffic += traffic + lines.append(f" ├─ {hour}:00 - {format_bytes(traffic)}") + lines.append(f" └─ Total Today: {format_bytes(total_traffic)}") + lines.append("") + return lines + +def print_account_summaries(): + lines = [""] + lines.extend( + [ + "=" * 60, + f"Real Debrid Account Summary - {datetime.datetime.now(crontab_timezone).strftime("%H:%M")}".center(60), + "=" * 60, + "", + ] + ) + lines.extend(get_account_data()) + lines.extend(generate_traffic_summary()) + lines.append("=" * 60) + lines.append("") + logger.info("\n".join(lines)) + +if not CRON_SCHEDULE: + if INTERVAL_HOURS: + schedule.every(INTERVAL_HOURS).hours.do(print_account_data) + elif INTERVAL_SECONDS: + schedule.every(INTERVAL_SECONDS).seconds.do(print_account_data) + + +if __name__ == "__main__": + if CRON_SCHEDULE: + base_time = datetime.datetime.now(crontab_timezone) + cron = croniter(CRON_SCHEDULE, base_time) + while True: + next_run = cron.get_next(datetime.datetime) + logger.info(f"Next run scheduled for {next_run} {CRONTAB_TIMEZONE_STRING}") + sleep_duration = (next_run - datetime.datetime.now(crontab_timezone)).total_seconds() + if sleep_duration > 0: + time.sleep(sleep_duration) + print_account_summaries() + base_time = next_run + cron = croniter(CRON_SCHEDULE, base_time) + + while not CRON_SCHEDULE and (INTERVAL_HOURS or INTERVAL_SECONDS): + schedule.run_pending() + time.sleep(1) diff --git a/apps/recyclarr/compose.yaml b/apps/recyclarr/compose.yaml new file mode 100644 index 0000000..9251140 --- /dev/null +++ b/apps/recyclarr/compose.yaml @@ -0,0 +1,21 @@ +services: + recyclarr: + image: ghcr.io/recyclarr/recyclarr:latest + container_name: recyclarr + user: $PUID:$PGID + restart: unless-stopped + environment: + - TZ=${TZ:-UTC} + volumes: + - ${DOCKER_DATA_DIR}/recyclarr:/config + depends_on: + - sonarr + - sonarr4k + - sonarranime + - radarr + - radarr4k + - radarranime + profiles: + - all + - recyclarr + - debrid_media_server diff --git a/apps/seanime/.env b/apps/seanime/.env new file mode 100644 index 0000000..6424f18 --- /dev/null +++ b/apps/seanime/.env @@ -0,0 +1,17 @@ +# --------------------------------------------------------- +# SEANIME +# --------------------------------------------------------- +# Profiles: seanime, all +# Protected by authelia. +# +# IMPORTANT: Once you have the container running, you need to edit Seanime's config.toml file in order to set the correct host. +# Run the following command to do this. +# sudo sed -i 's/127.0.0.1/0.0.0.0/' ./data/seanime/config.toml +# Then, restart the container by running `sudo docker restart seanime +# +# Note: If you are planning on using this for local media, you will not be able to use an external player +# as we have set up a password for seanime. +# --------------------------------------------------------- + +SEANIME_HOSTNAME= + diff --git a/apps/seanime/compose.yaml b/apps/seanime/compose.yaml new file mode 100644 index 0000000..ad4f7e2 --- /dev/null +++ b/apps/seanime/compose.yaml @@ -0,0 +1,30 @@ +services: + seanime: + image: umagistr/seanime + container_name: seanime + volumes: + - /mnt/user/anime:/anime + - /mnt/user/downloads:/downloads + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/seanime:/root/.config/Seanime + expose: + - 43211 + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.seanime.rule=Host(`${SEANIME_HOSTNAME?}`)" + - "traefik.http.routers.seanime.entrypoints=websecure" + - "traefik.http.routers.seanime.tls.certresolver=letsencrypt" + - "traefik.http.routers.seanime.middlewares=authelia@docker" + - "flame.type=app" + - "flame.name=Seanime" + - "flame.url=https://${SEANIME_HOSTNAME}" + healthcheck: + test: wget -qO- http://localhost:43211/api/v1/status + interval: 5m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - seanime + - all diff --git a/apps/searxng/.env b/apps/searxng/.env new file mode 100644 index 0000000..c8e5536 --- /dev/null +++ b/apps/searxng/.env @@ -0,0 +1 @@ +SEARXNG_HOSTNAME= diff --git a/apps/searxng/compose.yaml b/apps/searxng/compose.yaml new file mode 100644 index 0000000..2deeeef --- /dev/null +++ b/apps/searxng/compose.yaml @@ -0,0 +1,29 @@ +services: + searxng: + container_name: searxng + image: docker.io/searxng/searxng:latest + restart: unless-stopped + expose: + - 8080 + volumes: + - ${DOCKER_DATA_DIR}/searxng:/etc/searxng:rw + environment: + - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/ + - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4} + - UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4} + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "1" + labels: + - "traefik.enable=true" + - "traefik.http.routers.searxng.rule=Host(`${SEARXNG_HOSTNAME}`)" + - "traefik.http.routers.searxng.entrypoints=websecure" + - "traefik.http.routers.searxng.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=SearxNG" + - "flame.url=https://${SEARXNG_HOSTNAME}" + profiles: + - searxng + - all diff --git a/apps/sonarr/.env b/apps/sonarr/.env new file mode 100644 index 0000000..d4aa105 --- /dev/null +++ b/apps/sonarr/.env @@ -0,0 +1,3 @@ +SONARR_HOSTNAME= +SONARR4K_HOSTNAME= +SONARRANIME_HOSTNAME= diff --git a/apps/sonarr/compose.yaml b/apps/sonarr/compose.yaml new file mode 100644 index 0000000..29d45c9 --- /dev/null +++ b/apps/sonarr/compose.yaml @@ -0,0 +1,111 @@ +services: + sonarr: + container_name: sonarr + expose: + - 8989 + image: ghcr.io/hotio/sonarr:release + restart: unless-stopped + environment: + - PUID=${PUID} + - PGID=${PGID} + labels: + - "traefik.enable=true" + - "traefik.http.routers.sonarr.rule=Host(`${SONARR_HOSTNAME}`)" + - "traefik.http.routers.sonarr.entrypoints=websecure" + - "traefik.http.routers.sonarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.sonarr.middlewares=authelia@docker" + - "traefik.http.services.sonarr.loadbalancer.server.port=8989" + - "flame.type=app" + - "flame.name=Sonarr" + - "flame.url=https://${SONARR_HOSTNAME}" + volumes: + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/sonarr/default:/config + - /usr/bin/rclone:/usr/bin/rclone + depends_on: + - rclone + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - debrid_media_server + - all + + sonarr4k: + container_name: sonarr4k + environment: + - PUID=${PUID} + - PGID=${PGID} + expose: + - 8989 + image: ghcr.io/hotio/sonarr:release + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.sonarr4k.rule=Host(`${SONARR4K_HOSTNAME}`)" + - "traefik.http.routers.sonarr4k.entrypoints=websecure" + - "traefik.http.routers.sonarr4k.tls.certresolver=letsencrypt" + - "traefik.http.routers.sonarr4k.middlewares=authelia@docker" + - "traefik.http.services.sonarr4k.loadbalancer.server.port=8989" + - "flame.type=app" + - "flame.name=Sonarr4k" + - "flame.url=https://${SONARR4K_HOSTNAME}" + volumes: + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/sonarr/4k:/config + - /usr/bin/rclone:/usr/bin/rclone + depends_on: + - rclone + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - sonarr + - debrid_media_server + - all + + + sonarranime: + container_name: sonarranime + expose: + - 8989 + image: ghcr.io/hotio/sonarr:release + environment: + - PUID=${PUID} + - PGID=${PGID} + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.sonarranime.rule=Host(`${SONARRANIME_HOSTNAME}`)" + - "traefik.http.routers.sonarranime.entrypoints=websecure" + - "traefik.http.routers.sonarranime.tls.certresolver=letsencrypt" + - "traefik.http.routers.sonarranimej.middlewares=authelia@docker" + - "traefik.http.services.sonarranime.loadbalancer.server.port=8989" + - "flame.type=app" + - "flame.name=Sonarr Anime" + - "flame.url=https://${SONARRANIME_HOSTNAME}" + volumes: + - /mnt:/mnt + - ${DOCKER_DATA_DIR}/sonarr/anime:/config + - /usr/bin/rclone:/usr/bin/rclone + depends_on: + - sonarr + - rclone + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] + interval: 1m + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - debrid_media_server + - all + + + diff --git a/apps/stremio-catalog-providers/.env b/apps/stremio-catalog-providers/.env new file mode 100644 index 0000000..3cd0465 --- /dev/null +++ b/apps/stremio-catalog-providers/.env @@ -0,0 +1,12 @@ +STREMIO_CATALOG_PROVIDERS_HOSTNAME= + +# We need to obtain a Trakt Client ID and secret in order for the addons to work. +# To obtain these credentials: +# 1. Create an account/Log in on Trakt.tv/ (https://trakt.tv). +# 2. Go to the applications section (https://trakt.tv/oauth/applications). +# 3. Create a new application by filling in the required information (name, description, etc.). +# - For the "Redirect URL", add the following URLs (replacing the ${*_HOSTNAME} with your actual hostname): +# - https://${STREMIO_CATALOG_PROVIDERS_HOSTNAME}/callback +# +TRAKT_CLIENT_ID= +TRAKT_CLIENT_SECRET= diff --git a/apps/stremio-catalog-providers/compose.yaml b/apps/stremio-catalog-providers/compose.yaml new file mode 100644 index 0000000..93ae080 --- /dev/null +++ b/apps/stremio-catalog-providers/compose.yaml @@ -0,0 +1,86 @@ +services: + stremio-catalog-providers: + image: reddravenn/stremio-catalog-providers + container_name: stremio-catalog-providers + expose: + - 7000 + environment: + PORT: 7000 + BASE_URL: https://${STREMIO_CATALOG_PROVIDERS_HOSTNAME?} + DB_USER: postgres + DB_HOST: stremio-catalog-providers_postgres + DB_NAME: stremio_catalog_db + DB_PASSWORD: postgres + DB_PORT: 5432 + DB_MAX_CONNECTIONS: 20 + DB_IDLE_TIMEOUT: 30000 + DB_CONNECTION_TIMEOUT: 2000 + REDIS_HOST: stremio-catalog-providers_redis + REDIS_PORT: 6379 + REDIS_PASSWORD: + TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID?} + TRAKT_CLIENT_SECRET: ${TRAKT_CLIENT_SECRET?} + TRAKT_HISTORY_FETCH_INTERVAL: 1d + CACHE_CATALOG_CONTENT_DURATION_DAYS: 1 + CACHE_POSTER_CONTENT_DURATION_DAYS: 7 + LOG_LEVEL: info + LOG_INTERVAL_DELETION: 3d + NODE_ENV: production + depends_on: + stremio-catalog-providers_postgres: + condition: service_healthy + stremio-catalog-providers_redis: + condition: service_healthy + volumes: + - ${DOCKER_DATA_DIR}/stremio-catalog-providers/logs:/usr/src/app/log + labels: + - "traefik.enable=true" + - "traefik.http.routers.ravenn-catalogs.rule=Host(`${STREMIO_CATALOG_PROVIDERS_HOSTNAME?}`)" + - "traefik.http.routers.ravenn-catalogs.entrypoints=websecure" + - "traefik.http.routers.ravenn-catalogs.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Stremio Catalogs" + - "flame.url=https://${STREMIO_CATALOG_PROVIDERS_HOSTNAME}" + profiles: + - stremio-catalog-providers + - stremio + - all + + stremio-catalog-providers_postgres: + container_name: stremio-catalog-providers_postgres + image: postgres:16.4 + environment: + POSTGRES_DB: stremio_catalog_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - ${DOCKER_DATA_DIR}/stremio-catalog-providers/db:/var/lib/postgresql/data + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres_user -d stremio_catalog_db"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - stremio-catalog-providers + - stremio + - all + + stremio-catalog-providers_redis: + container_name: stremio-catalog-providers_redis + image: redis:6 + expose: + - 6379 + volumes: + - ${DOCKER_DATA_DIR}/stremio-catalog-providers/cache:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 30s + timeout: 10s + retries: 5 + profiles: + - stremio-catalog-providers + - stremio + - all diff --git a/apps/stremio-jackett/.env b/apps/stremio-jackett/.env new file mode 100644 index 0000000..55c39c4 --- /dev/null +++ b/apps/stremio-jackett/.env @@ -0,0 +1 @@ +STREMIO_JACKETT_HOSTNAME= diff --git a/apps/stremio-jackett/compose.yaml b/apps/stremio-jackett/compose.yaml new file mode 100644 index 0000000..1a73b58 --- /dev/null +++ b/apps/stremio-jackett/compose.yaml @@ -0,0 +1,23 @@ +services: + stremio-jackett: + image: belmeg/stremio-addon-jackett + container_name: stremio-jackett + restart: unless-stopped + expose: + - 3000 + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ:-UTC} # Add timezone support + labels: + - "traefik.enable=true" + - "traefik.http.routers.stremiojackett.rule=Host(`${STREMIO_JACKETT_HOSTNAME?}`)" + - "traefik.http.routers.stremiojackett.entrypoints=websecure" + - "traefik.http.routers.stremiojackett.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Stremio-Jackett" + - "flame.url=https://${STREMIO_JACKETT_HOSTNAME}" + profiles: + - stremio-jackett + - stremio + - all diff --git a/apps/stremio-server/.env b/apps/stremio-server/.env new file mode 100644 index 0000000..c84ae97 --- /dev/null +++ b/apps/stremio-server/.env @@ -0,0 +1 @@ +STREMIO_SERVER_HOSTNAME= diff --git a/apps/stremio-server/compose.yaml b/apps/stremio-server/compose.yaml new file mode 100644 index 0000000..d6f0480 --- /dev/null +++ b/apps/stremio-server/compose.yaml @@ -0,0 +1,19 @@ +services: + stremio-server: + image: stremio/server:latest + container_name: stremio-server + expose: + - 11470 + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.stremio-server.rule=Host(`${STREMIO_SERVER_HOSTNAME?}`)" + - "traefik.http.routers.stremio-server.entrypoints=websecure" + - "traefik.http.routers.stremio-server.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Stremio Server" + - "flame.url=https://${STREMIO_SERVER_HOSTNAME}" + profiles: + - stremio-server + - stremio + - all diff --git a/apps/stremio-trakt-addon/.env b/apps/stremio-trakt-addon/.env new file mode 100644 index 0000000..df2a702 --- /dev/null +++ b/apps/stremio-trakt-addon/.env @@ -0,0 +1,14 @@ +STREMIO_TRAKT_ADDON_HOSTNAME= + + +# We need to obtain a Trakt Client ID and secret in order for the addons to work. +# To obtain these credentials: +# 1. Create an account/Log in on Trakt.tv/ (https://trakt.tv). +# 2. Go to the applications section (https://trakt.tv/oauth/applications). +# 3. Create a new application (or use an existing application) by filling in the required information (name, description, etc.). +# - For the "Redirect URL", add the following URLs (replacing the ${*_HOSTNAME} with your actual hostname): +# - https://${STREMIO_TRAKT_ADDON_HOSTNAME}/callback +# +# Note: you can only use an existing application, if you are not using a device code auth flow for that application. +TRAKT_CLIENT_ID= +TRAKT_CLIENT_SECRET= diff --git a/apps/stremio-trakt-addon/compose.yaml b/apps/stremio-trakt-addon/compose.yaml new file mode 100644 index 0000000..b1d125b --- /dev/null +++ b/apps/stremio-trakt-addon/compose.yaml @@ -0,0 +1,91 @@ + +services: + stremio-trakt-addon: + image: reddravenn/stremio-trakt-addon + container_name: stremio-trakt-addon + expose: + - 7000 + environment: + PORT: 7000 + BASE_URL: https://${STREMIO_TRAKT_ADDON_HOSTNAME?} + DB_USER: postgres + DB_HOST: stremio-trakt-addon_postgres + DB_NAME: stremio_trakt_db + DB_PASSWORD: postgres + DB_PORT: 5432 + DB_MAX_CONNECTIONS: 20 + DB_IDLE_TIMEOUT: 30000 + DB_CONNECTION_TIMEOUT: 2000 + REDIS_HOST: stremio-trakt-addon_redis + REDIS_PORT: 6379 + REDIS_PASSWORD: + TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID?} + TRAKT_CLIENT_SECRET: ${TRAKT_CLIENT_SECRET?} + TMDB_CACHE_DURATION: 1d + TRAKT_CACHE_DURATION: 1d + TRAKT_HISTORY_FETCH_INTERVAL: 1d + LOG_LEVEL: info + LOG_INTERVAL_DELETION: 3d + NODE_ENV: production + restart: unless-stopped + depends_on: + stremio-trakt-addon_postgres: + condition: service_healthy + stremio-trakt-addon_redis: + condition: service_healthy + volumes: + - ${DOCKER_DATA_DIR}/stremio-trakt-addon/cache:/usr/src/app/cache + - ${DOCKER_DATA_DIR}/stremio-trakt-addon/log:/usr/src/app/log + labels: + - "traefik.enable=true" + - "traefik.http.routers.ravenn-trakt.rule=Host(`${STREMIO_TRAKT_ADDON_HOSTNAME?}`)" + - "traefik.http.routers.ravenn-trakt.entrypoints=websecure" + - "traefik.http.routers.ravenn-trakt.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Stremio Trakt" + - "flame.url=https://${STREMIO_TRAKT_ADDON_HOSTNAME}" + profiles: + - stremio-trakt-addon + - stremio + - all + + stremio-trakt-addon_postgres: + container_name: stremio-trakt-addon_postgres + image: postgres:16.4 + restart: unless-stopped + environment: + POSTGRES_DB: stremio_trakt_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - ${DOCKER_DATA_DIR}/stremio-trakt-addon/db:/var/lib/postgresql/data + expose: + - 5432 + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres_user -d stremio_trakt_db"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 10s + profiles: + - stremio-trakt-addon + - stremio + - all + + stremio-trakt-addon_redis: + container_name: stremio-trakt-addon_redis + image: redis:6 + restart: unless-stopped + expose: + - 6379 + volumes: + - ${DOCKER_DATA_DIR}/stremio-trakt-addon/redis:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 30s + timeout: 10s + retries: 5 + profiles: + - stremio-trakt-addon + - stremio + - all diff --git a/apps/stremthru/.env b/apps/stremthru/.env new file mode 100644 index 0000000..65a0026 --- /dev/null +++ b/apps/stremthru/.env @@ -0,0 +1 @@ +STREMTHRU_HOSTNAME= diff --git a/apps/stremthru/compose.yaml b/apps/stremthru/compose.yaml new file mode 100644 index 0000000..56b88b3 --- /dev/null +++ b/apps/stremthru/compose.yaml @@ -0,0 +1,53 @@ +services: + stremthru: + image: muniftanjim/stremthru:latest + container_name: stremthru + restart: unless-stopped + expose: + - 8080 + environment: + - STREMTHRU_HTTP_PROXY=http://warp:1080 + - STREMTHRU_TUNNEL=*:false,torrentio.strem.fun:true # Only tunnel hostnames that block VPS access (e.g. Torrentio) + - STREMTHRU_PROXY_AUTH=user1:pass1,user2:pass2 + - STREMTHRU_STORE_AUTH=*:realdebrid:abc...xyz # Add apikey + - STREMTHRU_STORE_TUNNEL=realdebrid:api # Only send RD API via tunnel, not all access (e.g playback) + - STREMTHRU_STORE_CONTENT_PROXY=*:true,easydebrid:false,premiumize:false + - STREMTHRU_PEER_URI=https://stremthru.13377001.xyz + - STREMTHRU_DATABASE_URI=sqlite://./data/stremthru.db + - STREMTHRU_REDIS_URI=redis://stremthru_redis:6379 + depends_on: + stremthru_redis: + condition: service_healthy + volumes: + - ${DOCKER_DATA_DIR}/stremthru:/app/data + labels: + - "traefik.enable=true" + - "traefik.http.routers.stremthru.rule=Host(`${STREMTHRU_HOSTNAME?}`)" + - "traefik.http.routers.stremthru.entrypoints=websecure" + - "traefik.http.routers.stremthru.tls.certresolver=letsencrypt" + - "traefik.http.services.stremthru.loadbalancer.server.port=8080" + - "flame.type=app" + - "flame.name=StremThru" + - "flame.url=https://${STREMTHRU_HOSTNAME}" + profiles: + - stremthru + - stremio + - all + + stremthru_redis: + image: redis:latest + container_name: stremthru_redis + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/stremthru/cache:/data + command: redis-server --appendonly yes --save 60 1 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + profiles: + - stremthru + - stremio + - all + diff --git a/apps/tautulli/.env b/apps/tautulli/.env new file mode 100644 index 0000000..7709aab --- /dev/null +++ b/apps/tautulli/.env @@ -0,0 +1 @@ +TAUTULLI_HOSTNAME= diff --git a/apps/tautulli/compose.yaml b/apps/tautulli/compose.yaml new file mode 100644 index 0000000..af406eb --- /dev/null +++ b/apps/tautulli/compose.yaml @@ -0,0 +1,25 @@ +services: + tautulli: + image: ghcr.io/tautulli/tautulli + container_name: tautulli + restart: unless-stopped + expose: + - 8181 + volumes: + - ${DOCKER_DATA_DIR}/tautulli:/config + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ:-UTC} + labels: + - "traefik.enable=true" + - "traefik.http.routers.tautulli.rule=Host(`${TAUTULLI_HOSTNAME?}`)" + - "traefik.http.routers.tautulli.entrypoints=websecure" + - "traefik.http.routers.tautulli.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Tautulli" + - "flame.url=https://${TAUTULLI_HOSTNAME}" + profiles: + - all + - tautulli + - debrid_media_server diff --git a/apps/tmdb-addon/.env b/apps/tmdb-addon/.env new file mode 100644 index 0000000..53340be --- /dev/null +++ b/apps/tmdb-addon/.env @@ -0,0 +1,7 @@ +TMDB_ADDON_HOSTNAME= +# Get your API key from https://www.themoviedb.org/settings/api +TMDB_API_KEY= +# Get your API key from https://fanart.tv/get-an-api-key/ +FANART_API_KEY= + +# Tip: The information that TMDb and Fanart.tv ask from you does not need to be real. diff --git a/apps/tmdb-addon/compose.yaml b/apps/tmdb-addon/compose.yaml new file mode 100644 index 0000000..a67a78b --- /dev/null +++ b/apps/tmdb-addon/compose.yaml @@ -0,0 +1,49 @@ +services: + tmdb-addon: + image: viren070/tmdb-addon:latest + container_name: tmdb-addon + restart: unless-stopped + expose: + - 3232 + environment: + - PORT=3232 + - TMDB_API=${TMDB_API_KEY?} # https://www.themoviedb.org/settings/api + - FANART_API=${FANART_API_KEY?} # https://fanart.tv/get-an-api-key/ + - HOST_NAME=${TMDB_ADDON_HOSTNAME?} + - MONGODB_URI=mongodb://mongodb:27017/tmdb + - META_TTL=604800 # 1 week + - CATALOG_TTL=86400 # 1 day + - NO_CACHE=false # Enable cache, set to true to disable + labels: + - "traefik.enable=true" + - "traefik.http.routers.tmdb.rule=Host(`${TMDB_ADDON_HOSTNAME?}`)" + - "traefik.http.routers.tmdb.entrypoints=websecure" + - "traefik.http.routers.tmdb.tls.certresolver=letsencrypt" + - "traefik.http.services.tmdb.loadbalancer.server.port=3232" + - "flame.type=app" + - "flame.name=TMDB Addon" + - "flame.url=https://${TMDB_ADDON_HOSTNAME?}" + depends_on: + tmdb-addon_mongo: + condition: service_healthy + profiles: + - tmdb-addon + - stremio + - all + + tmdb-addon_mongo: + image: mongo:latest + container_name: tmdb-addon_mongo + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/tmdb-addon/db:/data/db + healthcheck: + test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet + interval: 10s + timeout: 10s + retries: 5 + start_period: 40s + profiles: + - tmdb-addon + - stremio + - all diff --git a/apps/torbox-manager/.env b/apps/torbox-manager/.env new file mode 100644 index 0000000..c2c2f12 --- /dev/null +++ b/apps/torbox-manager/.env @@ -0,0 +1 @@ +TBM_HOSTNAME= diff --git a/apps/torbox-manager/compose.yaml b/apps/torbox-manager/compose.yaml new file mode 100644 index 0000000..dac4737 --- /dev/null +++ b/apps/torbox-manager/compose.yaml @@ -0,0 +1,61 @@ +services: + torbox-manager: + build: + context: https://github.com/jittarao/torbox-app.git + dockerfile_inline: | + # Builder stage + FROM node:22-alpine AS builder + WORKDIR /app + + # Install dependencies + COPY package*.json ./ + RUN npm ci + + # Copy source code + COPY . /app + + # Build the Next.js application + RUN npm run build + + # Runner stage + FROM node:22-alpine AS runner + WORKDIR /app + + # Set environment variables + ENV NODE_ENV=production + ENV HOSTNAME=0.0.0.0 + ENV PORT=3000 + + # Copy package.json and package-lock.json + COPY package*.json ./ + + # Install only production dependencies + RUN npm ci --only=production + + # Copy the built application from the builder stage + COPY --from=builder /app/.next ./.next + COPY --from=builder /app/public ./public + COPY --from=builder /app/node_modules ./node_modules + + # Expose the port Next.js runs on + EXPOSE 3000 + + # Start the Next.js application + CMD ["npm", "start"] + image: torbox-manager + container_name: torbox-manager + expose: + - 3000 + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.tbm.rule=Host(`${TBM_HOSTNAME?}`)" + - "traefik.http.routers.tbm.entrypoints=websecure" + - "traefik.http.routers.tbm.tls.certresolver=letsencrypt" + - "traefik.http.routers.tbm.middlewares=authelia@docker" + - "flame.type=app" + - "flame.name=TBM" + - "flame.url=https://${TBM_HOSTNAME}" + profiles: + - torbox_manager + - all diff --git a/apps/traefik/.env b/apps/traefik/.env new file mode 100644 index 0000000..864eee7 --- /dev/null +++ b/apps/traefik/.env @@ -0,0 +1,2 @@ +# Email provided to Let's Encrypt for notifications +LETSENCRYPT_EMAIL= diff --git a/apps/traefik/compose.yaml b/apps/traefik/compose.yaml new file mode 100644 index 0000000..9d8eee9 --- /dev/null +++ b/apps/traefik/compose.yaml @@ -0,0 +1,60 @@ +services: + traefik: + image: traefik:v3 + container_name: traefik + restart: unless-stopped + ports: + - 443:443 + - 80:80 + command: + - '--api=true' + - '--api.dashboard=true' + - '--api.insecure=false' + - '--global.sendAnonymousUsage=false' + - '--global.checkNewVersion=false' + - '--log=true' + - '--log.level=DEBUG' + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + + - "--entryPoints.web.address=:80" + - "--entryPoints.websecure.address=:443" + + + - "--entryPoints.web.forwardedHeaders.insecure=false" + - "--entryPoints.web.proxyProtocol.insecure=false" + + - "--entryPoints.web.http.redirections.entryPoint.to=websecure" + - "--entryPoints.web.http.redirections.entryPoint.scheme=https" + - "--entryPoints.web.forwardedHeaders.trustedIPs=${TRUSTED_IPS}" + - "--entryPoints.web.proxyProtocol.trustedIPs=${TRUSTED_IPS}" + + + - "--entryPoints.websecure.forwardedHeaders.insecure=false" + - "--entryPoints.websecure.proxyProtocol.insecure=false" + - "--entryPoints.websecure.forwardedHeaders.trustedIPs=${TRUSTED_IPS}" + - "--entryPoints.websecure.proxyProtocol.trustedIPs=${TRUSTED_IPS}" + + - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" + - "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL?}" + - "--certificatesresolvers.letsencrypt.acme.storage=/config/acme.json" + - "--log.level=INFO" + - "--ping" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "${DOCKER_DATA_DIR}/traefik:/config" + labels: + - "traefik.enable=true" + - "traefik.http.routers.api.rule=Host(`${TRAEFIK_HOSTNAME?}`)" + - "traefik.http.routers.api.entrypoints=websecure" + - "traefik.http.routers.api.tls.certresolver=letsencrypt" + - "traefik.http.routers.api.service=api@internal" + - "traefik.http.routers.api.middlewares=authelia@docker" + healthcheck: + test: ["CMD", "traefik", "healthcheck", "--ping"] + interval: 10s + timeout: 5s + retries: 3 + depends_on: + authelia: + condition: service_healthy diff --git a/apps/tweakio/compose.yaml b/apps/tweakio/compose.yaml new file mode 100644 index 0000000..8f2019d --- /dev/null +++ b/apps/tweakio/compose.yaml @@ -0,0 +1,14 @@ +services: + tweakio: + image: varthe/tweakio:latest + container_name: tweakio + restart: unless-stopped + user: $PUID:$PGID + expose: + - 3185 + volumes: + - ${DOCKER_DATA_DIR}/tweakio/config.yaml:/app/config.yaml + profiles: + - all + - debrid_media_server + - tweakio diff --git a/apps/uptime-kuma/.env b/apps/uptime-kuma/.env new file mode 100644 index 0000000..4b7d592 --- /dev/null +++ b/apps/uptime-kuma/.env @@ -0,0 +1 @@ +UPTIME_KUMA_HOSTNAME= diff --git a/apps/uptime-kuma/compose.yaml b/apps/uptime-kuma/compose.yaml new file mode 100644 index 0000000..8d666f7 --- /dev/null +++ b/apps/uptime-kuma/compose.yaml @@ -0,0 +1,21 @@ +services: + uptime-kuma: + image: louislam/uptime-kuma:latest + container_name: kuma + restart: unless-stopped + environment: + PUID: ${PUID} + PGID: ${PGID} + expose: + - 3001 + labels: + - "traefik.enable=true" + - "traefik.http.routers.uptime-kuma.rule=Host(`${UPTIME_KUMA_HOSTNAME?}`)" + - "traefik.http.routers.uptime-kuma.entrypoints=websecure" + - "traefik.http.routers.uptime-kuma.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Uptime Kuma" + - "flame.url=https://${UPTIME_KUMA_HOSTNAME?}" + volumes: + - ${DOCKER_DATA_DIR}/uptime-kuma:/app/data + - /var/run/docker.sock:/var/run/docker.sock diff --git a/apps/vaultwarden/.env b/apps/vaultwarden/.env new file mode 100644 index 0000000..c5d1414 --- /dev/null +++ b/apps/vaultwarden/.env @@ -0,0 +1,5 @@ +VAULTWARDEN_HOSTNAME= +VAULTWARDEN_ADMIN_TOKEN= +# Whether to allow signups or not. Set to true to allow signups, false to disable signups. +# You can set it to false after you have created your account. +VAULTWARDEN_SIGNUPS_ALLOWED=true diff --git a/apps/vaultwarden/compose.yaml b/apps/vaultwarden/compose.yaml new file mode 100644 index 0000000..45051bb --- /dev/null +++ b/apps/vaultwarden/compose.yaml @@ -0,0 +1,24 @@ +services: + vaultwarden: + image: vaultwarden/server:latest + container_name: vaultwarden + restart: unless-stopped + expose: + - 80 + environment: + DOMAIN: "https://${VAULTWARDEN_HOSTNAME?}" + SIGNUPS_ALLOWED: ${VAULTWARDEN_SIGNUPS_ALLOWED:-true} + ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN?} + volumes: + - ${DOCKER_DATA_DIR}/vaultwarden:/data/ + labels: + - "traefik.enable=true" + - "traefik.http.routers.vaultwarden.rule=Host(`${VAULTWARDEN_HOSTNAME?}`)" + - "traefik.http.routers.vaultwarden.entrypoints=websecure" + - "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Vaultwarden" + - "flame.url=https://${VAULTWARDEN_HOSTNAME?}" + profiles: + - vaultwarden + - all diff --git a/apps/warp/compose.yaml b/apps/warp/compose.yaml new file mode 100644 index 0000000..3500437 --- /dev/null +++ b/apps/warp/compose.yaml @@ -0,0 +1,29 @@ +services: + warp: + image: caomingjun/warp + container_name: warp + restart: unless-stopped + device_cgroup_rules: + - 'c 10:200 rwm' + expose: + - 1080 + environment: + - WARP_SLEEP=5 + cap_add: + - NET_ADMIN + sysctls: + - net.ipv6.conf.all.disable_ipv6=0 + - net.ipv4.conf.all.src_valid_mark=1 + volumes: + - ${DOCKER_DATA_DIR}/warp:/var/lib/cloudflare-warp + healthcheck: + test: curl -x "socks5h://127.0.0.1:1080" -fsSL "https://www.cloudflare.com/cdn-cgi/trace" | grep -qE "warp=(plus|on)" || exit 1 + interval: 1m + timeout: 5s + retries: 3 + start_period: 5s + profiles: + - warp + - stremio + - all + - debrid_media_server diff --git a/apps/watchtower/.env b/apps/watchtower/.env new file mode 100644 index 0000000..51e9ce1 --- /dev/null +++ b/apps/watchtower/.env @@ -0,0 +1,17 @@ +# --------------------------------------------------------- +# WATCHTOWER +# --------------------------------------------------------- +# The AUTO_UPDATE_SCHEDULE is a cron expression that is used to schedule the auto update of the containers. +# It is different from a normal cron expression, as it has an additional field at the beginning for seconds. +# See https://pkg.go.dev/github.com/robfig/cron@v1.2.0#hdr-CRON_Expression_Format +# +# The AUTO_UPDATE_NOTIFICATION_URL is the URL that will be used to send notifications about the auto update. +# You can find more information about the available services at https://containrrr.dev/shoutrrr/v0.8/services/overview/ +# Make sure the format of the AUTO_UPDATE_NOTIFICATION_URL is correct. + +# e.g. For discord, the format is discord://token@id +# Discord webhook URLs are in the format https://discord.com/api/webhooks// +# So the URL would be discord://@ +# --------------------------------------------------------- +AUTO_UPDATE_SCHEDULE=0 0 6 * * * +AUTO_UPDATE_NOTIFICATION_URL= diff --git a/apps/watchtower/compose.yaml b/apps/watchtower/compose.yaml new file mode 100644 index 0000000..0e5f385 --- /dev/null +++ b/apps/watchtower/compose.yaml @@ -0,0 +1,32 @@ +services: + watchtower: + image: containrrr/watchtower + container_name: watchtower + restart: unless-stopped + environment: + TZ: ${TZ:-UTC} + WATCHTOWER_CLEANUP: "true" + WATCHTOWER_SCHEDULE: ${AUTO_UPDATE_SCHEDULE:-0 0 6 * * *} # Run at 6am daily + WATCHTOWER_NOTIFICATION_URL: ${AUTO_UPDATE_NOTIFICATION_URL:-} + WATCHTOWER_NOTIFICATION_REPORT: "true" + WATCHTOWER_NOTIFICATION_TEMPLATE: | + {{- if .Report -}} + {{- with .Report -}} + {{- if ( or .Updated .Failed ) -}} + {{len .Scanned}} Scanned, {{len .Updated}} Updated, {{len .Failed}} Failed + {{- range .Updated}} + - {{.Name}} ({{.ImageName}}): {{.CurrentImageID.ShortID}} updated to {{.LatestImageID.ShortID}} + {{- end -}} + {{- range .Skipped}} + - {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}} + {{- end -}} + {{- range .Failed}} + - {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- else -}} + {{range .Entries -}}{{.Message}}{{"\n"}}{{- end -}} + {{- end -}} + volumes: + - /var/run/docker.sock:/var/run/docker.sock diff --git a/apps/wests-scripts/.env b/apps/wests-scripts/.env new file mode 100644 index 0000000..57d051f --- /dev/null +++ b/apps/wests-scripts/.env @@ -0,0 +1,133 @@ +#------------------------------------------------------# +# ███████╗ ██████╗██████╗ ██╗██████╗ ████████╗███████╗ # +# ██╔════╝██╔════╝██╔══██╗██║██╔══██╗╚══██╔══╝██╔════╝ # +# ███████╗██║ ██████╔╝██║██████╔╝ ██║ ███████╗ # +# ╚════██║██║ ██╔══██╗██║██╔═══╝ ██║ ╚════██║ # +# ███████║╚██████╗██║ ██║██║██║ ██║ ███████║ # +# ╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚══════╝ # +#------------------------------------------------------# + +#--------# +# SERVER # +#--------# +SERVER_DOMAIN= + +#-------------------------------------------------------------------# +# PLEX - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, PLEX REFRESH # +#-------------------------------------------------------------------# + +PLEX_HOST="https://plex.tv/" +PLEX_METADATA_HOST="https://metadata.provider.plex.tv/" +# This server host cannot be http://plex:32400, it will not work. +# You will need to use the internal IP address of the server. +# You can also use the gateway IP of the docker network. If you run docker inspect plex, you will see the gateway IP address. +# It must also not have a trailing slash. (a slash at the end of the URL) +PLEX_SERVER_HOST= +# To obtain your machine ID, visit https://${PLEX_HOSTNAME}/?X-Plex-Token=YourTokenHere +# Obtaining a plex token: https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/ +PLEX_SERVER_MACHINE_ID= +# To obtain your server token look at the file located in ${DOCKER_DATA_DIR/plex/config/Library/Application Support/Plex Media Server/Preferences.xml +# for the PlexOnlineToken +PLEX_SERVER_API_KEY= +# To obtain your library ID: https://support.plex.tv/articles/201638786-plex-media-server-url-commands/#:~:text=Listing%20Defined%20Libraries +PLEX_SERVER_MOVIE_LIBRARY_ID= +PLEX_SERVER_TV_SHOW_LIBRARY_ID= +# This would be the path to your plex server files. +# Which should be ${DOCKER_DATA_DIR/plex/config/Library/Application Support/Plex Media Server +PLEX_SERVER_PATH= + +#-------------------------------------------------------------------------# +# OVERSEERR - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, RECLAIM SPACE # +#-------------------------------------------------------------------------# + +OVERSEERR_HOST=http://overseerr:5055 +OVERSEERR_API_KEY= + +#------------------------------------------------------------------------------------# +# SONARR - BLACKHOLE, REPAIR, IMPORT TORRENT FOLDER, RECLAIM SPACE, ADD NEXT EPISODE # +#------------------------------------------------------------------------------------# + +SONARR_HOST=http://sonarr:8989 +SONARR_API_KEY= +SONARR_ROOT_FOLDER="/mnt/media/TV" + +SONARR_HOST_4K=http://sonarr4k:8989 +SONARR_API_KEY_4K= +SONARR_ROOT_FOLDER_4K="/mnt/media/TV - 4K" + +SONARR_HOST_ANIME=http://sonarranime:8989 +SONARR_API_KEY_ANIME= +SONARR_ROOT_FOLDER_ANIME="/mnt/media/TV - Anime" + +#------------------------------------------------------------------# +# RADARR - BLACKHOLE, REPAIR, IMPORT TORRENT FOLDER, RECLAIM SPACE # +#------------------------------------------------------------------# + +RADARR_HOST=http://radarr:7878 +RADARR_API_KEY= +RADARR_ROOT_FOLDER="/mnt/media/Movies" + +RADARR_HOST_4K=http://radarr4k:7878 +RADARR_API_KEY_4K= +RADARR_ROOT_FOLDER_4K="/mnt/media/Movies - 4K" + +RADARR_HOST_ANIME=http://radarranime:7878 +RADARR_API_KEY_ANIME= +RADARR_ROOT_FOLDER_ANIME="/mnt/media/Movies - Anime" + + +#-------------------------------# +# REALDEBRID - BLACKHOLE, REPAIR # +#-------------------------------# + +REALDEBRID_ENABLED=true +REALDEBRID_HOST="https://api.real-debrid.com/rest/1.0/" +REALDEBRID_API_KEY= +REALDEBRID_MOUNT_TORRENTS_PATH="/mnt/remote/realdebrid/__all__" + +#-----------------------# +# BLACKHOLE - BLACKHOLE # +#-----------------------# + +BLACKHOLE_BASE_WATCH_PATH="/mnt/symlinks" +BLACKHOLE_RADARR_PATH="radarr" +BLACKHOLE_SONARR_PATH="sonarr" +BLACKHOLE_FAIL_IF_NOT_CACHED=true +BLACKHOLE_RD_MOUNT_REFRESH_SECONDS=200 +BLACKHOLE_WAIT_FOR_TORRENT_TIMEOUT=300 +BLACKHOLE_HISTORY_PAGE_SIZE=500 + + +#-----------------------------------------------------------------------------------------------# +# DISCORD - BLACKHOLE, WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, MONITOR RAM, RECLAIM SPACE # +#-----------------------------------------------------------------------------------------------# + +DISCORD_ENABLED=false +DISCORD_UPDATE_ENABLED=false +DISCORD_WEBHOOK_URL= + +#-------------------------------------# +# WATCHLIST - WATCHLIST, PLEX REQUEST # +#-------------------------------------# +# No changes necessary. + +WATCHLIST_PLEX_PRODUCT="Plex Request Authentication" +WATCHLIST_PLEX_VERSION="1.0.0" +WATCHLIST_PLEX_CLIENT_IDENTIFIER="576101fc-b425-4685-91cb-5d3c1671fd2b" + + +#-----------------# +# REPAIR - REPAIR # +#-----------------# + +REPAIR_REPAIR_INTERVAL="10m" +REPAIR_RUN_INTERVAL="1d" + +#-----------------------# +# GENERAL CONFIGURATION # +#-----------------------# + +PYTHONUNBUFFERED=TRUE +PUID=${PUID} +PGID=${PGID} +UMASK=002 diff --git a/apps/wests-scripts/blackhole/compose.yaml b/apps/wests-scripts/blackhole/compose.yaml new file mode 100644 index 0000000..624fbb1 --- /dev/null +++ b/apps/wests-scripts/blackhole/compose.yaml @@ -0,0 +1,112 @@ +services: + blackhole: + image: ghcr.io/westsurname/scripts/blackhole:latest + container_name: blackhole + user: "${PUID}:${PGID}" + volumes: + - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} + - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} + - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} + - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} + - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/default/logs:/app/logs + - /mnt:/mnt + env_file: + - ../.env + environment: + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + - SONARR_HOST=${SONARR_HOST} + - SONARR_API_KEY=${SONARR_API_KEY} + - RADARR_HOST=${RADARR_HOST} + - RADARR_API_KEY=${RADARR_API_KEY} + - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} + restart: unless-stopped + depends_on: + rclone: + condition: service_started + sonarr: + condition: service_healthy + radarr: + condition: service_healthy + profiles: + - debrid_media_server + - all + + + blackhole4k: + image: ghcr.io/westsurname/scripts/blackhole:latest + container_name: blackhole4k + user: "${PUID}:${PGID}" + volumes: + - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} + - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} + - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} + - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} + - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/4k/logs:/app/logs + - /mnt:/mnt + env_file: + - ../.env + environment: + - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + - SONARR_HOST=${SONARR_HOST_4K} + - SONARR_API_KEY=${SONARR_API_KEY_4K} + - RADARR_HOST=${RADARR_HOST_4K} + - RADARR_API_KEY=${RADARR_API_KEY_4K} + - SONARR_ROOT_FOLDER=${SONARR_ROOT_FOLDER_4K} + - RADARR_ROOT_FOLDER=${RADARR_ROOT_FOLDER_4K} + restart: unless-stopped + depends_on: + rclone: + condition: service_started + sonarr4k: + condition: service_healthy + radarr4k: + condition: service_healthy + profiles: + - debrid_media_server + - all + + + + blackholeanime: + image: ghcr.io/westsurname/scripts/blackhole:latest + container_name: blackholeanime + user: "${PUID}:${PGID}" + volumes: + - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} + - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} + - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} + - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} + - ${DOCKER_DATA_DIR}/wests-scripts/blackhole/anime/logs:/app/logs + - /mnt:/mnt + env_file: + - ../.env + environment: + - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} + - PUID=${PUID} + - PGID=${PGID} + - UMASK=002 + - SONARR_HOST=${SONARR_HOST_ANIME} + - SONARR_API_KEY=${SONARR_API_KEY_ANIME} + - RADARR_HOST=${RADARR_HOST_ANIME} + - RADARR_API_KEY=${RADARR_API_KEY_ANIME} + - SONARR_ROOT_FOLDER=${SONARR_ROOT_FOLDER_ANIME} + - RADARR_ROOT_FOLDER=${RADARR_ROOT_FOLDER_ANIME} + + restart: unless-stopped + depends_on: + rclone: + condition: service_started + sonarranime: + condition: service_healthy + radarranime: + condition: service_healthy + profiles: + - debrid_media_server + - all + + diff --git a/apps/wests-scripts/compose.yaml b/apps/wests-scripts/compose.yaml new file mode 100644 index 0000000..8dac1ce --- /dev/null +++ b/apps/wests-scripts/compose.yaml @@ -0,0 +1,8 @@ +include: + - blackhole/compose.yaml + - repair/compose.yaml + # The below are optional and can be uncommented if needed + # You must have plex setup already before using these. + # - plex_authentication/compose.yaml + # - plex_watchlist/compose.yaml + # - plex_requests/compose.yaml diff --git a/apps/wests-scripts/plex_authentication/compose.yaml b/apps/wests-scripts/plex_authentication/compose.yaml new file mode 100644 index 0000000..70512e8 --- /dev/null +++ b/apps/wests-scripts/plex_authentication/compose.yaml @@ -0,0 +1,14 @@ +services: + plex_authentication: + image: ghcr.io/westsurname/scripts/plex_authentication:latest + container_name: plex_authentication_service + restart: unless-stopped + volumes: + - ${DOCKER_DATA_DIR}/wests-scripts/shared/tokens.json:/app/shared/tokens.json + - ${DOCKER_DATA_DIR}/wests-scripts/sockets:/app/sockets + env_file: + - ../.env + profiles: + - all + - plex_request + - plex_watchlist diff --git a/apps/wests-scripts/plex_requests/compose.yaml b/apps/wests-scripts/plex_requests/compose.yaml new file mode 100644 index 0000000..1b9c989 --- /dev/null +++ b/apps/wests-scripts/plex_requests/compose.yaml @@ -0,0 +1,45 @@ +services: + plex_request: + image: ghcr.io/westsurname/scripts/plex_request:latest + container_name: plex_request_service + volumes: + - ${DOCKER_DATA_DIR}/wests-scripts/shared/tokens.json:/app/shared/tokens.json + - ${DOCKER_DATA_DIR}/wests-scripts/sockets:/app/sockets + env_file: + - .env + restart: unless-stopped + depends_on: + plex: + condition: service_healthy + profiles: + - all + - plex_request + + # This puts plex behind a custom nginx reverse proxy, which is required for the plex_request script to work. + # It allows it to intercept requests and modify the data to show a request button on all clients. + # You should disable the traefik router for plex in /opt/docker/apps/plex/.env + # 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. + plex_request_nginx: + image: ghcr.io/westsurname/scripts/plex_request_nginx:latest + container_name: plex_request_nginx_service + volumes: + - ${PLEX_SERVER_PATH}:/plex:ro + - ${DOCKER_DATA_DIR}/wests-scripts/sockets:/app/sockets + expose: + - 8000 + env_file: + - .env + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.plexrequest.rule=Host(`${PLEX_HOSTNAME?}`)" + - "traefik.http.routers.plexrequest.entrypoints=websecure" + - "traefik.http.routers.plexrequest.tls.certresolver=letsencrypt" + - "traefik.http.services.plexrequest.loadbalancer.server.port=8000" + depends_on: + - plex_request + - plex_authentication + profiles: + - all + - plex_request + diff --git a/apps/wests-scripts/plex_watchlist/compose.yaml b/apps/wests-scripts/plex_watchlist/compose.yaml new file mode 100644 index 0000000..6ef7f34 --- /dev/null +++ b/apps/wests-scripts/plex_watchlist/compose.yaml @@ -0,0 +1,17 @@ +services: + watchlist: + container_name: plex_watchlist_service + image: ghcr.io/westsurname/scripts/watchlist:latest + volumes: + - ${DOCKER_DATA_DIR}/wests-scripts/shared/tokens.json:/app/shared/tokens.json + env_file: + - ../.env + restart: unless-stopped + depends_on: + plex: + condition: service_healthy + plex_authentication: + condition: service_started + profiles: + - all + - plex_watchlist \ No newline at end of file diff --git a/apps/wests-scripts/repair/compose.yaml b/apps/wests-scripts/repair/compose.yaml new file mode 100644 index 0000000..fed7990 --- /dev/null +++ b/apps/wests-scripts/repair/compose.yaml @@ -0,0 +1,84 @@ +services: + repair: + image: ghcr.io/westsurname/scripts/scripts:latest + container_name: repair + command: python repair.py --no-confirm + restart: unless-stopped + env_file: + - ../.env + environment: + - SONARR_HOST=${SONARR_HOST} + - SONARR_API_KEY=${SONARR_API_KEY} + - RADARR_HOST=${RADARR_HOST} + - RADARR_API_KEY=${RADARR_API_KEY} + volumes: + - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} + - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} + - ${SONARR_ROOT_FOLDER}:${SONARR_ROOT_FOLDER} + - ${RADARR_ROOT_FOLDER}:${RADARR_ROOT_FOLDER} + depends_on: + rclone: + condition: service_started + sonarr: + condition: service_healthy + radarr: + condition: service_healthy + profiles: + - debrid_media_server + - all + + repair4k: + image: ghcr.io/westsurname/scripts/scripts:latest + container_name: repair4k + command: python repair.py --no-confirm + restart: unless-stopped + env_file: + - ../.env + environment: + - SONARR_HOST=${SONARR_HOST_4K} + - SONARR_API_KEY=${SONARR_API_KEY_4K} + - RADARR_HOST=${RADARR_HOST_4K} + - RADARR_API_KEY=${RADARR_API_KEY_4K} + volumes: + - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} + - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} + - ${SONARR_ROOT_FOLDER_4K}:${SONARR_ROOT_FOLDER_4K} + - ${RADARR_ROOT_FOLDER_4K}:${RADARR_ROOT_FOLDER_4K} + depends_on: + rclone: + condition: service_started + sonarr4k: + condition: service_healthy + radarr4k: + condition: service_healthy + profiles: + - debrid_media_server + - all + + repairanime: + image: ghcr.io/westsurname/scripts/scripts:latest + container_name: repairanime + command: python repair.py --no-confirm + restart: unless-stopped + env_file: + - ../.env + environment: + - SONARR_HOST=${SONARR_HOST_ANIME} + - SONARR_API_KEY=${SONARR_API_KEY_ANIME} + - RADARR_HOST=${RADARR_HOST_ANIME} + - RADARR_API_KEY=${RADARR_API_KEY_ANIME} + volumes: + - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} + - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} + - ${SONARR_ROOT_FOLDER_ANIME}:${SONARR_ROOT_FOLDER_ANIME} + - ${RADARR_ROOT_FOLDER_ANIME}:${RADARR_ROOT_FOLDER_ANIME} + depends_on: + rclone: + condition: service_started + sonarranime: + condition: service_healthy + radarranime: + condition: service_healthy + profiles: + - debrid_media_server + - all diff --git a/apps/zilean/compose.yaml b/apps/zilean/compose.yaml new file mode 100644 index 0000000..c1f56fe --- /dev/null +++ b/apps/zilean/compose.yaml @@ -0,0 +1,50 @@ +services: + zilean: + image: ipromknight/zilean:latest + restart: unless-stopped + container_name: zilean + tty: true + environment: + Zilean__Database__ConnectionString: Host=zilean_postgres;Database=zilean;Username=zilean;Password=postgres;Include Error Detail=true;Timeout=30;CommandTimeout=3600 + Zilean__Imdb__UseAllCores: true + Zilean__Imdb__UseLucene: true + Zilean__Parsing__BatchSize: 100000 + Zilean__Dmm_ScrapeSchedule: 32 * * * * + healthcheck: + test: curl --connect-timeout 10 --silent --show-error --fail http://localhost:8181/healthchecks/ping + timeout: 60s + interval: 30s + retries: 10 + depends_on: + zilean_postgres: + condition: service_healthy + volumes: + - ${DOCKER_DATA_DIR}/zilean/tmp:/tmp + profiles: + - zilean + - stremio + - debrid_media_server + - all + + zilean_postgres: + image: postgres:17.2-alpine + container_name: zilean_postgres + restart: unless-stopped + shm_size: 2G + environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_USER: zilean + POSTGRES_PASSWORD: postgres + POSTGRES_DB: zilean + volumes: + - ${DOCKER_DATA_DIR}/zilean/db:/var/lib/postgresql/data/pgdata + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U postgres -d zilean" ] + interval: 30s + timeout: 5s + retries: 5 + profiles: + - zilean + - stremio + - debrid_media_server + - all diff --git a/apps/zipline/.env b/apps/zipline/.env new file mode 100644 index 0000000..70a72df --- /dev/null +++ b/apps/zipline/.env @@ -0,0 +1,18 @@ +# --------------------------------------------------------- +# ZIPLINE +# --------------------------------------------------------- +# Profiles: zipline, all +# +# Zipline is a ShareX / File upload server +# +# To generate the CORE_SECRET, run the following command: +# openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n'; echo +# +# Once you fill these values in and start the container, head to the dashboard and create an admin user +# Most of the configuration for Zipline is done through the web interface. +# +# Within the server settings +# Set the 'Default domain' under 'Core' to the value you set for ZIPLINE_HOSTNAME +# Also enable Return HTTPS URLs +ZIPLINE_HOSTNAME= +ZIPLINE_CORE_SECRET= \ No newline at end of file diff --git a/apps/zipline/compose.yaml b/apps/zipline/compose.yaml new file mode 100644 index 0000000..2c61082 --- /dev/null +++ b/apps/zipline/compose.yaml @@ -0,0 +1,46 @@ +services: + zipline: + image: ghcr.io/diced/zipline:v4 + container_name: zipline + restart: unless-stopped + user: $PUID:$PGID + expose: + - 3000 + environment: + - DATABASE_URL=postgres://zipline:postgres@zipline_postgres:5432/zipline + - CORE_SECRET=${ZIPLINE_CORE_SECRET?} + depends_on: + zipline_postgres: + condition: service_healthy + volumes: + - '${DOCKER_DATA_DIR}/zipline/uploads:/zipline/uploads' + - '${DOCKER_DATA_DIR}/zipline/public:/zipline/public' + - '${DOCKER_DATA_DIR}/zipline/themes:/zipline/themes' + labels: + - "traefik.enable=true" + - "traefik.http.routers.zipline.rule=Host(`${ZIPLINE_HOSTNAME?}`)" + - "traefik.http.routers.zipline.entrypoints=websecure" + - "traefik.http.routers.zipline.tls.certresolver=letsencrypt" + - "flame.type=app" + - "flame.name=Zipline" + - "flame.url=https://${ZIPLINE_HOSTNAME}" + profiles: + - zipline + - all + + zipline_postgres: + image: postgres:16 + restart: unless-stopped + container_name: zipline_postgres + volumes: + - ${DOCKER_DATA_DIR}/zipline/db:/var/lib/postgresql/data + environment: + POSTGRES_USER: zipline + POSTGRES_PASSWORD: postgres + POSTGRES_DB: zipline + healthcheck: + test: ["CMD-SHELL", "pg_isready -U zipline"] + start_period: 1m + profiles: + - zipline + - all diff --git a/apps/zurg/.env b/apps/zurg/.env new file mode 100644 index 0000000..aa144d3 --- /dev/null +++ b/apps/zurg/.env @@ -0,0 +1,21 @@ + +# Controls which Zurg version to use +# If using the public zurg, leave these as is. +ZURG_REPO=zurg-testing +ZURG_VERSION=v0.9.3-final +ZURG_CONFIG_VERSION=v0.9 + +# If you are a sponsor, you can use the private zurg repo, along with a later version of the config. +# ZURG_REPO=zurg +# ZURG_VERSION=v0.10.0-rc.4-1 +# ZURG_CONFIG_VERSION=v0.10 + +# If you would like nightly builds, you can use the latest tag. +# Or a specific tag e.g. 2025.03.24.0030-nightly + +# To pull from a private repo, you can run the following command after creating a github token (classic) with the read:packages scope: +# echo "${GITHUB_TOKEN}" | docker login ghcr.io -u "${GITHUB_USERNAME}" --password-stdin && docker pull ghcr.io/debridmediamanager/zurg:${ZURG_VERSION} +# (replace ${GITHUB_TOKEN} and ${GITHUB_USERNAME} with your github token and username respectively, and ${ZURG_VERSION} with the version you want to pull) + + +ZURG_HOSTNAME= diff --git a/apps/zurg/compose.yaml b/apps/zurg/compose.yaml new file mode 100644 index 0000000..23e3859 --- /dev/null +++ b/apps/zurg/compose.yaml @@ -0,0 +1,76 @@ +services: + zurg: + image: ghcr.io/debridmediamanager/${ZURG_REPO:-zurg-testing}:${ZURG_VERSION:-v0.9.3-final} + container_name: zurg + restart: unless-stopped + healthcheck: + test: curl -f localhost:9999/dav/version.txt || exit 1 + ports: + - 9999:9999 + volumes: + - ${DOCKER_DATA_DIR}/zurg/config-${ZURG_CONFIG_VERSION:-v0.9}.yml:/app/config.yml + - ${DOCKER_DATA_DIR}/zurg/data:/app/data + - ${DOCKER_DATA_DIR}/zurg/logs:/app/logs + labels: + - "traefik.enable=true" + - "traefik.http.routers.zurg.rule=Host(`${ZURG_HOSTNAME?}`)" + - "traefik.http.routers.zurg.entrypoints=websecure" + - "traefik.http.routers.zurg.tls.certresolver=letsencrypt" + - "traefik.http.routers.zurg.middlewares=authelia@docker" + profiles: + - all + - zurg + - debrid_media_server + + rclone: + image: rclone/rclone:latest + container_name: rclone + restart: unless-stopped + environment: + TZ: ${TZ:-UTC} + PUID: 1000 + PGID: 1000 + volumes: + - /mnt/remote/realdebrid:/data:rshared + - ${DOCKER_DATA_DIR}/zurg/rclone.conf:/config/rclone/rclone.conf + - /mnt:/mnt + cap_add: + - SYS_ADMIN + security_opt: + - apparmor:unconfined + devices: + - /dev/fuse:/dev/fuse:rwm + depends_on: + zurg: + condition: service_healthy + restart: true + command: > + mount zurg: /data + --allow-non-empty + --allow-other + --uid=1000 + --gid=1000 + --umask=002 + --attr-timeout 10y + --buffer-size 64M + --dir-cache-time 120s + --poll-interval 60s + --vfs-cache-max-age 2M + --vfs-cache-max-size 30G + --vfs-cache-min-free-space 1G + --vfs-cache-mode full + --vfs-cache-poll-interval 30s + --vfs-disk-space-total-size 32G + --vfs-fast-fingerprint + --vfs-read-ahead 64M + --vfs-read-chunk-size 1M + --vfs-read-chunk-size-limit 32M + --vfs-read-wait 40ms + --vfs-refresh + --transfers 16 + --checkers 16 + --multi-thread-streams 8 + profiles: + - all + - zurg + - debrid_media_server diff --git a/compose.yaml b/compose.yaml deleted file mode 100644 index 87387e9..0000000 --- a/compose.yaml +++ /dev/null @@ -1,1837 +0,0 @@ -# This is a sample docker-compose file for setting up a server with several addons and services you can use with Stremio. -# -# This template includes the following default services: -# - Traefik: Reverse proxy for routing traffic to the services -# - Flame/Honey: Start page for your server -# - Dash: Dashboard for monitoring server resources -# - Uptime Kuma: Status page for monitoring uptime -# - Watchtower: Auto-updating services -# - Dozzle: Web UI for viewing logs -# -# It has additional optional profiles for: -# - stremio: includes stremio addons and utilities -# - debrid_media_server: includes services for building a debrid media server -# - minecraft: includes services for running a Minecraft server with PaperMC -# - vaultwarden: a bitwarden compatible server written in Rust -# - zipline: a file upload server/url shortener/ShareX server. -# - searxng: a self hosted search engine -# - plausible: self hosted, privacy friendly analytics -# - all: includes all profiles - -# This file is only a template and it requires the .env file to be set up with the necessary environment variables. -# -# Tips: -# -# May need sudo perms to run docker compose commands, so run `sudo su` to switch to root user -# or run each command with the `sudo` prefix. -# -# - Run `docker compose up -d` to start the services -# - Run `docker compose down` to stop the services -# - Run `docker compose logs -f` to view the logs of all services live (Ctrl+C to exit without stopping the services) -# - Run `docker compose logs -f ` to view the logs of a specific service live (Ctrl+C to exit without stopping the services) -# - Run `docker compose ps` to view the status of all services -# - Run `docker compose ps ` to view the status of a specific service -# - -services: - traefik: - image: traefik:v3 - container_name: traefik - restart: unless-stopped - ports: - - 443:443 - - 80:80 - command: - - "--providers.docker=true" - - "--providers.docker.exposedbydefault=false" - - "--entryPoints.web.address=:80" - - "--entryPoints.websecure.address=:443" - - "--entryPoints.web.http.redirections.entryPoint.to=websecure" - - "--entryPoints.web.http.redirections.entryPoint.scheme=https" - - "--certificatesresolvers.myresolver.acme.tlschallenge=true" - - "--certificatesresolvers.myresolver.acme.email=${LETSENCRYPT_EMAIL?}" - - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" - - "--log.level=INFO" - - "--ping" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "./data/letsencrypt:/letsencrypt" - healthcheck: - test: ["CMD", "traefik", "healthcheck", "--ping"] - interval: 10s - timeout: 5s - retries: 3 - # Start page for your server - flame: - image: pawelmalak/flame:multiarch - container_name: flame - restart: unless-stopped - expose: - - 5005 - environment: - - PASSWORD=${FLAME_PASSWORD?} - labels: - - "traefik.enable=true" - - "traefik.http.routers.flame.rule=Host(`${FLAME_HOSTNAME?}`)" - - "traefik.http.routers.flame.entrypoints=websecure" - - "traefik.http.routers.flame.tls.certresolver=myresolver" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - ./data/flame:/app/data - - dash: - image: mauricenino/dashdot:latest - container_name: dash - restart: unless-stopped - expose: - - 3001 - privileged: true - environment: - DASHDOT_PAGE_TITLE: ${DASHDOT_PAGE_TITLE:-dash.} - DASHDOT_ALWAYS_SHOW_PERCENTAGES: true - DASHDOT_SHOW_HOST: ${DASHDOT_SHOW_HOST:-true} - DASHDOT_CUSTOM_HOST: ${DASHDOT_CUSTOM_HOST:-} - DASHDOT_ACCEPT_OOKLA_EULA: true - DASHDOT_NETWORK_SPEED_AS_BYTES: false - volumes: - - /:/mnt/host:ro - labels: - - "traefik.enable=true" - - "traefik.http.routers.dash.rule=Host(`${DASHDOT_HOSTNAME?}`)" - - "traefik.http.routers.dash.entrypoints=websecure" - - "traefik.http.routers.dash.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Dash" - - "flame.url=https://${DASHDOT_HOSTNAME?}" - - honey: - image: ghcr.io/dani3l0/honey:latest - container_name: honey - restart: unless-stopped - volumes: - - ./data/honey:/app/dist/config - - ./data/honey/img:/app/dist/img/custom - expose: - - 4173 - labels: - - "traefik.enable=true" - - "traefik.http.routers.honey.rule=Host(`${HONEY_HOSTNAME?}`)" - - "traefik.http.routers.honey.entrypoints=websecure" - - "traefik.http.routers.honey.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Honey" - - "flame.url=https://${HONEY_HOSTNAME?}" - - # Status page for monitoring uptime - uptime-kuma: - image: louislam/uptime-kuma:latest - container_name: kuma - restart: unless-stopped - expose: - - 3001 - labels: - - "traefik.enable=true" - - "traefik.http.routers.uptime-kuma.rule=Host(`${UPTIME_KUMA_HOSTNAME?}`)" - - "traefik.http.routers.uptime-kuma.entrypoints=websecure" - - "traefik.http.routers.uptime-kuma.tls.certresolver=myresolver" - - "traefik.http.routers.status-page.rule=Host(`${STATUS_PAGE_HOSTNAME?}`)" - - "traefik.http.routers.status-page.entrypoints=websecure" - - "traefik.http.routers.status-page.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Uptime Kuma" - - "flame.url=https://${UPTIME_KUMA_HOSTNAME?}" - volumes: - - ./data/kuma:/app/data - - /var/run/docker.sock:/var/run/docker.sock - - # Watchtower for auto-updating services - watchtower: - image: containrrr/watchtower - container_name: watchtower - restart: unless-stopped - environment: - TZ: ${TZ:-UTC} - WATCHTOWER_CLEANUP: "true" - WATCHTOWER_SCHEDULE: ${AUTO_UPDATE_SCHEDULE:-0 0 6 * * *} # Run at 6am daily - WATCHTOWER_NOTIFICATION_URL: ${AUTO_UPDATE_NOTIFICATION_URL:-} - WATCHTOWER_NOTIFICATION_REPORT: "true" - WATCHTOWER_NOTIFICATION_TEMPLATE: | - {{- if .Report -}} - {{- with .Report -}} - {{- if ( or .Updated .Failed ) -}} - {{len .Scanned}} Scanned, {{len .Updated}} Updated, {{len .Failed}} Failed - {{- range .Updated}} - - {{.Name}} ({{.ImageName}}): {{.CurrentImageID.ShortID}} updated to {{.LatestImageID.ShortID}} - {{- end -}} - {{- range .Skipped}} - - {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}} - {{- end -}} - {{- range .Failed}} - - {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- else -}} - {{range .Entries -}}{{.Message}}{{"\n"}}{{- end -}} - {{- end -}} - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - # Web UI for viewing logs - dozzle: - image: amir20/dozzle:latest - container_name: dozzle - restart: unless-stopped - expose: - - 8080 - environment: - DOZZLE_ENABLE_ACTIONS: "true" - DOZZLE_NO_ANALYTICS: "true" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - labels: - - "traefik.enable=true" - - "traefik.http.routers.dozzle.rule=Host(`${DOZZLE_HOSTNAME?}`)" - - "traefik.http.routers.dozzle.entrypoints=websecure" - - "traefik.http.routers.dozzle.tls.certresolver=myresolver" - - "traefik.http.routers.dozzle.middlewares=dozzle-auth" - - "traefik.http.middlewares.dozzle-auth.basicauth.users=${DOZZLE_USERNAME?}:${DOZZLE_HASHED_PASSWORD?}" - - "flame.type=app" - - "flame.name=Dozzle" - - "flame.url=https://${DOZZLE_HOSTNAME?}" - healthcheck: - test: ["CMD", "/dozzle", "healthcheck"] - interval: 3s - timeout: 30s - retries: 5 - start_period: 30s - # AIOStreams service - aiostreams: - image: viren070/aiostreams:latest - container_name: aiostreams - restart: unless-stopped - expose: - - 3000 - environment: - - ADDON_PROXY=${AIOSTREAMS_ADDON_PROXY:-} - - ADDON_PROXY_CONFIG=*:false,*.strem.fun:true # only route requests to any strem.fun subdomain through the proxy - - API_KEY=${AIOSTREAMS_API_KEY:-} - - SECRET_KEY=${AIOSTREAMS_SECRET_KEY} # openssl rand -hex 16 - - DEFAULT_TIMEOUT=5000 - - TMDB_API_KEY=${TMDB_API_KEY} - - LOG_FORMAT=text - - LOG_LEVEL=debug - - LOG_SENSITIVE_INFO=true - # <<< The environment variables below are instructing our AIOStreams addon to use our other self hosted services, if you don't >>> - # <<< want to use them you can remove the environment variables from the .env file or set them to an empty string, or remove them from here >>> - - EASYNEWS_PLUS_URL=${AIOSTREAMS_EASYNEWS_PLUS_URL:-} - - MEDIAFUSION_URL=${AIOSTREAMS_MEDIAFUSION_URL:-} - - MEDIAFUSION_API_PASSWORD=${MEDIAFUSION_API_PASSWORD:-} - - MEDIAFUSION_CONFIG_TIMEOUT=3000 - - COMET_URL=${AIOSTREAMS_COMET_URL:-} - - FORCE_COMET_HOSTNAME=${COMET_HOSTNAME:-} - - COMET_INDEXERS=${AIOSTREAMS_COMET_INDEXERS:-} - - JACKETTIO_URL=${AIOSTREAMS_JACKETTIO_URL:-} - - JACKETT_INDEXERS=${AIOSTREAMS_JACKETT_INDEXERS:-} - - STREMIO_JACKETT_URL=${AIOSTREAMS_STREMIO_JACKETT_URL:-} - - JACKETT_URL=${AIOSTREAMS_JACKETT_URL:-} - - JACKETT_API_KEY=${JACKETT_API_KEY:-} - labels: - - "traefik.enable=true" - - "traefik.http.routers.aio.rule=Host(`${AIOSTREAMS_HOSTNAME?}`)" - - "traefik.http.routers.aio.entrypoints=websecure" - - "traefik.http.routers.aio.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=AIOStreams" - - "flame.url=https://${AIOSTREAMS_HOSTNAME}" - - healthcheck: - test: wget -qO- http://localhost:3000/health - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - stremio - - all - tmdb-addon: - image: mrcanelas/tmdb-addon:latest - container_name: tmdb-addon - restart: unless-stopped - expose: - - 3232 - environment: - - PORT=3232 - - TMDB_API=${TMDB_API_KEY?} # https://www.themoviedb.org/settings/api - - FANART_API=${FANART_API_KEY?} # https://fanart.tv/get-an-api-key/ - - HOST_NAME=tmdb-${TMDB_ADDON_HOSTNAME?} - - MONGODB_URI=mongodb://mongodb:27017/tmdb - - META_TTL=604800 # 1 week - - CATALOG_TTL=86400 # 1 day - - NO_CACHE=false # Enable cache, set to true to disable - labels: - - "traefik.enable=true" - - "traefik.http.routers.tmdb.rule=Host(`${TMDB_ADDON_HOSTNAME?}`)" - - "traefik.http.routers.tmdb.entrypoints=websecure" - - "traefik.http.routers.tmdb.tls.certresolver=myresolver" - - "traefik.http.services.tmdb.loadbalancer.server.port=3232" - - "flame.type=app" - - "flame.name=TMDB Addon" - - "flame.url=https://${TMDB_ADDON_HOSTNAME?}" - depends_on: - mongodb: - condition: service_healthy - profiles: - - stremio - - all - - easynews-plus: - image: ghcr.io/sleeyax/stremio-easynews-addon:latest - container_name: easynews-plus - restart: unless-stopped - expose: - - 1337 - labels: - - "traefik.enable=true" - - "traefik.http.routers.easynews.rule=Host(`${EASYNEWS_PLUS_HOSTNAME}`)" - - "traefik.http.routers.easynews.entrypoints=websecure" - - "traefik.http.routers.easynews.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Easynews+" - - "flame.url=https://${EASYNEWS_PLUS_HOSTNAME}" - profiles: - - stremio - - all - - comet: - container_name: comet - image: g0ldyy/comet:latest - restart: unless-stopped - expose: - - 2020 - environment: - - FASTAPI_HOST=0.0.0.0 - - FASTAPI_PORT=2020 - - FASTAPI_WORKERS=-1 - - DATABASE_TYPE=sqlite - - DATABASE_URL=data/comet.db - - DASHBOARD_ADMIN_PASSWORD=${COMET_ADMIN_PASSWORD} - - DEBRID_PROXY_URL=http://warp:1080 - - INDEXER_MANAGER_TYPE=${COMET_INDEXER_TYPE:-prowlarr} # or jackett - - INDEXER_MANAGER_URL=${COMET_INDEXER_URL:-http://prowlarr:9696} - #http://prowlarr:9696 # or http://jackett:9117 - - INDEXER_MANAGER_API_KEY=${COMET_INDEXER_API_KEY:-${PROWLARR_API_KEY:-}} # or ${JACKETT_API_KEY:-} - - INDEXER_MANAGER_INDEXERS=${COMET_INDEXERS:-[]} # comma separated list of indexer ids # for jackett, get the names from https://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Definitions - for prowlarr you can write them like on the web dashboard - - SCRAPE_ZILEAN=True - - ZILEAN_URL=http://zilean:8181 # or https://zilean.elfhosted.com if not hosting zilean locally - - ZILEAN_TAKE_FIRST=500 - - SCRAPE_TORRENTIO=True - - SCRAPE_MEDIAFUSION=True - - SCRAPE_COMET=True - - MEDIAFUSION_URL=http://mediafusion:8000 # or https://mediafusion.elfhosted.com if not hosting mediafusion locally - - STREMTHRU_URL=http://stremthru:8080 # or https://stremthru.13377001.xyz if not hosting stremthru locally - - DOWNLOAD_TORRENT_FILES=False - - REMOVE_ADULT_CONTENT=True - labels: - - "traefik.enable=true" - - "traefik.http.routers.comet.rule=Host(`${COMET_HOSTNAME}`)" - - "traefik.http.routers.comet.entrypoints=websecure" - - "traefik.http.routers.comet.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Comet" - - "flame.url=https://${COMET_HOSTNAME}" - volumes: - - ./data/comet:/app/data - healthcheck: - test: wget -qO- http://127.0.0.1:2020/health - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - stremio - - all - - - # Mediaflow Proxy service - mediaflow-proxy: - image: mhdzumair/mediaflow-proxy - container_name: mediaflow-proxy - restart: unless-stopped - expose: - - 8888 - environment: - API_PASSWORD: ${MEDIAFLOW_API_PASSWORD} - PROXY_URL: http://warp:1080 - TRANSPORT_ROUTES: '{ "https://torrentio.strem.fun": { "proxy": true } }' - labels: - - "traefik.enable=true" - - "traefik.http.routers.mediaflow.rule=Host(`${MEDIAFLOW_HOSTNAME}`)" - - "traefik.http.routers.mediaflow.entrypoints=websecure" - - "traefik.http.routers.mediaflow.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=MediaFlow Proxy" - - "flame.url=https://${MEDIAFLOW_HOSTNAME}" - healthcheck: - test: python3 -c "import urllib.request; print(urllib.request.urlopen('http://127.0.0.1:8888/health').read().decode())" - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - stremio - - all - - # MediaFusion - mediafusion: - image: mhdzumair/mediafusion:latest - container_name: mediafusion - restart: unless-stopped - expose: - - 8000 - env_file: - - ./data/mediafusion/.env - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8000/health"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - depends_on: - mongodb: - condition: service_healthy - redis: - condition: service_healthy - warp: - condition: service_healthy - labels: - - "traefik.enable=true" - - "traefik.http.routers.mediafusion.rule=Host(`${MEDIAFUSION_HOSTNAME?}`)" - - "traefik.http.routers.mediafusion.entrypoints=websecure" - - "traefik.http.routers.mediafusion.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=MediaFusion" - - "flame.url=https://${MEDIAFUSION_HOSTNAME?}" - profiles: - - stremio - - all - - dramatiq-worker: - image: mhdzumair/mediafusion:latest - container_name: dramatiq-worker - command: ["dramatiq", "api.task", "-p", "1", "-t", "4"] - restart: unless-stopped - env_file: - - ./data/mediafusion/.env - depends_on: - mongodb: - condition: service_healthy - redis: - condition: service_healthy - profiles: - - stremio - - all - - browserless: - image: ghcr.io/browserless/chromium - container_name: browserless - environment: - - TIMEOUT=-1 - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3000/json/version"] - interval: 30s - timeout: 10s - retries: 3 - profiles: - - stremio - - all - - stremthru: - image: muniftanjim/stremthru:latest - container_name: stremthru - restart: unless-stopped - expose: - - 8080 - environment: - - STREMTHRU_HTTP_PROXY=http://warp:1080 - - STREMTHRU_TUNNEL=*:false,torrentio.strem.fun:true # Only tunnel hostnames that block VPS access (e.g. Torrentio) - - STREMTHRU_PROXY_AUTH=user1:pass1,user2:pass2 - - STREMTHRU_STORE_AUTH=*:realdebrid:abc...xyz # Add apikey - - STREMTHRU_STORE_TUNNEL=realdebrid:api # Only send RD API via tunnel, not all access (e.g playback) - - STREMTHRU_STORE_CONTENT_PROXY=*:true,easydebrid:false,premiumize:false - - STREMTHRU_PEER_URI=https://stremthru.13377001.xyz - - STREMTHRU_DATABASE_URI=sqlite://./data/stremthru.db - - STREMTHRU_REDIS_URI=redis://redis:6379 # redis://garnet:6379 - depends_on: - warp: - condition: service_healthy - volumes: - - ./data/stremthru:/app/data - - labels: - - "traefik.enable=true" - - "traefik.http.routers.stremthru.rule=Host(`${STREMTHRU_HOSTNAME?}`)" - - "traefik.http.routers.stremthru.entrypoints=websecure" - - "traefik.http.routers.stremthru.tls.certresolver=myresolver" - - "traefik.http.services.stremthru.loadbalancer.server.port=8080" - - "flame.type=app" - - "flame.name=StremThru" - - "flame.url=https://${STREMTHRU_HOSTNAME}" - profiles: - - stremio - - all - - stremio-jackett: - image: belmeg/stremio-addon-jackett - container_name: stremio-jackett - restart: unless-stopped - expose: - - 3000 - environment: - - PUID=1000 - - PGID=1000 - - TZ=${TZ:-UTC} # Add timezone support - labels: - - "traefik.enable=true" - - "traefik.http.routers.stremiojackett.rule=Host(`${STREMIO_JACKETT_HOSTNAME?}`)" - - "traefik.http.routers.stremiojackett.entrypoints=websecure" - - "traefik.http.routers.stremiojackett.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Stremio-Jackett" - - "flame.url=https://${STREMIO_JACKETT_HOSTNAME}" - profiles: - - stremio - - all - - jackettio: - image: arvida42/jackettio:latest - container_name: jackettio - restart: unless-stopped - expose: - - 4000 - environment: - - JACKETT_URL=http://jackett:9117 - - JACKETT_API_KEY=${JACKETT_API_KEY:-} - - TMDB_ACCESS_TOKEN=${TMDB_ACCESS_TOKEN:-} - volumes: - - ./data/jackettio:/data - labels: - - "traefik.enable=true" - - "traefik.http.routers.jackettio.rule=Host(`${JACKETTIO_HOSTNAME?}`)" - - "traefik.http.routers.jackettio.entrypoints=websecure" - - "traefik.http.routers.jackettio.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Jackettio" - - "flame.url=https://${JACKETTIO_HOSTNAME}" - profiles: - - stremio - - all - - zilean: - image: ipromknight/zilean:latest - restart: unless-stopped - container_name: zilean - tty: true - environment: - Zilean__Database__ConnectionString: Host=postgres;Database=zilean;Username=${POSTGRES_USER:-postgres};Password=${POSTGRES_PASSWORD:-postgres};Include Error Detail=true;Timeout=30;CommandTimeout=3600 - Zilean__Imdb__UseAllCores: true - Zilean__Imdb__UseLucene: true - healthcheck: - test: curl --connect-timeout 10 --silent --show-error --fail http://localhost:8181/healthchecks/ping - timeout: 60s - interval: 30s - retries: 10 - depends_on: - postgres: - condition: service_healthy - volumes: - - zilean-tmp:/tmp - profiles: - - stremio - - debrid_media_server - - all - - prowlarr: - image: ghcr.io/hotio/prowlarr:latest - container_name: prowlarr - environment: - - PUID=1000 - - PGID=1000 - - UMASK=002 - - TZ=${TZ:-UTC} # Add timezone support - expose: - - 9696 - volumes: - - ./data/prowlarr:/config - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.prowlarr.rule=Host(`${PROWLARR_HOSTNAME?}`)" - - "traefik.http.routers.prowlarr.entrypoints=websecure" - - "traefik.http.routers.prowlarr.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Prowlarr" - - "flame.url=https://${PROWLARR_HOSTNAME}" - healthcheck: - test: curl -f http://localhost:9696/ping - interval: 30s - timeout: 10s - retries: 3 - start_period: 30s - profiles: - - stremio - - all - - debrid_media_server - - indexers - - jackett: - image: linuxserver/jackett:latest - container_name: jackett - environment: - - PUID=1000 - - PGID=1000 - - TZ=${TZ:-UTC} # Add timezone support - expose: - - 9117 - volumes: - - ./data/jackett:/config - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.jackett.rule=Host(`${JACKETT_HOSTNAME?}`)" - - "traefik.http.routers.jackett.entrypoints=websecure" - - "traefik.http.routers.jackett.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Jackett" - - "flame.url=https://${JACKETT_HOSTNAME}" - healthcheck: - test: curl -f http://localhost:9117/health - interval: 30s - timeout: 10s - retries: 3 - start_period: 30s - profiles: - - stremio - - all - - indexers - - nzbhydra2: - container_name: nzbhydra2 - image: ghcr.io/hotio/nzbhydra2:latest - expose: - - 5076 - environment: - - PUID=1000 - - PGID=1000 - - UMASK=002 - - TZ=${TZ:-UTC} - volumes: - - ./data/nzbhydra/config:/config - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.nzbhydra2.rule=Host(`${NZBHYDRA2_HOSTNAME?}`)" - - "traefik.http.routers.nzbhydra2.entrypoints=websecure" - - "traefik.http.routers.nzbhydra2.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=NZBHydra2" - - "flame.url=https://${NZBHYDRA2_HOSTNAME}" - profiles: - - nzbhydra2 - - all - - indexers - - flaresolverr: - image: ghcr.io/flaresolverr/flaresolverr:latest - container_name: flaresolverr - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8191/health"] - interval: 30s - timeout: 10s - retries: 3 - profiles: - - all - - stremio - - debrid_media_server - - byparr: - image: ghcr.io/thephaseless/byparr - container_name: byparr - restart: unless-stopped - environment: - - LOG_LEVEL=INFO - volumes: - - ./data/byparr/screenshots:/app/screenshots - healthcheck: - test: curl -f http://localhost:8191/health - interval: 5m - timeout: 10s - retries: 3 - start_period: 10s - profiles: - - all - - stremio - - debrid_media_server - - stremio-server: - image: stremio/server:latest - container_name: stremio-server - expose: - - 11470 - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.stremio-server.rule=Host(`${STREMIO_SERVER_HOSTNAME?}`)" - - "traefik.http.routers.stremio-server.entrypoints=websecure" - - "traefik.http.routers.stremio-server.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Stremio Server" - - "flame.url=https://${STREMIO_SERVER_HOSTNAME}" - profiles: - - stremio - - all - - # Warp for SOCKS5 proxy for AIOStreams, MediaFlow Proxy, and Prowlarr, MediaFusion - warp: - image: caomingjun/warp - container_name: warp - restart: unless-stopped - device_cgroup_rules: - - 'c 10:200 rwm' - expose: - - 1080 - environment: - - WARP_SLEEP=5 - cap_add: - - NET_ADMIN - sysctls: - - net.ipv6.conf.all.disable_ipv6=0 - - net.ipv4.conf.all.src_valid_mark=1 - volumes: - - ./data/warp:/var/lib/cloudflare-warp - healthcheck: - test: curl -x "socks5h://127.0.0.1:1080" -fsSL "https://www.cloudflare.com/cdn-cgi/trace" | grep -qE "warp=(plus|on)" || exit 1 - interval: 15s - timeout: 5s - retries: 3 - start_period: 5s - profiles: - - stremio - - all - - debrid_media_server - - mongodb: - image: mongo:latest - container_name: mongodb - restart: unless-stopped - volumes: - - mongodb-data:/data/db - healthcheck: - test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet - interval: 10s - timeout: 10s - retries: 5 - start_period: 40s - profiles: - - stremio - - all - - postgres: - image: postgres:17.2-alpine - container_name: postgres - restart: unless-stopped - shm_size: 2G - environment: - PGDATA: /var/lib/postgresql/data/pgdata - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - POSTGRES_DB: postgres - volumes: - - postgres-data:/var/lib/postgresql/data/pgdata - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U postgres" ] - interval: 10s - timeout: 5s - retries: 5 - profiles: - - debrid_media_server - - stremio - - all - - redis: - image: redis:latest - container_name: redis - restart: unless-stopped - volumes: - - redis-data:/data - command: redis-server --appendonly yes --save 60 1 - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 5 - profiles: - - stremio - - all - - # garnet: - # image: 'ghcr.io/microsoft/garnet' - # command: - # - --lua - # - --lua-transaction-mode - # ulimits: - # memlock: -1 - # container_name: garnet - # restart: unless-stopped - # # To avoid docker NAT, consider `host` mode. - # # https://docs.docker.com/compose/compose-file/compose-file-v3/#network_mode - # # network_mode: "host" - # volumes: - # - garnet-data:/data - # profiles: - # - stremio - # - all - - - aiostremio: - image: viren070/aiostremio:latest - container_name: aiostremio - restart: unless-stopped - expose: - - 8469 - volumes: - - ./data/aiostremio:/app/data - environment: - ADMIN_USERNAME: ${AIOSTREMIO_ADMIN_USERNAME?} - ADMIN_PASSWORD: ${AIOSTREMIO_ADMIN_PASSWORD?} - MEDIAFLOW_API_PASSWORD: ${MEDIAFLOW_API_PASSWORD:-} - REDIS_HOST: redis - REDIS_PORT: 6379 - REDIS_PASSWORD: - DEBRID_API_KEY: ${DEBRID_API_KEY} - labels: - - "traefik.enable=true" - - "traefik.http.routers.aiostremio.rule=Host(`${AIOSTREMIO_HOSTNAME?}`)" - - "traefik.http.routers.aiostremio.entrypoints=websecure" - - "traefik.http.routers.aiostremio.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=AIOStremio" - - "flame.url=https://${AIOSTREMIO_HOSTNAME}" - profiles: - - stremio - - all - - - omg-tv-stremio-addon: - build: - context: https://github.com/mccoy88f/OMG-Premium-TV.git - dockerfile: Dockerfile - image: omg-tv-stremio-addon - container_name: omg-tv-stremio-addon - restart: unless-stopped - expose: - - 7860 - environment: - - PORT=7860 - - HOST=0.0.0.0 - labels: - - "traefik.enable=true" - - "traefik.http.routers.omg-tv-stremio-addon.rule=Host(`${OMG_TV_STREMIO_ADDON_HOSTNAME?}`)" - - "traefik.http.routers.omg-tv-stremio-addon.entrypoints=websecure" - - "traefik.http.routers.omg-tv-stremio-addon.tls.certresolver=myresolver" - - "traefik.http.services.omg-tv-stremio-addon.loadbalancer.server.port=7860" - - "flame.type=app" - - "flame.name=OMG TV Stremio Addon" - - "flame.url=https://${OMG_TV_STREMIO_ADDON_HOSTNAME}" - profiles: - - stremio - - all - - - - addon-manager: - image: reddravenn/stremio-addon-manager:latest - container_name: addon-manager - restart: unless-stopped - expose: - - 80 - labels: - - "traefik.enable=true" - - "traefik.http.routers.addon-manager.rule=Host(`${ADDON_MANAGER_HOSTNAME?}`)" - - "traefik.http.routers.addon-manager.entrypoints=websecure" - - "traefik.http.routers.addon-manager.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Stremio Addon Manager" - - "flame.url=https://${ADDON_MANAGER_HOSTNAME}" - profiles: - - stremio - - all - - - ravenn-catalogs: - image: reddravenn/stremio-catalog-providers - container_name: ravenn-catalogs - expose: - - 7000 - environment: - PORT: 7000 - BASE_URL: https://${RAVENN_CATALOGS_HOSTNAME?} - DB_USER: ${POSTGRES_USER:-postgres} - DB_HOST: ravenn-postgres - DB_NAME: stremio_catalog_db - DB_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - DB_PORT: 5432 - DB_MAX_CONNECTIONS: 20 - DB_IDLE_TIMEOUT: 30000 - DB_CONNECTION_TIMEOUT: 2000 - REDIS_HOST: ravenn-redis - REDIS_PORT: 6379 - REDIS_PASSWORD: - TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID?} - TRAKT_CLIENT_SECRET: ${TRAKT_CLIENT_SECRET?} - TRAKT_HISTORY_FETCH_INTERVAL: 1d - CACHE_CATALOG_CONTENT_DURATION_DAYS: 1 - CACHE_POSTER_CONTENT_DURATION_DAYS: 7 - LOG_LEVEL: info - LOG_INTERVAL_DELETION: 3d - NODE_ENV: production - depends_on: - ravenn-postgres: - condition: service_healthy - ravenn-redis: - condition: service_healthy - volumes: - - ./data/ravenn/catalogs/db:/usr/src/app/db - - ./data/ravenn/catalogs/log:/usr/src/app/log - labels: - - "traefik.enable=true" - - "traefik.http.routers.ravenn-catalogs.rule=Host(`${RAVENN_CATALOGS_HOSTNAME?}`)" - - "traefik.http.routers.ravenn-catalogs.entrypoints=websecure" - - "traefik.http.routers.ravenn-catalogs.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Stremio Catalogs" - - "flame.url=https://${RAVENN_CATALOGS_HOSTNAME}" - profiles: - - stremio - - all - - ravenn-trakt: - image: reddravenn/stremio-trakt-addon - container_name: ravenn-trakt - expose: - - 7000 - environment: - PORT: 7000 - BASE_URL: https://${RAVENN_TRAKT_HOSTNAME?} - DB_USER: ${POSTGRES_USER:-postgres} - DB_HOST: ravenn-postgres - DB_NAME: stremio_trakt_db - DB_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - DB_PORT: 5432 - DB_MAX_CONNECTIONS: 20 - DB_IDLE_TIMEOUT: 30000 - DB_CONNECTION_TIMEOUT: 2000 - REDIS_HOST: ravenn-redis - REDIS_PORT: 6379 - REDIS_PASSWORD: - TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID?} - TRAKT_CLIENT_SECRET: ${TRAKT_CLIENT_SECRET?} - TMDB_CACHE_DURATION: 1d - TRAKT_CACHE_DURATION: 1d - TRAKT_HISTORY_FETCH_INTERVAL: 1d - LOG_LEVEL: info - LOG_INTERVAL_DELETION: 3d - NODE_ENV: production - restart: unless-stopped - depends_on: - ravenn-postgres: - condition: service_healthy - ravenn-redis: - condition: service_healthy - volumes: - - ./data/ravenn/trakt/cache:/usr/src/app/cache - - ./data/ravenn/trakt/log:/usr/src/app/log - labels: - - "traefik.enable=true" - - "traefik.http.routers.ravenn-trakt.rule=Host(`${RAVENN_TRAKT_HOSTNAME?}`)" - - "traefik.http.routers.ravenn-trakt.entrypoints=websecure" - - "traefik.http.routers.ravenn-trakt.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Stremio Trakt" - - "flame.url=https://${RAVENN_TRAKT_HOSTNAME}" - profiles: - - stremio - - all - - ravenn-postgres: - container_name: ravenn-postgres - image: postgres:16.4 - environment: - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - volumes: - - ravenn-postgres:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - stremio - - all - - ravenn-redis: - container_name: ravenn-redis - image: redis:6 - volumes: - - ravenn-redis:/data - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - stremio - - all - - - # https://github.com/5rahim/seanime - # App/Server for anime. - seanime: - image: umagistr/seanime - container_name: seanime - command: - volumes: - - /mnt/user/anime:/anime - - /mnt/user/downloads:/downloads - - /mnt:/mnt - - ./data/seanime:/root/.config/Seanime - expose: - - 43211 - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.seanime.rule=Host(`${SEANIME_HOSTNAME?}`)" - - "traefik.http.routers.seanime.entrypoints=websecure" - - "traefik.http.routers.seanime.tls.certresolver=myresolver" - - "traefik.http.routers.seanime.middlewares=seanime-auth" - - "traefik.http.middlewares.seanime-auth.basicauth.users=${SEANIME_USERNAME?}:${SEANIME_HASHED_PASSWORD?}" - - "flame.type=app" - - "flame.name=Seanime" - - "flame.url=https://${SEANIME_HOSTNAME}" - healthcheck: - test: wget -qO- http://localhost:43211/api/v1/status - interval: 5m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - seanime - - all - - searxng: - container_name: searxng - image: docker.io/searxng/searxng:latest - restart: unless-stopped - expose: - - 8080 - volumes: - - ./data/searxng:/etc/searxng:rw - environment: - - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/ - - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4} - - UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4} - logging: - driver: "json-file" - options: - max-size: "1m" - max-file: "1" - labels: - - "traefik.enable=true" - - "traefik.http.routers.searxng.rule=Host(`${SEARXNG_HOSTNAME}`)" - - "traefik.http.routers.searxng.entrypoints=websecure" - - "traefik.http.routers.searxng.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=SearxNG" - - "flame.url=https://${SEARXNG_HOSTNAME}" - profiles: - - searxng - - all - - plausible_db: - image: postgres:16-alpine - restart: unless-stopped - container_name: plausible-db - volumes: - - plausible-db:/var/lib/postgresql/data - environment: - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - start_period: 1m - profiles: - - plausible - - all - - plausible_events_db: - image: clickhouse/clickhouse-server:24.3.3.102-alpine - restart: unless-stopped - container_name: plausible-events-db - volumes: - - plausible-event-db:/var/lib/clickhouse - - plausible-event-logs:/var/log/clickhouse-server - - ./data/plausible/clickhouse/logs.xml:/etc/clickhouse-server/config.d/logs.xml:ro - - ./data/plausible/clickhouse/ipv4-only.xml:/etc/clickhouse-server/config.d/ipv4-only.xml:ro - - ./data/plausible/clickhouse/low-resources.xml:/etc/clickhouse-server/config.d/low-resources.xml:ro - ulimits: - nofile: - soft: 262144 - hard: 262144 - healthcheck: - test: ["CMD-SHELL", "wget --no-verbose --tries=1 -O - http://127.0.0.1:8123/ping || exit 1"] - start_period: 1m - profiles: - - plausible - - all - - plausible: - image: ghcr.io/plausible/community-edition:latest - container_name: plausible - restart: unless-stopped - command: sh -c "/entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" - depends_on: - plausible_db: - condition: service_healthy - plausible_events_db: - condition: service_healthy - volumes: - - plausible-data:/var/lib/plausible - ulimits: - nofile: - soft: 65535 - hard: 65535 - expose: - - 8000 - environment: - TMPDIR: /var/lib/plausible/tmp - BASE_URL: https://${PLAUSIBLE_HOSTNAME?} - SECRET_KEY_BASE: ${PLAUSIBLE_SECRET_KEY_BASE?} - HTTP_PORT: 8000 - labels: - - "traefik.enable=true" - - "traefik.http.routers.plausible.rule=Host(`${PLAUSIBLE_HOSTNAME}`)" - - "traefik.http.routers.plausible.entrypoints=websecure" - - "traefik.http.routers.plausible.tls.certresolver=myresolver" - - "traefik.http.services.plausible.loadbalancer.server.port=8000" - - "flame.type=app" - - "flame.name=Plausible" - - "flame.url=https://${PLAUSIBLE_HOSTNAME}" - profiles: - - plausible - - all - - zipline: - image: ghcr.io/diced/zipline:v4 - container_name: zipline - restart: unless-stopped - expose: - - 3000 - environment: - - DATABASE_URL=postgres://${ZIPLINE_POSTGRES_USER:-zipline}:${ZIPLINE_POSTGRES_PASSWORD}@zipline-db:5432/${ZIPLINE_POSTGRES_DB:-zipline} - - CORE_SECRET=${ZIPLINE_CORE_SECRET?} - depends_on: - zipline-db: - condition: service_healthy - volumes: - - './data/zipline/uploads:/zipline/uploads' - - './data/zipline/public:/zipline/public' - - './data/zipline/themes:/zipline/themes' - labels: - - "traefik.enable=true" - - "traefik.http.routers.zipline.rule=Host(`${ZIPLINE_HOSTNAME?}`)" - - "traefik.http.routers.zipline.entrypoints=websecure" - - "traefik.http.routers.zipline.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Zipline" - - "flame.url=https://${ZIPLINE_HOSTNAME}" - profiles: - - zipline - - all - - zipline-db: - image: postgres:16 - restart: unless-stopped - container_name: zipline-db - volumes: - - zipline-db:/var/lib/postgresql/data - environment: - POSTGRES_USER: ${ZIPLINE_POSTGRES_USER:-zipline} - POSTGRES_PASSWORD: ${ZIPLINE_POSTGRES_PASSWORD?} - POSTGRES_DB: ${ZIPLINE_POSTGRES_DB:-zipline} - healthcheck: - test: ["CMD-SHELL", "pg_isready -U zipline"] - start_period: 1m - profiles: - - zipline - - all - - # https://setupmc.com/java-server/ - # Use the above link to generate the service configuration for your Minecraft server. - minecraft: - image: itzg/minecraft-server:latest - tty: true - stdin_open: true - container_name: minecraft - ports: - - "25565:25565" - environment: - EULA: "TRUE" - TYPE: ${MINECRAFT_SERVER_TYPE:-PAPER} - MEMORY: ${MINECRAFT_SERVER_MEMORY:-8G} - MOTD: ${MINECRAFT_SERVER_MOTD:-"A Minecraft Server"} - OVERRIDE_ICON: ${MINECRAFT_SERVER_OVERRIDE_ICON:-} - ICON: ${MINECRAFT_SERVER_ICON:-} - USE_AIKAR_FLAGS: "TRUE" - TZ: ${TZ:-UTC} - DIFFICULTY: "2" - VIEW_DISTANCE: ${MINECRAFT_SERVER_VIEW_DISTANCE:-10} - OPS: |- - ${MINECRAFT_SERVER_OP:-} - ENABLE_WHITE_LIST: ${MINECRAFT_SERVER_ENABLE_WHITE_LIST:-false} - WHITELIST: ${MINECRAFT_SERVER_WHITELIST:-} - volumes: - - "./data/minecraft:/data" - profiles: - - minecraft - - all - - vaultwarden: - image: vaultwarden/server:latest - container_name: vaultwarden - restart: unless-stopped - expose: - - 80 - environment: - DOMAIN: "https://${VAULTWARDEN_HOSTNAME?}" - SIGNUPS_ALLOWED: ${VAULTWARDEN_SIGNUPS_ALLOWED:-true} - ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN?} - volumes: - - ./data/vaultwarden:/data/ - labels: - - "traefik.enable=true" - - "traefik.http.routers.vaultwarden.rule=Host(`${VAULTWARDEN_HOSTNAME?}`)" - - "traefik.http.routers.vaultwarden.entrypoints=websecure" - - "traefik.http.routers.vaultwarden.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Vaultwarden" - - "flame.url=https://${VAULTWARDEN_HOSTNAME?}" - profiles: - - vaultwarden - - all - - - - - # ================================================================================================== - # DEBRID MEDIA SERVER - # ================================================================================================== - # This is incomplete and will be updated in the future with a proper guide. - # The below stack does mostly work, but there could be some permission issues which can be resolved with (not recommended): - # - sudo chmod -R 777 /mnt/symlinks - # You should only use the below as a reference. - blackhole: - image: ghcr.io/westsurname/scripts/blackhole:latest - container_name: blackhole - user: "1000:1000" - volumes: - - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} - - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} - - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} - - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} - - ./data/blackhole/logs:/app/logs - - /mnt:/mnt - env_file: - - ./data/blackhole/.env - environment: - - PUID=1000 - - PGID=1000 - - UMASK=002 - - SONARR_HOST=${SONARR_HOST} - - SONARR_API_KEY=${SONARR_API_KEY} - - RADARR_HOST=${RADARR_HOST} - - RADARR_API_KEY=${RADARR_API_KEY} - - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} - restart: unless-stopped - depends_on: - rclone: - condition: service_started - sonarr: - condition: service_healthy - radarr: - condition: service_healthy - profiles: - - debrid_media_server - - all - - repair: - image: ghcr.io/westsurname/scripts/scripts:latest - container_name: repair - command: python repair.py --no-confirm - restart: unless-stopped - env_file: - - ./data/blackhole/.env - environment: - - SONARR_HOST=${SONARR_HOST} - - SONARR_API_KEY=${SONARR_API_KEY} - - RADARR_HOST=${RADARR_HOST} - - RADARR_API_KEY=${RADARR_API_KEY} - volumes: - - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} - - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} - - ${SONARR_ROOT_FOLDER}:${SONARR_ROOT_FOLDER} - - ${RADARR_ROOT_FOLDER}:${RADARR_ROOT_FOLDER} - depends_on: - rclone: - condition: service_started - sonarr: - condition: service_healthy - radarr: - condition: service_healthy - profiles: - - debrid_media_server - - all - - blackhole4k: - image: ghcr.io/westsurname/scripts/blackhole:latest - container_name: blackhole4k - user: "1000:1000" - volumes: - - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} - - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} - - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} - - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} - - ./data/blackhole4k/logs:/app/logs - - /mnt:/mnt - env_file: - - ./data/blackhole/.env - environment: - - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} - - PUID=1000 - - PGID=1000 - - UMASK=002 - - SONARR_HOST=${SONARR_HOST_4K} - - SONARR_API_KEY=${SONARR_API_KEY_4K} - - RADARR_HOST=${RADARR_HOST_4K} - - RADARR_API_KEY=${RADARR_API_KEY_4K} - - SONARR_ROOT_FOLDER=${SONARR_ROOT_FOLDER_4K} - - RADARR_ROOT_FOLDER=${RADARR_ROOT_FOLDER_4K} - restart: unless-stopped - depends_on: - rclone: - condition: service_started - sonarr4k: - condition: service_healthy - radarr4k: - condition: service_healthy - profiles: - - debrid_media_server - - all - - repair4k: - image: ghcr.io/westsurname/scripts/scripts:latest - container_name: repair4k - command: python repair.py --no-confirm - restart: unless-stopped - env_file: - - ./data/blackhole/.env - environment: - - SONARR_HOST=${SONARR_HOST_4K} - - SONARR_API_KEY=${SONARR_API_KEY_4K} - - RADARR_HOST=${RADARR_HOST_4K} - - RADARR_API_KEY=${RADARR_API_KEY_4K} - volumes: - - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} - - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} - - ${SONARR_ROOT_FOLDER_4K}:${SONARR_ROOT_FOLDER_4K} - - ${RADARR_ROOT_FOLDER_4K}:${RADARR_ROOT_FOLDER_4K} - depends_on: - rclone: - condition: service_started - sonarr4k: - condition: service_healthy - radarr4k: - condition: service_healthy - profiles: - - debrid_media_server - - all - - blackholeanime: - image: ghcr.io/westsurname/scripts/blackhole:latest - container_name: blackholeanime - user: "1000:1000" - volumes: - - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} - - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} - - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH} - - ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH} - - ./data/blackholeanime/logs:/app/logs - - /mnt:/mnt - env_file: - - ./data/blackhole/.env - environment: - - BLACKHOLE_BASE_WATCH_PATH=${BLACKHOLE_BASE_WATCH_PATH} - - PUID=1000 - - PGID=1000 - - UMASK=002 - - SONARR_HOST=${SONARR_HOST_ANIME} - - SONARR_API_KEY=${SONARR_API_KEY_ANIME} - - RADARR_HOST=${RADARR_HOST_ANIME} - - RADARR_API_KEY=${RADARR_API_KEY_ANIME} - - SONARR_ROOT_FOLDER=${SONARR_ROOT_FOLDER_ANIME} - - RADARR_ROOT_FOLDER=${RADARR_ROOT_FOLDER_ANIME} - - restart: unless-stopped - depends_on: - rclone: - condition: service_started - sonarranime: - condition: service_healthy - radarranime: - condition: service_healthy - profiles: - - debrid_media_server - - all - - repairanime: - image: ghcr.io/westsurname/scripts/scripts:latest - container_name: repairanime - command: python repair.py --no-confirm - restart: unless-stopped - env_file: - - ./data/blackhole/.env - environment: - - SONARR_HOST=${SONARR_HOST_ANIME} - - SONARR_API_KEY=${SONARR_API_KEY_ANIME} - - RADARR_HOST=${RADARR_HOST_ANIME} - - RADARR_API_KEY=${RADARR_API_KEY_ANIME} - volumes: - - ${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null}:${REALDEBRID_MOUNT_TORRENTS_PATH:-/dev/null} - - ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null} - - ${SONARR_ROOT_FOLDER_ANIME}:${SONARR_ROOT_FOLDER_ANIME} - - ${RADARR_ROOT_FOLDER_ANIME}:${RADARR_ROOT_FOLDER_ANIME} - depends_on: - rclone: - condition: service_started - sonarranime: - condition: service_healthy - radarranime: - condition: service_healthy - profiles: - - debrid_media_server - - all - - radarr: - container_name: radarr - environment: - - PUID=1000 - - PGID=1000 - expose: - - 7878 - hostname: radarr - image: ghcr.io/hotio/radarr:release - restart: unless-stopped - volumes: - - /mnt:/mnt - - /opt/radarr:/config - - /opt/scripts:/scripts - - /usr/bin/rclone:/usr/bin/rclone - labels: - - "traefik.enable=true" - - "traefik.http.routers.radarr.rule=Host(`${RADARR_HOSTNAME}`)" - - "traefik.http.routers.radarr.entrypoints=websecure" - - "traefik.http.routers.radarr.tls.certresolver=myresolver" - - "traefik.http.services.radarr.loadbalancer.server.port=7878" - - "flame.type=app" - - "flame.name=Radarr" - - "flame.url=https://${RADARR_HOSTNAME}" - depends_on: - - rclone - healthcheck: - test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - debrid_media_server - - all - - - radarr4k: - container_name: radarr4k - expose: - - 7878 - environment: - - PUID=1000 - - PGID=1000 - image: ghcr.io/hotio/radarr:release - restart: unless-stopped - volumes: - - /mnt:/mnt - - /opt/radarr4k:/config - - /opt/scripts:/scripts - - /usr/bin/rclone:/usr/bin/rclone - labels: - - "traefik.enable=true" - - "traefik.http.routers.radarr4k.rule=Host(`${RADARR4K_HOSTNAME}`)" - - "traefik.http.routers.radarr4k.entrypoints=websecure" - - "traefik.http.routers.radarr4k.tls.certresolver=myresolver" - - "traefik.http.services.radarr4k.loadbalancer.server.port=7878" - - "flame.type=app" - - "flame.name=Radarr4k" - - "flame.url=https://${RADARR4K_HOSTNAME}" - depends_on: - - rclone - healthcheck: - test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - debrid_media_server - - all - - radarranime: - container_name: radarranime - expose: - - 7878 - image: ghcr.io/hotio/radarr:release - environment: - - PUID=1000 - - PGID=1000 - restart: unless-stopped - volumes: - - /mnt:/mnt - - /opt/radarranime:/config - - /opt/scripts:/scripts - - /usr/bin/rclone:/usr/bin/rclone - labels: - - "traefik.enable=true" - - "traefik.http.routers.radarranime.rule=Host(`${RADARRANIME_HOSTNAME}`)" - - "traefik.http.routers.radarranime.entrypoints=websecure" - - "traefik.http.routers.radarranime.tls.certresolver=myresolver" - - "traefik.http.services.radarranime.loadbalancer.server.port=7878" - - "flame.type=app" - - "flame.name=RadarrAnime" - - "flame.url=https://${RADARRANIME_HOSTNAME}" - depends_on: - - rclone - healthcheck: - test: ["CMD-SHELL", "curl -s http://localhost:7878/ping | grep -q '\"status\": \"OK\"' || exit 1"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - debrid_media_server - - all - - sonarr: - container_name: sonarr - expose: - - 8989 - image: ghcr.io/hotio/sonarr:release - restart: unless-stopped - environment: - - PUID=1000 - - PGID=1000 - labels: - - "traefik.enable=true" - - "traefik.http.routers.sonarr.rule=Host(`${SONARR_HOSTNAME}`)" - - "traefik.http.routers.sonarr.entrypoints=websecure" - - "traefik.http.routers.sonarr.tls.certresolver=myresolver" - - "traefik.http.services.sonarr.loadbalancer.server.port=8989" - - "flame.type=app" - - "flame.name=Sonarr" - - "flame.url=https://${SONARR_HOSTNAME}" - volumes: - - /mnt:/mnt - - /opt/sonarr:/config - - /opt/scripts:/scripts - - /usr/bin/rclone:/usr/bin/rclone - depends_on: - - rclone - healthcheck: - test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - debrid_media_server - - all - - sonarr4k: - container_name: sonarr4k - environment: - - PUID=1000 - - PGID=1000 - expose: - - 8989 - image: ghcr.io/hotio/sonarr:release - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.sonarr4k.rule=Host(`${SONARR4K_HOSTNAME}`)" - - "traefik.http.routers.sonarr4k.entrypoints=websecure" - - "traefik.http.routers.sonarr4k.tls.certresolver=myresolver" - - "traefik.http.services.sonarr4k.loadbalancer.server.port=8989" - - "flame.type=app" - - "flame.name=Sonarr4k" - - "flame.url=https://${SONARR4K_HOSTNAME}" - volumes: - - /mnt:/mnt - - /opt/sonarr4k:/config - - /opt/scripts:/scripts - - /usr/bin/rclone:/usr/bin/rclone - depends_on: - - rclone - healthcheck: - test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - debrid_media_server - - all - - - sonarranime: - container_name: sonarranime - expose: - - 8989 - image: ghcr.io/hotio/sonarr:release - environment: - - PUID=1000 - - PGID=1000 - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.sonarranime.rule=Host(`${SONARRANIME_HOSTNAME}`)" - - "traefik.http.routers.sonarranime.entrypoints=websecure" - - "traefik.http.routers.sonarranime.tls.certresolver=myresolver" - - "traefik.http.services.sonarranime.loadbalancer.server.port=8989" - - "flame.type=app" - - "flame.name=SonarrAnime" - - "flame.url=https://${SONARRANIME_HOSTNAME}" - volumes: - - /mnt:/mnt - - /opt/sonarranime:/config - - /opt/scripts:/scripts - - /usr/bin/rclone:/usr/bin/rclone - depends_on: - - rclone - healthcheck: - test: ["CMD-SHELL", "curl -s http://localhost:8989/ping | grep -q '\"status\": \"OK\"' || exit 1"] - interval: 1m - timeout: 10s - retries: 5 - start_period: 10s - profiles: - - debrid_media_server - - all - - - recyclarr: - image: ghcr.io/recyclarr/recyclarr:latest - container_name: recyclarr - user: "1000:1000" - restart: unless-stopped - environment: - - TZ=${TZ:-UTC} - volumes: - - ./data/recyclarr:/config - - autosync: - image: ghcr.io/pukabyte/autosync:latest - container_name: autosync - expose: - - 3536 - volumes: - - ./data/autosync/config.yaml:/app/config.yaml:ro - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.autosync.rule=Host(`${AUTOSYNC_HOSTNAME}`)" - - "traefik.http.routers.autosync.entrypoints=websecure" - - "traefik.http.routers.autosync.tls.certresolver=myresolver" - - "traefik.http.services.autosync.loadbalancer.server.port=3536" - - "flame.type=app" - - "flame.name=AutoSync" - - "flame.url=https://${AUTOSYNC_HOSTNAME}" - profiles: - - debrid_media_server - - all - plex: - image: plexinc/pms-docker:latest - container_name: plex - restart: unless-stopped - ports: - - 1900/udp - - "32400:32400/tcp" - - 32410/udp - - 32412/udp - - 32413/udp - - 32414/udp - - 32469/tcp - - 8324/tcp - expose: - - 32400 - environment: - - PLEX_UID=1000 - - PLEX_GID=1000 - - PLEX_CLAIM=${PLEX_CLAIM} - - TZ=Europe/London - volumes: - - /dev/shm:/dev/shm - - /mnt/local/transcodes/plex:/transcode - - /mnt:/mnt - - /opt/plex:/config - - /opt/scripts:/scripts - labels: - - "traefik.enable=true" - - "traefik.http.routers.plex.rule=Host(`${PLEX_HOSTNAME}`)" - - "traefik.http.routers.plex.entrypoints=websecure" - - "traefik.http.routers.plex.tls.certresolver=myresolver" - - "traefik.http.services.plex.loadbalancer.server.port=32400" - - "traefik.http.middlewares.plex-https-redirect.redirectscheme.scheme=https" - - "traefik.http.routers.plex.middlewares=plex-https-redirect" - - "flame.type=app" - - "flame.name=Plex" - - "flame.url=https://${PLEX_HOSTNAME}" - depends_on: - - rclone - profiles: - - debrid_media_server - - all - - jellyfin: - image: lscr.io/linuxserver/jellyfin:latest - restart: unless-stopped - container_name: jellyfin - expose: - - 8096 - environment: - - TZ=${TZ:-UTC} - volumes: - - ./data/jellyfin:/config - - /mnt:/mnt - labels: - - "traefik.enable=true" - - "traefik.http.routers.jellyfin.rule=Host(`${JELLYFIN_HOSTNAME}`)" - - "traefik.http.routers.jellyfin.tls=true" - - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" - - "traefik.http.routers.jellyfin.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Jellyfin" - - "flame.url=https://${JELLYFIN_HOSTNAME}" - depends_on: - - rclone - profiles: - - debrid_media_server - - all - - jellyseer: - image: fallenbagel/jellyseerr:latest - container_name: jellyseer - restart: unless-stopped - expose: - - 5055 - environment: - - TZ=${TZ:-UTC} - - LOG_LEVEL=debug - labels: - - "traefik.enable=true" - - "traefik.http.routers.jellyseer.rule=Host(`${JELLYSEER_HOSTNAME}`)" - - "traefik.http.routers.jellyseer.entrypoints=websecure" - - "traefik.http.routers.jellyseer.tls.certresolver=myresolver" - - "flame.type=app" - - "flame.name=Jellyseer" - - "flame.url=https://${JELLYSEER_HOSTNAME}" - volumes: - - ./data/jellyseer:/app/config - depends_on: - - rclone - profiles: - - debrid_media_server - - all - - zurg: - image: ghcr.io/debridmediamanager/zurg-testing:v0.9.3-final - container_name: zurg - restart: unless-stopped - healthcheck: - test: curl -f localhost:9999/dav/version.txt || exit 1 - ports: - - 9999:9999 - volumes: - - ./data/zurg/config.yml:/app/config.yml - - ./data/zurg/data:/app/data - profiles: - - debrid_media_server - - all - - rclone: - image: rclone/rclone:latest - container_name: rclone - restart: unless-stopped - environment: - TZ: ${TZ:-UTC} - PUID: 1000 - PGID: 1000 - volumes: - - /mnt/remote/realdebrid:/data:rshared - - ./data/zurg/rclone.conf:/config/rclone/rclone.conf - - /mnt:/mnt - cap_add: - - SYS_ADMIN - security_opt: - - apparmor:unconfined - devices: - - /dev/fuse:/dev/fuse:rwm - depends_on: - zurg: - condition: service_healthy - restart: true - command: "mount zurg: /data --allow-non-empty --allow-other --uid=1000 --gid=1000 --umask=002 --dir-cache-time 10s" - profiles: - - debrid_media_server - - all - -volumes: - zilean-tmp: - redis-data: - postgres-data: - mongodb-data: - ravenn-postgres: - ravenn-redis: - plausible-db: - plausible-data: - plausible-event-db: - plausible-event-logs: - garnet-data: - zipline-db: - - - -networks: - default: - name: ${DOCKER_NETWORK:-aio_default} - external: ${DOCKER_NETWORK_EXTERNAL:-false} \ No newline at end of file diff --git a/data/aiostremio/config.json b/data/aiostremio/config.json new file mode 100644 index 0000000..8f73b8e --- /dev/null +++ b/data/aiostremio/config.json @@ -0,0 +1,29 @@ +{ + "debrid_service": "torbox", + "addon_config": { + "torrentio": { + "debrid_service": "", + "debrid_api_key": "" + }, + "comet": { + "base_url": "https://comet.elfhosted.com", + "debrid_service": "", + "debrid_api_key": "" + }, + "debridio": { + "debrid_service": "easydebrid", + "debrid_api_key": "" + }, + "peerflix": { + "debrid_service": "", + "debrid_api_key": "" + } + }, + "addon_url": "https://aiostremio.yourdomain.com", + "mediaflow_url": "http://mediaflow-proxy:8888", + "external_mediaflow_url": "https://mediaflow.your-domain.com", + "mediaflow_enabled": true, + "cache_ttl_seconds": 604800, + "buffer_size_mb": 256, + "chunk_size_mb": 4 +} \ No newline at end of file diff --git a/data/authelia/config/assets/empty b/data/authelia/config/assets/empty new file mode 100644 index 0000000..e69de29 diff --git a/data/authelia/config/certificates/empty b/data/authelia/config/certificates/empty new file mode 100644 index 0000000..e69de29 diff --git a/data/authelia/config/configuration.yml b/data/authelia/config/configuration.yml new file mode 100644 index 0000000..f46b38b --- /dev/null +++ b/data/authelia/config/configuration.yml @@ -0,0 +1,1667 @@ +# yamllint disable rule:comments-indentation +--- +############################################################################### +## Authelia Configuration ## +############################################################################### + +## +## Notes: +## +## - the default location of this file is assumed to be configuration.yml unless otherwise noted +## - when using docker the container expects this by default to be at /config/configuration.yml +## - the default location where this file is loaded from can be overridden with the X_AUTHELIA_CONFIG environment var +## - the comments in this configuration file are helpful but users should consult the official documentation on the +## website at https://www.authelia.com/ or https://www.authelia.com/configuration/prologue/introduction/ +## - this configuration file template is not automatically updated +## + +## Certificates directory specifies where Authelia will load trusted certificates (public portion) from in addition to +## the system certificates store. +## They should be in base64 format, and have one of the following extensions: *.cer, *.crt, *.pem. +# certificates_directory: '/config/certificates/' + +## The theme to display: light, dark, grey, auto. +theme: 'dark' + +## Set the default 2FA method for new users and for when a user has a preferred method configured that has been +## disabled. This setting must be a method that is enabled. +## Options are totp, webauthn, mobile_push. +default_2fa_method: 'totp' + +## +## Server Configuration +## +server: + ## The address for the Main server to listen on in the address common syntax. + ## Formats: + ## - [://][:][/] + ## - [://][hostname]:[/] + ## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', 'unix', or 'fd'. + ## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '9091'. + ## If the path is specified this configures the router to handle both the `/` path and the configured path. + # address: 'tcp://:9091/' + + ## Set the path on disk to Authelia assets. + ## Useful to allow overriding of specific static assets. + # asset_path: '/config/assets/' + + ## Disables writing the health check vars to /app/.healthcheck.env which makes healthcheck.sh return exit code 0. + ## This is disabled by default if either /app/.healthcheck.env or /app/healthcheck.sh do not exist. + # disable_healthcheck: false + + ## Authelia by default doesn't accept TLS communication on the server port. This section overrides this behaviour. + # tls: + ## The path to the DER base64/PEM format private key. + # key: '' + + ## The path to the DER base64/PEM format public certificate. + # certificate: '' + + ## The list of certificates for client authentication. + # client_certificates: [] + + ## Server headers configuration/customization. + # headers: + + ## The CSP Template. Read the docs. + # csp_template: '' + + ## Server Buffers configuration. + # buffers: + + ## Buffers usually should be configured to be the same value. + ## Explanation at https://www.authelia.com/c/server#buffer-sizes + ## Read buffer size adjusts the server's max incoming request size in bytes. + ## Write buffer size does the same for outgoing responses. + + ## Read buffer. + # read: 4096 + + ## Write buffer. + # write: 4096 + + ## Server Timeouts configuration. + # timeouts: + + ## Read timeout in the duration common syntax. + # read: '6 seconds' + + ## Write timeout in the duration common syntax. + # write: '6 seconds' + + ## Idle timeout in the duration common syntax. + # idle: '30 seconds' + + ## Server Endpoints configuration. + ## This section is considered advanced and it SHOULD NOT be configured unless you've read the relevant documentation. + endpoints: + ## Enables the pprof endpoint. + # enable_pprof: false + + ## Enables the expvars endpoint. + # enable_expvars: false + + ## Configure the authz endpoints. + authz: + forward-auth: + implementation: 'ForwardAuth' + # authn_strategies: [] + # ext-authz: + # implementation: 'ExtAuthz' + # authn_strategies: [] + # auth-request: + # implementation: 'AuthRequest' + # authn_strategies: [] + # legacy: + # implementation: 'Legacy' + # authn_strategies: [] + +## +## Log Configuration +## +log: + ## Level of verbosity for logs: info, debug, trace. + level: 'info' + + ## Format the logs are written as: json, text. + format: 'text' + + ## File path where the logs will be written. If not set logs are written to stdout. + # file_path: '/config/authelia.log' + + ## Whether to also log to stdout when a log_file_path is defined. + # keep_stdout: true + +## +## Telemetry Configuration +## +# telemetry: + + ## + ## Metrics Configuration + ## + # metrics: + ## Enable Metrics. + # enabled: false + + ## The address for the Metrics server to listen on in the address common syntax. + ## Formats: + ## - [://][:][/] + ## - [://][hostname]:[/] + ## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', 'unix', or 'fd'. + ## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '9959'. + ## If the path is not specified it defaults to `/metrics`. + # address: 'tcp://:9959/metrics' + + ## Metrics Server Buffers configuration. + # buffers: + + ## Read buffer. + # read: 4096 + + ## Write buffer. + # write: 4096 + + ## Metrics Server Timeouts configuration. + # timeouts: + + ## Read timeout in the duration common syntax. + # read: '6 seconds' + + ## Write timeout in the duration common syntax. + # write: '6 seconds' + + ## Idle timeout in the duration common syntax. + # idle: '30 seconds' + +## +## TOTP Configuration +## +## Parameters used for TOTP generation. +totp: + ## Disable TOTP. + # disable: false + + ## The issuer name displayed in the Authenticator application of your choice. + issuer: '{{ env "TEMPLATE_DOMAIN" }}' + + ## The TOTP algorithm to use. + ## It is CRITICAL you read the documentation before changing this option: + ## https://www.authelia.com/c/totp#algorithm + # algorithm: 'SHA1' + + ## The number of digits a user has to input. Must either be 6 or 8. + ## Changing this option only affects newly generated TOTP configurations. + ## It is CRITICAL you read the documentation before changing this option: + ## https://www.authelia.com/c/totp#digits + # digits: 6 + + ## The period in seconds a Time-based One-Time Password is valid for. + ## Changing this option only affects newly generated TOTP configurations. + # period: 30 + + ## The skew controls number of Time-based One-Time Passwords either side of the current one that are valid. + ## Warning: before changing skew read the docs link below. + # skew: 1 + ## See: https://www.authelia.com/c/totp#input-validation to read + ## the documentation. + + ## The size of the generated shared secrets. Default is 32 and is sufficient in most use cases, minimum is 20. + # secret_size: 32 + + ## The allowed algorithms for a user to pick from. + # allowed_algorithms: + # - 'SHA1' + + ## The allowed digits for a user to pick from. + # allowed_digits: + # - 6 + + ## The allowed periods for a user to pick from. + # allowed_periods: + # - 30 + + ## Disable the reuse security policy which prevents replays of one-time password code values. + # disable_reuse_security_policy: false + +## +## WebAuthn Configuration +## +## Parameters used for WebAuthn. +webauthn: + ## Disable WebAuthn. + disable: false + + ## Enables logins via a Passkey. + enable_passkey_login: true + + ## The display name the browser should show the user for when using WebAuthn to login/register. + display_name: '{{ env "TEMPLATE_AUTHELIA_WEBAUTHN_DISPLAY_NAME" }}' + + ## Conveyance preference controls if we collect the attestation statement including the AAGUID from the device. + ## Options are none, indirect, direct. + # attestation_conveyance_preference: 'indirect' + + ## The interaction timeout for WebAuthn dialogues in the duration common syntax. + # timeout: '60 seconds' + + ## Authenticator Filtering. + # filtering: + ## Prohibits registering Authenticators that claim they can export their credentials in some way. + # prohibit_backup_eligibility: false + + ## Permitted AAGUID's. If configured specifically only allows the listed AAGUID's. + # permitted_aaguids: [] + + ## Prohibited AAGUID's. If configured prohibits the use of specific AAGUID's. + # prohibited_aaguids: [] + + ## Selection Criteria controls the preferences for registration. + # selection_criteria: + ## The attachment preference. Either 'cross-platform' for dedicated authenticators, or 'platform' for embedded + ## authenticators. + # attachment: 'cross-platform' + + ## The discoverability preference. Options are 'discouraged', 'preferred', and 'required'. + # discoverability: 'discouraged' + + ## User verification controls if the user must make a gesture or action to confirm they are present. + ## Options are required, preferred, discouraged. + # user_verification: 'preferred' + + ## Metadata Service validation via MDS3. + # metadata: + + ## Enable the metadata fetch behaviour. + # enabled: false + + ## Enable Validation of the Trust Anchor. This generally should be enabled if you're using the metadata. It + ## ensures the attestation certificate presented by the authenticator is valid against the MDS3 certificate that + ## issued the attestation certificate. + # validate_trust_anchor: true + + ## Enable Validation of the Entry. This ensures that the MDS3 actually contains the metadata entry. If not enabled + ## attestation certificates which are not formally registered will be skipped. This may potentially exclude some + ## virtual authenticators. + # validate_entry: true + + ## Enabling this allows attestation certificates with a zero AAGUID to pass validation. This is important if you do + ## use non-conformant authenticators like Apple ID. + # validate_entry_permit_zero_aaguid: false + + ## Enable Validation of the Authenticator Status. + # validate_status: true + + ## List of statuses which are considered permitted when validating an authenticator's metadata. Generally it is + ## recommended that this is not configured as any other status the authenticator's metadata has will result in an + ## error. This option is ineffectual if validate_status is false. + # validate_status_permitted: ~ + + ## List of statuses that should be prohibited when validating an authenticator's metadata. Generally it is + ## recommended that this is not configured as there are safe defaults. This option is ineffectual if validate_status + ## is false, or validate_status_permitted has values. + # validate_status_prohibited: ~ + +## +## Duo Push API Configuration +## +## Parameters used to contact the Duo API. Those are generated when you protect an application of type +## "Partner Auth API" in the management panel. +# duo_api: + # disable: false + # hostname: 'api-123456789.example.com' + # integration_key: 'ABCDEF' + ## Secret can also be set using a secret: https://www.authelia.com/c/secrets + # secret_key: '1234567890abcdefghifjkl' + # enable_self_enrollment: false + +## +## Identity Validation Configuration +## +## This configuration tunes the identity validation flows. +identity_validation: + + ## Reset Password flow. Adjusts how the reset password flow operates. + reset_password: + ## Maximum allowed time before the JWT is generated and when the user uses it in the duration common syntax. + # jwt_lifespan: '5 minutes' + + ## The algorithm used for the Reset Password JWT. + # jwt_algorithm: 'HS256' + + ## The secret key used to sign and verify the JWT. + jwt_secret: '{{ env "TEMPLATE_AUTHELIA_JWT_SECRET" }}' + + ## Elevated Session flows. Adjusts the flow which require elevated sessions for example managing credentials, adding, + ## removing, etc. + # elevated_session: + ## Maximum allowed lifetime after the One-Time Code is generated that it is considered valid. + # code_lifespan: '5 minutes' + + ## Maximum allowed lifetime after the user uses the One-Time Code and the user must perform the validation again in + ## the duration common syntax. + # elevation_lifespan: '10 minutes' + + ## Number of characters the one-time password contains. + # characters: 8 + + ## In addition to the One-Time Code requires the user performs a second factor authentication. + # require_second_factor: false + + ## Skips the elevation requirement and entry of the One-Time Code if the user has performed second factor + ## authentication. + # skip_second_factor: false + +## +## NTP Configuration +## +## This is used to validate the servers time is accurate enough to validate TOTP. +# ntp: + ## The address of the NTP server to connect to in the address common syntax. + ## Format: [://][:]. + ## Square brackets indicate optional portions of the format. Scheme must be 'udp', 'udp4', or 'udp6'. + ## The default scheme is 'udp'. The default port is '123'. + # address: 'udp://time.cloudflare.com:123' + + ## NTP version. + # version: 4 + + ## Maximum allowed time offset between the host and the NTP server in the duration common syntax. + # max_desync: '3 seconds' + + ## Disables the NTP check on startup entirely. This means Authelia will not contact a remote service at all if you + ## set this to true, and can operate in a truly offline mode. + # disable_startup_check: false + + ## The default of false will prevent startup only if we can contact the NTP server and the time is out of sync with + ## the NTP server more than the configured max_desync. If you set this to true, an error will be logged but startup + ## will continue regardless of results. + # disable_failure: false + +## +## Definitions +## +## The definitions are used in other areas as reference points to reduce duplication. +## +# definitions: + ## The user attribute definitions. + # user_attributes: + ## The name of the definition. + # definition_name: + ## The common expression language expression for this definition. + # expression: '' + + ## The network definitions. + # network: + ## The name of the definition followed by the list of CIDR network addresses in this definition. + # internal: + # - '10.10.0.0/16' + # - '172.16.0.0/12' + # - '192.168.2.0/24' + # VPN: + # - '10.9.0.0/16' + +## +## Authentication Backend Provider Configuration +## +## Used for verifying user passwords and retrieve information such as email address and groups users belong to. +## +## The available providers are: `file`, `ldap`. You must use only one of these providers. +authentication_backend: + ## Password Change Options. + # password_change: + ## Disable both the HTML element and the API for password change functionality. + # disable: false + ## Password Reset Options. + # password_reset: + ## Disable both the HTML element and the API for reset password functionality. + # disable: false + + ## External reset password url that redirects the user to an external reset portal. This disables the internal reset + ## functionality. + # custom_url: '' + + ## The amount of time to wait before we refresh data from the authentication backend in the duration common syntax. + ## To disable this feature set it to 'disable', this will slightly reduce security because for Authelia, users will + ## always belong to groups they belonged to at the time of login even if they have been removed from them in LDAP. + ## To force update on every request you can set this to '0' or 'always', this will increase processor demand. + ## See the below documentation for more information. + ## Refresh Interval docs: https://www.authelia.com/c/1fa#refresh-interval + # refresh_interval: '5 minutes' + + ## + ## LDAP (Authentication Provider) + ## + ## This is the recommended Authentication Provider in production + ## because it allows Authelia to offload the stateful operations + ## onto the LDAP service. + # ldap: + ## The address of the directory server to connect to in the address common syntax. + ## Format: [://][:]. + ## Square brackets indicate optional portions of the format. Scheme must be 'ldap', 'ldaps', or 'ldapi`. + ## The default scheme is 'ldapi' if the address is an absolute path otherwise it's 'ldaps'. + ## The default port is '636', unless the scheme is 'ldap' in which case it's '389'. + # address: 'ldaps://127.0.0.1:636' + + ## The LDAP implementation, this affects elements like the attribute utilised for resetting a password. + ## Acceptable options are as follows: + ## - 'activedirectory' - for Microsoft Active Directory. + ## - 'freeipa' - for FreeIPA. + ## - 'lldap' - for lldap. + ## - 'custom' - for custom specifications of attributes and filters. + ## This currently defaults to 'custom' to maintain existing behaviour. + ## + ## Depending on the option here certain other values in this section have a default value, notably all of the + ## attribute mappings have a default value that this config overrides, you can read more about these default values + ## at https://www.authelia.com/c/ldap#defaults + # implementation: 'custom' + + ## The dial timeout for LDAP in the duration common syntax. + # timeout: '20 seconds' + + ## Use StartTLS with the LDAP connection. + # start_tls: false + + ## TLS configuration. + # tls: + ## The server subject name to check the servers certificate against during the validation process. + ## This option is not required if the certificate has a SAN which matches the address options hostname. + # server_name: 'ldap.example.com' + + ## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the + ## certificate or the certificate of the authority signing the certificate to the certificates directory which is + ## defined by the `certificates_directory` option at the top of the configuration. + ## It's important to note the public key should be added to the directory, not the private key. + ## This option is strongly discouraged but may be useful in some self-signed situations where validation is not + ## important to the administrator. + # skip_verify: false + + ## Minimum TLS version for the connection. + # minimum_version: 'TLS1.2' + + ## Maximum TLS version for the connection. + # maximum_version: 'TLS1.3' + + ## The certificate chain used with the private_key if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + + ## The private key used with the certificate_chain if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # private_key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + + ## Connection Pooling configuration. + # pooling: + ## Enable Pooling. + # enable: false + + ## Pool count. + # count: 5 + + ## Retries to obtain a connection during the timeout. + # retries: 2 + + ## Timeout before the attempt to obtain a connection fails. + # timeout: '10 seconds' + + ## The distinguished name of the container searched for objects in the directory information tree. + ## See also: additional_users_dn, additional_groups_dn. + # base_dn: 'dc=example,dc=com' + + ## The additional_users_dn is prefixed to base_dn and delimited by a comma when searching for users. + ## i.e. with this set to OU=Users and base_dn set to DC=a,DC=com; OU=Users,DC=a,DC=com is searched for users. + # additional_users_dn: 'ou=users' + + ## The users filter used in search queries to find the user profile based on input filled in login form. + ## Various placeholders are available in the user filter which you can read about in the documentation which can + ## be found at: https://www.authelia.com/c/ldap#users-filter-replacements + ## + ## Recommended settings are as follows: + ## - Microsoft Active Directory: (&({username_attribute}={input})(objectCategory=person)(objectClass=user)) + ## - OpenLDAP: + ## - (&({username_attribute}={input})(objectClass=person)) + ## - (&({username_attribute}={input})(objectClass=inetOrgPerson)) + ## + ## To allow sign in both with username and email, one can use a filter like + ## (&(|({username_attribute}={input})({mail_attribute}={input}))(objectClass=person)) + # users_filter: '(&({username_attribute}={input})(objectClass=person))' + + ## The additional_groups_dn is prefixed to base_dn and delimited by a comma when searching for groups. + ## i.e. with this set to OU=Groups and base_dn set to DC=a,DC=com; OU=Groups,DC=a,DC=com is searched for groups. + # additional_groups_dn: 'ou=groups' + + ## The groups filter used in search queries to find the groups based on relevant authenticated user. + ## Various placeholders are available in the groups filter which you can read about in the documentation which can + ## be found at: https://www.authelia.com/c/ldap#groups-filter-replacements + ## + ## If your groups use the `groupOfUniqueNames` structure use this instead: + ## (&(uniqueMember={dn})(objectClass=groupOfUniqueNames)) + # groups_filter: '(&(member={dn})(objectClass=groupOfNames))' + + ## The group search mode to use. Options are 'filter' or 'memberof'. It's essential to read the docs if you wish to + ## use 'memberof'. Also 'filter' is the best choice for most use cases. + # group_search_mode: 'filter' + + ## Follow referrals returned by the server. + ## This is especially useful for environments where read-only servers exist. Only implemented for write operations. + # permit_referrals: false + + ## The username and password of the admin user. + # user: 'cn=admin,dc=example,dc=com' + ## Password can also be set using a secret: https://www.authelia.com/c/secrets + # password: 'password' + + ## The attributes for users and objects from the directory server. + # attributes: + + ## The distinguished name attribute if your directory server supports it. Users should read the docs before + ## configuring. Only used for the 'memberof' group search mode. + # distinguished_name: '' + + ## The attribute holding the username of the user. This attribute is used to populate the username in the session + ## information. For your information, Microsoft Active Directory usually uses 'sAMAccountName' and OpenLDAP + ## usually uses 'uid'. Beware that this attribute holds the unique identifiers for the users binding the user and + ## the configuration stored in database; therefore only single value attributes are allowed and the value must + ## never be changed once attributed to a user otherwise it would break the configuration for that user. + ## Technically non-unique attributes like 'mail' can also be used but we don't recommend using them, we instead + ## advise to use a filter to perform alternative lookups and the attributes mentioned above + ## (sAMAccountName and uid) to follow https://datatracker.ietf.org/doc/html/rfc2307. + # username: 'uid' + + ## The attribute holding the display name of the user. This will be used to greet an authenticated user. + # display_name: 'displayName' + + ## The attribute holding the mail address of the user. If multiple email addresses are defined for a user, only + ## the first one returned by the directory server is used. + # mail: 'mail' + + ## The attribute which provides distinguished names of groups an object is a member of. + ## Only used for the 'memberof' group search mode. + # member_of: 'memberOf' + + ## The attribute holding the name of the group. + # group_name: 'cn' + + ## + ## File (Authentication Provider) + ## + ## With this backend, the users database is stored in a file which is updated when users reset their passwords. + ## Therefore, this backend is meant to be used in a dev environment and not in production since it prevents Authelia + ## to be scaled to more than one instance. The options under 'password' have sane defaults, and as it has security + ## implications it is highly recommended you leave the default values. Before considering changing these settings + ## please read the docs page below: + ## https://www.authelia.com/r/passwords#tuning + ## + ## Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness + ## + file: + path: '/config/users.yml' + # watch: false + # search: + # email: false + # case_insensitive: false + # password: + # algorithm: 'argon2' + # argon2: + # variant: 'argon2id' + # iterations: 3 + # memory: 65536 + # parallelism: 4 + # key_length: 32 + # salt_length: 16 + # scrypt: + # iterations: 16 + # block_size: 8 + # parallelism: 1 + # key_length: 32 + # salt_length: 16 + # pbkdf2: + # variant: 'sha512' + # iterations: 310000 + # salt_length: 16 + # sha2crypt: + # variant: 'sha512' + # iterations: 50000 + # salt_length: 16 + # bcrypt: + # variant: 'standard' + # cost: 12 + +## +## Password Policy Configuration. +## +# password_policy: + + ## The standard policy allows you to tune individual settings manually. + # standard: + # enabled: false + + ## Require a minimum length for passwords. + # min_length: 8 + + ## Require a maximum length for passwords. + # max_length: 0 + + ## Require uppercase characters. + # require_uppercase: true + + ## Require lowercase characters. + # require_lowercase: true + + ## Require numeric characters. + # require_number: true + + ## Require special characters. + # require_special: true + + ## zxcvbn is a well known and used password strength algorithm. It does not have tunable settings. + # zxcvbn: + # enabled: false + + ## Configures the minimum score allowed. + # min_score: 3 + +## +## Privacy Policy Configuration +## +## Parameters used for displaying the privacy policy link and drawer. +# privacy_policy: + + ## Enables the display of the privacy policy using the policy_url. + # enabled: false + + ## Enables the display of the privacy policy drawer which requires users accept the privacy policy + ## on a per-browser basis. + # require_user_acceptance: false + + ## The URL of the privacy policy document. Must be an absolute URL and must have the 'https://' scheme. + ## If the privacy policy enabled option is true, this MUST be provided. + # policy_url: '' + +## +## Access Control Configuration +## +## Access control is a list of rules defining the authorizations applied for one resource to users or group of users. +## +## If 'access_control' is not defined, ACL rules are disabled and the 'deny' rule is applied, i.e., access is denied +## to everyone. Otherwise restrictions follow the rules defined. +## +## Note: One can use the wildcard * to match any subdomain. +## It must stand at the beginning of the pattern. (example: *.example.com) +## +## Note: You must put patterns containing wildcards between simple quotes for the YAML to be syntactically correct. +## +## Definition: A 'rule' is an object with the following keys: 'domain', 'subject', 'policy' and 'resources'. +## +## - 'domain' defines which domain or set of domains the rule applies to. +## +## - 'subject' defines the subject to apply authorizations to. This parameter is optional and matching any user if not +## provided. If provided, the parameter represents either a user or a group. It should be of the form +## 'user:' or 'group:'. +## +## - 'policy' is the policy to apply to resources. It must be either 'bypass', 'one_factor', 'two_factor' or 'deny'. +## +## - 'resources' is a list of regular expressions that matches a set of resources to apply the policy to. This parameter +## is optional and matches any resource if not provided. +## +## Note: the order of the rules is important. The first policy matching (domain, resource, subject) applies. +access_control: + ## Default policy can either be 'bypass', 'one_factor', 'two_factor' or 'deny'. It is the policy applied to any + ## resource if there is no policy to be applied to the user. + default_policy: 'deny' + + rules: + ## subdomains + - domain: '*.{{ env "TEMPLATE_DOMAIN" }}' + policy: 'two_factor' + + ## root domain + - domain: '{{ env "TEMPLATE_DOMAIN" }}' + policy: 'two_factor' + + ## Domain Regex examples. Generally we recommend just using a standard domain. + # - domain_regex: '^(?P\w+)\.example\.com$' + # policy: 'one_factor' + # - domain_regex: '^(?P\w+)\.example\.com$' + # policy: 'one_factor' + # - domain_regex: + # - '^appgroup-.*\.example\.com$' + # - '^appgroup2-.*\.example\.com$' + # policy: 'one_factor' + # - domain_regex: '^.*\.example\.com$' + # policy: 'two_factor' + + # - domain: 'secure.example.com' + # policy: 'one_factor' + ## Network based rule, if not provided any network matches. + # networks: + # - 'internal' + # - 'VPN' + # - '192.168.1.0/24' + # - '10.0.0.1' + + # - domain: + # - 'secure.example.com' + # - 'private.example.com' + # policy: 'two_factor' + + # - domain: 'singlefactor.example.com' + # policy: 'one_factor' + + ## Rules applied to 'admins' group + # - domain: 'mx2.mail.example.com' + # subject: 'group:admins' + # policy: 'deny' + + # - domain: '*.example.com' + # subject: + # - 'group:admins' + # - 'group:moderators' + # policy: 'two_factor' + + ## Rules applied to 'dev' group + # - domain: 'dev.example.com' + # resources: + # - '^/groups/dev/.*$' + # subject: 'group:dev' + # policy: 'two_factor' + + ## Rules applied to user 'john' + # - domain: 'dev.example.com' + # resources: + # - '^/users/john/.*$' + # subject: 'user:john' + # policy: 'two_factor' + + ## Rules applied to user 'harry' + # - domain: 'dev.example.com' + # resources: + # - '^/users/harry/.*$' + # subject: 'user:harry' + # policy: 'two_factor' + + ## Rules applied to user 'bob' + # - domain: '*.mail.example.com' + # subject: 'user:bob' + # policy: 'two_factor' + # - domain: 'dev.example.com' + # resources: + # - '^/users/bob/.*$' + # subject: 'user:bob' + # policy: 'two_factor' + +## +## Session Provider Configuration +## +## The session cookies identify the user once logged in. +## The available providers are: `memory`, `redis`. Memory is the provider unless redis is defined. +session: + ## The secret to encrypt the session data. This is only used with Redis / Redis Sentinel. + ## Secret can also be set using a secret: https://www.authelia.com/c/secrets + secret: '{{ env "TEMPLATE_AUTHELIA_SESSION_SECRET" }}' + + + ## Cookies configures the list of allowed cookie domains for sessions to be created on. + ## Undefined values will default to the values below. + cookies: + - + ## The name of the session cookie. + name: 'authelia_session' + + ## The domain to protect. + ## Note: the Authelia portal must also be in that domain. + domain: '{{ env "TEMPLATE_DOMAIN" }}' + + ## Required. The fully qualified URI of the portal to redirect users to on proxies that support redirections. + ## Rules: + ## - MUST use the secure scheme 'https://' + ## - The above 'domain' option MUST either: + ## - Match the host portion of this URI. + ## - Match the suffix of the host portion when prefixed with '.'. + authelia_url: 'https://auth.{{ env "TEMPLATE_DOMAIN" }}' + + ## Optional. The fully qualified URI used as the redirection location if the portal is accessed directly. Not + ## configuring this option disables the automatic redirection behaviour. + ## + ## Note: this parameter is optional. If not provided, user won't be redirected upon successful authentication + ## unless they were redirected to Authelia by the proxy. + ## + ## Rules: + ## - MUST use the secure scheme 'https://' + ## - MUST not match the 'authelia_url' option. + ## - The above 'domain' option MUST either: + ## - Match the host portion of this URI. + ## - Match the suffix of the host portion when prefixed with '.'. + default_redirection_url: 'https://{{ env "TEMPLATE_DOMAIN" }}' + + ## Sets the Cookie SameSite value. Possible options are none, lax, or strict. + ## Please read https://www.authelia.com/c/session#same_site + # same_site: 'lax' + + ## The value for inactivity, expiration, and remember_me are in seconds or the duration common syntax. + ## All three of these values affect the cookie/session validity period. Longer periods are considered less secure + ## because a stolen cookie will last longer giving attackers more time to spy or attack. + + ## The inactivity time before the session is reset. If expiration is set to 1h, and this is set to 5m, if the user + ## does not select the remember me option their session will get destroyed after 1h, or after 5m since the last + ## time Authelia detected user activity. + # inactivity: '5 minutes' + + ## The time before the session cookie expires and the session is destroyed if remember me IS NOT selected by the + ## user. + # expiration: '1 hour' + + ## The time before the cookie expires and the session is destroyed if remember me IS selected by the user. Setting + ## this value to -1 disables remember me for this session cookie domain. If allowed and the user uses the remember + ## me checkbox this overrides the expiration option and disables the inactivity option. + # remember_me: '1 month' + + ## Cookie Session Domain default 'name' value. + # name: 'authelia_session' + + ## Cookie Session Domain default 'same_site' value. + # same_site: 'lax' + + ## Cookie Session Domain default 'inactivity' value. + # inactivity: '5m' + + ## Cookie Session Domain default 'expiration' value. + # expiration: '1h' + + ## Cookie Session Domain default 'remember_me' value. + # remember_me: '1M' + + ## + ## Redis Provider + ## + ## Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness + ## + redis: + host: 'authelia_redis' + port: 6379 + ## Use a unix socket instead + # host: '/var/run/redis/redis.sock' + + ## The connection timeout in the duration common syntax. + # timeout: '5 seconds' + + ## The maximum number of retries on a failed command. Set it to 0 to disable retries. + # max_retries: 3 + + ## Username used for redis authentication. This is optional and a new feature in redis 6.0. + # username: 'authelia' + + ## Password can also be set using a secret: https://www.authelia.com/c/secrets + # password: 'authelia' + + ## This is the Redis DB Index https://redis.io/commands/select (sometimes referred to as database number, DB, etc). + # database_index: 0 + + ## The maximum number of concurrent active connections to Redis. + # maximum_active_connections: 8 + + ## The target number of idle connections to have open ready for work. Useful when opening connections is slow. + # minimum_idle_connections: 0 + + ## The Redis TLS configuration. If defined will require a TLS connection to the Redis instance(s). + # tls: + ## The server subject name to check the servers certificate against during the validation process. + ## This option is not required if the certificate has a SAN which matches the host option. + # server_name: 'myredis.example.com' + + ## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the + ## certificate or the certificate of the authority signing the certificate to the certificates directory which is + ## defined by the `certificates_directory` option at the top of the configuration. + ## It's important to note the public key should be added to the directory, not the private key. + ## This option is strongly discouraged but may be useful in some self-signed situations where validation is not + ## important to the administrator. + # skip_verify: false + + ## Minimum TLS version for the connection. + # minimum_version: 'TLS1.2' + + ## Maximum TLS version for the connection. + # maximum_version: 'TLS1.3' + + ## The certificate chain used with the private_key if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + + ## The private key used with the certificate_chain if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # private_key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + + ## The Redis HA configuration options. + ## This provides specific options to Redis Sentinel, sentinel_name must be defined (Master Name). + # high_availability: + ## Sentinel Name / Master Name. + # sentinel_name: 'mysentinel' + + ## Specific username for Redis Sentinel. The node username and password is configured above. + # sentinel_username: 'sentinel_specific_user' + + ## Specific password for Redis Sentinel. The node username and password is configured above. + # sentinel_password: 'sentinel_specific_pass' + + ## The additional nodes to pre-seed the redis provider with (for sentinel). + ## If the host in the above section is defined, it will be combined with this list to connect to sentinel. + ## For high availability to be used you must have either defined; the host above or at least one node below. + # nodes: + # - host: 'sentinel-node1' + # port: 6379 + # - host: 'sentinel-node2' + # port: 6379 + + ## Choose the host with the lowest latency. + # route_by_latency: false + + ## Choose the host randomly. + # route_randomly: false + +## +## Regulation Configuration +## +## This mechanism prevents attackers from brute forcing the first factor. It bans the user if too many attempts are made +## in a short period of time. +# regulation: + ## Regulation Mode. + # modes: + # - 'user' + + ## The number of failed login attempts before user is banned. Set it to 0 to disable regulation. + # max_retries: 3 + + ## The time range during which the user can attempt login before being banned in the duration common syntax. The user + ## is banned if the authentication failed 'max_retries' times in a 'find_time' seconds window. + # find_time: '2 minutes' + + ## The length of time before a banned user can login again in the duration common syntax. + # ban_time: '5 minutes' + +## +## Storage Provider Configuration +## +## The available providers are: `local`, `mysql`, `postgres`. You must use one and only one of these providers. +storage: + ## The encryption key that is used to encrypt sensitive information in the database. Must be a string with a minimum + ## length of 20. Please see the docs if you configure this with an undesirable key and need to change it, you MUST use + ## the CLI to change this in the database if you want to change it from a previously configured value. + encryption_key: '{{ env "TEMPLATE_AUTHELIA_STORAGE_ENCRYPTION_KEY" }}' + + ## + ## Local (Storage Provider) + ## + ## This stores the data in a SQLite3 Database. + ## This is only recommended for lightweight non-stateful installations. + ## + ## Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness + ## + # local: + ## Path to the SQLite3 Database. + # path: '/config/db.sqlite3' + + ## + ## MySQL / MariaDB (Storage Provider) + ## + # mysql: + ## The address of the MySQL server to connect to in the address common syntax. + ## Format: [://][:]. + ## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', or 'unix`. + ## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '3306'. + # address: 'tcp://127.0.0.1:3306' + + ## The database name to use. + # database: 'authelia' + + ## The username used for SQL authentication. + # username: 'authelia' + + ## The password used for SQL authentication. + ## Can also be set using a secret: https://www.authelia.com/c/secrets + # password: 'mypassword' + + ## The connection timeout in the duration common syntax. + # timeout: '5 seconds' + + ## MySQL TLS settings. Configuring this requires TLS. + # tls: + ## The server subject name to check the servers certificate against during the validation process. + ## This option is not required if the certificate has a SAN which matches the address options hostname. + # server_name: 'mysql.example.com' + + ## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the + ## certificate or the certificate of the authority signing the certificate to the certificates directory which is + ## defined by the `certificates_directory` option at the top of the configuration. + ## It's important to note the public key should be added to the directory, not the private key. + ## This option is strongly discouraged but may be useful in some self-signed situations where validation is not + ## important to the administrator. + # skip_verify: false + + ## Minimum TLS version for the connection. + # minimum_version: 'TLS1.2' + + ## Maximum TLS version for the connection. + # maximum_version: 'TLS1.3' + + ## The certificate chain used with the private_key if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + + ## The private key used with the certificate_chain if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # private_key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + + ## + ## PostgreSQL (Storage Provider) + ## + postgres: + ## The address of the PostgreSQL server to connect to in the address common syntax. + ## Format: [://][:]. + ## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', or 'unix`. + ## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '5432'. + address: 'tcp://authelia_postgres:5432' + + ## List of additional server instance configurations to fallback to when the primary instance is not available. + # servers: + # - + ## The Address of this individual instance. + # address: 'tcp://127.0.0.1:5432' + + ## The TLS configuration for this individual instance. + # tls: + # server_name: 'postgres.example.com' + # skip_verify: false + # minimum_version: 'TLS1.2' + # maximum_version: 'TLS1.3' + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # private_key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + + ## The database name to use. + database: 'authelia' + + ## The schema name to use. + # schema: 'public' + + ## The username used for SQL authentication. + username: 'authelia' + + ## The password used for SQL authentication. + ## Can also be set using a secret: https://www.authelia.com/c/secrets + password: 'authelia' + + ## The connection timeout in the duration common syntax. + # timeout: '5 seconds' + + ## PostgreSQL TLS settings. Configuring this requires TLS. + # tls: + ## The server subject name to check the servers certificate against during the validation process. + ## This option is not required if the certificate has a SAN which matches the address options hostname. + # server_name: 'postgres.example.com' + + ## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the + ## certificate or the certificate of the authority signing the certificate to the certificates directory which is + ## defined by the `certificates_directory` option at the top of the configuration. + ## It's important to note the public key should be added to the directory, not the private key. + ## This option is strongly discouraged but may be useful in some self-signed situations where validation is not + ## important to the administrator. + # skip_verify: false + + ## Minimum TLS version for the connection. + # minimum_version: 'TLS1.2' + + ## Maximum TLS version for the connection. + # maximum_version: 'TLS1.3' + + ## The certificate chain used with the private_key if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + + ## The private key used with the certificate_chain if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # private_key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + +## +## Notification Provider +## +## Notifications are sent to users when they require a password reset, a WebAuthn registration or a TOTP registration. +## The available providers are: filesystem, smtp. You must use only one of these providers. +notifier: + ## You can disable the notifier startup check by setting this to true. + # disable_startup_check: false + + ## + ## File System (Notification Provider) + ## + ## Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness + ## + filesystem: + filename: '/config/notification.txt' + + ## + ## SMTP (Notification Provider) + ## + ## Use a SMTP server for sending notifications. Authelia uses the PLAIN or LOGIN methods to authenticate. + ## [Security] By default Authelia will: + ## - force all SMTP connections over TLS including unauthenticated connections + ## - use the disable_require_tls boolean value to disable this requirement + ## (only works for unauthenticated connections) + ## - validate the SMTP server x509 certificate during the TLS handshake against the hosts trusted certificates + ## (configure in tls section) + # smtp: + ## The address of the SMTP server to connect to in the address common syntax. + # address: 'smtp://127.0.0.1:25' + + ## The connection timeout in the duration common syntax. + # timeout: '5 seconds' + + ## The username used for SMTP authentication. + # username: 'test' + + ## The password used for SMTP authentication. + ## Can also be set using a secret: https://www.authelia.com/c/secrets + # password: 'password' + + ## The sender is used to is used for the MAIL FROM command and the FROM header. + ## If this is not defined and the username is an email, we use the username as this value. This can either be just + ## an email address or the RFC5322 'Name ' format. + # sender: 'Authelia ' + + ## HELO/EHLO Identifier. Some SMTP Servers may reject the default of localhost. + # identifier: 'localhost' + + ## Subject configuration of the emails sent. {title} is replaced by the text from the notifier. + # subject: '[Authelia] {title}' + + ## This address is used during the startup check to verify the email configuration is correct. + ## It's not important what it is except if your email server only allows local delivery. + # startup_check_address: 'test@authelia.com' + + ## By default we require some form of TLS. This disables this check though is not advised. + # disable_require_tls: false + + ## Disables sending HTML formatted emails. + # disable_html_emails: false + + # tls: + ## The server subject name to check the servers certificate against during the validation process. + ## This option is not required if the certificate has a SAN which matches the address options hostname. + # server_name: 'smtp.example.com' + + ## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the + ## certificate or the certificate of the authority signing the certificate to the certificates directory which is + ## defined by the `certificates_directory` option at the top of the configuration. + ## It's important to note the public key should be added to the directory, not the private key. + ## This option is strongly discouraged but may be useful in some self-signed situations where validation is not + ## important to the administrator. + # skip_verify: false + + ## Minimum TLS version for the connection. + # minimum_version: 'TLS1.2' + + ## Maximum TLS version for the connection. + # maximum_version: 'TLS1.3' + + ## The certificate chain used with the private_key if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + + ## The private key used with the certificate_chain if the server requests TLS Client Authentication + ## i.e. Mutual TLS. + # private_key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + +## +## Identity Providers +## +# identity_providers: + + ## + ## OpenID Connect (Identity Provider) + ## + ## It's recommended you read the documentation before configuration of this section. + ## See: https://www.authelia.com/c/oidc/provider + # oidc: + ## The hmac_secret is used to sign OAuth2 tokens (authorization code, access tokens and refresh tokens). + ## HMAC Secret can also be set using a secret: https://www.authelia.com/c/secrets + # hmac_secret: 'this_is_a_secret_abc123abc123abc' + + ## The JWK's issuer option configures multiple JSON Web Keys. It's required that at least one of the JWK's + ## configured has the RS256 algorithm. For RSA keys (RS or PS) the minimum is a 2048 bit key. + # jwks: + # - + ## Key ID embedded into the JWT header for key matching. Must be an alphanumeric string with 7 or less characters. + ## This value is automatically generated if not provided. It's recommended to not configure this. + # key_id: 'example' + + ## The key algorithm used with this key. + # algorithm: 'RS256' + + ## The key use expected with this key. Currently only 'sig' is supported. + # use: 'sig' + + ## Required Private Key in PEM DER form. + # key: | + # -----BEGIN RSA PRIVATE KEY----- + # ... + # -----END RSA PRIVATE KEY----- + + + ## Optional matching certificate chain in PEM DER form that matches the key. All certificates within the chain + ## must be valid and current, and from top to bottom each certificate must be signed by the subsequent one. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + + ## Enables additional debug messages. + # enable_client_debug_messages: false + + ## SECURITY NOTICE: It's not recommended changing this option and values below 8 are strongly discouraged. + # minimum_parameter_entropy: 8 + + ## SECURITY NOTICE: It's not recommended changing this option, and highly discouraged to have it set to 'never' + ## for security reasons. + # enforce_pkce: 'public_clients_only' + + ## SECURITY NOTICE: It's not recommended changing this option. We encourage you to read the documentation and fully + ## understanding it before enabling this option. + # enable_jwt_access_token_stateless_introspection: false + + ## The signing algorithm used for signing the discovery and metadata responses. An issuer JWK with a matching + ## algorithm must be available when configured. Most clients completely ignore this and it has a performance cost. + # discovery_signed_response_alg: 'none' + + ## The signing key id used for signing the discovery and metadata responses. An issuer JWK with a matching key id + ## must be available when configured. Most clients completely ignore this and it has a performance cost. + # discovery_signed_response_key_id: '' + + ## Authorization Policies which can be utilized by clients. The 'policy_name' is an arbitrary value that you pick + ## which is utilized as the value for the 'authorization_policy' on the client. + # authorization_policies: + # policy_name: + # default_policy: 'two_factor' + # rules: + # - policy: 'one_factor' + # subject: 'group:services' + # networks: + # - '192.168.1.0/24' + + ## The lifespans configure the expiration for these token types in the duration common syntax. In addition to this + ## syntax the lifespans can be customized per-client. + # lifespans: + ## Configures the default/fallback lifespan for given token types. This behaviour applies to all clients and all + ## grant types but you can override this behaviour using the custom lifespans. + # access_token: '1 hour' + # authorize_code: '1 minute' + # id_token: '1 hour' + # refresh_token: '90 minutes' + + ## Cross-Origin Resource Sharing (CORS) settings. + # cors: + ## List of endpoints in addition to the metadata endpoints to permit cross-origin requests on. + # endpoints: + # - 'authorization' + # - 'pushed-authorization-request' + # - 'token' + # - 'revocation' + # - 'introspection' + # - 'userinfo' + + ## List of allowed origins. + ## Any origin with https is permitted unless this option is configured or the + ## allowed_origins_from_client_redirect_uris option is enabled. + # allowed_origins: + # - 'https://example.com' + + ## Automatically adds the origin portion of all redirect URI's on all clients to the list of allowed_origins, + ## provided they have the scheme http or https and do not have the hostname of localhost. + # allowed_origins_from_client_redirect_uris: false + + ## Clients is a list of registered clients and their configuration. + ## It's recommended you read the documentation before configuration of a registered client. + ## See: https://www.authelia.com/c/oidc/registered-clients + # clients: + # - + ## The Client ID is the OAuth 2.0 and OpenID Connect 1.0 Client ID which is used to link an application to a + ## configuration. + # client_id: 'myapp' + + ## The description to show to users when they end up on the consent screen. Defaults to the ID above. + # client_name: 'My Application' + + ## The client secret is a shared secret between Authelia and the consumer of this client. + # yamllint disable-line rule:line-length + # client_secret: '$pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng' # The digest of 'insecure_secret'. + + ## Sector Identifiers are occasionally used to generate pairwise subject identifiers. In most cases this is not + ## necessary. It is critical to read the documentation for more information. + # sector_identifier_uri: 'https://example.com/sector.json' + + ## Sets the client to public. This should typically not be set, please see the documentation for usage. + # public: false + + ## Redirect URI's specifies a list of valid case-sensitive callbacks for this client. + # redirect_uris: + # - 'https://oidc.example.com:8080/oauth2/callback' + + ## Request URI's specifies a list of valid case-sensitive TLS-secured URIs for this client for use as + ## URIs to fetch Request Objects. + # request_uris: + # - 'https://oidc.example.com:8080/oidc/request-object.jwk' + + ## Audience this client is allowed to request. + # audience: [] + + ## Scopes this client is allowed to request. + # scopes: + # - 'openid' + # - 'groups' + # - 'email' + # - 'profile' + + ## Grant Types configures which grants this client can obtain. + ## It's not recommended to define this unless you know what you're doing. + # grant_types: + # - 'authorization_code' + + ## Response Types configures which responses this client can be sent. + ## It's not recommended to define this unless you know what you're doing. + # response_types: + # - 'code' + + ## Response Modes configures which response modes this client supports. + # response_modes: + # - 'form_post' + # - 'query' + + ## The policy to require for this client; one_factor or two_factor. Can also be the key names for the + ## authorization policies section. + # authorization_policy: 'two_factor' + + ## The custom lifespan name to use for this client. This must be configured independent of the client before + ## utilization. Custom lifespans are reusable similar to authorization policies. + # lifespan: '' + + ## The consent mode controls how consent is obtained. + # consent_mode: 'auto' + + ## This value controls the duration a consent on this client remains remembered when the consent mode is + ## configured as 'auto' or 'pre-configured' in the duration common syntax. + # pre_configured_consent_duration: '1 week' + + ## Requires the use of Pushed Authorization Requests for this client when set to true. + # require_pushed_authorization_requests: false + + ## Enforces the use of PKCE for this client when set to true. + # require_pkce: false + + ## Enforces the use of PKCE for this client when configured, and enforces the specified challenge method. + ## Options are 'plain' and 'S256'. + # pkce_challenge_method: 'S256' + + ## The signing algorithm used for signing the authorization responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#authorization_signed_response_alg + # authorization_signed_response_alg: 'none' + + ## The signing key id used for signing the authorization responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#authorization_signed_response_key_id + # authorization_signed_response_key_id: '' + + ## The content encryption algorithm used for encrypting the authorization responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_alg + # authorization_encrypted_response_alg: 'none' + + ## The encryption algorithm used for encrypting the authorization responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_enc + # authorization_encrypted_response_enc: 'A128CBC-HS256' + + ## The content encryption key id used for encrypting the authorization responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_key_id + # authorization_encrypted_response_key_id: '' + + ## The signing algorithm used for signing the ID Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#id_token_signed_response_alg + # id_token_signed_response_alg: 'RS256' + + ## The signing key id used for signing the ID Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#id_token_signed_response_key_id + # id_token_signed_response_key_id: '' + + ## The content encryption algorithm used for encrypting the ID Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#id_token_encrypted_response_alg + # id_token_encrypted_response_alg: 'none' + + ## The encryption algorithm used for encrypting the ID Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#id_token_encrypted_response_enc + # id_token_encrypted_response_enc: 'A128CBC-HS256' + + ## The content encryption key id used for encrypting the ID Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_key_id + # id_token_encrypted_response_key_id: '' + + ## The signing algorithm used for signing the Access Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#access_token_signed_response_alg + # access_token_signed_response_alg: 'none' + + ## The signing key id used for signing the Access Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#access_token_signed_response_key_id + # access_token_signed_response_key_id: '' + + ## The content encryption algorithm used for encrypting the Access Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#access_token_encrypted_response_alg + # access_token_encrypted_response_alg: 'none' + + ## The encryption algorithm used for encrypting the Access Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#access_token_encrypted_response_enc + # access_token_encrypted_response_enc: 'A128CBC-HS256' + + ## The content encryption key id used for encrypting the Access Tokens in Access Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#access_token_encrypted_response_key_id + # access_token_encrypted_response_key_id: '' + + ## The signing algorithm used for signing the User Info Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_signed_response_alg + # userinfo_signed_response_alg: 'none' + + ## The signing key id used for signing the User Info Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_signed_response_key_id + # userinfo_signed_response_key_id: '' + + ## The content encryption algorithm used for encrypting the User Info Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_encrypted_response_alg + # userinfo_encrypted_response_alg: 'none' + + ## The encryption algorithm used for encrypting the User Info Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_encrypted_response_enc + # userinfo_encrypted_response_enc: 'A128CBC-HS256' + + ## The content encryption key id used for encrypting the User Info Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_encrypted_response_key_id + # userinfo_encrypted_response_key_id: '' + + ## The signing algorithm used for signing the Introspection Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#introspection_signed_response_alg + # introspection_signed_response_alg: 'none' + + ## The signing key id used for Introspection responses. An issuer JWK with a matching key id must be available + ## when configured. + # introspection_signed_response_key_id: '' + + ## The content encryption algorithm used for encrypting the Introspection Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#introspection_encrypted_response_alg + # introspection_encrypted_response_alg: 'none' + + ## The encryption algorithm used for encrypting the Introspection Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#introspection_encrypted_response_enc + # introspection_encrypted_response_enc: 'A128CBC-HS256' + + ## The content encryption key id used for encrypting the Introspection Request responses. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#introspection_encrypted_response_key_id + # introspection_encrypted_response_key_id: '' + + ## The signature algorithm which must be used for request objects. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#request_object_signing_alg + # request_object_signing_alg: 'RS256' + + ## The content encryption algorithm which must be used for request objects. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#request_object_encryption_alg + # request_object_encryption_alg: '' + + ## The encryption algorithm which must be used for request objects. + ## Please read the documentation before adjusting this option. + ## See: https://www.authelia.com/c/oidc/registered-clients#request_object_encryption_enc + # request_object_encryption_enc: '' + + ## The permitted client authentication method for the Token Endpoint for this client. + ## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it + ## defaults to 'none' per the specifications. + # token_endpoint_auth_method: 'client_secret_basic' + + ## The permitted client authentication signing algorithm for the Token Endpoint for this client when using + ## the 'client_secret_jwt' or 'private_key_jwt' token_endpoint_auth_method. + # token_endpoint_auth_signing_alg: 'RS256' + + ## The permitted client authentication method for the Revocation Endpoint for this client. + ## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it + ## defaults to 'none' per the specifications. + # revocation_endpoint_auth_method: 'client_secret_basic' + + ## The permitted client authentication signing algorithm for the Revocation Endpoint for this client when using + ## the 'client_secret_jwt' or 'private_key_jwt' revocation_endpoint_auth_method. + # revocation_endpoint_auth_signing_alg: 'RS256' + + ## The permitted client authentication method for the Introspection Endpoint for this client. + ## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it + ## defaults to 'none' per the specifications. + # introspection_endpoint_auth_method: 'client_secret_basic' + + ## The permitted client authentication signing algorithm for the Introspection Endpoint for this client when + ## using the 'client_secret_jwt' or 'private_key_jwt' introspection_endpoint_auth_method. + # introspection_endpoint_auth_signing_alg: 'RS256' + + ## The permitted client authentication method for the Pushed Authorization Request Endpoint for this client. + ## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it + ## defaults to 'none' per the specifications. + # pushed_authorization_request_endpoint_auth_method: 'client_secret_basic' + + ## The permitted client authentication signing algorithm for the Pushed Authorization Request Endpoint for this + ## client when using the 'client_secret_jwt' or 'private_key_jwt' + ## pushed_authorization_request_endpoint_auth_method. + # pushed_authorization_request_endpoint_auth_signing_alg: 'RS256' + + ## Trusted public keys configuration for request object signing for things such as 'private_key_jwt'. + ## URL of the HTTPS endpoint which serves the keys. Please note the 'jwks_uri' and the 'jwks' option below + ## are mutually exclusive. + # jwks_uri: 'https://app.example.com/jwks.json' + + ## Trusted public keys configuration for request object signing for things such as 'private_key_jwt'. + ## List of JWKs known and registered with this client. It's recommended to use the 'jwks_uri' option if + ## available due to key rotation. Please note the 'jwks' and the 'jwks_uri' option above are mutually exclusive. + # jwks: + # - + ## Key ID used to match the JWT's to an individual identifier. This option is required if configured. + # key_id: 'example' + + ## The key algorithm expected with this key. + # algorithm: 'RS256' + + ## The key use expected with this key. Currently only 'sig' is supported. + # use: 'sig' + + ## Required Public Key in PEM DER form. + # key: | + # -----BEGIN RSA PUBLIC KEY----- + # ... + # -----END RSA PUBLIC KEY----- + + ## The matching certificate chain in PEM DER form that matches the key if available. + # certificate_chain: | + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- + # -----BEGIN CERTIFICATE----- + # ... + # -----END CERTIFICATE----- +... diff --git a/data/authelia/config/users.yml b/data/authelia/config/users.yml new file mode 100644 index 0000000..07ba838 --- /dev/null +++ b/data/authelia/config/users.yml @@ -0,0 +1,24 @@ +# yamllint disable rule:line-length +--- +############################################################### +# Users Database # +############################################################### + +# This file can be used if you do not have an LDAP set up. + +users: + ## change this to the username you want to use + user1: + disabled: false + ## change this to the display name you want to use + displayname: "User" + ## Generate the argon 2 password hash using the following command + ## sudo docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password 'yourpassword' + ## (currently the password is 'password') + password: "$argon2id$v=19$m=65536,t=3,p=4$9WCjag9NY9e/8OYGnPV1rg$OtXfECdXxgY+nI0ELWyRlSGKYV0a5QeW+r6mL1nXmoo" + email: authelia@authelia.com + groups: + - admins + - dev +... +# yamllint enable rule:line-length diff --git a/data/autosync/config.yml b/data/autosync/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/data/blackhole/.env b/data/blackhole/.env deleted file mode 100644 index 53cbdd2..0000000 --- a/data/blackhole/.env +++ /dev/null @@ -1,76 +0,0 @@ -#-------------------------------# -# REALDEBRID - BLACKHOLE, REPAIR # -#-------------------------------# - -REALDEBRID_ENABLED=true -REALDEBRID_HOST="https://api.real-debrid.com/rest/1.0/" -REALDEBRID_API_KEY= # https://real-debrid.com/apitoken -REALDEBRID_MOUNT_TORRENTS_PATH="/mnt/remote/realdebrid/__all__" - -#-----------------------# -# BLACKHOLE - BLACKHOLE # -#-----------------------# - -BLACKHOLE_BASE_WATCH_PATH="/mnt/symlinks" -BLACKHOLE_RADARR_PATH="radarr" -BLACKHOLE_SONARR_PATH="sonarr" -BLACKHOLE_FAIL_IF_NOT_CACHED=true -BLACKHOLE_RD_MOUNT_REFRESH_SECONDS=200 -BLACKHOLE_WAIT_FOR_TORRENT_TIMEOUT=300 -BLACKHOLE_HISTORY_PAGE_SIZE=500 - -#-----------------------------------------------------------------------------------------------# -# DISCORD - BLACKHOLE, WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, MONITOR RAM, RECLAIM SPACE # -#-----------------------------------------------------------------------------------------------# - -DISCORD_ENABLED=false -DISCORD_UPDATE_ENABLED=false -DISCORD_WEBHOOK_URL= - -#-----------------# -# REPAIR - REPAIR # -#-----------------# - -REPAIR_REPAIR_INTERVAL="10m" -REPAIR_RUN_INTERVAL="1d" - -#-----------------------# -# GENERAL CONFIGURATION # -#-----------------------# - -PYTHONUNBUFFERED=TRUE -PUID=1000 -PGID=1000 -UMASK=002 -DOCKER_NETWORK="scripts_default" -DOCKER_NETWORK_EXTERNAL=false - -# =================================================================================================== # -# THE FOLLOWING VARIABLES CAN BE IGNORED # -# =================================================================================================== # - -#--------# -# SERVER # -#--------# - -SERVER_DOMAIN= - -#-------------------------------------------------------------------# -# PLEX - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, PLEX REFRESH # -#-------------------------------------------------------------------# - -PLEX_HOST="https://plex.tv/" -PLEX_METADATA_HOST="https://metadata.provider.plex.tv/" -PLEX_SERVER_HOST= -PLEX_SERVER_MACHINE_ID= -PLEX_SERVER_API_KEY= -PLEX_SERVER_MOVIE_LIBRARY_ID= -PLEX_SERVER_TV_SHOW_LIBRARY_ID= -PLEX_SERVER_PATH= - -#-------------------------------------------------------------------------# -# OVERSEERR - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, RECLAIM SPACE # -#-------------------------------------------------------------------------# - -OVERSEERR_HOST= -OVERSEERR_API_KEY= \ No newline at end of file diff --git a/data/plausible/clickhouse/ip4-only.xml b/data/plausible/clickhouse/ip4-only.xml new file mode 100644 index 0000000..e4f4b22 --- /dev/null +++ b/data/plausible/clickhouse/ip4-only.xml @@ -0,0 +1,3 @@ + + 0.0.0.0 + \ No newline at end of file diff --git a/data/plausible/clickhouse/logs.xml b/data/plausible/clickhouse/logs.xml new file mode 100644 index 0000000..3ffd303 --- /dev/null +++ b/data/plausible/clickhouse/logs.xml @@ -0,0 +1,28 @@ + + + warning + true + + + + system + query_log
+ 7500 + + ENGINE = MergeTree + PARTITION BY event_date + ORDER BY (event_time) + TTL event_date + interval 30 day + SETTINGS ttl_only_drop_parts=1 + +
+ + + + + + + + + +
\ No newline at end of file diff --git a/data/plausible/clickhouse/low-resources.xml b/data/plausible/clickhouse/low-resources.xml new file mode 100644 index 0000000..aab3cd8 --- /dev/null +++ b/data/plausible/clickhouse/low-resources.xml @@ -0,0 +1,23 @@ + + + + 524288000 + + + + + 1 + + 8192 + + 1 + + 0 + + 0 + + + \ No newline at end of file diff --git a/data/recyclarr/recyclarr.yml b/data/recyclarr/recyclarr.yml index bd51a2b..e69de29 100644 --- a/data/recyclarr/recyclarr.yml +++ b/data/recyclarr/recyclarr.yml @@ -1,352 +0,0 @@ -radarr: - radarr_default: - - delete_old_custom_formats: true - replace_existing_custom_formats: true - - include: - # Comment out any of the following includes to disable them - - template: radarr-quality-definition-movie - - template: radarr-quality-profile-remux-web-1080p - - template: radarr-custom-formats-remux-web-1080p - - # Custom Formats: https://recyclarr.dev/wiki/yaml/config-reference/custom-formats/ - custom_formats: - # Audio - - trash_ids: - # Uncomment the next section to enable Advanced Audio Formats - # - 496f355514737f7d83bf7aa4d24f8169 # TrueHD Atmos - # - 2f22d89048b01681dde8afe203bf2e95 # DTS X - # - 417804f7f2c4308c1f4c5d380d4c4475 # ATMOS (undefined) - # - 1af239278386be2919e1bcee0bde047e # DD+ ATMOS - # - 3cafb66171b47f226146a0770576870f # TrueHD - # - dcf3ec6938fa32445f590a4da84256cd # DTS-HD MA - # - a570d4a0e56a2874b64e5bfa55202a1b # FLAC - # - e7c2fcae07cbada050a0af3357491d7b # PCM - # - 8e109e50e0a0b83a5098b056e13bf6db # DTS-HD HRA - # - 185f1dd7264c4562b9022d963ac37424 # DD+ - # - f9f847ac70a0af62ea4a08280b859636 # DTS-ES - # - 1c1a4c5e823891c75bc50380a6866f73 # DTS - # - 240770601cc226190c367ef59aba7463 # AAC - # - c2998bd0d90ed5621d8df281e839436e # DD - assign_scores_to: - - name: Remux + WEB 1080p - - # Movie Versions - - trash_ids: - # Uncomment any of the following lines to prefer these movie versions - # - 0f12c086e289cf966fa5948eac571f44 # Hybrid - # - 570bc9ebecd92723d2d21500f4be314c # Remaster - # - eca37840c13c6ef2dd0262b141a5482f # 4K Remaster - # - e0c07d59beb37348e975a930d5e50319 # Criterion Collection - # - 9d27d9d2181838f76dee150882bdc58c # Masters of Cinema - # - db9b4c4b53d312a3ca5f1378f6440fc9 # Vinegar Syndrome - # - 957d0f44b592285f26449575e8b1167e # Special Edition - # - eecf3a857724171f968a66cb5719e152 # IMAX - # - 9f6cbff8cfe4ebbc1bde14c7b7bec0de # IMAX Enhanced - assign_scores_to: - - name: Remux + WEB 1080p - - # Optional - - trash_ids: - # - b6832f586342ef70d9c128d40c07b872 # Bad Dual Groups - # - cc444569854e9de0b084ab2b8b1532b2 # Black and White Editions - # - 90cedc1fea7ea5d11298bebd3d1d3223 # EVO (no WEBDL) - - ae9b7c9ebde1f3bd336a8cbd1ec4c5e5 # No-RlsGroup - # - 7357cf5161efbf8c4d5d0c30b4815ee2 # Obfuscated - # - 5c44f52a8714fdd79bb4d98e2673be1f # Retags - # - f537cf427b64c38c8e36298f657e4828 # Scene - assign_scores_to: - - name: Remux + WEB 1080p - - - trash_ids: - # Uncomment the next six lines to allow x265 HD releases with HDR/DV - # - dc98083864ea246d05a42df0d05f81cc # x265 (HD) - # assign_scores_to: - # - name: Remux + WEB 1080p - # score: 0 - # - trash_ids: - # - 839bea857ed2c0a8e084f3cbdbd65ecb # x265 (no HDR/DV) - assign_scores_to: - - name: Remux + WEB 1080p - - - radarr_anime: - delete_old_custom_formats: true - replace_existing_custom_formats: true - - media_naming: - folder: default - - movie: - rename: true - standard: anime - include: - # Comment out any of the following includes to disable them - - template: radarr-quality-definition-movie - - template: radarr-quality-profile-anime - - template: radarr-custom-formats-anime - -# Custom Formats: https://recyclarr.dev/wiki/yaml/config-reference/custom-formats/ - custom_formats: - - trash_ids: - - 064af5f084a0a24458cc8ecd3220f93f # Uncensored - assign_scores_to: - - name: Remux-1080p - Anime - score: 0 # Adjust scoring as desired - - - trash_ids: - - a5d148168c4506b55cf53984107c396e # 10bit - assign_scores_to: - - name: Remux-1080p - Anime - score: 0 # Adjust scoring as desired - - - trash_ids: - - 4a3b087eea2ce012fcc1ce319259a3be # Anime Dual Audio - assign_scores_to: - - name: Remux-1080p - Anime - score: 0 # Adjust scoring as desired - - radarr_4k: - delete_old_custom_formats: true - replace_existing_custom_formats: true - - media_naming: - folder: default - - movie: - rename: true - standard: standard - - include: - # Comment out any of the following includes to disable them - - template: radarr-quality-definition-movie - - template: radarr-quality-profile-remux-web-2160p - - template: radarr-custom-formats-remux-web-2160p - - # Custom Formats: https://recyclarr.dev/wiki/yaml/config-reference/custom-formats/ - custom_formats: - - trash_ids: - # Audio - # Uncomment the next section to enable Advanced Audio Formats - # - 496f355514737f7d83bf7aa4d24f8169 # TrueHD Atmos - # - 2f22d89048b01681dde8afe203bf2e95 # DTS X - # - 417804f7f2c4308c1f4c5d380d4c4475 # ATMOS (undefined) - # - 1af239278386be2919e1bcee0bde047e # DD+ ATMOS - # - 3cafb66171b47f226146a0770576870f # TrueHD - # - dcf3ec6938fa32445f590a4da84256cd # DTS-HD MA - # - a570d4a0e56a2874b64e5bfa55202a1b # FLAC - # - e7c2fcae07cbada050a0af3357491d7b # PCM - # - 8e109e50e0a0b83a5098b056e13bf6db # DTS-HD HRA - # - 185f1dd7264c4562b9022d963ac37424 # DD+ - # - f9f847ac70a0af62ea4a08280b859636 # DTS-ES - # - 1c1a4c5e823891c75bc50380a6866f73 # DTS - # - 240770601cc226190c367ef59aba7463 # AAC - # - c2998bd0d90ed5621d8df281e839436e # DD - assign_scores_to: - - name: Remux + WEB 2160p - - # Movie Versions - - trash_ids: - # Uncomment any of the following lines to prefer these movie versions - # - 0f12c086e289cf966fa5948eac571f44 # Hybrid - # - 570bc9ebecd92723d2d21500f4be314c # Remaster - # - eca37840c13c6ef2dd0262b141a5482f # 4K Remaster - # - e0c07d59beb37348e975a930d5e50319 # Criterion Collection - # - 9d27d9d2181838f76dee150882bdc58c # Masters of Cinema - # - db9b4c4b53d312a3ca5f1378f6440fc9 # Vinegar Syndrome - # - 957d0f44b592285f26449575e8b1167e # Special Edition - # - eecf3a857724171f968a66cb5719e152 # IMAX - # - 9f6cbff8cfe4ebbc1bde14c7b7bec0de # IMAX Enhanced - assign_scores_to: - - name: Remux + WEB 2160p - - # Optional - - trash_ids: - # - b6832f586342ef70d9c128d40c07b872 # Bad Dual Groups - # - cc444569854e9de0b084ab2b8b1532b2 # Black and White Editions - # - 90cedc1fea7ea5d11298bebd3d1d3223 # EVO (no WEBDL) - - ae9b7c9ebde1f3bd336a8cbd1ec4c5e5 # No-RlsGroup - # - 7357cf5161efbf8c4d5d0c30b4815ee2 # Obfuscated - # - 5c44f52a8714fdd79bb4d98e2673be1f # Retags - # - f537cf427b64c38c8e36298f657e4828 # Scene - assign_scores_to: - - name: Remux + WEB 2160p - - - trash_ids: - # Uncomment the next six lines to allow x265 HD releases with HDR/DV - # - dc98083864ea246d05a42df0d05f81cc # x265 (HD) - # assign_scores_to: - # - name: Remux + WEB 2160p - # score: 0 - # - trash_ids: - # - 839bea857ed2c0a8e084f3cbdbd65ecb # x265 (no HDR/DV) - assign_scores_to: - - name: Remux + WEB 2160p - - - trash_ids: - # Comment out the next line if you and all of your users' setups are fully DV compatible - # - 923b6abef9b17f937fab56cfcf89e1f1 # DV (WEBDL) - - # HDR10+ Boost - Uncomment the next two lines if any of your devices DO support HDR10+ - - b17886cb4158d9fea189859409975758 # HDR10Plus Boost - - 55a5b50cb416dea5a50c4955896217ab # DV HDR10+ Boost - assign_scores_to: - - name: Remux + WEB 2160p - - # Optional SDR - # Only ever use ONE of the following custom formats: - # SDR - block ALL SDR releases - # SDR (no WEBDL) - block UHD/4k Remux and Bluray encode SDR releases, but allow SDR WEB - - trash_ids: - - 9c38ebb7384dada637be8899efa68e6f # SDR - # - 25c12f78430a3a23413652cbd1d48d77 # SDR (no WEBDL) - assign_scores_to: - - name: Remux + WEB 2160p - -sonarr: - - sonarr_default: - delete_old_custom_formats: true - replace_existing_custom_formats: true - - media_naming: - series: default - season: default - episodes: - rename: true - standard: default - daily: default - anime: default - - include: - # Comment out any of the following includes to disable them - - template: sonarr-quality-definition-series - # Choose between the standard or alternative quality profile setup (choose one only) - # - template: sonarr-v4-quality-profile-web-1080p- - - template: sonarr-v4-quality-profile-web-1080p-alternative - - template: sonarr-v4-custom-formats-web-1080p - -# Custom Formats: https://recyclarr.dev/wiki/yaml/config-reference/custom-formats/ - custom_formats: - # Optional - - trash_ids: - # - 32b367365729d530ca1c124a0b180c64 # Bad Dual Groups - # - 82d40da2bc6923f41e14394075dd4b03 # No-RlsGroup - # - e1a997ddb54e3ecbfe06341ad323c458 # Obfuscated - # - 06d66ab109d4d2eddb2794d21526d140 # Retags - # - 1b3994c551cbb92a2c781af061f4ab44 # Scene - assign_scores_to: - - name: WEB-1080p - - - trash_ids: - # Uncomment the next six lines to allow x265 HD releases with HDR/DV - # - 47435ece6b99a0b477caf360e79ba0bb # x265 (HD) - # assign_scores_to: - # - name: WEB-1080p - # score: 0 - # - trash_ids: - # - 9b64dff695c2115facf1b6ea59c9bd07 # x265 (no HDR/DV) - assign_scores_to: - - name: WEB-1080p - - sonarr_4k: - delete_old_custom_formats: true - replace_existing_custom_formats: true - - media_naming: - series: default - season: default - episodes: - rename: true - standard: default - daily: default - anime: default - include: - # Comment out any of the following includes to disable them - - template: sonarr-quality-definition-series - # Choose between the standard or alternative quality profile setup (choose one only) - - template: sonarr-v4-quality-profile-web-2160p - # - template: sonarr-v4-quality-profile-web-2160p-alternative - - template: sonarr-v4-custom-formats-web-2160p - -# Custom Formats: https://recyclarr.dev/wiki/yaml/config-reference/custom-formats/ - custom_formats: - # HDR Formats - - trash_ids: - # Comment out the next line if you and all of your users' setups are fully DV compatible - - 9b27ab6498ec0f31a3353992e19434ca # DV (WEBDL) - - # HDR10+ Boost - Uncomment the next two lines if any of your devices DO support HDR10+ - # - 0dad0a507451acddd754fe6dc3a7f5e7 # HDR10+ Boost - # - 385e9e8581d33133c3961bdcdeffb7b4 # DV HDR10+ Boost - assign_scores_to: - - name: WEB-2160p - - # Optional - - trash_ids: - # - 32b367365729d530ca1c124a0b180c64 # Bad Dual Groups - # - 82d40da2bc6923f41e14394075dd4b03 # No-RlsGroup - # - e1a997ddb54e3ecbfe06341ad323c458 # Obfuscated - # - 06d66ab109d4d2eddb2794d21526d140 # Retags - # - 1b3994c551cbb92a2c781af061f4ab44 # Scene - assign_scores_to: - - name: WEB-2160p - - - trash_ids: - # Uncomment the next six lines to allow x265 HD releases with HDR/DV - # - 47435ece6b99a0b477caf360e79ba0bb # x265 (HD) - # assign_scores_to: - # - name: WEB-2160p - # score: 0 - # - trash_ids: - # - 9b64dff695c2115facf1b6ea59c9bd07 # x265 (no HDR/DV) - assign_scores_to: - - name: WEB-2160p - - # Optional SDR - # Only ever use ONE of the following custom formats: - # SDR - block ALL SDR releases - # SDR (no WEBDL) - block UHD/4k Remux and Bluray encode SDR releases, but allow SDR WEB - - trash_ids: - - 2016d1676f5ee13a5b7257ff86ac9a93 # SDR - # - 83304f261cf516bb208c18c54c0adf97 # SDR (no WEBDL) - assign_scores_to: - - name: WEB-2160p - sonarr_anime: - delete_old_custom_formats: true - replace_existing_custom_formats: true - - media_naming: - series: default - season: default - episodes: - rename: true - standard: default - daily: default - anime: default - include: - # Comment out any of the following includes to disable them - - template: sonarr-quality-definition-anime - - template: sonarr-v4-quality-profile-anime - - template: sonarr-v4-custom-formats-anime - -# Custom Formats: https://recyclarr.dev/wiki/yaml/config-reference/custom-formats/ - custom_formats: - - trash_ids: - - 026d5aadd1a6b4e550b134cb6c72b3ca # Uncensored - assign_scores_to: - - name: Remux-1080p - Anime - score: 0 # Adjust scoring as desired - - - trash_ids: - - b2550eb333d27b75833e25b8c2557b38 # 10bit - assign_scores_to: - - name: Remux-1080p - Anime - score: 0 # Adjust scoring as desired - - - trash_ids: - - 418f50b10f1907201b6cfdf881f467b7 # Anime Dual Audio - assign_scores_to: - - name: Remux-1080p - Anime - score: 0 # Adjust scoring as desired diff --git a/data/recyclarr/secrets.yml b/data/recyclarr/secrets.yml index 2134eea..e69de29 100644 --- a/data/recyclarr/secrets.yml +++ b/data/recyclarr/secrets.yml @@ -1,17 +0,0 @@ -radarr_default_base_url: http://radarr:7878 -radarr_default_api_key: - -radarr_4k_base_url: http://radarr4k:7878 -radarr_4k_api_key: - -radarr_anime_base_url: http://radarranime:7878 -radarr_anime_api_key: - -sonarr_default_base_url: http://sonarr:8989 -sonarr_default_api_key: - -sonarr_4k_base_url: http://sonarr4k:8989 -sonarr_4k_api_key: - -sonarr_anime_base_url: http://sonarranime:8989 -sonarr_anime_api_key: \ No newline at end of file diff --git a/data/tweakio/config.yaml b/data/tweakio/config.yaml new file mode 100644 index 0000000..8ca2eb4 --- /dev/null +++ b/data/tweakio/config.yaml @@ -0,0 +1,7 @@ +torrentio: + base_url: https://torrentio.strem.fun/ + options: "providers=yts,eztv,rarbg,1337x,thepiratebay,kickasstorrents,torrentgalaxy,magnetdl,horriblesubs,nyaasi,tokyotosho,anidex|sort=qualitysize|qualityfilter=scr,cam" + +tmdb: + api_key: "" # If empty, defaults to 10 episodes for everything + cache_size: 1000 \ No newline at end of file diff --git a/data/wests-scripts/shared/tokens.json b/data/wests-scripts/shared/tokens.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/data/wests-scripts/shared/tokens.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/data/zurg/config-v0.10.yml b/data/zurg/config-v0.10.yml new file mode 100644 index 0000000..2d8dbb6 --- /dev/null +++ b/data/zurg/config-v0.10.yml @@ -0,0 +1,122 @@ +# =================================== # +# ███████╗██╗ ██╗██████╗ ██████╗ # +# ╚══███╔╝██║ ██║██╔══██╗██╔════╝ # +# ███╔╝ ██║ ██║██████╔╝██║ ███╗ # +# ███╔╝ ██║ ██║██╔══██╗██║ ██║ # +# ███████╗╚██████╔╝██║ ██║╚██████╔╝ # +# ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ # +# =================================== # + +# ============================================================================== +# BASIC CONFIGURATION +# ============================================================================== +# Zurg configuration version +zurg: v1 + +# Your Real-Debrid API token +# Get it from https://real-debrid.com/apitoken +token: + +# If you have other Real-Debrid tokens, you can uncomment the lines below and add them here +# download_tokens: +# - MY_TOKEN_2 +# - MY_TOKEN_3 +# ============================================================================== +# CORE SETTINGS +# ============================================================================== + +host: "[::]" +port: 9999 +# proxy: "http://warp:1080" +force_ipv6: false +number_of_hosts: 3 + +# ============================================================================== +# PERFORMANCE AND RATE LIMITS +# ============================================================================== + +concurrent_workers: 32 +api_rate_limit_per_minute: 60 +torrents_rate_limit_per_minute: 25 +api_timeout_secs: 15 +download_timeout_secs: 10 +retries_until_failed: 2 +retry_503_errors: false +fetch_torrents_page_size: 1000 + +# ============================================================================== +# FILE MANAGEMENT +# ============================================================================== + +# Enable automatic torrent repair +enable_repair: true + +# Action for RAR files: extract, delete, or none (default: "none") +rar_action: none + +# Additional file extensions to consider as playable +# addl_playable_extensions: +# - m3u +# - jpg + +# If a torrent contains any file with these extensions, delete the torrent +# delete_torrent_if_extensions_found: +# - zipx +# - rar + +# Even when files are not selected in the torrent, if the file is playable (video or addl_playable_extensions), it will be selected +force_select_playable_files: false + +# Retain the torrent name extension which is used for directory names (useful for single file torrents) +retain_folder_name_extension: true + +# Retain the name value of a torrent from real-debrid (if false, will use original_name instead) +retain_rd_torrent_name: true + +# Delete torrents that have encountered an error +delete_error_torrents: false + +# Hide torrents that are broken (unplayable) +hide_broken_torrents: false + +# Will ignore rename values in the torrent +ignore_renames: true + +# Whether to safe .STRM files +save_strm_files: false + +# ============================================================================== +# SCHEDULING AND UPDATES +# ============================================================================== + +# How often to check for changes in the library (default: 15 seconds) +check_for_changes_every_secs: 20 + +# How often to check for broken torrents and repair them (default: 60 minutes) +repair_every_mins: 60 + +# How often to check for new downloads (unrestricted links, file locker links) (default: 720 minutes) +downloads_every_mins: 720 + +# How often to dump your library torrents to the dump folder for backup (default: 1440 minutes) +dump_torrents_every_mins: 1440 + +# Command to run when the library is updated (useful for plex refresh) +# on_library_update: "sh plex_update.sh \"$@\"" + + + +# ============================================================================== +# MEDIA ANALYSIS +# ============================================================================== + + +auto_analyze_new_torrents: false +cache_network_test_results: true + + +# ============================================================================== +# ADVANCED SETTINGS +# ============================================================================== + +disable_stream_proxy: false diff --git a/data/zurg/config-v0.9.yml b/data/zurg/config-v0.9.yml new file mode 100644 index 0000000..3d702e6 --- /dev/null +++ b/data/zurg/config-v0.9.yml @@ -0,0 +1,40 @@ +# =================================== # +# ███████╗██╗ ██╗██████╗ ██████╗ # +# ╚══███╔╝██║ ██║██╔══██╗██╔════╝ # +# ███╔╝ ██║ ██║██████╔╝██║ ███╗ # +# ███╔╝ ██║ ██║██╔══██╗██║ ██║ # +# ███████╗╚██████╔╝██║ ██║╚██████╔╝ # +# ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ # +# =================================== # + + +# Zurg configuration version +zurg: v1 + +# Provide your Real-Debrid API token +token: YOUR_RD_API_TOKEN # https://real-debrid.com/apitoken + +# Host and port settings +host: "[::]" +port: 9999 + +concurrent_workers: 32 + +# Checking for changes in Real-Debrid API more frequently (every 60 seconds) +check_for_changes_every_secs: 15 + +# File handling and renaming settings +retain_rd_torrent_name: true +retain_folder_name_extension: true +expose_full_path: true + +# Torrent management settings +enable_repair: true +auto_delete_rar_torrents: false + +# Streaming and download link verification settings +serve_from_rclone: false +verify_download_link: false + +# Network and API settings +force_ipv6: false \ No newline at end of file diff --git a/data/zurg/config.yml b/data/zurg/config.yml deleted file mode 100644 index 213cb1b..0000000 --- a/data/zurg/config.yml +++ /dev/null @@ -1,28 +0,0 @@ -# Zurg configuration version -zurg: v1 -token: ENTER REAL-DEBRID API TOKEN HERE # https://real-debrid.com/apitoken -# host: "[::]" -# port: 9999 -# username: -# password: -# proxy: -api_rate_limit_per_minute: 60 -torrents_rate_limit_per_minute: 25 -concurrent_workers: 32 -check_for_changes_every_secs: 10 -# repair_every_mins: 60 -ignore_renames: true -retain_rd_torrent_name: true -retain_folder_name_extension: true -enable_repair: false -auto_delete_rar_torrents: false -get_torrents_count: 5000 -# api_timeout_secs: 15 -# download_timeout_secs: 10 -# enable_download_mount: false -# rate_limit_sleep_secs: 6 -# retries_until_failed: 2 -# network_buffer_size: 4194304 # 4MB -serve_from_rclone: true -# verify_download_link: false -# force_ipv6: false \ No newline at end of file diff --git a/data/zurg/rclone.conf b/data/zurg/rclone.conf index 5b0ecd2..e6b8fe3 100644 --- a/data/zurg/rclone.conf +++ b/data/zurg/rclone.conf @@ -2,4 +2,4 @@ type = webdav url = http://zurg:9999/dav vendor = other -pacer_min_sleep = 0 \ No newline at end of file +pacer_min_sleep = 0