Files
vps-manager/deploy/update.sh
T

80 lines
2.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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
# 不一致时拷贝并 reloadtimer 变更额外 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}"
git pull --ff-only -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