- 移除系统 nginx 配置(1Panel 用内置 OpenResty,系统 nginx 不适用) - 站点反代改用 1Panel 网站-反向代理;容器改用 1Panel Compose 编排 - 定时触发由 systemd timer 改为 1Panel 计划任务(日志面板可视) - 脚本上传改用 1Panel 文件管理器,PULL_DEPLOY.md 全步骤 1Panel 化 - deploy.sh/deploy-watch.sh 核心逻辑不变(原子切换+健康检查+回滚)
48 lines
1.5 KiB
Bash
48 lines
1.5 KiB
Bash
#!/bin/bash
|
||
# 拉取式部署 watcher - 监听 CI 产物目录,发现新版本自动部署
|
||
# 设计原则:
|
||
# - CI 只负责构建并把产物写入 /ci-artifacts(runner 与本机同宿主)
|
||
# - 部署动作只由服务器本地触发(1Panel 计划任务每分钟调用本脚本),
|
||
# 任何 AI/CI 均不通过 SSH 操作服务器
|
||
# 安装方式见 .gitea/docs/PULL_DEPLOY.md(1Panel 原生方式,一次性配置)
|
||
|
||
set -u
|
||
|
||
ARTIFACT="${ARTIFACT:-/ci-artifacts/server-deploy-latest.tar.gz}"
|
||
STATE_FILE="${STATE_FILE:-/opt/lunar/production/.last-deployed-sha256}"
|
||
DEPLOY_SCRIPT="${DEPLOY_SCRIPT:-/opt/lunar/scripts/deploy.sh}"
|
||
LOG_FILE="${LOG_FILE:-/opt/lunar/deploy-watch.log}"
|
||
|
||
log() {
|
||
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG_FILE"
|
||
}
|
||
|
||
# 产物不存在时静默等待
|
||
if [ ! -f "$ARTIFACT" ]; then
|
||
exit 0
|
||
fi
|
||
|
||
# 计算产物指纹
|
||
CURRENT_SHA="$(sha256sum "$ARTIFACT" | awk '{print $1}')"
|
||
LAST_SHA=""
|
||
if [ -f "$STATE_FILE" ]; then
|
||
LAST_SHA="$(cat "$STATE_FILE")"
|
||
fi
|
||
|
||
# 无变化则跳过
|
||
if [ "$CURRENT_SHA" = "$LAST_SHA" ]; then
|
||
exit 0
|
||
fi
|
||
|
||
log "发现新版本产物 sha256=${CURRENT_SHA:0:12},开始部署"
|
||
|
||
# 执行部署;成功后才记录指纹(失败时下次轮询会重试)
|
||
if bash "$DEPLOY_SCRIPT" "$ARTIFACT" >> "$LOG_FILE" 2>&1; then
|
||
mkdir -p "$(dirname "$STATE_FILE")"
|
||
printf '%s' "$CURRENT_SHA" > "$STATE_FILE"
|
||
log "部署成功"
|
||
else
|
||
log "部署失败,保留旧指纹,等待下次轮询重试或人工介入"
|
||
exit 1
|
||
fi
|