#!/bin/bash # HOPS Service Definitions # Contains all Docker Compose service configurations # Version: 3.1.0 # This script provides functions to generate Docker Compose service definitions # Usage: Source this script and call generate_service_definition # -------------------------------------------- # COMMON CONFIGURATIONS # -------------------------------------------- # Common environment variables for LinuxServer containers get_linuxserver_env() { cat < "$compose_file" <> "$compose_file" if generate_service_definition "$service" >> "$compose_file"; then echo "✅ Added service: $service" else echo "⚠️ Failed to add service: $service" fi done echo "📝 Docker Compose file generated with ${#services[@]} services" } # Create service-specific configuration directories and files create_service_configs() { local services=("$@") local config_root="${CONFIG_ROOT:-/opt/appdata}" for service in "${services[@]}"; do local service_dir="$config_root/$service" mkdir -p "$service_dir" case "$service" in "portainer") # Create admin password file for Portainer if [[ -n "${DEFAULT_ADMIN_PASSWORD}" ]] && command -v htpasswd &>/dev/null; then echo -n "${DEFAULT_ADMIN_PASSWORD}" | htpasswd -niB admin | cut -d: -f2 > "$service_dir/admin_password" fi ;; "traefik") mkdir -p "$service_dir/letsencrypt" mkdir -p "$service_dir/dynamic" # Create basic traefik config cat > "$service_dir/traefik.yml" < "$service_dir/redis.conf" < "$service_dir/init/create_databases.sql" < "$service_dir/configuration.yml" < "$service_dir/users_database.yml" </dev/null || true fi done } # Get service dependencies get_service_dependencies() { local service="$1" case "$service" in "jellystat") echo "postgres" ;; "authelia") echo "redis" ;; *) # No dependencies ;; esac } # Get all dependencies for a list of services resolve_dependencies() { local services=("$@") local all_services=() local processed=() # Add services and their dependencies for service in "${services[@]}"; do if [[ ! " ${processed[*]} " =~ " ${service} " ]]; then all_services+=("$service") processed+=("$service") # Add dependencies local deps=$(get_service_dependencies "$service") for dep in $deps; do if [[ ! " ${processed[*]} " =~ " ${dep} " ]]; then all_services+=("$dep") processed+=("$dep") fi done fi done echo "${all_services[@]}" } # Get service ports for conflict checking get_service_ports() { local service="$1" case "$service" in "sonarr") echo "8989" ;; "radarr") echo "7878" ;; "lidarr") echo "8686" ;; "readarr") echo "8787" ;; "bazarr") echo "6767" ;; "prowlarr") echo "9696" ;; "tdarr") echo "8265 8266" ;; "qbittorrent") echo "8082 6881 6881/udp" ;; "transmission") echo "9091 51413 51413/udp" ;; "nzbget") echo "6789" ;; "sabnzbd") echo "8080" ;; "jellyfin") echo "8096 8920 7359/udp 1900/udp" ;; "plex") echo "32400 1900/udp 3005 5353/udp 8324 32410/udp 32412/udp 32413/udp 32414/udp 32469" ;; "emby") echo "8097 8920" ;; "jellystat") echo "3000" ;; "overseerr") echo "5055" ;; "jellyseerr") echo "5056" ;; "ombi") echo "3579" ;; "traefik") echo "80 443 8080" ;; "nginx-proxy-manager") echo "80 443 81" ;; "authelia") echo "9091" ;; "portainer") echo "9000 9443" ;; "uptime-kuma") echo "3001" ;; "postgres") echo "5432" ;; "redis") echo "6379" ;; *) echo "" ;; esac } # Print service summary print_service_summary() { local services=("$@") echo "===========================" echo "HOPS SERVICE SUMMARY" echo "===========================" echo "Selected services: ${#services[@]}" echo # Categorize services local media_mgmt=() local download_clients=() local media_servers=() local request_mgmt=() local proxy_security=() local monitoring=() local databases=() for service in "${services[@]}"; do case "$service" in sonarr|radarr|lidarr|readarr|bazarr|prowlarr|tdarr) media_mgmt+=("$service") ;; qbittorrent|transmission|nzbget|sabnzbd) download_clients+=("$service") ;; jellyfin|plex|emby|jellystat) media_servers+=("$service") ;; overseerr|jellyseerr|ombi) request_mgmt+=("$service") ;; traefik|nginx-proxy-manager|authelia) proxy_security+=("$service") ;; portainer|watchtower|uptime-kuma) monitoring+=("$service") ;; postgres|redis) databases+=("$service") ;; esac done [[ ${#media_mgmt[@]} -gt 0 ]] && echo "📺 Media Management: ${media_mgmt[*]}" [[ ${#download_clients[@]} -gt 0 ]] && echo "⬇️ Download Clients: ${download_clients[*]}" [[ ${#media_servers[@]} -gt 0 ]] && echo "🎞️ Media Servers: ${media_servers[*]}" [[ ${#request_mgmt[@]} -gt 0 ]] && echo "🎛️ Request Management: ${request_mgmt[*]}" [[ ${#proxy_security[@]} -gt 0 ]] && echo "🔒 Proxy & Security: ${proxy_security[*]}" [[ ${#monitoring[@]} -gt 0 ]] && echo "📈 Monitoring: ${monitoring[*]}" [[ ${#databases[@]} -gt 0 ]] && echo "🗄️ Databases: ${databases[*]}" echo } # Main function to generate everything generate_hops_stack() { local services=("$@") if [[ ${#services[@]} -eq 0 ]]; then echo "Error: No services specified" return 1 fi echo "Generating HOPS stack for: ${services[*]}" # Resolve dependencies local all_services=($(resolve_dependencies "${services[@]}")) echo "Services with dependencies: ${all_services[*]}" # Print summary print_service_summary "${all_services[@]}" # Generate docker-compose.yml generate_complete_compose "${all_services[@]}" # Create service configurations create_service_configs "${all_services[@]}" echo "HOPS stack generation complete!" } # Helper function to list all available services list_available_services() { echo "Available HOPS services:" echo echo "📺 MEDIA MANAGEMENT:" echo " sonarr radarr lidarr readarr bazarr prowlarr tdarr" echo echo "⬇️ DOWNLOAD CLIENTS:" echo " qbittorrent transmission nzbget sabnzbd" echo echo "🎞️ MEDIA SERVERS:" echo " jellyfin plex emby jellystat" echo echo "🎛️ REQUEST MANAGEMENT:" echo " overseerr jellyseerr ombi" echo echo "🔒 PROXY & SECURITY:" echo " traefik nginx-proxy-manager authelia" echo echo "📈 MONITORING:" echo " portainer watchtower uptime-kuma" echo echo "🗄️ DATABASES:" echo " postgres redis" } # Usage information show_usage() { cat < - Generate single service generate_complete_compose - Generate docker-compose.yml create_service_configs - Create config directories list_available_services - Show all available services resolve_dependencies - Add required dependencies get_service_ports - Get service port mappings EOF }