Initial commit

This commit is contained in:
2026-06-02 19:17:45 -04:00
commit 1466c6b970
3 changed files with 576 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
appdata/
.env
+478
View File
@@ -0,0 +1,478 @@
name: media-stack
networks:
media-network:
name: media-network
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
gateway: 172.18.0.1
services:
radarr:
container_name: radarr
image: ghcr.io/hotio/radarr:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
ports:
- ${RADARR_PORT}:7878
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/radarr:/config
- ${MEDIASERVER}/data:/data
depends_on:
flaresolverr:
condition: service_started
qbittorrent:
condition: service_started
sabnzbd:
condition: service_started
sonarr:
container_name: sonarr
image: ghcr.io/hotio/sonarr:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
ports:
- ${SONARR_PORT}:8989
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/sonarr:/config
- ${MEDIASERVER}/data:/data
depends_on:
flaresolverr:
condition: service_started
qbittorrent:
condition: service_started
sabnzbd:
condition: service_started
prowlarr:
container_name: prowlarr
image: ghcr.io/hotio/prowlarr:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
ports:
- ${PROWLARR_PORT}:9696
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/prowlarr:/config
- ${MEDIASERVER}/data:/data
depends_on:
flaresolverr:
condition: service_started
qbittorrent:
condition: service_started
sabnzbd:
condition: service_started
lidarr:
container_name: lidarr
image: ghcr.io/hotio/lidarr:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
ports:
- ${LIDARR_PORT}:8686
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/lidarr:/config
- ${MEDIASERVER}/data:/data
depends_on:
flaresolverr:
condition: service_started
qbittorrent:
condition: service_started
sabnzbd:
condition: service_started
whisparr:
container_name: whisparr
image: ghcr.io/hotio/whisparr:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
ports:
- ${WHISPARR_PORT}:6969
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/whisparr:/config
- ${MEDIASERVER}/data:/data
depends_on:
flaresolverr:
condition: service_started
qbittorrent:
condition: service_started
sabnzbd:
condition: service_started
sabnzbd:
container_name: sabnzbd
image: ghcr.io/hotio/sabnzbd:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
ports:
- 8080:8080
- 9090:9090
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/sabnzbd:/config
- ${MEDIASERVER}/data/usenet:/data/usenet:rw
pinchflat:
container_name: pinchflat
image: ghcr.io/kieraneglin/pinchflat:latest
restart: unless-stopped
user: 1000:1000
environment:
- TZ=${TZ}
- ENABLE_PROMETHEUS=true
- UMASK=000
ports:
- ${PINCHFLAT_PORT}:8945
volumes:
- ${APPDATA}/pinchflat:/config
- ${MEDIASERVER}/data/media:/downloads
qbittorrent:
container_name: qbittorrent
image: ghcr.io/hotio/qbittorrent:latest
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
ports:
- ${QBITTORRENT_PORT}:${QBITTORRENT_PORT}
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
- WEBUI_PORTS=${QBITTORRENT_PORT}/tcp,${QBITTORRENT_PORT}/udp
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/qbittorrent:/config
- ${MEDIASERVER}/data/torrents:/data/torrents:rw
notifiarr:
container_name: notifiarr
hostname: notifiarr-mediaserver
image: golift/notifiarr
restart: unless-stopped
privileged: true
ports:
- "${NOTIFIARR_PORT}:5454"
volumes:
- ${APPDATA}/notifiarr:/config
- /var/run/utmp:/var/run/utmp
- /etc/machine-id:/etc/machine-id
- ${MEDIASERVER}:/mediaserver:ro
- ${JELLYFIN_DIR}:/jellyfin:ro
seerr:
container_name: seerr
image: ghcr.io/v3djg6gl/seerr:feat-oidc-jellyfin-quickconnect
init: true
restart: unless-stopped
networks: [media-network]
logging:
driver: json-file
environment:
- LOG_LEVEL=debug
- TZ=${TZ}
- PUID=1000
- PGID=1000
ports:
- ${SEERR_PORT}:5055
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/seerr:/app/config
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1
start_period: 20s
timeout: 3s
interval: 15s
retries: 3
depends_on:
sonarr:
condition: service_started
radarr:
condition: service_started
jellyfin:
container_name: jellyfin
image: jellyfin/jellyfin
user: 110:118
networks: [media-network]
restart: 'unless-stopped'
# runtime: nvidia
# deploy:
# resources:
# reservations:
# devices:
# - capabilities: [gpu]
ports:
- 8096:8096
- 8920:8920
- 7359:7359/udp
- 1900:1900/udp
environment:
- TZ=${TZ}
- JELLYFIN_CACHE_DIR=/var/cache/jellyfin
- JELLYFIN_CONFIG_DIR=/etc/jellyfin
- JELLYFIN_DATA_DIR=/var/lib/jellyfin
- JELLYFIN_LOG_DIR=/var/log/jellyfin
- JELLYFIN_PublishedServerUrl=${JELLYFIN_PUBLISHED_SERVER_URL}
volumes:
- ${APPDATA}/jellyfin/etc/jellyfin:/etc/jellyfin
- ${APPDATA}/jellyfin/var/cache/jellyfin:/var/cache/jellyfin
- ${APPDATA}/jellyfin/var/lib/jellyfin:/var/lib/jellyfin
- ${APPDATA}/jellyfin/config:/config
- ${APPDATA}/jellyfin/cache:/cache
- /var/log/jellyfin:/var/log/jellyfin
- ${MEDIASERVER}:/media/mediaserver
- ${JELLYFIN_DIR}:/opt/jellyfin
flaresolverr:
image: flaresolverr/flaresolverr:latest
container_name: flaresolverr
networks: [media-network]
environment:
- LOG_LEVEL=info
- LOG_HTML=false
- TZ=${TZ}
ports:
- ${FLARESOLVERR_PORT}:8191
restart: unless-stopped
cleanuparr:
image: ghcr.io/cleanuparr/cleanuparr:latest
container_name: cleanuparr
restart: unless-stopped
networks: [media-network]
ports:
- ${CLEANUPARR_PORT}:11011
volumes:
- /etc/localtime:/etc/localtime:ro
- ${APPDATA}/cleanuparr:/config
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
- BASE_PATH=
- UMASK=000
- PORT=${CLEANUPARR_PORT}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:${CLEANUPARR_PORT}/health"]
interval: 30s
timeout: 10s
start_period: 30s
retries: 3
sportarr:
image: sportarr/sportarr:latest
container_name: sportarr
networks: [media-network]
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- TZ=${TZ}
volumes:
- ${APPDATA}/sportarr:/config
- ${MEDIASERVER}/data/media/sports:/sports
ports:
- ${SPORTARR_PORT}:1867
restart: unless-stopped
depends_on:
flaresolverr:
condition: service_started
qbittorrent:
condition: service_started
sabnzbd:
condition: service_started
scraparr:
image: ghcr.io/thecfu/scraparr
container_name: scraparr
networks: [media-network]
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
- SONARR_URL=${SONARR_URL}
- SONARR_API_KEY=${SONARR_API_KEY}
- SONARR_ALIAS=${SONARR_ALIAS}
- RADARR_URL=${RADARR_URL}
- RADARR_API_KEY=${RADARR_API_KEY}
- RADARR_ALIAS=${RADARR_ALIAS}
- PROWLARR_URL=${PROWLARR_URL}
- PROWLARR_API_KEY=${PROWLARR_API_KEY}
- PROWLARR_ALIAS=${PROWLARR_ALIAS}
- JELLYSEERR_URL=${JELLYSEERR_URL}
- JELLYSEERR_API_KEY=${JELLYSEERR_API_KEY}
- JELLYSEERR_ALIAS=${JELLYSEERR_ALIAS}
ports:
- ${SCRAPARR_PORT}:7100
# volumes:
# - ${APPDATA}/scraparr/config.yaml:/app/src/scraparr/config/config.yaml
restart: unless-stopped
depends_on:
sonarr:
condition: service_started
radarr:
condition: service_started
prowlarr:
condition: service_started
seerr:
condition: service_started
sortarr:
image: ghcr.io/jaredharper1/sortarr:latest
# Optional: set platform (e.g., linux/arm64/v8 for Apple Silicon).
# platform: linux/arm64/v8
container_name: sortarr
ports:
- "${SORTARR_PORT}:8787"
networks: [media-network]
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
- SORTARR_CONFIG_PATH=/data/Sortarr.env
- ENV_FILE_PATH=/data/Sortarr.env
- CACHE_SECONDS=300
- SORTARR_STORE_SECRETS_AS_FILES=1
- SORTARR_ALLOW_PLAINTEXT_SECRETS=0
- SORTARR_ALLOW_UNSAFE_EPHEMERAL_RECOVERY=0
# Optional: allow embedding Sortarr inside a trusted parent origin
# eg. SORTARR_FRAME_ANCESTORS=http://your-trusted-origin
# Optional: Reverse proxy preset (recommended):
# eg. SORTARR_PROXY_MODE=single
# eg. SORTARR_PROXY_MODE=double
# eg. SORTARR_PROXY_MODE=direct
# Optional: Immediate upstream proxy IP/host for Waitress trusted-proxy handling
# eg. SORTARR_WAITRESS_TRUSTED_PROXY=172.21.0.22
# eg. SORTARR_WAITRESS_TRUSTED_PROXY=traefik
# Optional: Only for path-prefix proxy setups
# eg. SORTARR_PROXY_MODE=custom
# eg. SORTARR_PROXY_HOPS_PREFIX=1
# Optional: Map container paths to host paths for the UI
# eg. RADARR_PATH_MAP=/movies:/mnt/media/movies
volumes:
- "${APPDATA}/sortarr:/data"
# Optional: Mount .env for persistence if using default paths
- "${APPDATA}/sortarr/Sortarr.env:/app/.env"
restart: unless-stopped
depends_on:
sonarr:
condition: service_started
radarr:
condition: service_started
jellyfin:
condition: service_started
### LONGTERM DISABLED SERVICES GO BELOW THIS LINE ###
# tdarr:
# container_name: tdarr
# image: haveagitgat/tdarr:latest
# restart: unless-stopped
# networks: [media-network]
# logging:
# driver: json-file
# environment:
# - internalNode=true
# - PUID=1000
# - PGID=1000
# - serverIP=0.0.0.0
# - serverPort=8266
# - webUIPort=8265
# - inContainer=true
# - nodeName=MyInternalNode
# - TZ=${TZ}
# ports:
# - 8265:8265
# - 8266:8266
# volumes:
# - /etc/localtime:/etc/localtime:ro
# - ${APPDATA}/tdarr/server:/app/server
# - ${APPDATA}/tdarr/configs:/app/configs
# - ${APPDATA}/tdarr/logs:/app/logs
# - ${MEDIASERVER}/data:/media
# - ${MEDIASERVER}/transcodes:/temp
# bazarr:
# container_name: bazarr
# image: ghcr.io/hotio/bazarr:latest
# restart: unless-stopped
# networks: [media-network]
# logging:
# driver: json-file
# ports:
# - 6767:6767
# environment:
# - PUID=1000
# - PGID=1000
# - TZ=${TZ}
# volumes:
# - /etc/localtime:/etc/localtime:ro
# - ${APPDATA}/bazarr:/config
# - /data/media:/data/media
# stash:
# image: ghcr.io/hotio/stash:latest
# container_name: stash
# restart: unless-stopped
# ports:
# - "9999:9999"
# environment:
# - PUID=1000
# - PGID=1000
# - TZ=${TZ}
# - UMASK=000
# volumes:
# - /etc/localtime:/etc/localtime:ro
# ## Adjust below paths (the left part) to your liking.
# ## E.g. you can change ./config:/root/.stash to ./stash:/root/.stash
# ## Keep configs, scrapers, and plugins here.
# - /opt/stash-linux:/config
# ## Point this at your collection.
# - /media/hpdrive:/data
# pinchvault:
# container_name: pinchvault
# image: ghcr.io/kieraneglin/pinchflat:latest
# restart: unless-stopped
# user: 1000:1000
# environment:
# - TZ=${TZ}
# - ENABLE_PROMETHEUS=true
# - UMASK=000
# - BASIC_AUTH_USERNAME=tonystork
# - BASIC_AUTH_PASSWORD=Jgordon24Sept81988!
# ports:
# - 8946:8945
# volumes:
# - ${APPDATA}/pinchvault:/config
# - /media/hpdrive/pinchvault:/downloads
+96
View File
@@ -0,0 +1,96 @@
TZ='America/New_York'
APPDATA='/opt/media-stack/appdata'
MEDIASERVER='/mnt/mediaserver'
JELLYFIN_DIR='/opt/jellyfin'
RADARR_PORT=7878
SONARR_PORT=8989
PROWLARR_PORT=9696
LIDARR_PORT=8686
WHISPARR_PORT=6969
PINCHFLAT_PORT=8945
QBITTORRENT_PORT=8200
NOTIFIARR_PORT=5454
SEERR_PORT=5055
FLARESOLVERR_PORT=8191
CLEANUPARR_PORT=11011
SORTARR_PORT=9595
SPORTARR_PORT=1867
SCRAPARR_PORT=7100
JELLYFIN_PUBLISHED_SERVER_URL=192.168.1.35
# --- SCRAPARR CONFIGS ---
# --- General (optional) ---
# GENERAL_ADDRESS=0.0.0.0
# GENERAL_PORT=7100
# GENERAL_PATH=/metrics
# --- Auth (optional) ---
# AUTH_USERNAME=user
# AUTH_PASSWORD=pass
# AUTH_TOKEN=token
# --- Sonarr ---
SONARR_URL=http://sonarr:8989
SONARR_API_KEY=key
SONARR_ALIAS=sonarr
# SONARR_API_VERSION=v3
# SONARR_INTERVAL=30
# SONARR_DETAILED=true
# --- Radarr ---
RADARR_URL=http://radarr:7878
RADARR_API_KEY=key
RADARR_ALIAS=radarr
# RADARR_API_VERSION=v3
# RADARR_INTERVAL=30
# RADARR_DETAILED=true
# --- Prowlarr ---
PROWLARR_URL=http://prowlarr:9696
PROWLARR_API_KEY=key
PROWLARR_ALIAS=prowlarr
# PROWLARR_API_VERSION=v1
# PROWLARR_INTERVAL=30
# PROWLARR_DETAILED=true
# --- Bazarr ---
# BAZARR_URL=http://bazarr:6767
# BAZARR_API_KEY=key
# BAZARR_ALIAS=bazarr
# BAZARR_INTERVAL=30
# BAZARR_DETAILED=true
# --- Readarr ---
# READARR_URL=http://readarr:8787
# READARR_API_KEY=key
# READARR_ALIAS=readarr
# READARR_API_VERSION=v1
# READARR_INTERVAL=30
# READARR_DETAILED=true
# --- Jellyseerr ---
JELLYSEERR_URL=http://seerr:5055
JELLYSEERR_API_KEY=key
JELLYSEERR_ALIAS=seerr
# JELLYSEERR_INTERVAL=30
# JELLYSEERR_DETAILED=true
# --- Overseerr ---
# OVERSEERR_URL=http://overseerr:5055
# OVERSEERR_API_KEY=key
# OVERSEERR_ALIAS=overseerr
# OVERSEERR_INTERVAL=30
# OVERSEERR_DETAILED=true
# =============================================================================
# Multiple Instances (alias-based)
# =============================================================================
# To configure multiple instances of the same service, use alias-based naming:
#
# SONARR_MAIN_URL=http://sonarr:8989
# SONARR_MAIN_API_KEY=main-key
# SONARR_SECONDARY_URL=http://sonarr2:8989
# SONARR_SECONDARY_API_KEY=secondary-key
#
# =============================================================================