diff --git a/install.sh b/install.sh index 4ae5976..8b7052c 100755 --- a/install.sh +++ b/install.sh @@ -921,9 +921,11 @@ onboard_and_start() { fi fi - info "启动 gateway…" - if ! run_quiet openclaw gateway start; then - warn "openclaw gateway start 返回失败,稍后统一检查运行状态。" + info "启动 gateway(先安装服务再启动)…" + if gateway_up; then + ok "gateway 已启动,端口 $(gateway_port) 正在监听" + else + warn "gateway 启动后端口未监听,请在菜单选 8 查看状态排查。" fi fi @@ -1054,6 +1056,74 @@ CLAWEOF fi } +gateway_port() { + local port="" + if [ -f "${OPENCLAW_CONFIG:-}" ]; then + port="$(python3 - "$OPENCLAW_CONFIG" <<'PYEOF' 2>/dev/null +import json,sys +try: + c=json.load(open(sys.argv[1])) + p=(c.get("gateway") or {}).get("port") + print(p if p else "") +except Exception: + print("") +PYEOF +)" + fi + [ -z "$port" ] && port="18789" + printf '%s' "$port" +} + +port_listening() { + local port="$1" + if command -v ss >/dev/null 2>&1; then + ss -tln 2>/dev/null | grep -q ":${port} " && return 0 + fi + curl -s -o /dev/null -m 3 "http://127.0.0.1:${port}/" 2>/dev/null && return 0 + return 1 +} + +gateway_up() { + # 真正启动:先确保服务已安装,再启动,最后验端口 + local port; port="$(gateway_port)" + + if ! run_quiet openclaw gateway install; then + _log "gateway install returned non-zero (may already be installed)" + fi + run_quiet openclaw gateway start || _log "gateway start returned non-zero" + + local i + for i in 1 2 3 4 5 6 7 8 9 10; do + if port_listening "$port"; then return 0; fi + sleep 2 + done + return 1 +} + +show_webui() { + [ -z "${OPENCLAW_CONFIG:-}" ] && detect_config_path + local port; port="$(gateway_port)" + local ip; ip="$(curl -s -m 5 https://api.ipify.org 2>/dev/null || hostname -I 2>/dev/null | awk '{print $1}')" + local sshport; sshport="$(ss -tlnp 2>/dev/null | grep sshd | grep -oE ':[0-9]+ ' | tr -d ': ' | head -1)" + [ -z "$sshport" ] && sshport="22" + + plain "" + plain "${C_BOLD}WebUI / Dashboard 访问方式${C_RESET}" + plain " 本机地址: ${C_BOLD}http://127.0.0.1:${port}/${C_RESET}" + if port_listening "$port"; then + ok " 当前状态: 端口 ${port} 已监听,服务可访问" + else + warn " 当前状态: 端口 ${port} 未监听(gateway 可能未启动,请选 5 启动)" + fi + plain "" + plain " ${C_BOLD}它只监听本机回环,外网/手机不能直接打开。${C_RESET}" + plain " 从你自己的电脑访问,请用 SSH 隧道(在你本地电脑执行):" + plain " ${C_BOLD}ssh -p ${sshport} -L ${port}:127.0.0.1:${port} root@${ip:-<服务器IP>}${C_RESET}" + plain " 然后本地浏览器打开: ${C_BOLD}http://127.0.0.1:${port}${C_RESET}" + plain "" + hint "如需直接对公网开放,需自行改配置并加鉴权/防火墙,风险自负。" +} + svc_status_line() { local inst="未安装" run="未运行" ver="" if command -v openclaw >/dev/null 2>&1; then @@ -1168,9 +1238,8 @@ do_restart() { info "正在重启服务…" run_quiet openclaw gateway stop || true sleep 2 - if run_quiet openclaw gateway start; then - sleep 2 - is_running && ok "服务已重启并在运行" || warn "已发出启动命令,但未检测到进程" + if gateway_up; then + ok "服务已重启,端口 $(gateway_port) 监听中" else warn "重启失败,请执行 openclaw status 查看" fi @@ -1246,6 +1315,7 @@ main_menu() { plain " ---------------------" plain " 10. 更新到最新版" plain " 11. 卸载" + plain " 12. WebUI 访问地址" plain " 0. 退出" plain "" ask " 请输入选项并回车" "0" @@ -1273,7 +1343,7 @@ main_menu() { ask_yes_no " 重启服务生效?" "y" && do_restart fi pause_any ;; - 5) need_installed && { run_quiet openclaw gateway start && ok "已启动" || warn "启动失败"; }; pause_any ;; + 5) need_installed && { gateway_up && ok "已启动,端口 $(gateway_port) 监听中" || warn "启动失败或端口未监听"; }; pause_any ;; 6) need_installed && { run_quiet openclaw gateway stop && ok "已停止" || warn "停止失败"; }; pause_any ;; 7) need_installed && do_restart; pause_any ;; 8) need_installed && { openclaw status 2>&1 | head -40; }; pause_any ;; @@ -1296,8 +1366,9 @@ main_menu() { run_quiet npm uninstall -g openclaw && ok "已卸载(配置已保留)" || warn "卸载失败" fi pause_any ;; + 12) show_webui; pause_any ;; 0) plain "已退出。"; return 0 ;; - *) warn "请输入 0-11 之间的选项。"; sleep 1 ;; + *) warn "请输入 0-12 之间的选项。"; sleep 1 ;; esac done }