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>
53 lines
1.6 KiB
Bash
Executable File
53 lines
1.6 KiB
Bash
Executable File
#!/bin/sh
|
|
# ---------------------------------------------------------------------------
|
|
# Sicherung: Datenbank und Anhänge in ein Archiv schreiben.
|
|
#
|
|
# Läuft sowohl im Container als auch auf dem Entwicklungsrechner (Git Bash).
|
|
#
|
|
# sicherung.sh [zielverzeichnis]
|
|
#
|
|
# Ergebnis: <zielverzeichnis>/lernbar-JJJJMMTT-HHMMSS.tar.gz
|
|
# ---------------------------------------------------------------------------
|
|
set -eu
|
|
|
|
DATEN="${LERNBAR_DATEN:-/daten}"
|
|
DB="${LERNBAR_DB:-$DATEN/lernbar.sqlite}"
|
|
ZIEL="${1:-${LERNBAR_SICHERUNGEN:-$DATEN/sicherungen}}"
|
|
|
|
if [ ! -f "$DB" ]; then
|
|
echo "Keine Datenbank unter $DB gefunden." >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$ZIEL"
|
|
|
|
STEMPEL="$(date +%Y%m%d-%H%M%S)"
|
|
ARBEIT="$(mktemp -d)"
|
|
trap 'rm -rf "$ARBEIT"' EXIT
|
|
|
|
# Konsistente Kopie über die Sicherungsschnittstelle von SQLite. Ein blosses
|
|
# `cp` wäre bei aktivem WAL-Modus nicht verlässlich.
|
|
node -e "
|
|
const Database = require('better-sqlite3');
|
|
const db = new Database(process.argv[1], { readonly: true });
|
|
db.backup(process.argv[2]).then(() => { db.close(); }).catch((f) => { console.error(f); process.exit(1); });
|
|
" "$DB" "$ARBEIT/lernbar.sqlite"
|
|
|
|
mkdir -p "$ARBEIT/anhaenge"
|
|
if [ -d "$DATEN/anhaenge" ]; then
|
|
cp -R "$DATEN/anhaenge/." "$ARBEIT/anhaenge/" 2>/dev/null || true
|
|
fi
|
|
|
|
cat > "$ARBEIT/sicherung.txt" <<ENDE
|
|
Lern-Bar Sicherung
|
|
Erstellt am: $(date -Iseconds)
|
|
Quelle: $DATEN
|
|
Inhalt: lernbar.sqlite (Datenbank), anhaenge/ (hochgeladene Dateien)
|
|
Zurückspielen: wiederherstellen.sh <diese-datei.tar.gz>
|
|
ENDE
|
|
|
|
ARCHIV="$ZIEL/lernbar-$STEMPEL.tar.gz"
|
|
tar -czf "$ARCHIV" -C "$ARBEIT" lernbar.sqlite anhaenge sicherung.txt
|
|
|
|
echo "$ARCHIV"
|