diff --git a/README.txt b/README.txt index 4e28cc9..80f8f52 100644 --- a/README.txt +++ b/README.txt @@ -68,7 +68,8 @@ OpenDance Studio —— Web 管理服务端 v0.1.0 使用说明 deploy/proxy/web.config.example IIS(ARR + URL Rewrite)配置 deploy/proxy/README.md 完整说明、自检清单与常见故障 - 外部访问不了?先在服务器上跑一次自检脚本(只读,不改配置): + 外部访问不了?安装脚本结尾会直接给出结论(监听地址、对外可达性、 + 防火墙提示);也可以在服务器上跑一次自检脚本(只读,不改配置): bash deploy/check-access.sh # 或 bash deploy/check-access.sh /opt/opendance 它会打印 .env 里的 HOST/PORT、实际监听地址、回环与对外 IP 自测结果、 80/443 是否有反代、防火墙放行情况,并直接给出修复命令。 diff --git a/deploy/install.sh b/deploy/install.sh index a70813d..28907c2 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -28,8 +28,9 @@ cd "$SRC_DIR" APP_DIR="${APP_DIR:-/opt/opendance}" SERVICE_USER="${SERVICE_USER:-opendance}" STORAGE_DIR="${STORAGE_DIR:-/var/lib/opendance/storage}" -API_HOST="127.0.0.1" API_PORT="${PORT:-3000}" +# 注意:健康检查与汇总输出用的地址不在这里写死——真实监听地址来自 +# deploy/.env 的 HOST,脚本在源入 .env 后计算 BIND_HOST / HEALTH_HOST / LAN_IP。 log() { printf '\033[1;34m[install]\033[0m %s\n' "$*"; } warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*"; } @@ -119,6 +120,20 @@ API_PORT="${PORT:-3000}" [ -n "${DB_PASS:-}" ] || die "deploy/.env 中 DB_PASS 未设置" [ -n "${DB_NAME:-}" ] || die "deploy/.env 中 DB_NAME 未设置" +# 实际生效的监听地址(deploy/.env 的 HOST,默认 0.0.0.0) +BIND_HOST="${HOST:-0.0.0.0}" +case "$BIND_HOST" in + 0.0.0.0|'*'|''|127.0.0.1|localhost|::1) HEALTH_HOST="127.0.0.1" ;; + *) HEALTH_HOST="$BIND_HOST" ;; # 绑定具体网卡时,回环地址是连不上的 +esac + +# 本机对外 IP(用于给出可直接访问的地址,并在安装时验证"外部能否访问") +LAN_IP="" +if command -v ip >/dev/null 2>&1; then + LAN_IP="$(ip route get 1.1.1.1 2>/dev/null | awk '/src/{for(i=1;i<=NF;i++) if($i=="src") print $(i+1)}' | head -1)" +fi +[ -z "$LAN_IP" ] && LAN_IP="$(hostname -I 2>/dev/null | awk '{print $1}')" + command -v node >/dev/null 2>&1 || die "未找到 node。请安装 Node.js 22 或更高版本。" NODE_BIN="$(command -v node)" NODE_MAJOR="$(node -p 'process.versions.node.split(".")[0]')" @@ -373,7 +388,7 @@ esac log "等待 API 就绪…" READY=0 for _ in $(seq 1 30); do - if http_ok "http://${API_HOST}:${API_PORT}/health"; then READY=1; break; fi + if http_ok "http://${HEALTH_HOST}:${API_PORT}/health"; then READY=1; break; fi sleep 1 done if [ "$READY" -ne 1 ]; then @@ -381,7 +396,25 @@ if [ "$READY" -ne 1 ]; then journalctl -u opendance-api -n 40 --no-pager || true die "API 启动失败" fi -log "API 已就绪:$(http_get "http://${API_HOST}:${API_PORT}/health" | head -c 200)" +log "API 已就绪:$(http_get "http://${HEALTH_HOST}:${API_PORT}/health" | head -c 200)" + +# ---------- 5. 边界:确认"外部到底能不能访问" ---------- +# 绑定层写错(HOST=127.0.0.1)时,本机 curl 一切正常,但外部永远连不上, +# 而安装日志里看不出任何异常——必须在安装时就点出来。 +EXTERNAL_OK="" +case "$BIND_HOST" in + 127.0.0.1|localhost|::1) + ACCESS_MODE="loopback" + ;; + *) + ACCESS_MODE="external" + if [ -n "$LAN_IP" ] && http_ok "http://${LAN_IP}:${API_PORT}/health"; then + EXTERNAL_OK="yes" + else + EXTERNAL_OK="no" + fi + ;; +esac # ---------- 5. 反向代理(本脚本**不部署**,仅给出说明) ---------- # 需求变更:Web 端只负责业务服务,反向代理由另外的服务/团队提供。 @@ -403,14 +436,38 @@ cat <