feat: split up compose.yaml into multiple folders and add authelia to secure apps, add some more apps (#1)

* feat: .

* feat: delete old data folder

* fix: rename zipline-db service to zipline_postgres in compose.yaml

* fix: add zipline compose to include list

* fix: add redis service for stremthru

* docs: add instructions in .env files

* feat: remove docker folder and place apps and data folder in root dir

* fix: add empty tokens.json file for plex_authentication

* fix: add aiostremio template config

* docs: update README with Authelia authentication and clarify setup instructions

* fix: update stremthru_redis volume path and profile name in compose.yaml
This commit is contained in:
Viren070
2025-04-05 01:22:29 +01:00
committed by GitHub
parent 11cdd1b2e2
commit 1d3d792e12
125 changed files with 5547 additions and 3120 deletions
-794
View File
@@ -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 <your_password_here> with your desired password.
# (removing the < and > as well):
#
# htpasswd -niBb user <your_password_here> | 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/<webhook_id>/<webhook_token>
# So the URL would be discord://<webhook_token>@<webhook_id>
# ---------------------------------------------------------
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/<status_page_name>
# ---------------------------------------------------------
# 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 '(?<=<ApiKey>).*(?=</ApiKey>)'
#
# 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 <your_password_here> with your desired password.
#
# htpasswd -niBb user <your_password_here> | 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
+21 -7
View File
@@ -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)
+84
View File
@@ -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.
+1
View File
@@ -0,0 +1 @@
ADDON_MANAGER_HOSTNAME=
+20
View File
@@ -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
+197
View File
@@ -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=
# --------------------------------------
# ==============================================================================
+27
View File
@@ -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
+25
View File
@@ -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=
+43
View File
@@ -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
+46
View File
@@ -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
+63
View File
@@ -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
+8
View File
@@ -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.
+34
View File
@@ -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
+2
View File
@@ -0,0 +1,2 @@
BAZARR_HOSTNAME=
BAZARR4K_HOSTNAME=
+67
View File
@@ -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
+20
View File
@@ -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
+123
View File
@@ -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
+51
View File
@@ -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
+55
View File
@@ -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}
+19
View File
@@ -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
+22
View File
@@ -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?}"
+9
View File
@@ -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=
+28
View File
@@ -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
+12
View File
@@ -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=
+19
View File
@@ -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
+29
View File
@@ -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.
+38
View File
@@ -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
+5
View File
@@ -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=
+20
View File
@@ -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?}"
+1
View File
@@ -0,0 +1 @@
JACKETT_HOSTNAME=
+33
View File
@@ -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
+8
View File
@@ -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=
+25
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
JELLYFIN_HOSTNAME=
+29
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
JELLYSEER_HOSTNAME=
+26
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
MEDIAFLOW_HOSTNAME=
API_PASSWORD=
PROXY_URL=http://warp:1080
TRANSPORT_ROUTES="{ "https://torrentio.strem.fun": { "proxy": true } }"
+27
View File
@@ -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
@@ -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
+99
View File
@@ -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
+54
View File
@@ -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=
+30
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
NZBHYDRA2_HOSTNAME=
+26
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
OMG_TV_STREMIO_ADDON_HOSTNAME=
+26
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
OVERSEERR_HOSTNAME=
+22
View File
@@ -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
+16
View File
@@ -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
+77
View File
@@ -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
+15
View File
@@ -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://<your-ip>: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
+45
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
PROWLARR_HOSTNAME=
+31
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
RADARR_HOSTNAME=
RADARR4K_HOSTNAME=
RADARRANIME_HOSTNAME=
+109
View File
@@ -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
+11
View File
@@ -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
@@ -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"]
@@ -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
+249
View File
@@ -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)
+21
View File
@@ -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
+17
View File
@@ -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=
+30
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
SEARXNG_HOSTNAME=
+29
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
SONARR_HOSTNAME=
SONARR4K_HOSTNAME=
SONARRANIME_HOSTNAME=
+111
View File
@@ -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
+12
View File
@@ -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=
@@ -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
+1
View File
@@ -0,0 +1 @@
STREMIO_JACKETT_HOSTNAME=
+23
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
STREMIO_SERVER_HOSTNAME=
+19
View File
@@ -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
+14
View File
@@ -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=
+91
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
STREMTHRU_HOSTNAME=
+53
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
TAUTULLI_HOSTNAME=
+25
View File
@@ -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
+7
View File
@@ -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.
+49
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
TBM_HOSTNAME=
+61
View File
@@ -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
+2
View File
@@ -0,0 +1,2 @@
# Email provided to Let's Encrypt for notifications
LETSENCRYPT_EMAIL=
+60
View File
@@ -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
+14
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
UPTIME_KUMA_HOSTNAME=
+21
View File
@@ -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
+5
View File
@@ -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
+24
View File
@@ -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
+29
View File
@@ -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
+17
View File
@@ -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/<webhook_id>/<webhook_token>
# So the URL would be discord://<webhook_token>@<webhook_id>
# ---------------------------------------------------------
AUTO_UPDATE_SCHEDULE=0 0 6 * * *
AUTO_UPDATE_NOTIFICATION_URL=
+32
View File
@@ -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
+133
View File
@@ -0,0 +1,133 @@
#------------------------------------------------------#
# ███████╗ ██████╗██████╗ ██╗██████╗ ████████╗███████╗ #
# ██╔════╝██╔════╝██╔══██╗██║██╔══██╗╚══██╔══╝██╔════╝ #
# ███████╗██║ ██████╔╝██║██████╔╝ ██║ ███████╗ #
# ╚════██║██║ ██╔══██╗██║██╔═══╝ ██║ ╚════██║ #
# ███████║╚██████╗██║ ██║██║██║ ██║ ███████║ #
# ╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚══════╝ #
#------------------------------------------------------#
#--------#
# SERVER #
#--------#
SERVER_DOMAIN=<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=<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=<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=<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_movie_library_id>
PLEX_SERVER_TV_SHOW_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=<plex_server_path>
#-------------------------------------------------------------------------#
# OVERSEERR - WATCHLIST, PLEX AUTHENTICATION, PLEX REQUEST, RECLAIM SPACE #
#-------------------------------------------------------------------------#
OVERSEERR_HOST=http://overseerr:5055
OVERSEERR_API_KEY=<overseerr_api_key>
#------------------------------------------------------------------------------------#
# SONARR - BLACKHOLE, REPAIR, IMPORT TORRENT FOLDER, RECLAIM SPACE, ADD NEXT EPISODE #
#------------------------------------------------------------------------------------#
SONARR_HOST=http://sonarr:8989
SONARR_API_KEY=<sonarr_api_key>
SONARR_ROOT_FOLDER="/mnt/media/TV"
SONARR_HOST_4K=http://sonarr4k:8989
SONARR_API_KEY_4K=<sonarr_api_key_4k>
SONARR_ROOT_FOLDER_4K="/mnt/media/TV - 4K"
SONARR_HOST_ANIME=http://sonarranime:8989
SONARR_API_KEY_ANIME=<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_api_key>
RADARR_ROOT_FOLDER="/mnt/media/Movies"
RADARR_HOST_4K=http://radarr4k:7878
RADARR_API_KEY_4K=<radarr_api_key_4k>
RADARR_ROOT_FOLDER_4K="/mnt/media/Movies - 4K"
RADARR_HOST_ANIME=http://radarranime:7878
RADARR_API_KEY_ANIME=<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_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=<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
+112
View File
@@ -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
+8
View File
@@ -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
@@ -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
@@ -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
@@ -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

Some files were not shown because too many files have changed in this diff Show More