#!/usr/bin/env bash set -Eeuo pipefail IMAGE=mike-ai/wireguard-gateway:local proxy_names=( mike-ai-emergency-openwebui mike-ai-emergency-mcp-web mike-ai-emergency-mcp-homeassistant mike-ai-emergency-mcp-arr mike-ai-emergency-mcp-unraid ) remove_proxies() { docker rm -f "${proxy_names[@]}" >/dev/null 2>&1 || true } start_proxy() { local name=$1 network=$2 host_port=$3 target=$4 docker container inspect "$target" >/dev/null 2>&1 || { printf 'Übersprungen (Ziel fehlt): %s\n' "$target" >&2 return 0 } docker start "$target" >/dev/null 2>&1 || true [ "$(docker inspect -f '{{.State.Running}}' "$target" 2>/dev/null || true)" = true ] || { printf 'Übersprungen (Ziel startet nicht): %s\n' "$target" >&2 return 0 } docker run --detach --rm --pull never \ --name "$name" \ --network mike-ai_frontend \ --publish "127.0.0.1:${host_port}:${host_port}" \ --read-only --cap-drop ALL --pids-limit 64 --memory 64m \ --security-opt no-new-privileges:true \ --entrypoint socat "$IMAGE" \ "TCP-LISTEN:${host_port},bind=0.0.0.0,reuseaddr,fork" \ "TCP:${target}:8000" >/dev/null # Docker deliberately discards published ports on an internal-only network. # The proxy therefore publishes through frontend and receives the tools # network as a second, non-egress attachment for target discovery. docker network connect "$network" "$name" } case "${1:-}" in start) remove_proxies docker image inspect "$IMAGE" >/dev/null docker start mike-ai-router mike-ai-open-webui >/dev/null 2>&1 || true docker run --detach --rm --pull never \ --name mike-ai-emergency-openwebui \ --network mike-ai_frontend \ --publish 127.0.0.1:18080:18080 \ --read-only --cap-drop ALL --pids-limit 64 --memory 64m \ --security-opt no-new-privileges:true \ --entrypoint socat "$IMAGE" \ TCP-LISTEN:18080,bind=0.0.0.0,reuseaddr,fork \ TCP:mike-ai-open-webui:8080 >/dev/null start_proxy mike-ai-emergency-mcp-web mike-ai-tools 18090 mike-ai-mcp-web start_proxy mike-ai-emergency-mcp-homeassistant mike-ai-tools 18091 mike-ai-mcp-homeassistant start_proxy mike-ai-emergency-mcp-arr mike-ai-tools 18092 mike-ai-mcp-arr start_proxy mike-ai-emergency-mcp-unraid mike-ai-tools 18093 mike-ai-mcp-unraid-official echo 'Notfall-Proxys laufen ausschließlich auf 127.0.0.1.' echo 'Jetzt vom Client einen SSH-Tunnel auf die Ports 18080 und 18090-18093 öffnen.' ;; stop) remove_proxies echo 'Notfall-Proxys entfernt.' ;; status) docker ps --filter 'name=mike-ai-emergency-' \ --format 'table {{.Names}}\t{{.Ports}}\t{{.Status}}' ;; *) echo "Aufruf: $0 start|stop|status" >&2 exit 2 ;; esac