#!/bin/bash # 私域Agent 公网隧道启动脚本(主推 cloudflared 无拦截页 + ngrok 应急) # 用法: bash ~/Desktop/yawan-workbench/启动公网隧道.sh set -u # 0. 后端 if lsof -ti :8010 >/dev/null 2>&1; then echo "✓ 后端已在运行 (port 8010)" else echo "▶ 启动后端…" (cd "$(dirname "$0")/server" && nohup .venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8010 >/tmp/yawan-uvicorn.log 2>&1 &) sleep 4 curl -s -m 5 --noproxy '*' http://127.0.0.1:8010/api/health >/dev/null \ && echo "✓ 后端就绪" || { echo "✗ 后端启动失败,看 /tmp/yawan-uvicorn.log"; exit 1; } fi # 1. cloudflared 主隧道(无 ngrok 拦截页) CF_METRICS=20241 if lsof -ti :$CF_METRICS >/dev/null 2>&1; then CF_URL=$(curl -s -m 5 --noproxy '*' "http://127.0.0.1:$CF_METRICS/metrics" | grep -o 'https://[a-z-]*\.trycloudflare\.com' | head -1) echo "✓ cloudflared 已在运行: $CF_URL" else echo "▶ 启动 cloudflared 主隧道…" nohup /opt/homebrew/bin/cloudflared tunnel --url http://127.0.0.1:8010 --protocol http2 --metrics "127.0.0.1:$CF_METRICS" >/tmp/yawan-cloudflared.log 2>&1 & sleep 8 CF_URL=$(curl -s -m 5 --noproxy '*' "http://127.0.0.1:$CF_METRICS/metrics" | grep -o 'https://[a-z-]*\.trycloudflare\.com' | head -1) [ -n "$CF_URL" ] && echo "✓ 主入口(cloudflared·无拦截页): $CF_URL/admin" || echo "✗ cloudflared 启动失败,看 /tmp/yawan-cloudflared.log" fi # 2. ngrok 应急隧道(地址固定,但有拦截确认页) if ! pgrep -f 'ngrok http 8010' >/dev/null 2>&1; then echo "▶ 启动 ngrok 应急隧道…" nohup /opt/homebrew/bin/ngrok http 8010 --host-header=localhost:8010 --log stdout >/tmp/yawan-ngrok.log 2>&1 & sleep 4 fi NGROK_URL=$(curl -s -m 5 --noproxy '*' http://127.0.0.1:4040/api/tunnels 2>/dev/null | grep -o 'https://[a-z0-9-]*\.ngrok-free\.dev' | head -1) [ -n "$NGROK_URL" ] && echo "✓ 应急入口(ngrok·有拦截页): $NGROK_URL/admin" echo "" echo "========== 把主入口发给测试用户 ==========" echo " ${CF_URL:-}/admin" echo "=========================================="