Skript zog sich per pull selbst neu, waehrend die alte Version noch lief → Health-Check nutzte alten Code. Nach pull jetzt exec der frischen Version (Marker _SU_REEXEC verhindert Doppel-Pull). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
82 lines
3.6 KiB
Bash
Executable File
82 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# =============================================================================
|
||
# server-update.sh – AUF dem jeweiligen Server ausführen (nicht lokal!)
|
||
#
|
||
# Aktualisiert GENAU DIESEN Server eigenständig aus dem Gitea-Repo:
|
||
# git pull → alembic upgrade head → service restart → health-check
|
||
#
|
||
# Jeder Server macht sich selbst – kein Cross-Server-SSH, kein "both".
|
||
# 137 und 164 sind komplett entkoppelt.
|
||
#
|
||
# Frontend: wird NICHT hier gebaut (kein Node auf den Servern, dist ist
|
||
# gitignored). Frontend liefert der Dev-Rechner separat per push-frontend.sh.
|
||
#
|
||
# Usage (auf dem Server):
|
||
# cd /opt/timemaster && ./server-update.sh
|
||
# ./server-update.sh --no-migrate # nur pull + restart
|
||
# =============================================================================
|
||
set -euo pipefail
|
||
|
||
REMOTE="/opt/timemaster"
|
||
SERVICE="timemaster"
|
||
HEALTH_URL="http://localhost:8000/health"
|
||
|
||
GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
||
log() { echo -e "${GREEN}==>${NC} $*"; }
|
||
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
|
||
die() { echo -e "${RED}[FEHLER]${NC} $*" >&2; exit 1; }
|
||
|
||
DO_MIGRATE=true
|
||
[[ "${1:-}" == "--no-migrate" ]] && DO_MIGRATE=false
|
||
|
||
# ── Sicherstellen, dass wir wirklich auf einem Server sind ────────────────────
|
||
[[ -d "$REMOTE/backend/venv" ]] || die "venv fehlt ($REMOTE/backend/venv) – falscher Host? Dieses Skript läuft AUF dem Server."
|
||
cd "$REMOTE"
|
||
git config --global --add safe.directory "$REMOTE" 2>/dev/null || true
|
||
|
||
# ── 1. Repo aktualisieren ─────────────────────────────────────────────────────
|
||
# Guard gegen "laufendes Skript editiert sich selbst": zuerst nur pullen, dann
|
||
# die frisch gezogene Version neu starten (Marker verhindert Doppel-Pull).
|
||
if [[ -z "${_SU_REEXEC:-}" ]]; then
|
||
log "git pull --ff-only origin main"
|
||
if ! git pull --ff-only origin main; then
|
||
die "git pull fehlgeschlagen. Arbeitsbaum sauber? ('git status' prüfen, ggf. 'git stash')."
|
||
fi
|
||
log "Jetzt auf: $(git log --oneline -1)"
|
||
export _SU_REEXEC=1
|
||
exec bash "$REMOTE/server-update.sh" "$@" # frische Version übernimmt ab hier
|
||
fi
|
||
|
||
# ── 2. Migration ──────────────────────────────────────────────────────────────
|
||
if $DO_MIGRATE; then
|
||
log "alembic upgrade head"
|
||
( cd "$REMOTE/backend" && source venv/bin/activate && alembic upgrade head ) \
|
||
|| die "Migration fehlgeschlagen – Service wird NICHT neugestartet (Schema evtl. inkonsistent)."
|
||
else
|
||
warn "Migration übersprungen (--no-migrate)"
|
||
fi
|
||
|
||
# ── 3. Service neustarten ─────────────────────────────────────────────────────
|
||
log "systemctl restart $SERVICE"
|
||
systemctl restart "$SERVICE"
|
||
sleep 2
|
||
state="$(systemctl is-active "$SERVICE" || true)"
|
||
[[ "$state" == "active" ]] || { journalctl -u "$SERVICE" -n 30 --no-pager; die "Service nicht aktiv ($state)."; }
|
||
log "Service aktiv"
|
||
|
||
# ── 4. Health-Check (mehrere Versuche – Worker brauchen kurz zum Starten) ─────
|
||
health_ok=false
|
||
for attempt in 1 2 3 4 5; do
|
||
if curl -sf --max-time 10 "$HEALTH_URL" >/dev/null; then
|
||
health_ok=true; break
|
||
fi
|
||
sleep 2
|
||
done
|
||
if $health_ok; then
|
||
log "Health OK ($HEALTH_URL)"
|
||
else
|
||
warn "Health-Check fehlgeschlagen – Logs prüfen: journalctl -u $SERVICE -n 50"
|
||
fi
|
||
|
||
log "✓ Update abgeschlossen auf $(hostname)"
|