- Automate Traefik email substitution in deploy script - Auto-generate Authelia admin password (saved to ADMIN_PASSWORD.txt) - Standardize all volume paths to use relative paths (./service/config) - Switch Traefik to HTTP challenge by default (DNS challenge optional) - Update documentation with improved setup instructions - Enhance troubleshooting guide - Update AGENT_INSTRUCTIONS with new conventions - Simplify .env.example with clearer guidance These changes reduce manual configuration steps and improve deployment reliability.
189 lines
6.4 KiB
YAML
189 lines
6.4 KiB
YAML
# Media Services
|
|
# Services for media management and streaming
|
|
# Place in /opt/stacks/media/docker-compose.yml
|
|
# NOTE: qBittorrent is configured to use Gluetun VPN (see gluetun.yml)
|
|
|
|
services:
|
|
# Plex Media Server - Media streaming platform
|
|
# Access at: https://plex.yourdomain.duckdns.org
|
|
# NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc.
|
|
plex:
|
|
image: plexinc/pms-docker:1.40.0.7998-f68041501
|
|
container_name: plex
|
|
restart: unless-stopped
|
|
networks:
|
|
- media-network
|
|
- homelab-network
|
|
- traefik-network
|
|
volumes:
|
|
- ./plex/config:/config
|
|
- /mnt/media:/media:ro # Large media files on separate drive
|
|
- plex-transcode:/transcode
|
|
environment:
|
|
- PUID=${PUID:-1000}
|
|
- PGID=${PGID:-1000}
|
|
- TZ=${TZ:-America/New_York}
|
|
- PLEX_CLAIM=${PLEX_CLAIM}
|
|
# Hardware transcoding support
|
|
# Uncomment ONE of the following options:
|
|
|
|
# Option 1: Intel QuickSync (most common)
|
|
# devices:
|
|
# - /dev/dri:/dev/dri
|
|
|
|
# Option 2: NVIDIA GPU (requires nvidia-container-toolkit installed)
|
|
# runtime: nvidia
|
|
# devices:
|
|
# - /dev/nvidia0:/dev/nvidia0
|
|
# - /dev/nvidiactl:/dev/nvidiactl
|
|
# - /dev/nvidia-modeset:/dev/nvidia-modeset
|
|
# - /dev/nvidia-uvm:/dev/nvidia-uvm
|
|
# - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools
|
|
# environment:
|
|
# - NVIDIA_VISIBLE_DEVICES=all
|
|
# - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
|
|
labels:
|
|
- "homelab.category=media"
|
|
- "homelab.description=Plex media streaming server"
|
|
# Traefik labels - NO Authelia for app access
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.plex.rule=Host(`plex.${DOMAIN}`)"
|
|
- "traefik.http.routers.plex.entrypoints=websecure"
|
|
- "traefik.http.routers.plex.tls.certresolver=letsencrypt"
|
|
- "traefik.http.services.plex.loadbalancer.server.port=32400"
|
|
|
|
# Jellyfin - Free alternative to Plex
|
|
# Access at: https://jellyfin.yourdomain.duckdns.org
|
|
# NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc.
|
|
jellyfin:
|
|
image: jellyfin/jellyfin:10.8.13
|
|
container_name: jellyfin
|
|
restart: unless-stopped
|
|
networks:
|
|
- media-network
|
|
- homelab-network
|
|
- traefik-network
|
|
volumes:
|
|
- ./jellyfin/config:/config
|
|
- ./jellyfin/cache:/cache
|
|
- /mnt/media:/media:ro # Large media files on separate drive
|
|
environment:
|
|
- PUID=${PUID:-1000}
|
|
- PGID=${PGID:-1000}
|
|
- TZ=${TZ:-America/New_York}
|
|
# Uncomment for hardware transcoding
|
|
# devices:
|
|
# - /dev/dri:/dev/dri
|
|
labels:
|
|
- "homelab.category=media"
|
|
- "homelab.description=Open-source media streaming server"
|
|
# Traefik labels - NO Authelia for app access
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.jellyfin.rule=Host(`jellyfin.${DOMAIN}`)"
|
|
- "traefik.http.routers.jellyfin.entrypoints=websecure"
|
|
- "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt"
|
|
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
|
|
|
|
# Sonarr - TV show automation
|
|
# Access at: https://sonarr.yourdomain.duckdns.org
|
|
sonarr:
|
|
image: lscr.io/linuxserver/sonarr:4.0.0
|
|
container_name: sonarr
|
|
restart: unless-stopped
|
|
networks:
|
|
- media-network
|
|
- homelab-network
|
|
- traefik-network
|
|
volumes:
|
|
- ./sonarr/config:/config
|
|
- /mnt/media:/media
|
|
- /mnt/downloads:/downloads # Large downloads on separate drive
|
|
environment:
|
|
- PUID=${PUID:-1000}
|
|
- PGID=${PGID:-1000}
|
|
- TZ=${TZ:-America/New_York}
|
|
labels:
|
|
- "homelab.category=media"
|
|
- "homelab.description=TV show management and automation"
|
|
# Traefik labels with Authelia
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.sonarr.rule=Host(`sonarr.${DOMAIN}`)"
|
|
- "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"
|
|
|
|
# Radarr - Movie automation
|
|
# Access at: https://radarr.yourdomain.duckdns.org
|
|
radarr:
|
|
image: lscr.io/linuxserver/radarr:5.2.6
|
|
container_name: radarr
|
|
restart: unless-stopped
|
|
networks:
|
|
- media-network
|
|
- homelab-network
|
|
- traefik-network
|
|
volumes:
|
|
- ./radarr/config:/config
|
|
- /mnt/media:/media
|
|
- /mnt/downloads:/downloads # Large downloads on separate drive
|
|
environment:
|
|
- PUID=${PUID:-1000}
|
|
- PGID=${PGID:-1000}
|
|
- TZ=${TZ:-America/New_York}
|
|
labels:
|
|
- "homelab.category=media"
|
|
- "homelab.description=Movie management and automation"
|
|
# Traefik labels with Authelia
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.radarr.rule=Host(`radarr.${DOMAIN}`)"
|
|
- "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"
|
|
|
|
# Prowlarr - Indexer manager
|
|
# Access at: https://prowlarr.yourdomain.duckdns.org
|
|
prowlarr:
|
|
image: lscr.io/linuxserver/prowlarr:1.11.4
|
|
container_name: prowlarr
|
|
restart: unless-stopped
|
|
networks:
|
|
- media-network
|
|
- homelab-network
|
|
- traefik-network
|
|
volumes:
|
|
- ./prowlarr/config:/config
|
|
environment:
|
|
- PUID=${PUID:-1000}
|
|
- PGID=${PGID:-1000}
|
|
- TZ=${TZ:-America/New_York}
|
|
labels:
|
|
- "homelab.category=media"
|
|
- "homelab.description=Indexer manager for Sonarr/Radarr"
|
|
# Traefik labels with Authelia
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.prowlarr.rule=Host(`prowlarr.${DOMAIN}`)"
|
|
- "traefik.http.routers.prowlarr.entrypoints=websecure"
|
|
- "traefik.http.routers.prowlarr.tls.certresolver=letsencrypt"
|
|
- "traefik.http.routers.prowlarr.middlewares=authelia@docker"
|
|
- "traefik.http.services.prowlarr.loadbalancer.server.port=9696"
|
|
|
|
# qBittorrent - Torrent client
|
|
# Access at: https://qbit.yourdomain.duckdns.org
|
|
# Routes through Gluetun VPN - configure in gluetun.yml
|
|
# NOTE: This is a placeholder. Configure qBittorrent in gluetun.yml with network_mode: "service:gluetun"
|
|
# See gluetun.yml for the actual qBittorrent configuration
|
|
|
|
volumes:
|
|
plex-transcode:
|
|
driver: local
|
|
|
|
networks:
|
|
media-network:
|
|
driver: bridge
|
|
homelab-network:
|
|
external: true
|
|
traefik-network:
|
|
external: true
|