feat: 公网访问加固(登录限速/会话滑动续期)+ 管理页三 Tab 信息架构重构

公网/NAS 稳定性专项扫描的产出:

① 登录限速:面板常被直接暴露公网,/api/auth/login 原先无任何限速可被无限爆破。
双键计数(IP+用户名 5 次、IP 20 次 / 15 分钟窗口),触发回 429 + 面板日志告警;
用 socket 直连地址而非可伪造的 XFF;成功登录清零。已实测:5×401 → 第 6 次 429。

② 会话滑动续期:固定 30 天硬过期在"常年挂着"的 NAS 场景表现为"隔三差五要重登"。
现剩余不足一半自动续满(服务端),鉴权层顺手刷新 cookie maxAge(浏览器侧同步)——
活跃用户永不掉线,闲置超时才需重登。

③ DNS-rebind 钩子补 return reply(async 钩子已 send 后的规范终止写法)。

④ 运维文档新增「公网访问 / 反代部署」章节:nginx 完整示例(ws 升级头 +
proxy_read_timeout 3600s——默认 60s 是"桌面挂着不动 1 分钟就断线"的元凶 +
client_max_body_size)、Caddy/frp/Cloudflare 注意事项、PANEL_ALLOWED_HOSTS 提醒。

⑤ 管理页重构:7 个区块一条长滚动 → 「实例 / 用户 / 系统」三 Tab
(实例=日常操作;用户=子账号+本账号;系统=残留容器+数据卷+诊断日志+关于)。
牛奶布艺分段选择器(凹槽+浮起胶囊),Tab 角标点提示待处理事项(可升级/有残留),
记住上次停留 Tab;子账号(非管理员)视图不变。
This commit is contained in:
Gloridust
2026-07-08 02:57:10 +08:00
parent c54d3ff18e
commit f3b3219cdb
5 changed files with 215 additions and 20 deletions

View File

@@ -99,3 +99,40 @@ WechatOnCloud/
```
数据:面板账号(含密码哈希)在 `./data-panel`,各微信实例在 docker 命名卷 `woc-data-<id>``./data-panel` 已在 `.gitignore` 中。
## 公网访问 / 反代部署nginx 示例)
把面板暴露到公网(域名 + HTTPS有三件事必须做对否则表现为「登录 400 / 桌面黑屏 / 挂一会儿就断线」:
1. **把对外域名加进 `PANEL_ALLOWED_HOSTS`**`.env`,逗号分隔,支持 `*.example.com`),然后 `docker compose up -d` 重建(不是 restart。这是防 DNS-rebinding 的白名单,不加会被面板以 400 拒绝。
2. **反代必须透传 WebSocket**(远程桌面全靠它)。
3. **把空闲超时调大**。nginx 默认 `proxy_read_timeout 60s`——桌面静止不动 1 分钟没有数据流过nginx 就掐断连接,表现为「挂着不动就断线重连」。
```nginx
server {
listen 443 ssl;
server_name woc.example.com;
# ssl_certificate / ssl_certificate_key ...
location / {
proxy_pass http://<NAS 内网 IP>:36080;
proxy_http_version 1.1;
# WebSocket 升级(远程桌面/音频都走 ws
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 透传真实 Host与 PANEL_ALLOWED_HOSTS 对得上)
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 关键:空闲超时调大,否则桌面静止 60s 即断nginx 默认值)
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
# 大文件上传(传文件到桌面 / 卷导入)
client_max_body_size 3g;
}
}
```
其它反代同理Caddy 默认无空闲超时开箱即用frp 建议 `transport.heartbeatInterval` 保持默认并确认 `proxy_read_timeout` 类配置未收紧Cloudflare 免费版对 WebSocket 空闲约 100s 断开,桌面场景建议用「灰云」(仅 DNS或自建隧道。
安全提示面板已内建登录限速15 分钟窗口内同源失败 5 次即暂时锁定),但公网暴露仍建议:强密码、改默认端口、优先用 VPN/内网穿透而非直接开放。