factory-import: --save-as-builtin Flag + README-Überarbeitung

Schließt die Lücke „nach Import landet die ZIP nicht im Image-Default":

  ./factory-import.sh --save-as-builtin
  → entpackt die ZIP nach erfolgreichem DB-Import zusätzlich in
    backend/factory-defaults/ (alter Inhalt vorher aufgeräumt, README.md
    und .gitkeep bleiben). Beim nächsten Image-Build sind die Defaults
    drin und seeden frische VMs automatisch.

README-Abschnitt „Factory-Defaults" komplett überarbeitet:
- Drei Transport-Pfade explizit erklärt (laufende DB / Drop-Box / Image)
- HTML-Standardtexte + AppSetting-Whitelist dokumentiert
- Auto-Seed-Verhalten + Berechtigungen aktualisiert
- Typische Workflows als End-zu-End-Sequenz inkl. scp-Sync

Live verifiziert: STALE_FILE.txt im backend/factory-defaults/ wurde beim
--save-as-builtin sauber entfernt, README.md blieb erhalten, Subfolder neu
befüllt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-07 20:04:02 +02:00
parent 4407bbfbb8
commit ab971618d5
3 changed files with 198 additions and 65 deletions
+50 -7
View File
@@ -3,9 +3,13 @@
# Idempotent (upserts pro Kategorie, nichts wird gelöscht).
#
# Aufruf:
# ./factory-import.sh ./factory-exports/factory-defaults-2026-05-07-1923.zip
# ./factory-import.sh # ohne Argument: nimmt automatisch
# # die jüngste ZIP aus factory-exports/
# ./factory-import.sh # jüngste ZIP aus factory-exports/
# ./factory-import.sh ./factory-exports/foo.zip # explizite ZIP
# ./factory-import.sh --save-as-builtin # nach Import auch ins
# ./factory-import.sh --save-as-builtin ./foo.zip # backend/factory-defaults/
# # entpacken → nächster
# # Image-Build hat sie
# # als Werkseinstellung
#
# ENV (wie factory-export.sh):
# OPENCRM_URL (default http://localhost:3010)
@@ -20,8 +24,29 @@ PASSWORD="${OPENCRM_PASSWORD:-}"
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
EXPORT_DIR="$REPO_ROOT/factory-exports"
BUILTIN_DIR="$REPO_ROOT/backend/factory-defaults"
# Argumente parsen: erlaubt sind --save-as-builtin und 0/1 ZIP-Pfade in
# beliebiger Reihenfolge.
SAVE_AS_BUILTIN=false
ZIP_PATH=""
for arg in "$@"; do
case "$arg" in
--save-as-builtin) SAVE_AS_BUILTIN=true ;;
-h|--help)
sed -n '2,16p' "$0" | sed 's/^# \?//'
exit 0
;;
--*) echo "✗ Unbekanntes Flag: $arg"; exit 2 ;;
*)
if [ -n "$ZIP_PATH" ]; then
echo "✗ Mehrere ZIP-Pfade angegeben (nur einer erlaubt)"; exit 2
fi
ZIP_PATH="$arg"
;;
esac
done
ZIP_PATH="${1:-}"
if [ -z "$ZIP_PATH" ]; then
# Jüngste ZIP automatisch wählen
ZIP_PATH="$(ls -1t "$EXPORT_DIR"/*.zip 2>/dev/null | head -1 || true)"
@@ -64,7 +89,7 @@ RESPONSE="$(curl -sS -X POST "$URL/api/factory-defaults/import" \
-F "zip=@$ZIP_PATH")"
# Hübsch ausgeben + auf success prüfen
if printf '%s' "$RESPONSE" | python3 -c '
if ! printf '%s' "$RESPONSE" | python3 -c '
import json, sys
r = json.load(sys.stdin)
if not r.get("success"):
@@ -91,7 +116,25 @@ if warnings:
for w in warnings:
print(f" - {w}")
'; then
exit 0
else
exit 1
fi
# --save-as-builtin: ZIP zusätzlich in backend/factory-defaults/ entpacken,
# damit der nächste Image-Build sie als Werkseinstellung mitnimmt.
# Vorher räumen wir auf (außer README.md + .gitkeep), damit nichts Veraltetes
# liegen bleibt.
if [ "$SAVE_AS_BUILTIN" = "true" ]; then
echo
echo "→ --save-as-builtin: aktualisiere $BUILTIN_DIR/"
if [ ! -d "$BUILTIN_DIR" ]; then
mkdir -p "$BUILTIN_DIR"
fi
# Aufräumen: alles außer README.md und .gitkeep löschen
find "$BUILTIN_DIR" -mindepth 1 \
\! -name 'README.md' \! -name '.gitkeep' \
-delete
# ZIP entpacken (manifest.json kommt mit, ist aber harmlos)
unzip -q -o "$ZIP_PATH" -d "$BUILTIN_DIR"
echo "✓ Werkseinstellungen aktualisiert. Beim nächsten 'docker-compose up"
echo " --build' landen sie im Image und seeden frische DBs automatisch."
fi