#!/usr/bin/env bash # # Auf die vorige Veröffentlichung zurückschalten. # # /var/www/ekdos/deploy/rollback.sh # eine zurück # /var/www/ekdos/deploy/rollback.sh 2f9c1ab # auf eine bestimmte # /var/www/ekdos/deploy/rollback.sh --list # zeigt, was vorrätig ist # # Es wird nur der Symlink getauscht und php-fpm neu geladen. Die alten # Veröffentlichungen liegen vollständig da, ein Rückschritt dauert Sekunden. # # ACHTUNG: Datenbankmigrationen werden NICHT zurückgenommen. Hat die neue # Fassung das Schema geändert, muss die alte damit umgehen können. Bei den # bisherigen Migrationen (nur Tabellen anlegen) ist das der Fall. set -euo pipefail ROOT="${EKDOS_ROOT:-/var/www/ekdos}" FPM_SERVICE="${EKDOS_FPM:-php8.5-fpm}" HEALTH_URL="${EKDOS_HEALTH_URL:-http://127.0.0.1/api/health}" step() { printf '\n\033[1m==> %s\033[0m\n' "$1"; } fail() { printf '\033[31mFEHLER: %s\033[0m\n' "$1" >&2; exit 1; } CURRENT="$(basename "$(readlink "$ROOT/current" 2>/dev/null || echo none)")" if [ "${1:-}" = "--list" ]; then echo "Vorrätige Veröffentlichungen (neueste zuerst):" ( cd "$ROOT/releases" && ls -1td -- */ | sed 's#/$##' ) | while read -r name; do [ "$name" = "$CURRENT" ] && echo " * $name (aktiv)" || echo " $name" done exit 0 fi TARGET="${1:-}" if [ -z "$TARGET" ]; then # Ohne Argument: der Eintrag, den release.sh beim letzten Umschalten notiert hat. [ -f "$ROOT/previous" ] || fail "Keine vorige Veröffentlichung vermerkt. Auswahl zeigen mit: rollback.sh --list" TARGET="$(basename "$(cat "$ROOT/previous")")" fi [ -d "$ROOT/releases/$TARGET" ] || fail "Die Veröffentlichung '$TARGET' gibt es nicht. Auswahl zeigen mit: rollback.sh --list" [ "$TARGET" != "$CURRENT" ] || fail "'$TARGET' ist bereits aktiv." step "Zurück von $CURRENT auf $TARGET" ln -sfn "releases/$TARGET" "$ROOT/current.new" mv -Tf "$ROOT/current.new" "$ROOT/current" printf '%s\n' "$CURRENT" > "$ROOT/previous" step "$FPM_SERVICE neu laden" sudo systemctl reload "$FPM_SERVICE" step "n8n-Cache verwerfen" php "$ROOT/current/backend/bin/ekdos" cache:flush step "Gesundheitsprüfung" curl -fsS --max-time 5 "$HEALTH_URL" > /dev/null || fail "$HEALTH_URL antwortet nicht." step "$TARGET ist wieder aktiv."