Docker Compose mit drei Services (nginx auf Port 8000), Migrationsmechanik, Update- und Backup-Skript. Anwendung: Router mit CSRF-Prüfung, Anmeldung und Ersteinrichtung, zentraler Einstellungsdialog mit Reitern, ein- und ausschaltbares Debug-Log mit Maskierung von Zugangsdaten. Layout nach Vorbild des FinanzManagers: feste Navigation links, Werkzeugleiste oben, Tab-Leiste; Farbschema hell/dunkel/System. Tests: 51 PHP-Prüfungen und 7 Playwright-Tests, alle grün.
81 lines
3 KiB
Bash
Executable file
81 lines
3 KiB
Bash
Executable file
#!/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))"
|