mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 20:40:43 +00:00
用户要求:服务器端文件里放一个 .sh,双击就能检查 cloudflared 装没装、
自动部署、配好公网,以后全自动。
== 新增 ==
relay/deploy.sh 一键部署主脚本,7 步全自动:
环境检查 -> 装 cloudflared -> 部署程序 -> 网络调优
-> 写 4 个 systemd 服务 -> 配隧道 -> 启动自检打公网地址
relay/deploy-tune.sh 网络调优,可单独重跑:
keepalive 30/10/3 + 路径 MTU 探测 + MSS 1360
+ 接口 MTU 1400 + mask networkd-wait-online
每一项都写明了实测依据
用法:
bash deploy.sh 复用已有凭据,全自动
TUNNEL_TOKEN=eyJh... bash deploy.sh Token 模式
bash deploy.sh --hostname relay.你的域名 换域名
bash deploy.sh --skip-tunnel 只装中转
bash deploy.sh --help 全部参数
重跑 = 升级;已有数据/配对码/管理密码/凭据/手改过的 config.yml 都不动。
== 自动化到什么程度 ==
* cloudflared 不在就自动下载装上(并校验能执行)
* 隧道支持两种模式:已有凭据文件、或 TUNNEL_TOKEN
* **不传 --hostname 且没有 Token 时明确提示要填**,不会静默用一个写死的值
(用户明确说过:这个中转站是他自己用的,不对外开放,
绝不能把私人域名烧成默认值)
* deploy-tune.sh 的 MTU 取 1400:路径 MTU 实测 1472,
而 MSS 钳制只管 TCP、QUIC 走 UDP 完全不受保护;
接口 MTU 降到 1400 后 QUIC 建齐 10 条连接从 28 秒缩到 12 秒
== 顺带修掉两个真 bug ==
1. write_tunnel_unit 写的文件名漏了 .service 后缀 ——
文件写下去了但 systemd 完全看不见,enable 还会安静地失败。
2. 发布包一直缺 site_shots/(老 bug):
package_remote.py 用 iterdir() + is_file() 收文件,目录进不去。
新机器装完官网截图全是 404。只有从 zip 解压真跑一遍才暴露。
同时把 deploy.sh 里 site_shots 的检查降级成警告(缺截图不该让部署失败)。
另外给 deploy-tune.sh 清旧 MSS 规则的循环加了 10 次上限 ——
原写法在 -D 报成功但规则仍在时会死循环把整个部署卡死。
== 验证 ==
* _build/test_deploy_sh.sh 沙箱 65 项,全通过
* _build/test_zip_deploy.sh 从发布 zip 解压再跑,30 项,全通过
* _build/test_deploy_real.sh **真机 Debian 上实测**(新增):
zip 解出 17 个文件 -> 语法/LF/无 BOM 通过
--help 退出码 0 且无副作用、未知参数退出码 2
沙箱安装成功、幂等重跑哨兵不被冲
现有三个中转服务全程 active,自检 200
98 lines
4.0 KiB
Bash
98 lines
4.0 KiB
Bash
#!/bin/bash
|
||
# 在真机 Debian 上用沙箱模式验证 deploy.sh(不碰现有中转)
|
||
set -u
|
||
|
||
echo "════════ 1. 从发布 zip 里解出脚本(模拟用户真实流程)════════"
|
||
cd /root
|
||
rm -rf /root/deploytest
|
||
mkdir -p /root/deploytest
|
||
if [ -f /root/lanremote-relay/downloads/ykxmz-server-1.8.2.zip ]; then
|
||
cd /root/deploytest
|
||
python3 -c "
|
||
import zipfile
|
||
z = zipfile.ZipFile('/root/lanremote-relay/downloads/ykxmz-server-1.8.2.zip')
|
||
z.extractall('.')
|
||
print(' 解出', len(z.namelist()), '个文件')
|
||
"
|
||
else
|
||
echo " ! 设备上没有服务端 zip"
|
||
exit 1
|
||
fi
|
||
|
||
D=$(ls -d /root/deploytest/ykxmz-server-* 2>/dev/null | head -1)
|
||
echo " 目录: $D"
|
||
echo " 内容:"
|
||
ls -1 "$D" | sed 's/^/ /'
|
||
echo " 有没有 deploy.sh: $([ -f "$D/deploy.sh" ] && echo 有 || echo **没有**)"
|
||
echo " 有没有 site_shots/: $([ -d "$D/site_shots" ] && echo '有 ('$(ls -1 "$D/site_shots" | wc -l)' 张)' || echo **没有**)"
|
||
|
||
echo
|
||
echo "════════ 2. 语法和格式 ════════"
|
||
bash -n "$D/deploy.sh" && echo " ✓ deploy.sh 语法通过" || echo " ✗ 语法错误"
|
||
bash -n "$D/deploy-tune.sh" 2>/dev/null && echo " ✓ deploy-tune.sh 语法通过" || echo " (deploy-tune.sh 不存在或语法错)"
|
||
python3 -c "
|
||
from pathlib import Path
|
||
for n in ['deploy.sh','deploy-tune.sh']:
|
||
p = Path('$D') / n
|
||
if not p.is_file(): continue
|
||
raw = p.read_bytes()
|
||
crlf = raw.count(b'\r\n')
|
||
bom = raw.startswith(b'\xef\xbb\xbf')
|
||
print(f' {n}: CRLF={crlf} BOM={bom} ' + ('✓' if crlf==0 and not bom else '✗'))
|
||
"
|
||
|
||
echo
|
||
echo "════════ 3. --help(必须无副作用)════════"
|
||
before=$(md5sum /etc/systemd/system/lanremote-relay.service 2>/dev/null | awk '{print $1}')
|
||
out=$(bash "$D/deploy.sh" --help 2>&1)
|
||
echo "$out" | head -22 | sed 's/^/ /'
|
||
after=$(md5sum /etc/systemd/system/lanremote-relay.service 2>/dev/null | awk '{print $1}')
|
||
echo " ----"
|
||
[ "$before" = "$after" ] && echo " ✓ --help 没动现有服务" || echo " ✗ --help 改了现有服务!"
|
||
echo " --help 退出码: $(bash "$D/deploy.sh" --help > /dev/null 2>&1; echo $?)"
|
||
|
||
echo
|
||
echo "════════ 4. 未知参数要被挡 ════════"
|
||
bash "$D/deploy.sh" --这是一个不存在的参数 > /dev/null 2>&1
|
||
echo " 退出码: $? (应该是 2)"
|
||
|
||
echo
|
||
echo "════════ 5. 沙箱跑一遍(--prefix,不碰真实 /root/lanremote-relay)════════"
|
||
echo " 跑之前的真实服务状态:"
|
||
for s in lanremote-relay lanremote-tunnel lanremote-tunnel-h2; do
|
||
printf " %-24s %s\n" "$s" "$(systemctl is-active $s)"
|
||
done
|
||
echo " ---"
|
||
rm -rf /root/sandbox
|
||
bash "$D/deploy.sh" --prefix /root/sandbox --skip-tunnel > /tmp/dep.log 2>&1
|
||
echo " 退出码: $?"
|
||
echo " 最后 25 行输出:"
|
||
tail -25 /tmp/dep.log | sed 's/^/ /'
|
||
echo " ---"
|
||
echo " 沙箱里生成了什么:"
|
||
find /root/sandbox -maxdepth 3 2>/dev/null | head -25 | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "════════ 6. 幂等:再跑一遍 ════════"
|
||
# 放个哨兵,看会不会被冲掉
|
||
echo "SENTINEL-$(date +%s)" > /root/sandbox/root/lanremote-relay/data/sentinel.txt 2>/dev/null \
|
||
|| mkdir -p /root/sandbox/root/lanremote-relay/data && echo "SENTINEL" > /root/sandbox/root/lanremote-relay/data/sentinel.txt
|
||
bash "$D/deploy.sh" --prefix /root/sandbox --skip-tunnel > /tmp/dep2.log 2>&1
|
||
echo " 第二次退出码: $?"
|
||
echo " 哨兵还在吗: $([ -f /root/sandbox/root/lanremote-relay/data/sentinel.txt ] && echo 在 || echo **被冲掉了**)"
|
||
echo " 第二次最后 8 行:"
|
||
tail -8 /tmp/dep2.log | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "════════ 7. 现有真实服务有没有被影响 ════════"
|
||
for s in lanremote-relay lanremote-tunnel lanremote-tunnel-h2; do
|
||
printf " %-24s %s\n" "$s" "$(systemctl is-active $s)"
|
||
done
|
||
echo " 自检: $(curl -s --max-time 10 http://127.0.0.1:8080/v1/health | head -c 60)"
|
||
|
||
echo
|
||
echo "════════ 8. 清理沙箱 ════════"
|
||
rm -rf /root/sandbox /root/deploytest
|
||
echo " ✓ 已清理"
|
||
df -h / | sed 's/^/ /'
|