mirror of
https://github.com/Viren070/docker-compose-template.git
synced 2025-12-01 23:17:00 +01:00
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:
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
@@ -0,0 +1 @@
|
||||
ADDON_MANAGER_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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=
|
||||
# --------------------------------------
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
BAZARR_HOSTNAME=
|
||||
BAZARR4K_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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}
|
||||
@@ -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
|
||||
@@ -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?}"
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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=
|
||||
@@ -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?}"
|
||||
@@ -0,0 +1 @@
|
||||
JACKETT_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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=
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
JELLYFIN_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
JELLYSEER_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
MEDIAFLOW_HOSTNAME=
|
||||
|
||||
API_PASSWORD=
|
||||
PROXY_URL=http://warp:1080
|
||||
TRANSPORT_ROUTES="{ "https://torrentio.strem.fun": { "proxy": true } }"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
NZBHYDRA2_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
OMG_TV_STREMIO_ADDON_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
OVERSEERR_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
PROWLARR_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
RADARR_HOSTNAME=
|
||||
RADARR4K_HOSTNAME=
|
||||
RADARRANIME_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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=
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
SEARXNG_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
SONARR_HOSTNAME=
|
||||
SONARR4K_HOSTNAME=
|
||||
SONARRANIME_HOSTNAME=
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
STREMIO_JACKETT_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
STREMIO_SERVER_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
STREMTHRU_HOSTNAME=
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
TAUTULLI_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
TBM_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
# Email provided to Let's Encrypt for notifications
|
||||
LETSENCRYPT_EMAIL=
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
UPTIME_KUMA_HOSTNAME=
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user