fix: textual-serve als Web-Frontend statt python -m textual serve

textual serve (python -m textual) startete immer die eingebaute Demo.
Lösung: textual-serve Paket (v1.1.3) mit eigenem serve_tui.py Einstiegspunkt.
Pro Browser-Verbindung wird tui_standalone.py als eigener Subprocess gestartet.

Starten: python serve_tui.py --host 0.0.0.0 --port 8001
This commit is contained in:
2026-03-13 14:12:25 +01:00
parent 3177146267
commit 23fb37cb1a
5 changed files with 55 additions and 13 deletions

View File

@@ -24,7 +24,7 @@ SMS_ENABLED=false
DATABASE_URL=sqlite:///./mcm.db DATABASE_URL=sqlite:///./mcm.db
# ── TUI Web-Modus (textual serve) ────────────────────────── # ── TUI Web-Modus (textual serve) ──────────────────────────
# Starten: .venv/bin/python -m textual serve --host 0.0.0.0 --port $WEB_PORT tui_standalone.py # Starten: python serve_tui.py --host 0.0.0.0 --port $WEB_PORT
WEB_PORT=8001 WEB_PORT=8001
# ── Benutzer-Authentifizierung ────────────────────────────────────────────── # ── Benutzer-Authentifizierung ──────────────────────────────────────────────

View File

@@ -128,7 +128,7 @@ DEFAULT_ADMIN_PASSWORD=admin
.venv/bin/python main_api_only.py .venv/bin/python main_api_only.py
# TUI als Browser-App (Terminal 2) # TUI als Browser-App (Terminal 2)
.venv/bin/python -m textual serve --host 0.0.0.0 --port 8001 tui_standalone.py python serve_tui.py
``` ```
Dann im Browser öffnen: `http://<raspberry-ip>:8001` Dann im Browser öffnen: `http://<raspberry-ip>:8001`

View File

@@ -14,3 +14,4 @@ python-dotenv>=1.0.0
httpx>=0.27.0 httpx>=0.27.0
python-jose[cryptography]>=3.3.0 python-jose[cryptography]>=3.3.0
bcrypt>=4.0.0 bcrypt>=4.0.0
textual-serve>=1.1.0

41
serve_tui.py Normal file
View File

@@ -0,0 +1,41 @@
"""MCM TUI Web-Server via textual-serve.
Startet einen Web-Server, der die TUI pro Browser-Verbindung als Subprocess ausführt.
Voraussetzung: MCM API-Server muss bereits laufen (python main_api_only.py).
Verwendung:
python serve_tui.py [--host 0.0.0.0] [--port 8001]
"""
import asyncio
import sys
from textual_serve.server import Server
from config import settings
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(
"--port", type=int, default=settings.web_port, help=f"Port (default: {settings.web_port})"
)
args = parser.parse_args()
# Pfad zum Python-Interpreter im venv, damit alle Pakete verfügbar sind
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("Ctrl+C zum Beenden.")
server = Server(command=command, host=args.host, port=args.port, title="MCM MultiCustomerMessenger")
asyncio.run(server.serve())
if __name__ == "__main__":
main()

View File

@@ -1,20 +1,20 @@
"""MCM TUI Standalone Entry Point für textual serve. """MCM TUI Standalone Entry Point.
Startet nur die TUI (kein API-Server, keine Channels). Wird von serve_tui.py per textual-serve als Subprocess pro Browser-Session gestartet.
Die TUI spricht via HTTP gegen den laufenden MCM-API-Server. Kann auch direkt im Terminal gestartet werden.
Verwendung: Verwendung:
# API-Server muss bereits laufen: # Direkt im Terminal:
python main_api_only.py python tui_standalone.py
# TUI im Browser starten: # Als Browser-App via serve_tui.py:
.venv/bin/python -m textual serve --host 0.0.0.0 --port 8001 tui_standalone.py python serve_tui.py
# Dann im Browser öffnen: http://<host>:8001
""" """
from tui.app import MCMApp from tui.app import MCMApp
# textual serve erwartet eine Klasse oder Factory-Funktion, # Für textual serve (ältere Variante) Klasse als Factory
# keine bereits instanziierte App.
app = MCMApp app = MCMApp
if __name__ == "__main__":
MCMApp().run()