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 "═══ 铸渊自动更新结束 ═══"
|