mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 07:10:44 +00:00
2.1.3:搬到 Lightsail 真服务器 + 支持"没有证书的中转"
用户买了 AWS Lightsail(2G 内存 / 2 vCPU / 60G SSD / 公网 IP
13.54.30.196),中转从随身 WiFi 那台小机器搬过去。
== 为什么这次搬迁解决了一堆老问题 ==
原机器(Debian aarch64、460MB、走 4G)一直有几件搞不定的:
* 线路对 Cloudflare 隧道的 **7844 端口间歇性阻断**(443 通、7844 不通),
隧道每 3~10 分钟掉一次、公网跟着 530 —— 查了很久才从
cloudflared 自己的 precheck 里看清
* 只有 460MB 内存
* 会掉电硬挂(实测 2026-10-08 18:42 一次非正常关机)
新机器**有公网 IP**,中转直接监听,不经隧道、不过 7844。
实测公网延迟从 **1000~2000 ms 降到 1.1 ms**。
== 代码改动 ==
1. **relay.py 的 DATA_DIR 默认值不再写死**
原来是 /root/lanremote-relay。新机器上服务以 admin 普通用户跑
(它没理由要 root),而 /root 是 0700 —— 部署时直接
PermissionError: '/root/lanremote-relay'。
改成"本脚本所在目录下的 data/",搬到哪都跟着走。
2. **客户端支持"没有证书的中转"**
新服务器是明文 HTTP(没签证书),而两个客户端原来都往 https 走:
* 手表端:裸 IP 会被强制补 https:// -> 永远连不上,
报的还是 SSL 错误,很容易让人白查半天证书
* Android 9+ 默认禁止明文流量,没 usesCleartextTraffic
请求会被系统直接掐掉
Windows 端本来就是对的(正则里把任意纯 IP 都当"用明文")。
现在手表端规则和它一致,并加了 usesCleartextTraffic。
3. 清掉电脑端一段函数内的重复代码(return 之后还有一份拷贝,
缩进仍在函数体内所以不报错,但读起来很迷惑)。
== 新服务器上的部署 ==
/opt/ykxmz-relay/ 服务端(relay/admin/landing/showcase)
ykxmz-relay.service 监听 0.0.0.0:13245
ykxmz-monitor.service/.timer 每 60 秒查公网,连续 3 次不通就叫预案
rescue-lightsail.sh 四级阶梯抢救(重启中转 / 强杀重拉 /
查防火墙 / 重启整机[默认关])
预案针对新架构重写过:原来围着隧道转(重启隧道、重施 MSS/MTU),
现在没有隧道,改成重启中转 + 查端口/防火墙。
全量回归 46 个阶段全部通过。
This commit is contained in:
+21
-2
@@ -59,13 +59,27 @@ from collections import deque
|
||||
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||||
from pathlib import Path
|
||||
|
||||
VERSION = "2.1.2"
|
||||
VERSION = "2.1.3"
|
||||
|
||||
# ---------------- 参数(都能用环境变量覆盖)----------------
|
||||
|
||||
PORT = int(os.environ.get("RELAY_PORT", "8080"))
|
||||
BIND = os.environ.get("RELAY_BIND", "127.0.0.1")
|
||||
DATA_DIR = Path(os.environ.get("RELAY_DATA", "/root/lanremote-relay"))
|
||||
|
||||
# ⚠ 数据目录的默认值曾经**写死成 /root/lanremote-relay**。
|
||||
# 原来那台机器上没问题(服务就跑在 /root 下、以 root 跑),
|
||||
# 但 2026-10-08 搬到 Lightsail 之后立刻炸了:
|
||||
#
|
||||
# PermissionError: [Errno 13] Permission denied: '/root/lanremote-relay'
|
||||
#
|
||||
# 新机器上服务以 admin 普通用户跑(它没理由要 root),
|
||||
# 而 /root 是 0700 —— mkdir 直接被拒。
|
||||
#
|
||||
# 改成本脚本所在目录下的 data/:搬到哪都跟着走,
|
||||
# 不用每换一台机器就记得设环境变量。
|
||||
# (要用别的路径照样可以,RELAY_DATA 优先级更高。)
|
||||
_SCRIPT_DIR = Path(__file__).resolve().parent
|
||||
DATA_DIR = Path(os.environ.get("RELAY_DATA", str(_SCRIPT_DIR / "data")))
|
||||
|
||||
# 长轮询最多挂多久。太长会占着 Cloudflare 的连接,太短则空转请求多。
|
||||
# 长轮询挂多久。
|
||||
@@ -375,6 +389,11 @@ def public_url() -> str:
|
||||
candidates = [
|
||||
DATA_DIR.parent / "public_url.txt",
|
||||
DATA_DIR / "public_url.txt",
|
||||
# 旧那台机器把 public_url.txt 放在 /root/lanremote-relay/。
|
||||
# 保留这条是为了**从旧机器迁过来时**还能读到已有的地址;
|
||||
# 新机器上这个路径根本不存在,is_file() 会直接跳过,无害。
|
||||
# (之前 DATA_DIR 默认值也写死成这个路径,搬迁时踩过 ——
|
||||
# 见文件顶部 DATA_DIR 那段注释。)
|
||||
Path("/root/lanremote-relay/public_url.txt"),
|
||||
]
|
||||
for path in candidates:
|
||||
|
||||
Reference in New Issue
Block a user