#!/bin/bash # HOPS Service Definitions - Improved Version # Contains all Docker Compose service configurations with error handling and pinned versions # Version: 3.1.0 # Exit on any error set -e # Source common functions SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [[ -f "$SCRIPT_DIR/lib/common.sh" ]]; then source "$SCRIPT_DIR/lib/common.sh" else echo "ERROR: Common library not found. Please ensure lib/common.sh exists." >&2 exit 1 fi if [[ -f "$SCRIPT_DIR/lib/security.sh" ]]; then source "$SCRIPT_DIR/lib/security.sh" else echo "ERROR: Security library not found. Please ensure lib/security.sh exists." >&2 exit 1 fi # Service definitions with pinned versions (from docker.sh) declare -A SERVICE_IMAGES=( # Media Management (*arr Stack) ["sonarr"]="lscr.io/linuxserver/sonarr:4.0.10" ["radarr"]="lscr.io/linuxserver/radarr:5.8.3" ["lidarr"]="lscr.io/linuxserver/lidarr:2.5.3" ["readarr"]="lscr.io/linuxserver/readarr:0.3.32-develop" ["bazarr"]="lscr.io/linuxserver/bazarr:1.4.3" ["prowlarr"]="lscr.io/linuxserver/prowlarr:1.24.3" ["tdarr"]="ghcr.io/haveagitgat/tdarr:2.26.01" # Download Clients ["qbittorrent"]="lscr.io/linuxserver/qbittorrent:4.6.7" ["transmission"]="lscr.io/linuxserver/transmission:4.0.6" ["nzbget"]="lscr.io/linuxserver/nzbget:24.3" ["sabnzbd"]="lscr.io/linuxserver/sabnzbd:4.3.3" # Media Servers ["jellyfin"]="lscr.io/linuxserver/jellyfin:10.9.11" ["plex"]="lscr.io/linuxserver/plex:1.40.5" ["emby"]="lscr.io/linuxserver/emby:4.8.8" ["jellystat"]="cyfershepard/jellystat:1.1.0" # Request Management ["overseerr"]="lscr.io/linuxserver/overseerr:1.33.2" ["jellyseerr"]="fallenbagel/jellyseerr:1.9.2" ["ombi"]="lscr.io/linuxserver/ombi:4.43.5" # Reverse Proxy & Security ["traefik"]="traefik:v3.1.6" ["nginx-proxy-manager"]="jc21/nginx-proxy-manager:2.11.3" ["authelia"]="authelia/authelia:4.38.16" # Monitoring & Management ["portainer"]="portainer/portainer-ce:2.21.4" ["uptime-kuma"]="louislam/uptime-kuma:1.23.15" ["watchtower"]="containrrr/watchtower:1.7.1" ) # Service port mapping declare -A SERVICE_PORTS=( ["sonarr"]="8989" ["radarr"]="7878" ["lidarr"]="8686" ["readarr"]="8787" ["bazarr"]="6767" ["prowlarr"]="9696" ["tdarr"]="8265" ["qbittorrent"]="8082" ["transmission"]="9091" ["nzbget"]="6789" ["sabnzbd"]="8080" ["jellyfin"]="8096" ["plex"]="32400" ["emby"]="8096" ["jellystat"]="3000" ["overseerr"]="5055" ["jellyseerr"]="5056" ["ombi"]="3579" ["traefik"]="8080" ["nginx-proxy-manager"]="81" ["authelia"]="9091" ["portainer"]="9000" ["uptime-kuma"]="3001" ["watchtower"]="8080" ) # Initialize logging setup_logging "service-definitions" # Validate service name validate_service_name_internal() { local service_name="$1" if [[ -z "$service_name" ]]; then error_exit "Service name is required" fi if ! validate_service_name "$service_name"; then error_exit "Invalid service name: $service_name" fi if [[ -z "${SERVICE_IMAGES[$service_name]}" ]]; then error_exit "Unknown service: $service_name" fi } # Get service image with validation get_service_image() { local service_name="$1" validate_service_name_internal "$service_name" echo "${SERVICE_IMAGES[$service_name]}" } # Get service port with validation get_service_port() { local service_name="$1" validate_service_name_internal "$service_name" echo "${SERVICE_PORTS[$service_name]}" } # Common environment variables for LinuxServer containers get_linuxserver_env() { cat < [service_name...]" fi generate_multiple_services "$@" ;; "list") list_available_services ;; "validate") if [[ $# -eq 0 ]]; then error_exit "Usage: $0 validate " fi validate_service_config "$1" ;; "help"|"--help"|"-h") cat < [options] Actions: generate ... Generate service definitions list List all available services validate Validate service configuration help Show this help message Examples: $0 generate sonarr radarr jellyfin $0 list $0 validate traefik EOF ;; *) error_exit "Unknown action: $action. Use 'help' for usage information." ;; esac } # If script is run directly (not sourced) if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi