Files
Vorrania/deploy/update.sh
Scarriffle 2b1b28fdfe 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>
2026-07-22 13:01:25 +02:00

107 lines
3.3 KiB
Bash
Executable File
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
#
# 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 )"