# Media Management Services
# RESTART POLICY GUIDE:
# - unless-stopped: Core infrastructure services that should always run
# - no: Services with Sablier lazy loading (start on-demand)
# - See individual service comments for specific reasoning

services:
  sonarr:
    # Sonarr - TV show management and automation
    image: linuxserver/sonarr:4.0.0
    container_name: sonarr
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '8989:8989'
    volumes:
      - ./sonarr/config:/config
      - ${MEDIA_DIR}:/media
      - ${DOWNLOAD_DIR}:/downloads # Large downloads on separate drive
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:8989/']
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=TV show management and automation'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - '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'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Radarr - Movie automation
  radarr:
    image: linuxserver/radarr:5.2.6
    container_name: radarr
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '7878:7878'
    volumes:
      - ./radarr/config:/config
      - ${MEDIA_DIR}:/media
      - ${DOWNLOAD_DIR}:/downloads # Large downloads on separate drive
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:7878/']
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Movie management and automation'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - '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'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Prowlarr - Indexer manager
  # Access at: https://prowlarr.yourdomain.duckdns.org
  prowlarr:
    image: linuxserver/prowlarr:1.11.4
    container_name: prowlarr
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '9696:9696'
    volumes:
      - ./prowlarr/config:/config
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:9696/']
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Indexer manager for Sonarr/Radarr'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - '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'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Readarr - Ebook and audiobook management
  readarr:
    image: linuxserver/readarr:0.4.19-nightly
    container_name: readarr
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '8787:8787'
    volumes:
      - ./readarr/config:/config
      - ${MEDIA_DIR}/books:/books
      - ${DOWNLOAD_DIR}:/downloads
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Ebook and audiobook management'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - 'traefik.http.routers.readarr.rule=Host(`readarr.${DOMAIN}`)'
      - 'traefik.http.routers.readarr.entrypoints=websecure'
      - 'traefik.http.routers.readarr.tls.certresolver=letsencrypt'
      - 'traefik.http.routers.readarr.middlewares=authelia@docker'
      - 'traefik.http.services.readarr.loadbalancer.server.port=8787'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Lidarr - Music collection manager
  lidarr:
    image: linuxserver/lidarr:2.0.7
    container_name: lidarr
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '8686:8686'
    volumes:
      - ./lidarr/config:/config
      - ${MEDIA_DIR}/music:/music
      - ${DOWNLOAD_DIR}:/downloads
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Music collection manager'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - 'traefik.http.routers.lidarr.rule=Host(`lidarr.${DOMAIN}`)'
      - 'traefik.http.routers.lidarr.entrypoints=websecure'
      - 'traefik.http.routers.lidarr.tls.certresolver=letsencrypt'
      - 'traefik.http.routers.lidarr.middlewares=authelia@docker'
      - 'traefik.http.services.lidarr.loadbalancer.server.port=8686'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Lazy Librarian - Book manager
  lazylibrarian:
    image: linuxserver/lazylibrarian:latest
    container_name: lazylibrarian
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '5299:5299'
    volumes:
      - ./lazylibrarian/config:/config
      - ${MEDIA_DIR}/books:/books
      - ${DOWNLOAD_DIR}:/downloads
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
      - DOCKER_MODS=linuxserver/mods:lazylibrarian-ffmpeg
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Book download automation'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - 'traefik.http.routers.lazylibrarian.rule=Host(`lazylibrarian.${DOMAIN}`)'
      - 'traefik.http.routers.lazylibrarian.entrypoints=websecure'
      - 'traefik.http.routers.lazylibrarian.tls.certresolver=letsencrypt'
      - 'traefik.http.routers.lazylibrarian.middlewares=authelia@docker'
      - 'traefik.http.services.lazylibrarian.loadbalancer.server.port=5299'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Mylar3 - Comic book manager
  mylar3:
    image: linuxserver/mylar3:latest
    container_name: mylar3
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '8090:8090'
    volumes:
      - ./mylar3/config:/config
      - ${MEDIA_DIR}/comics:/comics
      - ${DOWNLOAD_DIR}:/downloads
    environment:
      - PUID=${PUID}
      - PGID=${PUID}
      - TZ=${TZ}
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Comic book collection manager'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - 'traefik.http.routers.mylar.rule=Host(`mylar.${DOMAIN}`)'
      - 'traefik.http.routers.mylar.entrypoints=websecure'
      - 'traefik.http.routers.mylar.tls.certresolver=letsencrypt'
      - 'traefik.http.routers.mylar.middlewares=authelia@docker'
      - 'traefik.http.services.mylar.loadbalancer.server.port=8090'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # Jellyseerr - Request management for Jellyfin/Plex
  jellyseerr:
    image: fallenbagel/jellyseerr:latest
    container_name: jellyseerr
    restart: no
    networks:
      - homelab-network
      - traefik-network
    ports:
      - '5055:5055'
    volumes:
      - ./jellyseerr/config:/app/config
    environment:
      - LOG_LEVEL=info
      - TZ=${TZ}
    healthcheck:
      test: ['CMD', 'wget', '--quiet', '--tries=1', '--spider', 'http://localhost:5055/']
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    labels:
      # TRAEFIK CONFIGURATION
      # ==========================================
      # Service metadata
      - 'homelab.category=media'
      - 'homelab.description=Media request management'
      - 'com.centurylinklabs.watchtower.enable=true'
      # Traefik reverse proxy (comment/uncomment to disable/enable)
      # If Traefik is on a remote server: these labels are NOT USED; 
      #   configure external yml files in /traefik/dynamic folder instead.
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik-network'
      - 'traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.${DOMAIN}`)'
      - 'traefik.http.routers.jellyseerr.entrypoints=websecure'
      - 'traefik.http.routers.jellyseerr.tls.certresolver=letsencrypt'
      - 'traefik.http.routers.jellyseerr.middlewares=authelia@docker'
      - 'traefik.http.services.jellyseerr.loadbalancer.server.port=5055'
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'

  # FlareSolverr - Cloudflare bypass for Prowlarr
  # No web UI - used by Prowlarr
  flaresolverr:
    image: flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    restart: unless-stopped
    networks:
      - homelab-network
    environment:
      - LOG_LEVEL=info
      - TZ=${TZ}
    labels:
      - homelab.category=media
      - homelab.description=Cloudflare bypass for indexers
      - 'sablier.enable=true'
      - 'sablier.group=jasper-arr'
      - 'sablier.start-on-demand=true'
  
x-dockge:
  urls:
    - https://sonarr.${DOMAIN}
    - http://192.168.4.4:8989
    - https://radarr.${DOMAIN}
    - http://192.168.4.4:7878
    - https://prowlarr.${DOMAIN}
    - http://192.168.4.4:9696
    - https://readarr.${DOMAIN}
    - http://192.168.4.4:8787
    - https://lidarr.${DOMAIN}
    - http://192.168.4.4:8686
    - https://lazylibrarian.${DOMAIN}
    - http://192.168.4.4:5299
    - https://mylar.${DOMAIN}
    - http://192.168.4.4:8090
    - https://jellyseerr.${DOMAIN}
    - http://192.168.4.4:5055

networks:
  homelab-network:
    external: true
  traefik-network:
    external: true
