From 9556c4673d6caeeeceacfc8ae37dbd6deeddb15a Mon Sep 17 00:00:00 2001 From: dekun Date: Mon, 25 May 2026 13:47:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=AD=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manual_trading_hub/.env.example | 5 ++++- manual_trading_hub/hub.py | 8 +++++++- manual_trading_hub/云服务器部署说明.md | 5 ++++- manual_trading_hub/常见问题.md | 11 +++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/manual_trading_hub/.env.example b/manual_trading_hub/.env.example index f79451b..0ad111f 100644 --- a/manual_trading_hub/.env.example +++ b/manual_trading_hub/.env.example @@ -20,9 +20,12 @@ HUB_PORT=5100 # 留空 = 不强制关闭;仅不想用 OKX 时可设 HUB_DISABLED_IDS=1 HUB_DISABLED_IDS= -# true=允许 RFC1918 私网访问中控页面;false=仅 127.0.0.1 +# true=允许 RFC1918 私网访问中控页面;false=仅 127.0.0.1(反代须指向 127.0.0.1:5100) HUB_TRUST_LAN=true +# 云服务器用域名/HTTPS 反代访问中控时设为 true(否则公网可能看到 {"detail":"forbidden"}) +# HUB_ALLOW_PUBLIC=true + # 中控 Web 登录(密码非空即启用;反代到公网时务必设置用户名+密码) # HUB_USERNAME=admin # HUB_PASSWORD=your-strong-password-here diff --git a/manual_trading_hub/hub.py b/manual_trading_hub/hub.py index 7e95a08..1d5f3c4 100644 --- a/manual_trading_hub/hub.py +++ b/manual_trading_hub/hub.py @@ -58,6 +58,9 @@ HUB_PORT = int(os.getenv("HUB_PORT", "5100")) HUB_BRIDGE_TOKEN = (os.getenv("HUB_BRIDGE_TOKEN") or os.getenv("CONTROL_TOKEN") or "").strip() _trust_raw = (os.getenv("HUB_TRUST_LAN", "true") or "").strip().lower() HUB_TRUST_LAN = _trust_raw not in ("0", "false", "no", "off") +_allow_pub_raw = (os.getenv("HUB_ALLOW_PUBLIC") or "").strip().lower() +# 云服务器 + 域名反代时设为 true:不做 IP 限制,仅靠 HUB_PASSWORD / 登录页保护 +HUB_ALLOW_PUBLIC = _allow_pub_raw in ("1", "true", "yes", "on") DIR = Path(__file__).resolve().parent HUB_BUILD = "20260525-hub-sso" HUB_AGENT_TIMEOUT = float(os.getenv("HUB_AGENT_TIMEOUT", "8")) @@ -130,7 +133,10 @@ if STATIC_DIR.is_dir(): @app.middleware("http") async def local_only(request: Request, call_next): - if request.client and not _client_allowed(request.client.host): + if HUB_ALLOW_PUBLIC: + return await call_next(request) + peer = request.client.host if request.client else None + if not _client_allowed(peer): return JSONResponse({"detail": "forbidden"}, status_code=403) return await call_next(request) diff --git a/manual_trading_hub/云服务器部署说明.md b/manual_trading_hub/云服务器部署说明.md index c9d4aa6..bd8a286 100644 --- a/manual_trading_hub/云服务器部署说明.md +++ b/manual_trading_hub/云服务器部署说明.md @@ -121,7 +121,10 @@ HUB_SESSION_SECRET=另一串随机字符 # 中控为 HTTPS 时建议 true HUB_COOKIE_SECURE=true -# 仅本机访问中控进程时可 true;公网反代访问建议 false +# 公网用域名访问中控(宝塔反代)时必设其一: +# HUB_ALLOW_PUBLIC=true (推荐:反代 + 中控密码) +# 或反代目标必须是 http://127.0.0.1:5100 且可保持 HUB_TRUST_LAN=false +HUB_ALLOW_PUBLIC=true HUB_TRUST_LAN=false # 从中控打开实例的 SSO 链接有效期(秒),默认 7200 = 2 小时 diff --git a/manual_trading_hub/常见问题.md b/manual_trading_hub/常见问题.md index 9b55e73..a914607 100644 --- a/manual_trading_hub/常见问题.md +++ b/manual_trading_hub/常见问题.md @@ -238,6 +238,17 @@ HUB_PUBLIC_ORIGIN=http://192.168.8.6 `HUB_TRUST_LAN=true` 时仅允许本机 + RFC1918 私网(10/172.16/192.168)。公网 IP 直连 5100 会被拒;应走 **Nginx 反代到 127.0.0.1:5100**。 +### 4.4 浏览器显示 `{"detail":"forbidden"}` + +**原因**:中控 `local_only` 中间件认为访问来源 IP 不允许(常见于云上 `HUB_TRUST_LAN=false` 且反代未指向 `127.0.0.1:5100`)。 + +**处理**(二选一): + +1. `manual_trading_hub/.env` 增加 **`HUB_ALLOW_PUBLIC=true`**(已设 `HUB_PASSWORD` 时推荐),`pm2 restart manual-trading-hub`。 +2. 宝塔反代目标改为 **`http://127.0.0.1:5100`**(不要用公网 IP:5100 作 upstream)。 + +改后强刷浏览器再开 `/login`。 + ### 6.3 `.env` 修改不生效 PM2 须重启:`pm2 restart manual-trading-hub`(`run_hub.sh` 每次启动会重读 `.env`)。