69 lines
2.3 KiB
Bash
69 lines
2.3 KiB
Bash
#!/bin/bash
|
||
# ═══════════════════════════════════════════════════════════
|
||
# 铸渊自动更新脚本 · Zhuyuan Self-Update
|
||
# ═══════════════════════════════════════════════════════════
|
||
#
|
||
# 由 GitHub Webhook push 事件触发
|
||
# 从仓库拉取最新代码并重启应用
|
||
#
|
||
# 编号: ZY-SVR-UPDATE-001
|
||
# 守护: 铸渊 · ICE-GL-ZY001
|
||
# ═══════════════════════════════════════════════════════════
|
||
|
||
set -euo pipefail
|
||
|
||
ZY_ROOT="/opt/zhuyuan"
|
||
LOG_DIR="${ZY_ROOT}/data/logs"
|
||
LOG_FILE="${LOG_DIR}/self-update-$(date +%Y%m%d).log"
|
||
|
||
log() {
|
||
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $1" | tee -a "${LOG_FILE}"
|
||
}
|
||
|
||
mkdir -p "${LOG_DIR}"
|
||
|
||
log "═══ 铸渊自动更新开始 ═══"
|
||
|
||
# 记录到操作日志(仅在API可用时)
|
||
if curl -sf http://localhost:3800/api/health > /dev/null 2>&1; then
|
||
curl -sf -X POST http://localhost:3800/api/operations \
|
||
-H "Content-Type: application/json" \
|
||
-d "{
|
||
\"operator\": \"铸渊 · 自动更新引擎\",
|
||
\"action\": \"self-update triggered\",
|
||
\"details\": \"GitHub push event received\"
|
||
}" 2>/dev/null || true
|
||
fi
|
||
|
||
# 检查是否有git仓库(Phase 2+才有)
|
||
if [ -d "${ZY_ROOT}/repo/.git" ]; then
|
||
log "从 GitHub 拉取最新代码..."
|
||
cd "${ZY_ROOT}/repo"
|
||
git pull origin main 2>&1 | tee -a "${LOG_FILE}"
|
||
|
||
# 同步应用代码
|
||
log "同步应用代码..."
|
||
rsync -av --delete "${ZY_ROOT}/repo/server/app/" "${ZY_ROOT}/app/" 2>&1 | tee -a "${LOG_FILE}"
|
||
|
||
# 安装依赖
|
||
cd "${ZY_ROOT}/app"
|
||
npm install --production 2>&1 | tee -a "${LOG_FILE}"
|
||
fi
|
||
|
||
# PM2 重启
|
||
log "重启应用..."
|
||
pm2 restart zhuyuan-server 2>&1 | tee -a "${LOG_FILE}" || {
|
||
log "PM2重启失败,尝试重新启动..."
|
||
pm2 start "${ZY_ROOT}/config/pm2/ecosystem.config.js" 2>&1 | tee -a "${LOG_FILE}"
|
||
}
|
||
|
||
# 健康检查
|
||
sleep 3
|
||
if curl -sf http://localhost:3800/api/health > /dev/null; then
|
||
log "✅ 更新完成 · 服务器健康"
|
||
else
|
||
log "⚠️ 更新完成但健康检查失败"
|
||
fi
|
||
|
||
log "═══ 铸渊自动更新结束 ═══"
|