80 lines
2.6 KiB
Bash
Executable File
80 lines
2.6 KiB
Bash
Executable File
#!/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}"
|
||
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
|