diff --git a/scripts/vps-update-server.sh b/scripts/vps-update-server.sh new file mode 100755 index 0000000..c9dc1cb --- /dev/null +++ b/scripts/vps-update-server.sh @@ -0,0 +1,181 @@ +#!/usr/bin/env bash +# Fractured / AzerothCore — native VPS rolling update (git + compile). +# +# Run from anywhere; resolves the repository root from this script's location. +# Typical production layout: sources in ~/src/Fractured, install prefix in ~/azeroth-server +# (see docs/DEPLOY_LINUX_VPS.md). +# +# What this does: +# 1. git pull on the current branch (optional; can skip) +# 2. ./acore.sh compiler build — or compiler all for a full clean rebuild +# +# Database migrations from data/sql/updates/ run when you next start worldserver/authserver +# (Updates.* / SourceDirectory in *.conf). This script does not start or stop daemons unless +# you pass --run-after or set FRACTURED_POST_UPDATE_CMD. +# +# Usage: +# bash scripts/vps-update-server.sh +# bash scripts/vps-update-server.sh --full +# bash scripts/vps-update-server.sh --no-pull +# bash scripts/vps-update-server.sh --dry-run +# FRACTURED_POST_UPDATE_CMD='sudo systemctl restart fractured-world' bash scripts/vps-update-server.sh --run-after +# bash scripts/vps-update-server.sh --run-after 'sudo systemctl restart fractured-world' +# +# Environment: +# FRACTURED_GIT_REMOTE — remote name (default: origin) +# FRACTURED_POST_UPDATE_CMD — shell command run after a successful compile (if --run-after is passed without an argument, this is used) + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +NO_PULL=0 +FULL_BUILD=0 +COMPILE_ONLY=0 +DRY_RUN=0 +DO_RUN_AFTER=0 +POST_UPDATE_CMD="${FRACTURED_POST_UPDATE_CMD:-}" +GIT_REMOTE="${FRACTURED_GIT_REMOTE:-origin}" + +usage() { + cat <<'EOF' +Fractured VPS update — git pull + compiler (see header in script for full notes). + +Usage: + bash scripts/vps-update-server.sh [options] + +Options: + --no-pull Skip git pull (only compile current tree). + --full ./acore.sh compiler all (clean + configure + compile). + --compile-only ./acore.sh compiler compile (incremental). + --dry-run Print commands without running them. + --run-after [CMD] Run shell command after successful compile. If CMD is omitted, + uses FRACTURED_POST_UPDATE_CMD from the environment. + +Environment: + FRACTURED_GIT_REMOTE Git remote (default: origin). + FRACTURED_POST_UPDATE_CMD Used with bare --run-after. +EOF +} + +run() { + if [[ "$DRY_RUN" -eq 1 ]]; then + printf '[dry-run] ' + printf '%q ' "$@" + printf '\n' + else + "$@" + fi +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -h | --help) + usage + exit 0 + ;; + --no-pull) + NO_PULL=1 + shift + ;; + --full) + FULL_BUILD=1 + shift + ;; + --compile-only) + COMPILE_ONLY=1 + shift + ;; + --dry-run) + DRY_RUN=1 + shift + ;; + --run-after) + DO_RUN_AFTER=1 + shift + if [[ $# -gt 0 && "$1" != -* ]]; then + POST_UPDATE_CMD="$1" + shift + fi + ;; + *) + echo "error: unknown option: $1" >&2 + echo "Try: bash scripts/vps-update-server.sh --help" >&2 + exit 2 + ;; + esac +done + +if [[ "$FULL_BUILD" -eq 1 && "$COMPILE_ONLY" -eq 1 ]]; then + echo "error: use only one of --full or --compile-only" >&2 + exit 2 +fi + +if [[ ! -d "$ROOT/.git" ]]; then + echo "error: not a git clone: $ROOT" >&2 + exit 1 +fi + +if [[ ! -f "$ROOT/acore.sh" ]]; then + echo "error: acore.sh not found under $ROOT" >&2 + exit 1 +fi + +if [[ ! -f "$ROOT/conf/config.sh" ]]; then + echo "error: missing $ROOT/conf/config.sh — copy conf/dist/config.sh and edit (see DEPLOY_LINUX_VPS.md)." >&2 + exit 1 +fi + +cd "$ROOT" + +if [[ "$DO_RUN_AFTER" -eq 1 && -z "${POST_UPDATE_CMD// }" ]]; then + echo "error: --run-after needs a command or FRACTURED_POST_UPDATE_CMD set in the environment." >&2 + exit 2 +fi + +current_branch() { + git symbolic-ref -q --short HEAD || git rev-parse --short HEAD +} + +if [[ "$NO_PULL" -eq 0 ]]; then + ref="$(current_branch)" + if [[ "$ref" == "HEAD" ]]; then + echo "error: detached HEAD; checkout a branch or use --no-pull." >&2 + exit 1 + fi + echo "==> git pull $GIT_REMOTE $ref" + run git pull "$GIT_REMOTE" "$ref" +else + echo "==> skipping git pull (--no-pull)" +fi + +echo "==> ensuring acore.sh and JSONPath are executable" +if [[ "$DRY_RUN" -eq 1 ]]; then + run chmod +x acore.sh deps/jsonpath/JSONPath.sh +else + chmod +x acore.sh deps/jsonpath/JSONPath.sh 2>/dev/null || true +fi + +if [[ "$FULL_BUILD" -eq 1 ]]; then + echo "==> ./acore.sh compiler all (clean, configure, compile)" + run ./acore.sh compiler all +elif [[ "$COMPILE_ONLY" -eq 1 ]]; then + echo "==> ./acore.sh compiler compile (incremental; build dir must exist)" + run ./acore.sh compiler compile +else + echo "==> ./acore.sh compiler build (configure + compile)" + run ./acore.sh compiler build +fi + +if [[ "$DO_RUN_AFTER" -eq 1 ]]; then + echo "==> post-update: $POST_UPDATE_CMD" + if [[ "$DRY_RUN" -eq 1 ]]; then + printf '[dry-run] eval %q\n' "$POST_UPDATE_CMD" + else + # shellcheck disable=SC2086 + eval "$POST_UPDATE_CMD" + fi +fi + +echo "Done. Restart authserver/worldserver (or your service manager) when ready so new binaries and SQL updates apply."