#!/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: /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 # 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"