#!/bin/bash # ============================================================================ # 在设备上装好「网站监测 + 紧急预案」(可重复跑) # ============================================================================ # # 为什么单独一个脚本,而不是部署时塞一长串内联命令: # 内联命令要经过 ssh -> bash -c -> 再一层引号,中文和引号很容易 # 被打散(第一次就是这么失败的,报"寻找匹配的 ' 时遇到未预期的 EOF")。 # 写成文件传过去再跑,引号只有一层,可靠得多,而且能重复执行。 # # 做四件事: # 1. 建 rescue_reports/ 和知识库文件 # 2. 脚本加可执行位 # 3. 重载 systemd,把 nettune 拉起来(那份 unit 刚被换成正确形状) # 4. 启用并启动 monitor.timer # ============================================================================ set -u RELAY_DIR="${RELAY_DIR:-/root/lanremote-relay}" UNIT_DIR="${UNIT_DIR:-/etc/systemd/system}" echo "== 1. 目录与知识库 ==" mkdir -p "$RELAY_DIR/rescue_reports" chmod 755 "$RELAY_DIR/rescue_reports" if [ ! -f "$RELAY_DIR/rescue_knowledge.md" ]; then cat > "$RELAY_DIR/rescue_knowledge.md" <<'EOF' # 紧急预案知识库 每次自动抢救成功,这里会追加一条「第几级奏效」。 以后遇到同类症状,监测单元会优先试历史上奏效的那一级。 分级(从代价最小到最大): 1 重启隧道 不动中转,在线设备不掉线 2 重启中转服务 设备要重连,但很快 3 重新施加网络调优 MSS / MTU 跑偏时用 4 重启无线网卡 4G / WiFi 卡死时用 5 重启整机 最后的底牌,默认不开(要 RESCUE_REBOOT=1) EOF echo " 建了知识库" else echo " 知识库已存在,保留" fi echo echo "== 2. 可执行位 ==" chmod +x "$RELAY_DIR/monitor.sh" "$RELAY_DIR/rescue.sh" 2>/dev/null chmod +x "$RELAY_DIR/net-tune.sh" "$RELAY_DIR/watchdog.sh" 2>/dev/null ls -l "$RELAY_DIR/monitor.sh" "$RELAY_DIR/rescue.sh" | awk '{print " " $1, $NF}' echo echo "== 3. 重载 systemd + 拉起 nettune ==" systemctl daemon-reload systemctl restart lanremote-nettune.service sleep 4 echo " nettune: $(systemctl is-active lanremote-nettune.service)" echo " MTU: $(cat /sys/class/net/wlan0/mtu 2>/dev/null)" echo " MSS 规则: $(iptables -t mangle -L -n 2>/dev/null | grep -ci mss) 条" echo echo "== 4. 启用并启动监测定时器 ==" systemctl enable lanremote-monitor.timer >/dev/null 2>&1 systemctl start lanremote-monitor.timer sleep 3 echo " monitor.timer: $(systemctl is-active lanremote-monitor.timer)" systemctl list-timers lanremote-monitor.timer --no-pager 2>/dev/null | head -3 echo echo "== 5. 立刻手动跑一次监测(验证它能工作)==" FAILS_BEFORE=$(grep -m1 '^fails=' "$RELAY_DIR/monitor_state.txt" 2>/dev/null | cut -d= -f2) bash "$RELAY_DIR/monitor.sh" echo " 跑完了。状态文件:" cat "$RELAY_DIR/monitor_state.txt" 2>/dev/null | sed 's/^/ /' echo " 日志尾部:" tail -4 "$RELAY_DIR/monitor.log" 2>/dev/null | sed 's/^/ /' echo echo "== 6. 复核 ==" printf ' %-24s %s\n' "nettune" "$(systemctl is-active lanremote-nettune.service)" printf ' %-24s %s\n' "monitor.timer" "$(systemctl is-active lanremote-monitor.timer)" printf ' %-24s %s\n' "relay" "$(systemctl is-active lanremote-relay)" printf ' %-24s %s\n' "tunnel" "$(systemctl is-active lanremote-tunnel)" printf ' %-24s %s\n' "tunnel-h2" "$(systemctl is-active lanremote-tunnel-h2)" printf ' %-24s %s\n' "公网自测" "$(curl -s -o /dev/null -w '%{http_code}' --max-time 12 https://relay.xxmxxs.top/v1/health)" printf ' %-24s %s\n' "后台抢救报告路由" "$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/rescue/none.txt)" echo echo "== 7. 演练:造一份假报告,验证后台能列出并下载 ==" DEMO="$RELAY_DIR/rescue_reports/19700101-000000-演练.txt" { echo "这是一份**演练用**的假报告,用来验证后台的「抢救报告」分区能列出、能下载。" echo "看完可以删掉:rm $DEMO" echo echo "---- 一、结论速览 ----" echo " 公网 https://relay.xxmxxs.top/v1/health -> 不通" echo " 本机 http://127.0.0.1:8080/v1/health -> 200-正常" echo echo " 判断:**本机是好的,问题在隧道或 Cloudflare 那一侧**。" } > "$DEMO" echo " 造了:$DEMO" echo " 后台页里有几份报告:$(ls "$RELAY_DIR/rescue_reports" 2>/dev/null | wc -l)" echo " 拉一下后台页,看有没有「抢救报告」分区:" curl -s http://127.0.0.1:8080/zhongzhuanzhan 2>/dev/null | grep -c '抢救报告' | sed 's/^/ 匹配到 /;s/$/ 次/' echo echo "完成。删掉演练报告:rm \"$DEMO\""