fix: Ghostscript-Angebot log nicht mehr, fehlende Voraussetzungen dokumentiert (v0.7.1)

Befunde aus dem ersten echten Erstinstallations-Test auf frischen Debian-12-
und Debian-13-Containern. Der Weg selbst hat getragen (Basis-Install,
Instanz-Anlage, zweite Instanz, Update mit Rauchtest, Rollback) — diese
Stellen haben gelogen oder gefehlt:

- Das Ghostscript-Backports-Angebot auf Debian 12 war ein garantierter
  Leerlauf, der "aktualisiert ✓" meldete: bookworm-backports enthaelt gar
  kein ghostscript (am Paketindex verifiziert). Die Routine sucht jetzt den
  echten Kandidaten, vergleicht vorher/nachher und raeumt eine nur zur Probe
  angelegte Quelle wieder weg.
- Derselbe untaugliche Rat stand in der Preflight-Meldung, der
  pdfa_level-Warnung, config.example.toml und vier Doku-Dateien — ueberall
  ersetzt durch die echten Optionen.
- Mehrzeilige Log-Hinweise waren durch "echo -e" zerrissen und nicht
  kopierbar; log_* nutzt jetzt printf mit %s.
- pip-freeze.txt landete beim Rollback als /pip-freeze.txt im
  Wurzelverzeichnis, liegt jetzt unter opt/pdf-ocr-hotfolder/.
- git und sudo fehlen auf dem Proxmox-Debian-Template; "sudo ./install.sh"
  scheitert dort. Beide Wege dokumentiert, git als Voraussetzung ergaenzt,
  HTTPS-Clone als Normalfall.
- Rollback: systemctl start kann kein Glob. journald-Reparatur: Instanzen
  danach neu starten, sonst bleibt das Journal leer.

254 Tests gruen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 01:36:42 +02:00
parent cd803a3dfe
commit 465ff8873f
15 changed files with 611 additions and 101 deletions
+24 -6
View File
@@ -901,14 +901,24 @@ strip_root() {
# Das Archiv enthaelt Klartext-Passwoerter aus den Instanz-Configs und wird
# deshalb root-only (0600) abgelegt.
create_backup() {
local stage tmp d
local stage tmp tar_tmp d freeze_rel
local -a items=()
log_step "Backup erstellen"
mkdir -p "$BACKUP_DIR" || die "Backup-Verzeichnis $BACKUP_DIR nicht anlegbar."
chmod 700 "$BACKUP_DIR" 2>/dev/null || true
# Die pip-freeze-Liste liegt im Archiv UNTER dem Installationsverzeichnis.
# Der dokumentierte Rollback (tar -xzf ... -C /) legt sie damit nach
# $INSTALL_DIR/pip-freeze.txt statt als /pip-freeze.txt in die Wurzel.
# Dort ueberlebt sie auch den naechsten Update-Lauf: der raeumt nur
# $INSTALL_DIR/pdf_ocr_hotfolder und $INSTALL_DIR/lib weg.
freeze_rel="$(strip_root "$INSTALL_DIR")/pip-freeze.txt"
stage="$(mktemp -d)" || die "mktemp -d fehlgeschlagen."
if ! mkdir -p "$stage/$(dirname "$freeze_rel")"; then
rm -rf "$stage"
die "Backup-Zwischenverzeichnis nicht anlegbar."
fi
{
echo "# pip freeze der alten venv vor dem Update"
echo "# Zeitpunkt: $(date -Is)"
@@ -918,7 +928,7 @@ create_backup() {
else
echo "# keine funktionierende venv vorhanden"
fi
} > "$stage/pip-freeze.txt"
} > "$stage/$freeze_rel"
[ -d "$INSTALL_DIR" ] && items+=("$(strip_root "$INSTALL_DIR")")
[ -d "$CONFIG_DIR" ] && items+=("$(strip_root "$CONFIG_DIR")")
@@ -935,17 +945,24 @@ create_backup() {
fi
tmp="$BACKUP_DIR/backup-$(date +%Y%m%d-%H%M%S).tar.gz"
tar_tmp="${tmp%.gz}"
local old_umask; old_umask="$(umask)"
umask 077
if ! tar -czf "$tmp" \
# Zwei tar-Aufrufe statt einem: --exclude wirkt global, wuerde also auch
# die frische Liste aus $stage verschlucken. So faellt eine von einem
# frueheren Rollback liegengebliebene pip-freeze.txt im ersten Aufruf raus,
# und der zweite haengt die frische an — genau ein Eintrag im Archiv.
if ! tar -cf "$tar_tmp" \
--exclude="$(strip_root "$INSTALL_DIR")/venv" \
--exclude="$(strip_root "$INSTALL_DIR")/venv.old-*" \
--exclude="$freeze_rel" \
--exclude='*/__pycache__' \
--exclude='*.pyc' \
-C "$TAR_ROOT" "${items[@]}" \
-C "$stage" pip-freeze.txt; then
|| ! tar -rf "$tar_tmp" -C "$stage" "$freeze_rel" \
|| ! gzip -n "$tar_tmp"; then
umask "$old_umask"
rm -f "$tmp"
rm -f "$tar_tmp" "$tmp"
rm -rf "$stage"
die "Backup fehlgeschlagen (volle Platte?). Es wurde NICHTS veraendert."
fi
@@ -956,7 +973,8 @@ create_backup() {
BACKUP_FILE="$tmp"
log_info "Backup: $tmp ($(du -h "$tmp" 2>/dev/null | awk '{print $1}'))"
log_info " Enthalten: Code, $CONFIG_DIR, Template-Unit, Drop-ins, pip-freeze.txt"
log_info " Enthalten: Code, $CONFIG_DIR, Template-Unit, Drop-ins"
log_info " Dazu die pip-Liste der alten venv: $INSTALL_DIR/pip-freeze.txt"
log_info " NICHT enthalten: venv und die Datenverzeichnisse ($DATA_ROOT)"
log_warn " Achtung: die Instanz-Configs enthalten Klartext-Passwoerter"
log_warn " (SMTP/Nextcloud/SFTP) — Archiv ist deshalb root-only (0600)."