fix(webui): монтируем MCP в корень (внутренний роут /mcp) + UMask key

streamable_http_app() уже содержит маршрут /mcp, поэтому Mount на /mcp
давал двойной префикс (307→/mcp/→404). Монтируем суб-приложение в корень
после всех маршрутов — /api/*, /, /static приоритетны, /mcp отдаёт MCP.
This commit is contained in:
toros
2026-09-08 22:59:49 +05:00
parent 9a21cc9376
commit 586acf22e8
2 changed files with 8 additions and 2 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ EnvironmentFile=/etc/atxpi/atxpi.env
ExecStart=@TARGET@/atxpi/venv/bin/uvicorn atxpi.webui.server:app --host @BIND_HOST@ --port @BIND_PORT@
Restart=always
RestartSec=3
Umask=0077
UMask=0077
# безопасность: не даём раскрывать переменные окружения сервиса
NoNewPrivileges=true
ProtectSystem=full
+7 -1
View File
@@ -208,7 +208,8 @@ def power_cycle() -> dict:
return power_mod.cycle()
app.mount("/mcp", mcp.streamable_http_app())
# Суб-приложение mcp уже содержит маршрут `/mcp` → монтируем его в КОРЕНЬ
# (см. app.mount("/", ...) в самом низу файла), чтобы наш /mcp отдавал его роут.
# ── статика ─────────────────────────────────────────────────────────────────
@@ -218,3 +219,8 @@ async def index():
app.mount("/static", StaticFiles(directory=STATIC), name="static")
# MCP-эндпоинт. streamable_http_app() имеет собственный маршрут `/mcp`, поэтому
# монтируем суб-приложение в корень ПОСЛЕ всех наших маршрутов — тогда
# /api/*, /, /static обрабатываются первыми, а /mcp отдаёт MCP-протокол.
app.mount("/", mcp.streamable_http_app(), name="mcp")