76 lines
3.1 KiB
Bash
76 lines
3.1 KiB
Bash
#!/usr/bin/env bash
|
||
# 部署流程:拉代码 → 安装依赖 → 构建前端到 dist/ →(可选)同步到 Nginx root → 后台启动 API(5599)
|
||
# 若 Nginx 未反代 /api,请先设置 API_BASE_URL 再执行,例如:
|
||
# export API_BASE_URL="http://你的域名或IP:5599"
|
||
# ./run.sh
|
||
# 使用 pm2 保活(推荐):export USE_PM2=1 && ./run.sh
|
||
# 若项目在子目录、Nginx root 指向固定目录,构建后同步到该目录,例如:
|
||
# export DEPLOY_DIST=/www/wwwroot/view.airtep.com/dist
|
||
# ./run.sh
|
||
|
||
set -e
|
||
cd "$(dirname "$0")"
|
||
ROOT="$(pwd)"
|
||
API_PORT="${PORT:-5599}"
|
||
export PORT="$API_PORT"
|
||
|
||
git fetch origin && git reset --hard origin/master
|
||
npm install --no-audit --no-fund
|
||
|
||
# 若设置了 API_BASE_URL,则写入 api.config.json,供 build 复制到 dist/
|
||
if [ -n "$API_BASE_URL" ]; then
|
||
echo "[run.sh] 使用 API_BASE_URL=$API_BASE_URL"
|
||
node -e "require('fs').writeFileSync('api.config.json', JSON.stringify({ apiBase: process.env.API_BASE_URL }, null, 2))"
|
||
fi
|
||
|
||
node build.js
|
||
|
||
# 若设置了 DEPLOY_DIST(与 Nginx root 一致),将 dist/ 同步到该目录以便访问
|
||
if [ -n "$DEPLOY_DIST" ]; then
|
||
mkdir -p "$DEPLOY_DIST"
|
||
if command -v rsync >/dev/null 2>&1; then
|
||
rsync -a --delete dist/ "$DEPLOY_DIST/"
|
||
else
|
||
(cd dist && find . -mindepth 1 -maxdepth 1 -exec cp -r {} "$DEPLOY_DIST/" \;)
|
||
fi
|
||
echo "[run.sh] 已同步 dist/ 到 $DEPLOY_DIST"
|
||
fi
|
||
|
||
# 释放端口:避免 EADDRINUSE(上次进程未退出或多次执行 run.sh)
|
||
_kill_port() {
|
||
if command -v lsof >/dev/null 2>&1; then
|
||
pids=$(lsof -t -i ":$API_PORT" 2>/dev/null) || true
|
||
if [ -n "$pids" ]; then
|
||
echo "[run.sh] 停止占用端口 ${API_PORT} 的进程: $pids"
|
||
echo "$pids" | xargs kill 2>/dev/null || true
|
||
sleep 1
|
||
fi
|
||
elif command -v fuser >/dev/null 2>&1; then
|
||
if fuser -n tcp "$API_PORT" >/dev/null 2>&1; then
|
||
echo "[run.sh] 停止占用端口 ${API_PORT} 的进程..."
|
||
fuser -k "$API_PORT/tcp" 2>/dev/null || true
|
||
sleep 1
|
||
fi
|
||
fi
|
||
}
|
||
_kill_port
|
||
|
||
# 后台启动 API:优先 pm2,否则 nohup(ROOT 与 PORT 已在上方定义)
|
||
if [ -n "$USE_PM2" ] && command -v pm2 >/dev/null 2>&1; then
|
||
echo "[run.sh] 使用 pm2 启动 API(端口 ${API_PORT})..."
|
||
(cd "$ROOT/server" && npm install --no-audit --no-fund --silent && pm2 delete view-airtep-api 2>/dev/null; true)
|
||
(cd "$ROOT/server" && PORT="$API_PORT" pm2 start index.js --name view-airtep-api)
|
||
pm2 save 2>/dev/null || true
|
||
echo "[run.sh] API 已由 pm2 托管。查看: pm2 list / pm2 logs view-airtep-api"
|
||
elif command -v nohup >/dev/null 2>&1; then
|
||
echo "[run.sh] 使用 nohup 后台启动 API(端口 ${API_PORT})..."
|
||
mkdir -p "$ROOT/logs"
|
||
nohup bash "$ROOT/start-api.sh" >> "$ROOT/logs/api.log" 2>&1 &
|
||
echo "[run.sh] API 已在后台运行。查看日志: tail -f $ROOT/logs/api.log"
|
||
else
|
||
echo "[run.sh] 前台启动 API(Ctrl+C 会停止服务)..."
|
||
exec bash "$ROOT/start-api.sh"
|
||
fi
|
||
|
||
echo "[run.sh] 部署完成。前端静态在 dist/,API 端口 ${API_PORT}。"
|
||
echo "[run.sh] 检查服务: curl -s http://127.0.0.1:${API_PORT}/config 或 ./check-service.sh" |