Files
jellyfin/compose.yaml

291 lines
7.9 KiB
YAML

# Compose file for the *arr stack. Configuration files are stored in the
# directory you launch the compose file on. Change to bind mounts if needed.
# All containers are ran with user and group ids of the main user and
# group to aviod permissions issues of downloaded files, please refer
# the read me file for more information.
#############################################################################
# NOTICE: We recently switched to using a .env file. PLEASE refer to the docs.
# https://github.com/TechHutTV/homelab/tree/main/media#docker-compose-and-env
#############################################################################
networks:
servarrnetwork:
name: servarrnetwork
ipam:
config:
- subnet: 172.39.0.0/24
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: 1000:1000
ports:
- 8096:8096/tcp
# - 7359:7359/udp
volumes:
- ./jellyfin-config:/config
- ./jellyfin-cache:/cache
- ${DATA_MOUNT}:/data
restart: 'unless-stopped'
environment:
- TZ=${TIMEZONE}
- /dev/dri:/dev/dri
# airvpn recommended (referral url: https://airvpn.org/?referred_by=673908)
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun # If running on an LXC see readme for more info.
sysctls:
- net.ipv6.conf.all.disable_ipv6=1
networks:
servarrnetwork:
ipv4_address: 172.39.0.2
ports:
- 8701:8701 # qbittorrent web interface
- 6881:6881 # qbittorrent torrent port
- 6789:6789 # nzbget
- 9696:9696 # prowlarr
- 8191:8191 # flaresolver
volumes:
- ./gluetun:/gluetun
# Make a '.env' file in the same directory.
env_file:
- .env
environment:
- TZ=${TZ}
- UPDATER_PERIOD=24h
- VPN_SERVICE_PROVIDER=protonvpn
- VPN_TYPE=${VPN_TYPE}
- BLOCK_MALICIOUS=off
- OPENVPN_USER=${OPENVPN_USER}
- OPENVPN_PASSWORD=${OPENVPN_PASSWORD}
- OPENVPN_CIPHERS=AES-256-GCM
- WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY}
- PORT_FORWARD_ONLY=on
- VPN_PORT_FORWARDING=on
- VPN_PORT_FORWARDING_UP_COMMAND=/bin/sh -c 'wget -O- --retry-connrefused --post-data "json={\"listen_port\":{{PORTS}}}" http://127.0.0.1:8080/api/v2/app/setPreferences 2>&1'
- SERVER_COUNTRIES=${SERVER_COUNTRIES}
healthcheck:
test: ping -c 1 www.google.com || exit 1
interval: 20s
timeout: 10s
retries: 5
restart: unless-stopped
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
labels:
- deunhealth.restart.on.unhealthy=true
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- WEBUI_PORT=8701 # must match "qbittorrent web interface" port number in gluetun's service above
# - TORRENTING_PORT=${FIREWALL_VPN_INPUT_PORTS} # airvpn forwarded port, pulled from .env
# 🔄 Port Forwarding Mod (Syncs qBittorrent with Gluetun)
- DOCKER_MODS=ghcr.io/t-anc/gsp-qbittorent-gluetun-sync-port-mod:main
- GSP_GTN_API_KEY=${GSP_GTN_API_KEY:-randomapikey} # API key for port forwarding updates
- GSP_QBITTORRENT_PORT=${GSP_QBITTORRENT_PORT:-53764} # Torrenting port (auto-updated by Gluetun)
- GSP_MINIMAL_LOGS=false # Enables full logs for debugging purposes
volumes:
- ./qbittorrent:/config
- ${DATA_MOUNT}:/data
depends_on:
gluetun:
condition: service_healthy
restart: true
network_mode: service:gluetun
# ports:
# - 6881:6881/tcp # qbittorrent torrent port
# - 6881:6881/udp # qbittorrent torrent port
# - 8701:8701
# dns:
# - 1.1.1.1
# - 8.8.8.8
healthcheck:
test: ping -c 1 www.google.com || exit 1
interval: 60s
retries: 3
start_period: 20s
timeout: 10s
# ─── Performance Optimization ──────────────────────────────────────
ulimits:
nofile:
soft: 32768
hard: 65536 # Increases allowed open files (important for high-speed torrenting)
# See the 'qBittorrent Stalls with VPN Timeout' section for more information.
deunhealth:
image: qmcgaw/deunhealth
container_name: deunhealth
network_mode: "none"
environment:
- LOG_LEVEL=info
- HEALTH_SERVER_ADDRESS=127.0.0.1:9999
- TZ=${TZ}
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
nzbget:
image: lscr.io/linuxserver/nzbget:latest
container_name: nzbget
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./nzbget:/config
- ${DATA_MOUNT}:/data
depends_on:
gluetun:
condition: service_healthy
restart: true
restart: unless-stopped
network_mode: service:gluetun
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./prowlarr:/config
restart: unless-stopped
depends_on:
gluetun:
condition: service_healthy
restart: true
network_mode: service:gluetun
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
restart: unless-stopped
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./sonarr:/config
- ${DATA_MOUNT}:/data
ports:
- 8989:8989
networks:
servarrnetwork:
ipv4_address: 172.39.0.3
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
restart: unless-stopped
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./radarr:/config
- ${DATA_MOUNT}:/data
ports:
- 7878:7878
networks:
servarrnetwork:
ipv4_address: 172.39.0.4
lidarr:
container_name: lidarr
image: lscr.io/linuxserver/lidarr:latest
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- ./lidarr:/config
- ${DATA_MOUNT}:/data
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
ports:
- 8686:8686
networks:
servarrnetwork:
ipv4_address: 172.39.0.5
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./bazarr:/config
- ${DATA_MOUNT}:/data
ports:
- 6767:6767
networks:
servarrnetwork:
ipv4_address: 172.39.0.6
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
network_mode: "service:gluetun" # Routes all traffic through Gluetun
environment:
- TZ=${TIMEZONE}
depends_on:
- gluetun
# ports:
# - 8191:8191
restart: unless-stopped
jellyseerr:
container_name: jellyseerr
image: fallenbagel/jellyseerr:latest
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ./jellyseerr:/app/config
ports:
- 5055:5055
networks:
servarrnetwork:
ipv4_address: 172.39.0.9
restart: unless-stopped
# Newer additions to this stack feel. Remove the '#' to add the service.
#
# ytdl-sub:
# image: ghcr.io/jmbannon/ytdl-sub:latest
# container_name: ytdl-sub
# environment:
# - PUID=${PUID}
# - PGID=${PGID}
# - TZ=${TZ}
# - DOCKER_MODS=linuxserver/mods:universal-cron
# volumes:
# - ./ytdl-sub:/config
# - /data/youtube:/youtube
# networks:
# servarrnetwork:
# ipv4_address: 172.39.0.8
# restart: unless-stopped
#