From d7887ae0c95036e2e301d4b209e5f648a2580cc1 Mon Sep 17 00:00:00 2001 From: "itdrui.de" Date: Fri, 13 Mar 2026 14:19:56 +0100 Subject: [PATCH] fix: WebSocket-URL in Browser nutzt echte IP statt 0.0.0.0 --- serve_tui.py | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/serve_tui.py b/serve_tui.py index f5e34e0..4977798 100644 --- a/serve_tui.py +++ b/serve_tui.py @@ -4,10 +4,16 @@ Startet einen Web-Server, der die TUI pro Browser-Verbindung als Subprocess ausf Voraussetzung: MCM API-Server muss bereits laufen (python main_api_only.py). Verwendung: - python serve_tui.py [--host 0.0.0.0] [--port 8001] + # Lokal: + python serve_tui.py + + # Raspberry Pi / entfernter Rechner: + python serve_tui.py --host 0.0.0.0 --public-host 192.168.1.100 --port 8001 + # Browser: http://192.168.1.100:8001 """ import asyncio +import socket import sys from textual_serve.server import Server @@ -15,25 +21,51 @@ from textual_serve.server import Server from config import settings +def _local_ip() -> str: + """Ermittelt die lokale IP-Adresse (für den public_url-Fallback).""" + try: + with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: + s.connect(("8.8.8.8", 80)) + return s.getsockname()[0] + except Exception: + return "localhost" + + def main() -> None: import argparse parser = argparse.ArgumentParser(description="MCM TUI Web-Server") - parser.add_argument("--host", default="0.0.0.0", help="Host (default: 0.0.0.0)") + parser.add_argument("--host", default="0.0.0.0", help="Bind-Adresse (default: 0.0.0.0)") parser.add_argument( - "--port", type=int, default=settings.web_port, help=f"Port (default: {settings.web_port})" + "--port", type=int, default=settings.web_port, + help=f"Port (default: {settings.web_port})" + ) + parser.add_argument( + "--public-host", default=None, + help="Öffentlicher Hostname/IP für WebSocket-URL (default: automatisch ermittelt)" ) args = parser.parse_args() - # Pfad zum Python-Interpreter im venv, damit alle Pakete verfügbar sind + # Öffentliche URL für die WebSocket-Verbindung im Browser + public_host = args.public_host or ( + "localhost" if args.host in ("localhost", "127.0.0.1") else _local_ip() + ) + public_url = f"http://{public_host}:{args.port}" + python = sys.executable command = f"{python} tui_standalone.py" - print(f"MCM TUI Web-Server startet auf http://{args.host}:{args.port}") - print(f"Subprocess-Befehl: {command}") + print(f"MCM TUI Web-Server lauscht auf {args.host}:{args.port}") + print(f"Browser-URL: {public_url}") print("Ctrl+C zum Beenden.") - server = Server(command=command, host=args.host, port=args.port, title="MCM – MultiCustomerMessenger") + server = Server( + command=command, + host=args.host, + port=args.port, + title="MCM – MultiCustomerMessenger", + public_url=public_url, + ) asyncio.run(server.serve())