Files
lernbar/scripts/im-container/sicherung.sh
Florian WildeandClaude Opus 5 c61d5711e0 Baustein 10b: Anleitung mit Screenshots, Abnahmelauf, Fassung 1.0.0
docs/ANLEITUNG.md: 20 Abschnitte, 27 Bildschirmfotos, getrennt fuer
Ausbilder und Azubi, dazu "Wenn etwas nicht geht". Die Bilder entstehen
automatisiert ueber npm run screenshots - was dort steht, ist gemessen
und nicht gemalt.

scripts/pruefungen/abnahme.mjs (npm run abnahme) laeuft gegen eine
frische, leere Datenbank in einem Wegwerfverzeichnis: aufsetzen, Konten
anlegen, arbeiten, abnehmen, sichern, beschaedigen, zurueckspielen. Eine
Sicherung, die nie zurueckgespielt wurde, ist keine Sicherung. 33 von 33
Pruefungen erfuellt, Protokoll in docs/ABNAHME.md.

Dabei drei echte Fehler gefunden, alle in Wegen, die nie ausgefuehrt
worden waren:

- Die Sicherungsskripte liefen nicht in Git Bash, obwohl das in ihrem
  Kopf stand: tar deutet den Doppelpunkt in "C:\..." als Rechnernamen.
  Beide wechseln jetzt erst ins Verzeichnis und uebergeben einen blossen
  Dateinamen.
- Auf einer frischen Datenbank gibt es noch kein Wochenblatt; der Weg
  jedes neuen Azubis war nie durchlaufen worden.
- Der Abnahmelauf selbst liess unter Windows seinen Server ueberleben
  (kill() beendet nur die cmd.exe) und prueft deshalb jetzt vorher, ob
  der Port frei ist - sonst haette er gegen fremde Daten geprueft.

Fassung 1.0.0: package.json stand noch auf 0.1.0, waehrend das
Aenderungsprotokoll bei 0.9.0 war.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 19:26:34 +02:00

58 lines
1.9 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
# Bewusst erst ins Zielverzeichnis wechseln und dann einen blossen Dateinamen
# uebergeben: tar deutet einen Doppelpunkt im Dateinamen als Rechnernamen
# ("C:\..." wird zu Rechner "C"). Das faellt nur auf Windows auf, aber ein
# Pfad mit Doppelpunkt kann ueberall vorkommen.
NAME="lernbar-$STEMPEL.tar.gz"
ARCHIV="$ZIEL/$NAME"
( cd "$ZIEL" && tar -czf "$NAME" -C "$ARBEIT" lernbar.sqlite anhaenge sicherung.txt )
echo "$ARCHIV"