ykxmz 1.5.0:修复手表端 TLS 证书校验 + MTU 修复网络稳定性

被控端
- 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%)
- 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败)
- 每分钟回头找局域网,自动切回快 400 倍的路径
- 画面心跳帧:静止时省流量,客户端仍知道流是活的
- 锁屏时给出可操作的提示

手表端
- 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException
- 连接错误翻译成人话(证书/时间/解析/超时分别提示)
- 经中转连上后用服务器报的地址刷新已配对记录
- 新增局域网连接页面、服务器延迟检测

服务器端
- 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502)
- 网络调优脚本 net-tune.sh(开机自动应用)
- 管理页:批量删除、网络体检、下载区
- 隧道改 HTTP/2 + 双连接

文档
- 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
This commit is contained in:
xmz7891
2026-10-06 19:01:05 +08:00
commit b62ac865ea
3195 changed files with 203292 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
#!/bin/bash
# 中转服务器的内存 / 健壮性检查(这台机器只有 460MB)
#
# 查三件事:
# 1. 服务有没有自己崩过 / 重启过
# 2. 会话、队列涨起来之后内存会不会失控
# 3. 时间长了有没有泄漏(看两次采样的差值)
set -u
BASE=http://127.0.0.1:8080
echo "===== 1. 服务状态 ====="
for svc in lanremote-relay lanremote-tunnel; do
state=$(systemctl is-active "$svc" 2>/dev/null)
restarts=$(systemctl show "$svc" -p NRestarts 2>/dev/null | cut -d= -f2)
since=$(systemctl show "$svc" -p ActiveEnterTimestamp 2>/dev/null | cut -d= -f2)
printf " %-18s %-9s 重启 %s 次 自 %s\n" "$svc" "$state" "$restarts" "$since"
done
echo
echo "===== 2. 系统内存 ====="
free -m | awk 'NR==1{print " " $0} NR==2{printf " 总 %s MB 已用 %s MB 可用 %s MB\n", $2, $3, $7}'
echo
echo "===== 3. 各进程内存(前 8)====="
ps -eo rss,comm --sort=-rss 2>/dev/null | head -9 | tail -8 | \
while read -r rss comm; do
printf " %6s KB %s\n" "$rss" "$comm"
done
echo
echo "===== 4. 中转服务自报的内存 ====="
curl -s --max-time 8 "$BASE/v1/health" > /tmp/relay_health.json 2>/dev/null
if [ -s /tmp/relay_health.json ]; then
python3 - <<'PY'
import json
try:
d = json.load(open('/tmp/relay_health.json'))
except Exception as exc:
print(f" 解析失败: {exc}")
raise SystemExit
print(f" 版本 {d.get('version')}")
print(f" 已运行 {d.get('uptimeSeconds')} 秒")
print(f" 累计请求 {d.get('totalRequests')}")
print(f" 设备 {len(d.get('devices', []))} 台")
print(f" 会话 {d.get('sessions')}")
print(f" Rss {d.get('memoryKB', 0)} KB ({d.get('memoryKB', 0)//1024} MB)")
PY
else
echo " 健康检查没响应"
fi
echo
echo "===== 5. 内存稳定性:连续采样 10 次,每次隔 3 秒 ====="
echo " (如果一直涨,说明有泄漏)"
FIRST=""
LAST=""
for i in $(seq 1 10); do
# 打一批请求,模拟真实使用
for j in 1 2 3 4 5; do
curl -s -o /dev/null --max-time 5 "$BASE/v1/health" &
done
wait
RSS=$(curl -s --max-time 5 "$BASE/v1/health" \
| grep -oE '"memoryKB": *[0-9]+' | grep -oE '[0-9]+')
[ -z "$RSS" ] && RSS=0
if [ -z "$FIRST" ]; then FIRST=$RSS; fi
LAST=$RSS
printf " 第 %2d 次: %6s KB\n" "$i" "$RSS"
sleep 3
done
echo
echo " 第一次 $FIRST KB -> 最后一次 $LAST KB"
if [ "$FIRST" -gt 0 ]; then
DIFF=$((LAST - FIRST))
echo " 变化 ${DIFF} KB"
if [ "$DIFF" -gt 8000 ]; then
echo " ⚠ 涨了超过 8MB,可能有泄漏"
else
echo " ✓ 基本稳定"
fi
fi
echo
echo "===== 6. 队列上限保护(客户端不取数据时会丢最旧的,不涨内存)====="
echo " 队列上限设的是 2MB/设备(RELAY_QUEUE_BYTES)"
echo " 当前各设备队列:"
curl -s --max-time 8 "$BASE/v1/health" > /tmp/relay_health2.json 2>/dev/null
python3 - <<'PY'
import json
try:
d = json.load(open('/tmp/relay_health2.json'))
except Exception:
raise SystemExit
devices = d.get('devices', [])
if not devices:
print(" (还没有设备上线,队列都是空的)")
for item in devices:
print(f" {item.get('name')}: 待发手表 {item.get('queuedToClient')} 字节"
f" / 待发电脑 {item.get('queuedToAgent')} 字节")
PY
echo
echo "===== 7. 磁盘 ====="
df -h / | awk 'NR==2{printf " 总 %s 已用 %s 可用 %s (%s)\n", $2, $3, $4, $5}'