#!/usr/bin/env bash # # Update-Skript für den Produktionsserver. # # Holt den Stand aus dem Upstream-Repository und spielt alles ein, was dazu # nötig ist: Backup, Abhängigkeiten, Image-Neubau bei Bedarf, Migrationen. # # ./scripts/update.sh [--no-backup] [--no-tests] [--force-rebuild] set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." OHNE_BACKUP=false OHNE_TESTS=false NEUBAU_ERZWINGEN=false for arg in "$@"; do case "$arg" in --no-backup) OHNE_BACKUP=true ;; --no-tests) OHNE_TESTS=true ;; --force-rebuild) NEUBAU_ERZWINGEN=true ;; --help|-h) echo "Aufruf: $0 [--no-backup] [--no-tests] [--force-rebuild]" exit 0 ;; *) echo "Unbekannte Option: $arg" >&2 exit 1 ;; esac done melde() { printf '\n\033[1m▸ %s\033[0m\n' "$1"; } # ── Backup vor jeder Änderung ─────────────────────────────────────────────── if [[ "$OHNE_BACKUP" == false ]]; then melde "Backup" ./scripts/backup.sh fi # ── Stand aus dem Upstream holen ──────────────────────────────────────────── melde "Code aktualisieren" VORHER="$(git rev-parse HEAD)" git pull --ff-only NACHHER="$(git rev-parse HEAD)" if [[ "$VORHER" == "$NACHHER" && "$NEUBAU_ERZWINGEN" == false ]]; then echo "Bereits aktuell – nichts zu tun." exit 0 fi GEAENDERT="$(git diff --name-only "$VORHER" "$NACHHER" || true)" # ── Image neu bauen, wenn sich die Grundlage geändert hat ─────────────────── if [[ "$NEUBAU_ERZWINGEN" == true ]] \ || grep -qE '^(Dockerfile|composer\.(json|lock)|php/|nginx/)' <<<"$GEAENDERT"; then melde "Container-Image neu bauen" docker compose build --pull fi melde "Container starten" docker compose up -d # ── Migrationen ───────────────────────────────────────────────────────────── # Der Entrypoint spielt sie beim Start bereits ein; der zweite Lauf ist # idempotent und macht sichtbar, ob etwas fehlgeschlagen ist. melde "Migrationen" docker compose exec -T php php scripts/migrate.php # ── Berechtigungen ────────────────────────────────────────────────────────── melde "Berechtigungen" docker compose exec -T php chown -R www-data:www-data /var/www/html/data # ── Tests ─────────────────────────────────────────────────────────────────── if [[ "$OHNE_TESTS" == false ]]; then melde "Tests" docker compose exec -u www-data -T php php tests/run.php fi melde "Update abgeschlossen ($(git rev-parse --short HEAD))"