Update-Skript deploy/update.sh ergaenzt

Holt den neuesten Stand aus Git und baut die Container neu. Findet seinen
eigenen Pfad (von ueberall aufrufbar), nutzt die vorhandene deploy/.env,
erkennt docker compose v1/v2 und prueft am Ende /api/health.
Optionen: --prune (alte Images aufraeumen), --no-pull (nur neu bauen).
Bei fehlgeschlagenem git pull gibt es einen Hinweis auf lokale Aenderungen.
Im Repo direkt als ausfuehrbar markiert; README ergaenzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-22 13:01:25 +02:00
parent 4981418b97
commit 2b1b28fdfe
2 changed files with 116 additions and 0 deletions

106
deploy/update.sh Executable file
View File

@@ -0,0 +1,106 @@
#!/usr/bin/env bash
#
# Project-Good Update-Skript.
# Holt die neueste Version aus Git und baut die Container neu.
#
# Nutzung (von überall aufrufbar):
# ./update.sh Update holen, neu bauen, starten
# ./update.sh --prune zusätzlich alte, ungenutzte Images aufräumen
# ./update.sh --no-pull nur neu bauen (ohne git pull)
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"
DO_PULL=1
DO_PRUNE=0
for arg in "$@"; do
case "$arg" in
--no-pull) DO_PULL=0 ;;
--prune) DO_PRUNE=1 ;;
-h|--help) sed -n '2,12p' "${BASH_SOURCE[0]}"; exit 0 ;;
*) echo "Unbekannte Option: $arg" >&2; exit 1 ;;
esac
done
info() { printf '\033[0;32m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[0;33m[!]\033[0m %s\n' "$*"; }
error() { printf '\033[0;31m[x]\033[0m %s\n' "$*" >&2; }
# --- Docker Compose ermitteln ---------------------------------------------
if docker compose version >/dev/null 2>&1; then
COMPOSE="docker compose"
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE="docker-compose"
else
error "Docker Compose wurde nicht gefunden."
exit 1
fi
if [[ ! -f "$ENV_FILE" ]]; then
error "Keine .env in $SCRIPT_DIR gefunden. Bitte zuerst ./install.sh ausführen."
exit 1
fi
# --- Update aus Git holen --------------------------------------------------
if [[ "$DO_PULL" -eq 1 ]]; then
if [[ ! -d "$REPO_DIR/.git" ]]; then
warn "$REPO_DIR ist kein Git-Repository überspringe git pull."
else
info "Hole Updates aus Git …"
before="$(git -C "$REPO_DIR" rev-parse --short HEAD 2>/dev/null || echo '?')"
if ! git -C "$REPO_DIR" pull --ff-only; then
error "git pull fehlgeschlagen (lokale Änderungen?)."
echo " Lokalen Stand ansehen: git -C \"$REPO_DIR\" status"
echo " Lokale Änderungen weg: git -C \"$REPO_DIR\" checkout -- ."
exit 1
fi
after="$(git -C "$REPO_DIR" rev-parse --short HEAD)"
if [[ "$before" == "$after" ]]; then
info "Bereits aktuell ($after) baue trotzdem neu."
else
info "Aktualisiert: $before -> $after"
fi
fi
fi
# --- Neu bauen und starten -------------------------------------------------
info "Baue Container neu …"
( cd "$SCRIPT_DIR" && $COMPOSE --env-file "$ENV_FILE" build )
info "Starte Dienste …"
( cd "$SCRIPT_DIR" && $COMPOSE --env-file "$ENV_FILE" up -d )
if [[ "$DO_PRUNE" -eq 1 ]]; then
info "Räume ungenutzte Images auf …"
docker image prune -f >/dev/null || true
fi
# --- Kurzer Gesundheitscheck ----------------------------------------------
web_port="$(grep -E '^WEB_PORT=' "$ENV_FILE" | cut -d= -f2-)"
web_port="${web_port:-8080}"
if command -v curl >/dev/null 2>&1; then
info "Warte auf das Backend …"
ok=0
for _ in $(seq 1 30); do
if curl -fsS "http://localhost:${web_port}/api/health" >/dev/null 2>&1; then
ok=1
break
fi
sleep 2
done
if [[ "$ok" -eq 1 ]]; then
info "Backend ist erreichbar."
else
warn "Backend antwortet noch nicht Logs prüfen:"
echo " ( cd \"$SCRIPT_DIR\" && $COMPOSE logs backend --tail=40 )"
fi
fi
echo
info "Update fertig."
echo " Web-UI: http://localhost:${web_port} (bzw. http://<server-ip>:${web_port})"
echo " Status: ( cd \"$SCRIPT_DIR\" && $COMPOSE ps )"