#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" PORT="${ADM_PORT:-5174}" API_PORT="${ADM_API_PORT:-8085}" NODE_BIN="${NODE_BIN:-/opt/homebrew/opt/node@24/bin/node}" LOG="${ROOT}/adm-preview.log" API_LOG="${ROOT}/adm-api.log" PID_FILE="${ROOT}/.adm-preview.pid" API_PID_FILE="${ROOT}/.adm-api.pid" [[ -x "${NODE_BIN}" ]] || { echo "❌ NODE_BIN 不可执行: ${NODE_BIN}" >&2; exit 1; } NODE_DIR="$(dirname "${NODE_BIN}")" export PATH="${NODE_DIR}:${PATH}" NPM_BIN="${NPM_BIN:-${NODE_DIR}/npm}" [[ -x "${NPM_BIN}" ]] || { echo "❌ NPM_BIN 不可执行: ${NPM_BIN}" >&2; exit 1; } cd "${ROOT}" if [[ ! -d node_modules ]]; then echo "==> 安装依赖..." "${NPM_BIN}" install fi echo "==> 本机构建..." "${NPM_BIN}" run build echo "==> 停止旧进程 (port ${PORT}, ${API_PORT})..." lsof -ti "TCP:${PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill 2>/dev/null || true lsof -ti "TCP:${API_PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill 2>/dev/null || true sleep 1 lsof -ti "TCP:${PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill -9 2>/dev/null || true lsof -ti "TCP:${API_PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill -9 2>/dev/null || true rm -f "${PID_FILE}" "${API_PID_FILE}" echo "==> 启动本机 Admin API @ 127.0.0.1:${API_PORT}..." nohup "${NODE_BIN}" server/index.mjs >>"${API_LOG}" 2>&1 & echo $! >"${API_PID_FILE}" sleep 2 if ! curl -sf "http://127.0.0.1:${API_PORT}/health" >/dev/null; then echo "❌ 本机 Admin API 启动失败,最近日志:" >&2 tail -n 60 "${API_LOG}" >&2 || true exit 1 fi echo "==> 启动本机 vite preview @ 127.0.0.1:${PORT}..." nohup "${NPM_BIN}" run dev:preview -- --host 127.0.0.1 --port "${PORT}" >>"${LOG}" 2>&1 & echo $! >"${PID_FILE}" sleep 2 if ! curl -sf "http://127.0.0.1:${PORT}/" >/dev/null; then echo "❌ 本机 preview 启动失败,最近日志:" >&2 tail -n 60 "${LOG}" >&2 || true exit 1 fi echo "✅ local_restart 完成: http://127.0.0.1:${PORT}/"