LAN access: bind 0.0.0.0 + expose LAN URL (capabilities.lan, UI badge)

This commit is contained in:
2026-08-10 20:46:06 +07:00
parent a0d8725541
commit d31e226f00
5 changed files with 112 additions and 6 deletions
+36 -4
View File
@@ -22,14 +22,37 @@ def _pick_port():
# (2 engine cung 8000 -> request roi vao engine ngau nhien -> UI loi).
# Listen socket khong can SO_REUSEADDR (TIME_WAIT chi ap dung cho
# connection socket, khong phai listen socket).
# Bind 0.0.0.0 (GIONG uvicorn) — kiem tra dung port ma server se
# dung, truong hop port bi chiem tren interface khac khong sot.
try:
s.bind(("127.0.0.1", port))
s.bind(("0.0.0.0", port))
return port
except OSError:
continue
return PORT_RANGE[0]
def _lan_ips():
"""IPv4 cua may tren LAN (bo loopback) — client browser o may khac mo app."""
ips = []
try:
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
if ip and not ip.startswith("127.") and ip not in ips:
ips.append(ip)
except OSError:
pass
try:
for info in socket.getaddrinfo(socket.gethostname(), None, socket.AF_INET):
ip = info[4][0]
if ip and not ip.startswith("127.") and ip not in ips:
ips.append(ip)
except OSError:
pass
return ips
def _parent_alive(pid):
# Windows: os.kill(pid, 0) KHONG kiem tra ton tai — no goi
# TerminateProcess (giai thich: moi sig khac CTRL_C/BREAK deu terminate).
@@ -100,7 +123,10 @@ def main():
import uvicorn
import app.main # noqa: F401 — import tuong minh de PyInstaller bundle du package app
config = uvicorn.Config(app.main.app, host="127.0.0.1", port=port,
# Bind 0.0.0.0: client browser o may khac tren LAN mo app qua dia chi IP
# (http://<LAN-IP>:port) — lam viec realtime voi may chay standalone.
# Cua so Tauri (shell) van mo http://127.0.0.1:port nhu cu.
config = uvicorn.Config(app.main.app, host="0.0.0.0", port=port,
log_level="info", access_log=False)
server = uvicorn.Server(config)
@@ -117,8 +143,14 @@ def main():
return
threading.Thread(target=_watchdog, daemon=True).start()
logging.getLogger("desktop_engine").info(
"SonicForge engine listening on 127.0.0.1:%d", port)
logger = logging.getLogger("desktop_engine")
logger.info("SonicForge engine listening on 0.0.0.0:%d", port)
lan_ips = _lan_ips()
if lan_ips:
logger.info("LAN access — mo browser o may khac: %s",
" | ".join("http://%s:%d" % (ip, port) for ip in lan_ips))
else:
logger.warning("Khong phat hien dia chi LAN — client may khac khong truy cap duoc")
server.run()