#!/usr/bin/env bash # vps-manager 自动更新脚本(由 systemd timer 定时触发) # 1. 自动同步 deploy/ 下的 systemd 单元文件(有变更才拷贝 + daemon-reload) # 2. 从 Gitea 拉取最新代码,如有更新则装依赖并重启服务 # # 可配置项(环境变量): # VPS_MANAGER_DIR 项目根目录(默认 /opt/vps-manager) # VPS_MANAGER_SVC systemd 服务名(默认 vps-manager) # GIT_BRANCH 跟踪的远端分支(默认 main) # # 使用示例: # VPS_MANAGER_DIR=/srv/vps ./update.sh # 或在 systemd unit 中设置 Environment=VPS_MANAGER_DIR=/srv/vps set -euo pipefail APP_DIR="${VPS_MANAGER_DIR:-/opt/vps-manager}" SERVICE_NAME="${VPS_MANAGER_SVC:-vps-manager}" BRANCH="${GIT_BRANCH:-main}" cd "$APP_DIR" # 输出当前运行版本号(语义版本 + git 短哈希),便于比对本地与线上是否一致 print_version() { local semver commit semver=$(cat VERSION 2>/dev/null | tr -d '[:space:]') [ -z "$semver" ] && semver="dev" commit=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") echo "[$(date '+%F %T')] 当前版本: v${semver} (${commit})" } # 同步 systemd 单元文件:deploy/ 下的 .service/.timer 与 /etc/systemd/system # 不一致时拷贝并 reload;timer 变更额外 restart 使新调度周期立即生效。 # 每次都执行(而非仅版本更新时),保证单元变更不依赖代码变更触发。 sync_units() { local changed=0 f base for f in "$APP_DIR"/deploy/*.service "$APP_DIR"/deploy/*.timer; do [ -f "$f" ] || continue base=$(basename "$f") if ! cmp -s "$f" "/etc/systemd/system/$base"; then cp "$f" "/etc/systemd/system/$base" echo "[$(date '+%F %T')] 单元已更新: $base" changed=1 case "$base" in *.timer) systemctl restart "$base" 2>/dev/null || true ;; esac fi done if [ "$changed" -eq 1 ]; then systemctl daemon-reload echo "[$(date '+%F %T')] systemd 单元同步完成" fi } sync_units git fetch -q origin "$BRANCH" LOCAL=$(git rev-parse HEAD) REMOTE=$(git rev-parse "origin/$BRANCH") if [ "$LOCAL" = "$REMOTE" ]; then echo "[$(date '+%F %T')] 代码已是最新,无需更新" print_version exit 0 fi echo "[$(date '+%F %T')] 检测到新版本: ${LOCAL:0:8} -> ${REMOTE:0:8}" # 部署节点始终与远端完全一致:reset --hard 丢弃任何本地变更(含文件 mode 变化), # 避免 cc1 上误改文件导致 pull 拒绝合并、更新链路卡死 git reset --hard -q "origin/$BRANCH" # 依赖如有变更自动安装(无变化时 pip 会快速跳过) if [ -x ".venv/bin/pip" ]; then .venv/bin/pip install -q -r requirements.txt 2>/dev/null || true fi # 重启服务加载新代码 systemctl restart "$SERVICE_NAME" echo "[$(date '+%F %T')] 已重启 $SERVICE_NAME 服务" print_version