Files
lernbar/scripts/im-container/wiederherstellen.sh
T
Florian WildeandClaude Opus 5 e856349cd4 Baustein 1: Grundgeruest, Datenbank, Anmeldung, zwei Rollen
Legt das Fundament der Lern-Bar an:

- Next.js 15 (App Router), React 19, TypeScript, ESLint, Vitest
- SQLite ueber Drizzle hinter einer Repository-Schicht
- Eigener Migrationslauf mit Pruefsummen, beim Start angewendet
- Argon2id, serverseitige Sitzungen, HttpOnly-Cookie, SameSite=Lax
- Rollen Ausbilder und Azubi, Rechteregeln als reine Funktionen
- Verwaltung: Azubikonto und Ausbildung anlegen, Passwort, Sperren
- Gestaltung Petrol/Bernstein, helle und dunkle Darstellung
- Dockerfile, docker-compose, Lebenszeichen, update.sh mit Rueckfall
- Sicherung und Wiederherstellung als Shell-Skripte
- 29 Tests fuer Rechte, Zeitrechnung und Migrationslauf

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 00:52:44 +02:00

66 lines
1.8 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.
#!/bin/sh
# ---------------------------------------------------------------------------
# Wiederherstellung aus einem Sicherungsarchiv.
#
# wiederherstellen.sh <archiv.tar.gz> [--ohne-rueckfrage]
#
# Der vorhandene Datenbestand wird vorher zur Seite gelegt
# (daten/verdraengt-<zeitstempel>/), nichts wird endgültig gelöscht.
# Die Anwendung sollte dabei gestoppt sein.
# ---------------------------------------------------------------------------
set -eu
ARCHIV="${1:-}"
BESTAETIGT="${2:-}"
if [ -z "$ARCHIV" ] || [ ! -f "$ARCHIV" ]; then
echo "Aufruf: wiederherstellen.sh <archiv.tar.gz> [--ohne-rueckfrage]" >&2
exit 1
fi
DATEN="${LERNBAR_DATEN:-/daten}"
DB="${LERNBAR_DB:-$DATEN/lernbar.sqlite}"
if [ "$BESTAETIGT" != "--ohne-rueckfrage" ]; then
printf 'Der aktuelle Datenbestand unter %s wird ersetzt. Fortfahren? [j/N] ' "$DATEN"
read -r antwort
case "$antwort" in
j | J | ja | Ja) ;;
*)
echo "Abgebrochen."
exit 1
;;
esac
fi
ARBEIT="$(mktemp -d)"
trap 'rm -rf "$ARBEIT"' EXIT
tar -xzf "$ARCHIV" -C "$ARBEIT"
if [ ! -f "$ARBEIT/lernbar.sqlite" ]; then
echo "Das Archiv enthält keine lernbar.sqlite – falsche Datei?" >&2
exit 1
fi
STEMPEL="$(date +%Y%m%d-%H%M%S)"
VERDRAENGT="$DATEN/verdraengt-$STEMPEL"
mkdir -p "$VERDRAENGT"
for datei in "$DB" "$DB-wal" "$DB-shm"; do
[ -e "$datei" ] && mv "$datei" "$VERDRAENGT/" || true
done
if [ -d "$DATEN/anhaenge" ]; then
mv "$DATEN/anhaenge" "$VERDRAENGT/anhaenge"
fi
mkdir -p "$DATEN"
cp "$ARBEIT/lernbar.sqlite" "$DB"
mkdir -p "$DATEN/anhaenge"
if [ -d "$ARBEIT/anhaenge" ]; then
cp -R "$ARBEIT/anhaenge/." "$DATEN/anhaenge/" 2>/dev/null || true
fi
echo "Wiederhergestellt aus $ARCHIV."
echo "Der vorherige Stand liegt unter $VERDRAENGT und kann gelöscht werden, sobald alles passt."