This commit is contained in:
2026-08-06 14:38:05 -07:00
parent e9d329954d
commit 0a08e5176f
4 changed files with 897 additions and 229 deletions
+289 -225
View File
@@ -1,11 +1,55 @@
networks:
caddy_net:
external: true
tdarr-net:
driver: bridge
default:
name: portainer_network
volumes:
meilisearch:
karakeep-data:
caddy_config:
caddy_data:
external: true
myspeed:
external: true # docker compose will fail creating myspeed if the volume hasn't been manually created, which we have done. unless you deleted it...
portainer_data:
name: portainer_data
##### ORGANIZATION FOR EVERY CONTAINER
# services:
# container:
# image: <...>
# container_name: <...>
# env_file: <...>
# networks: <...>
# cap_add: <...>
# ports: <...>
# volumes: <...>
# environment: <...>
# labels: <...>
# healthcheck: <...>
# extra_hosts: <...>
# restart: <...>
#
services: services:
gluetun: gluetun:
image: qmcgaw/gluetun:latest image: qmcgaw/gluetun:latest
container_name: gluetun container_name: gluetun
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
devices: ports: # YOU MUST SPECIFY A PORT PER SERVICE ROUTED THROUGH GLUETUN!
- /dev/net/tun:/dev/net/tun - 8888:8000/tcp # gluetun control server, i dont think you should change this
- ${QBITTORRENT_PORT}:${QBITTORRENT_PORT} # qBittorrent Web UI
- ${PROWLARR_PORT}:${PROWLARR_PORT} # Prowlarr
- ${SONARR_PORT}:${SONARR_PORT} # Sonarr
- ${RADARR_PORT}:${RADARR_PORT} # Radarr
- ${LIDARR_PORT}:${LIDARR_PORT} # Lidarr
#- ${SEERR_PORT}:${SEERR_PORT}/tcp # Seerr # took this out of gluetun, as it could cause issues with starting the container, and it was unecessary
volumes:
- ./gluetun-data:/tmp/gluetun:rw
environment: environment:
- VPN_SERVICE_PROVIDER=protonvpn # Or mullvad, protonvpn, surfshark, etc. - VPN_SERVICE_PROVIDER=protonvpn # Or mullvad, protonvpn, surfshark, etc.
- VPN_TYPE=wireguard # WireGuard, openvpn - VPN_TYPE=wireguard # WireGuard, openvpn
@@ -22,35 +66,27 @@ services:
- FIREWALL_OUTBOUND_SUBNETS=192.168.50.0/24 - FIREWALL_OUTBOUND_SUBNETS=192.168.50.0/24
- TZ=${TIMEZONE} - TZ=${TIMEZONE}
- DNS_UPSTREAM_RESOLVER_TYPE=doh # DNS over TLS is an extra layer of security so your isp can not look at what you're doing through your DNS requests, even if your using a vpn (very vague, I don't know how this syustem works with a vpn). - DNS_UPSTREAM_RESOLVER_TYPE=doh # DNS over TLS is an extra layer of security so your isp can not look at what you're doing through your DNS requests, even if your using a vpn (very vague, I don't know how this syustem works with a vpn).
ports: # YOU MUST SPECIFY A PORT PER SERVICE ROUTED THROUGH GLUETUN!
- 8888:8000/tcp # gluetun control server, i dont think you should change this
- ${QBITTORRENT_PORT}:${QBITTORRENT_PORT} # qBittorrent Web UI
- ${PROWLARR_PORT}:${PROWLARR_PORT} # Prowlarr
- ${SONARR_PORT}:${SONARR_PORT} # Sonarr
- ${RADARR_PORT}:${RADARR_PORT} # Radarr
- ${LIDARR_PORT}:${LIDARR_PORT} # Lidarr
#- ${SEERR_PORT}:${SEERR_PORT}/tcp # Seerr # took this out of gluetun, as it could cause issues with starting the container, and it was unecessary
healthcheck: healthcheck:
test: wget --spider -q http://1.1.1.1 || exit 1 test: wget --spider -q http://1.1.1.1 || exit 1
interval: 30s interval: 30s
timeout: 15s timeout: 15s
retries: 3 retries: 3
start_period: 1m start_period: 1m
volumes:
- ./gluetun-data:/tmp/gluetun:rw
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" # host-gateway is a docker variable that automatically grabs the 172.XX.0.1 address, this is to be used by prowlarr to communicate with sonarr and radarr. - "host.docker.internal:host-gateway" # host-gateway is a docker variable that automatically grabs the 172.XX.0.1 address, this is to be used by prowlarr to communicate with sonarr and radarr.
devices:
- /dev/net/tun:/dev/net/tun
restart: always restart: always
qbittorrent: qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent container_name: qbittorrent
network_mode: "container:gluetun" # vpn bunker network_mode: "container:gluetun" # vpn bunker
environment: depends_on:
- PUID=1000 gluetun:
- PGID=1000 condition: service_healthy
- TZ=${TIMEZONE} labels:
- WEBUI_PORT=${QBITTORRENT_PORT} - "autoheal=true"
volumes: volumes:
- ./qbittorrent:/config - ./qbittorrent:/config
- ${DISK1}:${DISK1} - ${DISK1}:${DISK1}
@@ -58,11 +94,11 @@ services:
- ./gluetun-data:/tmp/gluetun - ./gluetun-data:/tmp/gluetun
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
labels: environment:
- "autoheal=true" - PUID=${HOST_PUID:-1000}
depends_on: - PGID=${HOST_PGID:-1000}
gluetun: - TZ=${TIMEZONE}
condition: service_healthy - WEBUI_PORT=${QBITTORRENT_PORT}
healthcheck: # if gluetun is slow to start, it's over healthcheck: # if gluetun is slow to start, it's over
test: ["CMD-SHELL", wget --spider -q https://1.1.1.1 || exit 1] # use 1.1.1.1, we don't need dns around here test: ["CMD-SHELL", wget --spider -q https://1.1.1.1 || exit 1] # use 1.1.1.1, we don't need dns around here
interval: 1m interval: 1m
@@ -124,21 +160,21 @@ services:
prowlarr: prowlarr:
image: lscr.io/linuxserver/prowlarr:latest image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr container_name: prowlarr
environment: network_mode: "container:gluetun"
- PUID=1000 depends_on:
- PGID=1000 gluetun:
- TZ=${TIMEZONE} condition: service_healthy
labels:
- "autoheal=true"
volumes: volumes:
- ./prowlarr:/config - ./prowlarr:/config
- ./notify.sh:/notify.sh:ro - ./notify.sh:/notify.sh:ro
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
labels: environment:
- "autoheal=true" - PUID=${HOST_PUID:-1000}
network_mode: "container:gluetun" - PGID=${HOST_PGID:-1000}
depends_on: - TZ=${TIMEZONE}
gluetun:
condition: service_healthy
healthcheck: healthcheck:
test: ["CMD-SHELL", wget --spider -q https://google.com || exit 1] # needs DNS test: ["CMD-SHELL", wget --spider -q https://google.com || exit 1] # needs DNS
interval: 5m interval: 5m
@@ -150,22 +186,22 @@ services:
sonarr: sonarr:
image: lscr.io/linuxserver/sonarr:latest image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr container_name: sonarr
environment: network_mode: "container:gluetun"
- PUID=1000 depends_on:
- PGID=1000 gluetun:
- TZ=${TIMEZONE} condition: service_healthy
labels:
- "autoheal=true"
volumes: volumes:
- /var/lib/sonarr:/config # had migrated into docker compose - /var/lib/sonarr:/config # had migrated into docker compose
- ${DISK1}:${DISK1} - ${DISK1}:${DISK1}
- ${DISK2}:${DISK2} - ${DISK2}:${DISK2}
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
labels: environment:
- "autoheal=true" - PUID=${HOST_PUID:-1000}
network_mode: "container:gluetun" - PGID=${HOST_PGID:-1000}
depends_on: - TZ=${TIMEZONE}
gluetun:
condition: service_healthy
healthcheck: healthcheck:
test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"] test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"]
interval: 5m interval: 5m
@@ -177,22 +213,22 @@ services:
radarr: radarr:
image: lscr.io/linuxserver/radarr:latest image: lscr.io/linuxserver/radarr:latest
container_name: radarr container_name: radarr
environment: network_mode: "container:gluetun"
- PUID=1000 labels:
- PGID=1000 - "autoheal=true"
- TZ=${TIMEZONE} depends_on:
gluetun:
condition: service_healthy
volumes: volumes:
- /var/lib/radarr:/config # had migrated into docker compose - /var/lib/radarr:/config # had migrated into docker compose
- ${DISK1}:${DISK1} - ${DISK1}:${DISK1}
- ${DISK2}:${DISK2} - ${DISK2}:${DISK2}
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
labels: environment:
- "autoheal=true" - PUID=${HOST_PUID:-1000}
network_mode: "container:gluetun" - PGID=${HOST_PGID:-1000}
depends_on: - TZ=${TIMEZONE}
gluetun:
condition: service_healthy
healthcheck: healthcheck:
test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"] test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"]
interval: 1m interval: 1m
@@ -204,23 +240,23 @@ services:
lidarr: lidarr:
image: lscr.io/linuxserver/lidarr:latest image: lscr.io/linuxserver/lidarr:latest
container_name: lidarr container_name: lidarr
environment: network_mode: "container:gluetun"
- PUID=1000 depends_on:
- PGID=1000 gluetun:
- TZ=${TIMEZONE} condition: service_healthy
labels:
- "autoheal=true"
volumes: volumes:
- /home/shaan/torrent-stack/lidarr:/music - ./lidarr:/music
- /var/lib/lidarr:/config - /var/lib/lidarr:/config
- ${DISK1}:${DISK1} - ${DISK1}:${DISK1}
- ${DISK2}:${DISK2} - ${DISK2}:${DISK2}
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
labels: environment:
- "autoheal=true" - PUID=${HOST_PUID:-1000}
network_mode: "container:gluetun" - PGID=${HOST_PGID:-1000}
depends_on: - TZ=${TIMEZONE}
gluetun:
condition: service_healthy
healthcheck: healthcheck:
test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"] test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"]
interval: 1m interval: 1m
@@ -232,70 +268,72 @@ services:
tautulli: # has no network bridge between containers. this is fine, as it only needs to get from plex, which is outside this container tautulli: # has no network bridge between containers. this is fine, as it only needs to get from plex, which is outside this container
image: ghcr.io/tautulli/tautulli image: ghcr.io/tautulli/tautulli
container_name: tautulli container_name: tautulli
networks:
- caddy_net
ports:
- ${TAUTULLI_PORT}:${TAUTULLI_PORT}
volumes: volumes:
#- /mnt/media/media:/config #- /mnt/media/media:/config
- ./tautulli:/config - ./tautulli:/config
environment: environment:
- PUID=1000 - PUID=${HOST_PUID:-1000}
- PGID=1000 - PGID=${HOST_PGID:-1000}
- TZ=${TIMEZONE} - TZ=${TIMEZONE}
ports: restart: unless-stopped
- ${TAUTULLI_PORT}:${TAUTULLI_PORT}
networks:
- caddy_net
restart: always
tdarr: tdarr:
container_name: tdarr
image: haveagitgat/tdarr:latest image: haveagitgat/tdarr:latest
container_name: tdarr
networks: networks:
- tdarr-net - tdarr-net
ports: ports:
- ${TDARR_PORT}:${TDARR_PORT} # WebUI - ${TDARR_PORT}:${TDARR_PORT} # WebUI
- ${TDARR_NODE_PORT}:${TDARR_NODE_PORT} # local tdarr-node - ${TDARR_NODE_PORT}:${TDARR_NODE_PORT} # local tdarr-node
environment:
- TZ=${TIMEZONE}
- PUID=1000
- PGID=1000
- UMASK_SET=002
- serverIP=0.0.0.0
volumes: volumes:
- ./tdarr/server:/app/server - ./tdarr/server:/app/server
- ./tdarr/configs:/app/configs - ./tdarr/configs:/app/configs
- ./tdarr/temp:/temp - ./tdarr/temp:/temp
- ${DISK1}:${DISK1} - ${DISK1}:${DISK1}
- ${DISK2}:${DISK2} - ${DISK2}:${DISK2}
# dont put temp files onto a HARD DISK DRIVE! > - ${DISK1}/tdarr-temp:/temp
devices:
- /dev/dri:/dev/dri # Intel UHD Graphics 710
restart: always
tdarr-node:
container_name: tdarr-node
image: haveagitgat/tdarr_node:latest
networks:
- tdarr-net
environment: environment:
- TZ=${TIMEZONE} - TZ=${TIMEZONE}
- PUID=1000 - PUID=${HOST_PUID:-1000}
- PGID=1000 - PGID=${HOST_PGID:-100}
- nodeID=${TDARR_NODE_ID} - UMASK_SET=002
- nodeIP=0.0.0.0 - serverIP=0.0.0.0
- serverIP=tdarr # Points to the server container # dont put temp files onto a HARD DISK DRIVE! > - ${DISK1}/tdarr-temp:/temp
- serverPort=${TDARR_NODE_PORT} #devices: #? I don't think this is needed
# - /dev/dri:/dev/dri # Intel UHD Graphics 710
restart: unless-stopped
tdarr-node:
image: haveagitgat/tdarr_node:latest
container_name: tdarr-node
networks:
- tdarr-net
volumes: volumes:
- ./tdarr/configs:/app/configs - ./tdarr/configs:/app/configs
- ./tdarr/logs:/app/logs - ./tdarr/logs:/app/logs
- /home/shaan/torrent-stack/tdarr/temp:/temp - /home/shaan/torrent-stack/tdarr/temp:/temp
- ${DISK1}:${DISK1} - ${DISK1}:${DISK1}
- ${DISK2}:${DISK2} - ${DISK2}:${DISK2}
environment:
- TZ=${TIMEZONE}
- PUID=${HOST_PUID:-1000}
- PGID=${HOST_PGID:-1000}
- nodeID=${TDARR_NODE_ID}
- nodeIP=0.0.0.0
- serverIP=tdarr # Points to the server container
- serverPort=${TDARR_NODE_PORT}
devices: devices:
- /dev/dri:/dev/dri # only works if user 'shaan' is a part of the 'video' or 'render' group. - /dev/dri/:/dev/dri/ # only works if user 'shaan' is a part of the 'video' or 'render' group.
restart: always restart: unless-stopped
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
networks:
- caddy_net
ports: ports:
- ${HOMEPAGE_PORT}:${HOMEPAGE_PORT} - ${HOMEPAGE_PORT}:${HOMEPAGE_PORT}
volumes: volumes:
@@ -306,14 +344,16 @@ services:
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
environment: environment:
#- "HOMEPAGE_ALLOWED_HOSTS=gethomepage.dev,${LOCAL_IPV4}:${HOMEPAGE_PORT},${SERVER_NAME}:${HOMEPAGE_PORT},100.76.249.110:${HOMEPAGE_PORT},${SERVER_NAME}.tail:${HOMEPAGE_PORT},${EXTERNAL_IPV4}:${HOMEPAGE_PORT},${WEB_NAME}:${HOMEPAGE_PORT},${WEB_NAME},172.17.0.1:${HOMEPAGE_PORT},${SERVER_NAME}:80,${SERVER_NAME}:443,shaan-server:443" # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts # INIT
- "HOMEPAGE_ALLOWED_HOSTS=*" - "HOMEPAGE_ALLOWED_HOSTS=gethomepage.dev,${LOCAL_IPV4}:${HOMEPAGE_PORT},${SERVER_NAME}:${HOMEPAGE_PORT},${SERVER_NAME}.${TAILNET_NAME}:${HOMEPAGE_PORT}" # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
#\- "HOMEPAGE_ALLOWED_HOSTS=*"
- "HOMEPAGE_VAR_DISK1=${DISK1}" - "HOMEPAGE_VAR_DISK1=${DISK1}"
- "HOMEPAGE_VAR_DISK2=${DISK2}" - "HOMEPAGE_VAR_DISK2=${DISK2}"
- "HOMEPAGE_VAR_DISK3=${DISK3}" - "HOMEPAGE_VAR_DISK3=${DISK3}"
- "HOMEPAGE_VAR_WEB_PROTOCOL=${WEB_PROTOCOL}" - "HOMEPAGE_VAR_WEB_PROTOCOL=${WEB_PROTOCOL}"
- "HOMEPAGE_VAR_LOCAL_IPV4=${LOCAL_IPV4}" - "HOMEPAGE_VAR_LOCAL_IPV4=${LOCAL_IPV4}"
- "HOMEPAGE_VAR_SERVER_NAME=${SERVER_NAME}" - "HOMEPAGE_VAR_SERVER_NAME=${SERVER_NAME}"
# KEYS
- "HOMEPAGE_VAR_PLEX_KEY=${PLEX_KEY}" - "HOMEPAGE_VAR_PLEX_KEY=${PLEX_KEY}"
- "HOMEPAGE_VAR_PROWLARR_KEY=${PROWLARR_KEY}" - "HOMEPAGE_VAR_PROWLARR_KEY=${PROWLARR_KEY}"
- "HOMEPAGE_VAR_RADARR_KEY=${RADARR_KEY}" - "HOMEPAGE_VAR_RADARR_KEY=${RADARR_KEY}"
@@ -324,6 +364,7 @@ services:
- "HOMEPAGE_VAR_QBITTORRENT_KEY=${QBITTORRENT_KEY}" - "HOMEPAGE_VAR_QBITTORRENT_KEY=${QBITTORRENT_KEY}"
- "HOMEPAGE_VAR_TAILSCALE_KEY=${TAILSCALE_KEY}" - "HOMEPAGE_VAR_TAILSCALE_KEY=${TAILSCALE_KEY}"
- "HOMEPAGE_VAR_TAILSCALE_DEVICE_KEY=${TAILSCALE_DEVICE_KEY}" - "HOMEPAGE_VAR_TAILSCALE_DEVICE_KEY=${TAILSCALE_DEVICE_KEY}"
# WEB ADDRESSES
- "HOMEPAGE_VAR_PLEX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PLEX_PORT}" - "HOMEPAGE_VAR_PLEX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PLEX_PORT}"
- "HOMEPAGE_VAR_QBITTORRENT_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${QBITTORRENT_PORT}" - "HOMEPAGE_VAR_QBITTORRENT_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${QBITTORRENT_PORT}"
- "HOMEPAGE_VAR_PROWLARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PROWLARR_PORT}" - "HOMEPAGE_VAR_PROWLARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PROWLARR_PORT}"
@@ -338,6 +379,7 @@ services:
- "HOMEPAGE_VAR_MYSPEED_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${MYSPEED_PORT}" - "HOMEPAGE_VAR_MYSPEED_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${MYSPEED_PORT}"
- "HOMEPAGE_VAR_TERMIX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TERMIX_PORT}" - "HOMEPAGE_VAR_TERMIX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TERMIX_PORT}"
- "HOMEPAGE_VAR_ODYSSEUS_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${ODYSSEUS_PORT}" - "HOMEPAGE_VAR_ODYSSEUS_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${ODYSSEUS_PORT}"
# WEB NAMES
- "HOMEPAGE_VAR_PLEX_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PLEX_PORT}" - "HOMEPAGE_VAR_PLEX_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PLEX_PORT}"
- "HOMEPAGE_VAR_QBITTORRENT_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${QBITTORRENT_PORT}" - "HOMEPAGE_VAR_QBITTORRENT_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${QBITTORRENT_PORT}"
- "HOMEPAGE_VAR_PROWLARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PROWLARR_PORT}" - "HOMEPAGE_VAR_PROWLARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PROWLARR_PORT}"
@@ -355,8 +397,6 @@ services:
- TZ=${TIMEZONE} - TZ=${TIMEZONE}
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" - "host.docker.internal:host-gateway"
networks:
- caddy_net
restart: always restart: always
glances: glances:
@@ -364,8 +404,6 @@ services:
container_name: glances container_name: glances
pid: host pid: host
network_mode: host network_mode: host
devices:
- /dev/dri:/dev/dri
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /etc/os-release:/etc/os-release:ro - /etc/os-release:/etc/os-release:ro
@@ -374,44 +412,46 @@ services:
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
environment: environment:
- GLANCES_OPT=-w - GLANCES_OPT=-w
- PUID=1000 - PUID=${HOST_PUID:-1000}
- PGID=1000 - PGID=${HOST_PGID:-1000}
- TZ=${TIMEZONE} - TZ=${TIMEZONE}
devices:
- /dev/dri:/dev/dri
restart: unless-stopped restart: unless-stopped
autoheal: autoheal:
image: willfarrell/autoheal:latest image: willfarrell/autoheal:latest
container_name: autoheal container_name: autoheal
environment:
- AUTOHEAL_CONTAINER_LABEL=all
- AUTOHEAL_INTERVAL=30
- AUTOHEAL_START_PERIOD=60
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
environment:
- AUTOHEAL_CONTAINER_LABEL=all
- AUTOHEAL_INTERVAL=30
- AUTOHEAL_START_PERIOD=60
restart: always restart: always
seerr: seerr:
image: ghcr.io/seerr-team/seerr:latest image: ghcr.io/seerr-team/seerr:latest
init: true
container_name: seerr container_name: seerr
working_dir: "/app" # something idk
init: true
networks:
- caddy_net
labels:
- "autoheal=true"
ports: ports:
- ${SEERR_PORT}:${SEERR_PORT} - ${SEERR_PORT}:${SEERR_PORT}
environment:
- LOG_LEVEL=debug
- TZ=America/Los_Angeles
- PUID=1000
- PGID=1000
volumes: volumes:
- "./seerr:/app/config" - "./seerr:/app/config"
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
working_dir: "/app" environment:
labels: - LOG_LEVEL=debug
- "autoheal=true" - TZ=America/Los_Angeles
networks: - PUID=${HOST_PUID:-1000}
- caddy_net - PGID=${HOST_PGID:-1000}
healthcheck: healthcheck:
test: ["CMD-SHELL", "wget --spider -q http://1.1.1.1 || exit 1"] test: ["CMD-SHELL", "wget --spider -q http://1.1.1.1 || exit 1"]
interval: 1m interval: 1m
@@ -420,35 +460,19 @@ services:
start_period: 60s start_period: 60s
restart: unless-stopped restart: unless-stopped
anubis-seerr: seerr-anubis:
image: ghcr.io/techarohq/anubis:latest image: ghcr.io/techarohq/anubis:latest
container_name: seerr_anubis
networks:
- caddy_net
environment: environment:
BIND: ":55055" BIND: ":55055"
TARGET: http://seerr:${SEERR_PORT} TARGET: http://seerr:${SEERR_PORT}
networks:
- caddy_net
restart: unless-stopped restart: unless-stopped
MySpeed: MySpeed:
command:
- "node"
- "server"
container_name: "MySpeed"
entrypoint:
- "docker-entrypoint.sh"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "NODE_VERSION=18.20.3"
- "YARN_VERSION=1.22.19"
- "NODE_ENV=production"
- TZ=${TIMEZONE}
hostname: "4b5e3178fcc4"
image: "germannewsmaker/myspeed" image: "germannewsmaker/myspeed"
ipc: "private" container_name: "MySpeed"
logging:
driver: "json-file"
options: {}
mac_address: "02:42:ac:11:00:03"
network_mode: "bridge" network_mode: "bridge"
ports: ports:
- "${MYSPEED_PORT}:${MYSPEED_PORT}/tcp" - "${MYSPEED_PORT}:${MYSPEED_PORT}/tcp"
@@ -456,98 +480,118 @@ services:
- "myspeed:/myspeed/data" - "myspeed:/myspeed/data"
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "NODE_VERSION=18.20.3"
- "YARN_VERSION=1.22.19"
- "NODE_ENV=production"
- TZ=${TIMEZONE}
hostname: "4b5e3178fcc4"
ipc: "private"
logging:
driver: "json-file"
options: {}
mac_address: "02:42:ac:11:00:03"
working_dir: "/myspeed" working_dir: "/myspeed"
entrypoint:
- "docker-entrypoint.sh"
command:
- "node"
- "server"
restart: unless-stopped restart: unless-stopped
termix: # termix:
image: ghcr.io/lukegus/termix:latest # image: ghcr.io/lukegus/termix:latest
container_name: termix # container_name: termix
cap_add: # cap_add:
- NET_ADMIN # - NET_ADMIN
- SYS_ADMIN # - SYS_ADMIN
ports: # networks:
- "${TERMIX_PORT}:${TERMIX_PORT}" # - termix-net
volumes: # ports:
- termix-data:/app/data # - "${TERMIX_PORT}:${TERMIX_PORT}"
environment: # volumes:
- "PORT: ${TERMIX_PORT}" # - termix-data:/app/data
- "TZ: {TIMEZONE}" # environment:
networks: # - "PORT: ${TERMIX_PORT}"
- termix-net # - "TZ: {TIMEZONE}"
restart: unless-stopped # restart: unless-stopped
pihole: pihole:
container_name: pihole
image: pihole/pihole:latest image: pihole/pihole:latest
container_name: pihole
cap_add:
- NET_ADMIN
network_mode: "host" network_mode: "host"
ports: ports:
- "53:53/tcp" - "53:53/tcp"
- "53:53/udp" - "53:53/udp"
- "67:67/udp" - "67:67/udp"
- "6060:6060/tcp" - "6060:6060/tcp" # original port '80' changed to '6060' within in the webui, be careful changing this
environment:
TZ: "America/Los_Angeles"
WEBPASSWORD: "password123"
FTLCONF_misc_etc_dnsmasq_d: "true"
volumes: volumes:
- "./etc-pihole:/etc/pihole" - "./etc-pihole:/etc/pihole"
- "./etc-dnsmasq.d:/etc/dnsmasq.d" - "./etc-dnsmasq.d:/etc/dnsmasq.d"
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
cap_add: environment:
- NET_ADMIN TZ: "America/Los_Angeles"
WEBPASSWORD: "password123"
FTLCONF_misc_etc_dnsmasq_d: "true"
restart: unless-stopped restart: unless-stopped
cloudflared: cloudflared:
container_name: cloudflared-tunnel
image: cloudflare/cloudflared:latest image: cloudflare/cloudflared:latest
restart: always container_name: cloudflared
command: tunnel --no-autoupdate run --token ${CLOUDFLARED_KEY} command: tunnel --no-autoupdate run --token ${CLOUDFLARED_KEY}
restart: always
torrents-csv: # torrents-csv:
image: dessalines/torrents-csv-server:latest # image: dessalines/torrents-csv-server:latest
restart: unless-stopped # container_name: torrents-csv
ports: # depends_on:
- "8902:8902" # - db # search at 'http://shaan-server:8902/service/search?q={SEARCH_TERM'
environment: # ports:
TORRENTS_CSV_DB_HOST: "postgres://postgres:password@db" # - "8902:8902"
TORRENTS_CSV_FRONT_END_DIR: /app/dist # environment:
RUST_LOG: DEBUG # TORRENTS_CSV_DB_HOST: "postgres://postgres:password@db"
TIMEZONE: ${TIMEZONE} # TORRENTS_CSV_FRONT_END_DIR: /app/dist
depends_on: # RUST_LOG: DEBUG
- db # search at 'http://shaan-server:8902/service/search?q={SEARCH_TERM' # TIMEZONE: ${TIMEZONE}
# restart: unless-stopped
db: # db:
image: pgautoupgrade/pgautoupgrade:17-alpine # image: pgautoupgrade/pgautoupgrade:17-alpine
shm_size: 1gb # container_name: torrents-csv-db
volumes: # shm_size: 4gb
- ./init-database.sh:/docker-entrypoint-initdb.d/init-database.sh # ports:
- ./init-database.sql:/var/lib/postgresql/init-database.sql # - "127.0.0.1:5433:5432"
- ./torrents.csv:/var/lib/postgresql/torrents.csv # volumes:
- /etc/localtime:/etc/localtime:ro # - ./init-database.sh:/docker-entrypoint-initdb.d/init-database.sh
- /etc/timezone:/etc/timezone:ro # - ./init-database.sql:/var/lib/postgresql/init-database.sql
ports: # - ./torrents.csv:/var/lib/postgresql/torrents.csv
- "127.0.0.1:5433:5432" # - /etc/localtime:/etc/localtime:ro
environment: # - /etc/timezone:/etc/timezone:ro
POSTGRES_PASSWORD: password # environment:
POSTGRES_USER: postgres # POSTGRES_PASSWORD: password
TIMEZONE: ${TIMEZONE} # POSTGRES_USER: postgres
restart: unless-stopped # TIMEZONE: ${TIMEZONE}
# restart: unless-stopped
portainer: portainer:
container_name: portainer
image: portainer/portainer-ce:lts image: portainer/portainer-ce:lts
container_name: portainer
restart: always restart: always
ports:
- ${PORTAINER_PORT}:${PORTAINER_PORT}
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data - portainer_data:/data
ports:
- ${PORTAINER_PORT}:${PORTAINER_PORT}
caddy: caddy:
image: caddy:latest image: caddy:latest
restart: unless-stopped
container_name: caddy container_name: caddy
networks:
- caddy_net
ports: ports:
- 80:80 - 80:80
- 443:443 - 443:443
@@ -557,13 +601,11 @@ services:
- /home/shaan/torrent-stack/caddy/site:/srv - /home/shaan/torrent-stack/caddy/site:/srv
- /home/shaan/torrent-stack/caddy/caddy_data:/data - /home/shaan/torrent-stack/caddy/caddy_data:/data
- /home/shaan/torrent-stack/caddy/caddy_config:/config - /home/shaan/torrent-stack/caddy/caddy_config:/config
networks: restart: unless-stopped
- caddy_net
scrutiny: scrutiny:
restart: unless-stopped
container_name: scrutiny
image: ghcr.io/analogj/scrutiny:nightly-omnibus image: ghcr.io/analogj/scrutiny:nightly-omnibus
container_name: scrutiny
cap_add: cap_add:
- SYS_RAWIO - SYS_RAWIO
ports: ports:
@@ -576,29 +618,51 @@ services:
devices: devices:
- "/dev/nvme0n1" - "/dev/nvme0n1"
- "/dev/sda" - "/dev/sda"
- "/dev/sdb" #- "/dev/sdb"
restart: unless-stopped
networks:
caddy_net:
external: true
tdarr-net:
driver: bridge
termix-net:
driver: bridge
staticaddress:
ipam:
config:
- subnet: "172.200.0.0/16"
default:
name: portainer_network
karakeep:
image: ghcr.io/karakeep-app/karakeep:${KARAKEEP_VERSION:-release}
container_name: karakeep
env_file:
- .env
ports:
- 4621:3000
volumes: volumes:
caddy_data: # By default, the data is stored in a docker volume called "data".
external: true # If you want to mount a custom directory, change the volume mapping to:
caddy_config: # - /path/to/your/directory:/data
myspeed: - karakeep-data:/data
external: true # docker compose will fail creating myspeed if the volume hasn't been manually created, which we have done. unless you deleted it... environment:
termix-data: MEILI_ADDR: http://meilisearch:7700
driver: local BROWSER_WEB_URL: http://chrome:9222
portainer_data: # OPENAI_API_KEY: ...
name: portainer_data # You almost never want to change the value of the DATA_DIR variable.
# If you want to mount a custom directory, change the volume mapping above instead.
DATA_DIR: /data # DON'T CHANGE THIS
restart: unless-stopped
chrome:
image: gcr.io/zenika-hub/alpine-chrome:124
container_name: karakeep-chromebrowser
command:
- --no-sandbox
- --disable-gpu
- --disable-dev-shm-usage
- --remote-debugging-address=0.0.0.0
- --remote-debugging-port=9222
- --hide-scrollbars
- --disable-blink-features=AutomationControlled
- --window-size=1440,900
restart: unless-stopped
meilisearch: # karakeep vector coord. support for karakeep. allows semantic search
image: getmeili/meilisearch:v1.41.0
container_name: karakeep-meilisearch
env_file:
- .env
volumes:
- meilisearch:/meili_data
environment:
MEILI_NO_ANALYTICS: "true"
restart: unless-stopped
+604
View File
@@ -0,0 +1,604 @@
services:
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
environment:
- VPN_SERVICE_PROVIDER=protonvpn # Or mullvad, protonvpn, surfshark, etc.
- VPN_TYPE=wireguard # WireGuard, openvpn
- HTTP_CONTROL_SERVER=ON
- HTTP_CONTROL_SERVER_AUTH_DEFAULT_ROLE='{"auth":"apikey","apikey":"${GLUETUN_KEY}"}' # generate by running `docker run --rm qmcgaw/gluetun genkey`, then adding this to your `.env` file
- WIREGUARD_PRIVATE_KEY=${VPN_PRIVATE_KEY}
- WIREGUARD_MTU=1280
- VPN_PORT_FORWARDING=on
- VPN_PORT_FORWARDING_PROVIDER=protonvpn
#- OPENVPN_USER=user
#- OPENVPN_PASSWORD=password
- SERVER_COUNTRIES=Netherlands # choose fast P2P friendly countries
- NETWORK_LOCAL_ADDRESSES=192.168.50.0/24,172.16.0.0/12
- FIREWALL_OUTBOUND_SUBNETS=192.168.50.0/24
- TZ=${TIMEZONE}
- DNS_UPSTREAM_RESOLVER_TYPE=doh # DNS over TLS is an extra layer of security so your isp can not look at what you're doing through your DNS requests, even if your using a vpn (very vague, I don't know how this syustem works with a vpn).
ports: # YOU MUST SPECIFY A PORT PER SERVICE ROUTED THROUGH GLUETUN!
- 8888:8000/tcp # gluetun control server, i dont think you should change this
- ${QBITTORRENT_PORT}:${QBITTORRENT_PORT} # qBittorrent Web UI
- ${PROWLARR_PORT}:${PROWLARR_PORT} # Prowlarr
- ${SONARR_PORT}:${SONARR_PORT} # Sonarr
- ${RADARR_PORT}:${RADARR_PORT} # Radarr
- ${LIDARR_PORT}:${LIDARR_PORT} # Lidarr
#- ${SEERR_PORT}:${SEERR_PORT}/tcp # Seerr # took this out of gluetun, as it could cause issues with starting the container, and it was unecessary
healthcheck:
test: wget --spider -q http://1.1.1.1 || exit 1
interval: 30s
timeout: 15s
retries: 3
start_period: 1m
volumes:
- ./gluetun-data:/tmp/gluetun:rw
extra_hosts:
- "host.docker.internal:host-gateway" # host-gateway is a docker variable that automatically grabs the 172.XX.0.1 address, this is to be used by prowlarr to communicate with sonarr and radarr.
restart: always
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "container:gluetun" # vpn bunker
environment:
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
- WEBUI_PORT=${QBITTORRENT_PORT}
volumes:
- ./qbittorrent:/config
- ${DISK1}:${DISK1}
- ${DISK2}:${DISK2}
- ./gluetun-data:/tmp/gluetun
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
labels:
- "autoheal=true"
depends_on:
gluetun:
condition: service_healthy
healthcheck: # if gluetun is slow to start, it's over
test: ["CMD-SHELL", wget --spider -q https://1.1.1.1 || exit 1] # use 1.1.1.1, we don't need dns around here
interval: 1m
timeout: 10s
retries: 3
start_period: 30s
restart: unless-stopped
port-updater:
# use an image that already has curl/wget to skip the 'apk add' step
image: curlimages/curl:latest
container_name: port-updater
volumes:
- ./gluetun-data:/tmp/gluetun:ro
# using 'exec' format and 'trap' allows the container to stop instantly
entrypoint: ["/bin/sh", "-c"]
command: # loololloloolol gemini did this for me
- |
trap 'exit 0' SIGTERM;
while true; do
# 1. Wait for Gluetun to actually create the file with a number
while [ ! -s /tmp/gluetun/forwarded_port ]; do
echo "Waiting for Gluetun to provide a port..."
sleep 5
done
# 2. Read and clean the port
read -r PORT_VAL < /tmp/gluetun/forwarded_port;
CLEAN_PORT=$$(echo "$$PORT_VAL" | tr -d '\r\n ');
# 3. Only update if the port isn't empty
if [ -n "$$CLEAN_PORT" ]; then
echo "Updating qBit to port: $$CLEAN_PORT";
sleep 10;
echo "Updated to $$CLEAN_PORT"
curl -s -X POST -d "json={\"listen_port\":$$CLEAN_PORT}" http://localhost:${QBITTORRENT_PORT}/api/v2/app/setPreferences;
# 4. Success! Now sleep for a long time (e.g., 1 hour)
sleep 3600 & wait $$!;
else
# If for some reason it's still blank, retry quickly
sleep 10
fi
done
labels:
- "autoheal=true"
network_mode: "container:gluetun"
depends_on:
gluetun:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f https://1.1.1.1 || exit 1"]
interval: 1m
timeout: 10s
retries: 3
start_period: 30s
restart: always
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
volumes:
- ./prowlarr:/config
- ./notify.sh:/notify.sh:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
labels:
- "autoheal=true"
network_mode: "container:gluetun"
depends_on:
gluetun:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", wget --spider -q https://google.com || exit 1] # needs DNS
interval: 5m
timeout: 60s
retries: 3
start_period: 30s
restart: always
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
volumes:
- /var/lib/sonarr:/config # had migrated into docker compose
- ${DISK1}:${DISK1}
- ${DISK2}:${DISK2}
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
labels:
- "autoheal=true"
network_mode: "container:gluetun"
depends_on:
gluetun:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"]
interval: 5m
timeout: 60s
retries: 3
start_period: 60s
restart: always
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
volumes:
- /var/lib/radarr:/config # had migrated into docker compose
- ${DISK1}:${DISK1}
- ${DISK2}:${DISK2}
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
labels:
- "autoheal=true"
network_mode: "container:gluetun"
depends_on:
gluetun:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"]
interval: 1m
timeout: 10s
retries: 3
start_period: 30s
restart: always
lidarr:
image: lscr.io/linuxserver/lidarr:latest
container_name: lidarr
environment:
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
volumes:
- /home/shaan/torrent-stack/lidarr:/music
- /var/lib/lidarr:/config
- ${DISK1}:${DISK1}
- ${DISK2}:${DISK2}
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
labels:
- "autoheal=true"
network_mode: "container:gluetun"
depends_on:
gluetun:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://1.1.1.1 || exit 1"]
interval: 1m
timeout: 10s
retries: 3
start_period: 30s
restart: unless-stopped
tautulli: # has no network bridge between containers. this is fine, as it only needs to get from plex, which is outside this container
image: ghcr.io/tautulli/tautulli
container_name: tautulli
volumes:
#- /mnt/media/media:/config
- ./tautulli:/config
environment:
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
ports:
- ${TAUTULLI_PORT}:${TAUTULLI_PORT}
networks:
- caddy_net
restart: always
tdarr:
container_name: tdarr
image: haveagitgat/tdarr:latest
networks:
- tdarr-net
ports:
- ${TDARR_PORT}:${TDARR_PORT} # WebUI
- ${TDARR_NODE_PORT}:${TDARR_NODE_PORT} # local tdarr-node
environment:
- TZ=${TIMEZONE}
- PUID=1000
- PGID=1000
- UMASK_SET=002
- serverIP=0.0.0.0
volumes:
- ./tdarr/server:/app/server
- ./tdarr/configs:/app/configs
- ./tdarr/temp:/temp
- ${DISK1}:${DISK1}
- ${DISK2}:${DISK2}
# dont put temp files onto a HARD DISK DRIVE! > - ${DISK1}/tdarr-temp:/temp
devices:
- /dev/dri:/dev/dri # Intel UHD Graphics 710
restart: always
tdarr-node:
container_name: tdarr-node
image: haveagitgat/tdarr_node:latest
networks:
- tdarr-net
environment:
- TZ=${TIMEZONE}
- PUID=1000
- PGID=1000
- nodeID=${TDARR_NODE_ID}
- nodeIP=0.0.0.0
- serverIP=tdarr # Points to the server container
- serverPort=${TDARR_NODE_PORT}
volumes:
- ./tdarr/configs:/app/configs
- ./tdarr/logs:/app/logs
- /home/shaan/torrent-stack/tdarr/temp:/temp
- ${DISK1}:${DISK1}
- ${DISK2}:${DISK2}
devices:
- /dev/dri:/dev/dri # only works if user 'shaan' is a part of the 'video' or 'render' group.
restart: always
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- ${HOMEPAGE_PORT}:${HOMEPAGE_PORT}
volumes:
- ./homepage:/app/config
- ./homepage/images:/app/public/images
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
- ./gluetun-data:/tmp/gluetun:ro # get the port from port-updater
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
environment:
#- "HOMEPAGE_ALLOWED_HOSTS=gethomepage.dev,${LOCAL_IPV4}:${HOMEPAGE_PORT},${SERVER_NAME}:${HOMEPAGE_PORT},100.76.249.110:${HOMEPAGE_PORT},${SERVER_NAME}.tail:${HOMEPAGE_PORT},${EXTERNAL_IPV4}:${HOMEPAGE_PORT},${WEB_NAME}:${HOMEPAGE_PORT},${WEB_NAME},172.17.0.1:${HOMEPAGE_PORT},${SERVER_NAME}:80,${SERVER_NAME}:443,shaan-server:443" # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
- "HOMEPAGE_ALLOWED_HOSTS=*"
- "HOMEPAGE_VAR_DISK1=${DISK1}"
- "HOMEPAGE_VAR_DISK2=${DISK2}"
- "HOMEPAGE_VAR_DISK3=${DISK3}"
- "HOMEPAGE_VAR_WEB_PROTOCOL=${WEB_PROTOCOL}"
- "HOMEPAGE_VAR_LOCAL_IPV4=${LOCAL_IPV4}"
- "HOMEPAGE_VAR_SERVER_NAME=${SERVER_NAME}"
- "HOMEPAGE_VAR_PLEX_KEY=${PLEX_KEY}"
- "HOMEPAGE_VAR_PROWLARR_KEY=${PROWLARR_KEY}"
- "HOMEPAGE_VAR_RADARR_KEY=${RADARR_KEY}"
- "HOMEPAGE_VAR_SONARR_KEY=${SONARR_KEY}"
- "HOMEPAGE_VAR_LIDARR_KEY=${LIDARR_KEY}"
- "HOMEPAGE_VAR_TAUTULLI_KEY=${TAUTULLI_KEY}"
- "HOMEPAGE_VAR_SEERR_KEY=${SEERR_KEY}"
- "HOMEPAGE_VAR_QBITTORRENT_KEY=${QBITTORRENT_KEY}"
- "HOMEPAGE_VAR_TAILSCALE_KEY=${TAILSCALE_KEY}"
- "HOMEPAGE_VAR_TAILSCALE_DEVICE_KEY=${TAILSCALE_DEVICE_KEY}"
- "HOMEPAGE_VAR_PLEX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PLEX_PORT}"
- "HOMEPAGE_VAR_QBITTORRENT_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${QBITTORRENT_PORT}"
- "HOMEPAGE_VAR_PROWLARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PROWLARR_PORT}"
- "HOMEPAGE_VAR_SONARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${SONARR_PORT}"
- "HOMEPAGE_VAR_RADARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${RADARR_PORT}"
- "HOMEPAGE_VAR_LIDARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${LIDARR_PORT}"
- "HOMEPAGE_VAR_TAUTULLI_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TAUTULLI_PORT}"
- "HOMEPAGE_VAR_TDARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TDARR_PORT}"
- "HOMEPAGE_VAR_HOMEPAGE_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${HOMEPAGE_PORT}"
- "HOMEPAGE_VAR_GLANCES_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${GLANCES_PORT}"
- "HOMEPAGE_VAR_SEERR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${SEERR_PORT}"
- "HOMEPAGE_VAR_MYSPEED_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${MYSPEED_PORT}"
- "HOMEPAGE_VAR_TERMIX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TERMIX_PORT}"
- "HOMEPAGE_VAR_ODYSSEUS_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${ODYSSEUS_PORT}"
- "HOMEPAGE_VAR_PLEX_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PLEX_PORT}"
- "HOMEPAGE_VAR_QBITTORRENT_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${QBITTORRENT_PORT}"
- "HOMEPAGE_VAR_PROWLARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PROWLARR_PORT}"
- "HOMEPAGE_VAR_SONARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${SONARR_PORT}"
- "HOMEPAGE_VAR_RADARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${RADARR_PORT}"
- "HOMEPAGE_VAR_LIDARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${LIDARR_PORT}"
- "HOMEPAGE_VAR_TAUTULLI_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${TAUTULLI_PORT}"
- "HOMEPAGE_VAR_TDARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${TDARR_PORT}"
- "HOMEPAGE_VAR_HOMEPAGE_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${HOMEPAGE_PORT}"
- "HOMEPAGE_VAR_GLANCES_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${GLANCES_PORT}"
- "HOMEPAGE_VAR_SEERR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${SEERR_PORT}"
- "HOMEPAGE_VAR_MYSPEED_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${MYSPEED_PORT}"
- "HOMEPAGE_VAR_TERMIX_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${TERMIX_PORT}"
- "HOMEPAGE_VAR_ODYSSEUS_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${ODYSSEUS_PORT}"
- TZ=${TIMEZONE}
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- caddy_net
restart: always
glances:
image: nicolargo/glances:latest-full
container_name: glances
pid: host
network_mode: host
devices:
- /dev/dri:/dev/dri
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/os-release:/etc/os-release:ro
- /:/host:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
environment:
- GLANCES_OPT=-w
- PUID=1000
- PGID=1000
- TZ=${TIMEZONE}
restart: unless-stopped
autoheal:
image: willfarrell/autoheal:latest
container_name: autoheal
environment:
- AUTOHEAL_CONTAINER_LABEL=all
- AUTOHEAL_INTERVAL=30
- AUTOHEAL_START_PERIOD=60
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
restart: always
seerr:
image: ghcr.io/seerr-team/seerr:latest
init: true
container_name: seerr
ports:
- ${SEERR_PORT}:${SEERR_PORT}
environment:
- LOG_LEVEL=debug
- TZ=America/Los_Angeles
- PUID=1000
- PGID=1000
volumes:
- "./seerr:/app/config"
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
working_dir: "/app"
labels:
- "autoheal=true"
networks:
- caddy_net
healthcheck:
test: ["CMD-SHELL", "wget --spider -q http://1.1.1.1 || exit 1"]
interval: 1m
timeout: 10s
retries: 3
start_period: 60s
restart: unless-stopped
anubis-seerr:
image: ghcr.io/techarohq/anubis:latest
environment:
BIND: ":55055"
TARGET: http://seerr:${SEERR_PORT}
networks:
- caddy_net
restart: unless-stopped
MySpeed:
command:
- "node"
- "server"
container_name: "MySpeed"
entrypoint:
- "docker-entrypoint.sh"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "NODE_VERSION=18.20.3"
- "YARN_VERSION=1.22.19"
- "NODE_ENV=production"
- TZ=${TIMEZONE}
hostname: "4b5e3178fcc4"
image: "germannewsmaker/myspeed"
ipc: "private"
logging:
driver: "json-file"
options: {}
mac_address: "02:42:ac:11:00:03"
network_mode: "bridge"
ports:
- "${MYSPEED_PORT}:${MYSPEED_PORT}/tcp"
volumes:
- "myspeed:/myspeed/data"
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
working_dir: "/myspeed"
restart: unless-stopped
termix:
image: ghcr.io/lukegus/termix:latest
container_name: termix
cap_add:
- NET_ADMIN
- SYS_ADMIN
ports:
- "${TERMIX_PORT}:${TERMIX_PORT}"
volumes:
- termix-data:/app/data
environment:
- "PORT: ${TERMIX_PORT}"
- "TZ: {TIMEZONE}"
networks:
- termix-net
restart: unless-stopped
pihole:
container_name: pihole
image: pihole/pihole:latest
network_mode: "host"
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
- "6060:6060/tcp"
environment:
TZ: "America/Los_Angeles"
WEBPASSWORD: "password123"
FTLCONF_misc_etc_dnsmasq_d: "true"
volumes:
- "./etc-pihole:/etc/pihole"
- "./etc-dnsmasq.d:/etc/dnsmasq.d"
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
cap_add:
- NET_ADMIN
restart: unless-stopped
cloudflared:
container_name: cloudflared-tunnel
image: cloudflare/cloudflared:latest
restart: always
command: tunnel --no-autoupdate run --token ${CLOUDFLARED_KEY}
torrents-csv:
image: dessalines/torrents-csv-server:latest
restart: unless-stopped
ports:
- "8902:8902"
environment:
TORRENTS_CSV_DB_HOST: "postgres://postgres:password@db"
TORRENTS_CSV_FRONT_END_DIR: /app/dist
RUST_LOG: DEBUG
TIMEZONE: ${TIMEZONE}
depends_on:
- db # search at 'http://shaan-server:8902/service/search?q={SEARCH_TERM'
db:
image: pgautoupgrade/pgautoupgrade:17-alpine
shm_size: 1gb
volumes:
- ./init-database.sh:/docker-entrypoint-initdb.d/init-database.sh
- ./init-database.sql:/var/lib/postgresql/init-database.sql
- ./torrents.csv:/var/lib/postgresql/torrents.csv
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
ports:
- "127.0.0.1:5433:5432"
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
TIMEZONE: ${TIMEZONE}
restart: unless-stopped
portainer:
container_name: portainer
image: portainer/portainer-ce:lts
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
ports:
- ${PORTAINER_PORT}:${PORTAINER_PORT}
caddy:
image: caddy:latest
restart: unless-stopped
container_name: caddy
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/shaan/torrent-stack/caddy/Caddyfile:/etc/caddy/Caddyfile
- /home/shaan/torrent-stack/caddy/site:/srv
- /home/shaan/torrent-stack/caddy/caddy_data:/data
- /home/shaan/torrent-stack/caddy/caddy_config:/config
networks:
- caddy_net
scrutiny:
restart: unless-stopped
container_name: scrutiny
image: ghcr.io/analogj/scrutiny:nightly-omnibus
cap_add:
- SYS_RAWIO
ports:
- "${SCRUTINY_PORT:-54321}:8080" # webapp
- "${SCRUTINY_ADMIN_PORT:-12345}:8086" # influxDB admin
volumes:
- /run/udev:/run/udev:ro
- ./config:/opt/scrutiny/config
- ./influxdb:/opt/scrutiny/influxdb
devices:
- "/dev/nvme0n1"
- "/dev/sda"
- "/dev/sdb"
networks:
caddy_net:
external: true
tdarr-net:
driver: bridge
termix-net:
driver: bridge
staticaddress:
ipam:
config:
- subnet: "172.200.0.0/16"
default:
name: portainer_network
volumes:
caddy_data:
external: true
caddy_config:
myspeed:
external: true # docker compose will fail creating myspeed if the volume hasn't been manually created, which we have done. unless you deleted it...
termix-data:
driver: local
portainer_data:
name: portainer_data
+3 -3
View File
@@ -246,7 +246,7 @@
key: ptr_dR3wQa568otBJzfZz5FET+IQKXee7K6O+VO301iY6x4= key: ptr_dR3wQa568otBJzfZz5FET+IQKXee7K6O+VO301iY6x4=
- "Pi-Hole Adblocker": - "Pi-Hole Adblocker":
icon: sh-pi-hole icon: sh-pi-hole
href: "http://192.168.50.2/admin" href: "http://192.168.50.2:6060/admin/login"
description: DNS description: DNS
server: my-docker server: my-docker
container: pihole container: pihole
@@ -454,10 +454,10 @@
- "Network_2": - "Network_2":
- "Scrutiny": - "Scrutiny":
icon: sh-scrutiny icon: sh-scrutiny
href: http://192.168.50.2:54321 #"{{HOMEPAGE_VAR_SCRUTINY_ADDRESS}}"" href: http://192.168.50.2:4545 #"{{HOMEPAGE_VAR_SCRUTINY_ADDRESS}}""
description: S.M.A.R.T. description: S.M.A.R.T.
server: my-docker server: my-docker
container: scrutiny container: scrutiny
widget: widget:
type: scrutiny type: scrutiny
url: http://192.168.50.2:54321 #"{{HOMEPAGE_VAR_SCRUTINY_ADDRESS}}" url: http://192.168.50.2:4545 #"{{HOMEPAGE_VAR_SCRUTINY_ADDRESS}}"
View File