feat: Wiederaufnahme aus working/, --check-config, feldtauglicher Updater (v0.6.0)
Datenverlust behoben: - Nach hartem Stopp blieb das Original in working/ liegen und wurde nie wieder angefasst (_scan_existing sah nur incoming/). Es wird jetzt beim Start an Ort und Stelle wieder aufgegriffen, mit Kollisionsschutz gegen gleichnamige neue Scans; angefangene __ocr_-Fragmente werden geloescht. - TimeoutStopSec 30 -> 300, damit laufendes OCR zu Ende laufen darf. Config-Drift sichtbar gemacht: - Neues --check-config (Exit 0 sauber / 1 Warnungen / 2 Fehler), das update.sh vor dem Neustart ueber alle Instanz-Configs laufen laesst. - Warnungen fuer [ocr].timeout >= 900 (seit 0.4.0 pro SEITE) und gesetztes pdfa_level, beim Dienststart wie im Check. - Unbekannte Config-Keys werden nicht mehr still verworfen, sondern genannt. Updater feldtauglich: - venv-Health-Check erkennt toten Symlink UND Versions-Drift gegen das System-Python; --rebuild-venv als ausdruecklicher Weg nach einem Debian- Major-Upgrade. Neubau ist ganz-oder-gar-nicht mit Rollback. - apt-Pakete werden auch beim Update synchronisiert (Quelle: install.sh). - Instanz-Erfassung inkl. activating/failed, Verifikation prueft is-failed und NRestarts statt sleep 1 + is-active. - Backup enthaelt Configs, Unit, Drop-ins und pip-freeze.txt, liegt auf 0600 und rotiert auf 5; schlaegt es fehl, bricht das Update vorher ab. - ERR-Trap faehrt die vorher laufenden Instanzen wieder hoch. - lxc-compat.conf wird beim Update nachgezogen. - requirements.txt gepinnt (ocrmypdf 16.13.0, geprueft fuer Python 3.11+3.13). Doku in Installation / Update / OS-Upgrade aufgeteilt (docs/). 135 Tests gruen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+66
-6
@@ -37,18 +37,58 @@ if [ ! -f "$REPO_DIR/pdf_ocr_hotfolder/__init__.py" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
# System-Pakete — einzige Quelle der Wahrheit
|
||||
# ============================================================
|
||||
# Der folgende Block wird von update.sh aus dieser Datei herausgeschnitten
|
||||
# (sed auf die BEGIN/END-Marken) und dort ausgewertet, damit ein Update
|
||||
# neue Pakete nachzieht. Die Marken und der Funktionsname duerfen sich
|
||||
# deshalb nicht aendern, ohne update.sh anzupassen.
|
||||
# --- BEGIN apt-packages (wird von update.sh extrahiert) ---
|
||||
pdf_ocr_apt_packages() {
|
||||
cat <<'PKGLIST'
|
||||
python3
|
||||
python3-venv
|
||||
python3-pip
|
||||
tesseract-ocr
|
||||
tesseract-ocr-deu
|
||||
tesseract-ocr-eng
|
||||
ghostscript
|
||||
qpdf
|
||||
unpaper
|
||||
pngquant
|
||||
icc-profiles-free
|
||||
ca-certificates
|
||||
curl
|
||||
PKGLIST
|
||||
}
|
||||
# --- END apt-packages ---
|
||||
|
||||
# Prueft, ob die venv noch zum aktuellen System-Python passt.
|
||||
# Zwei Faelle: (1) der Interpreter der venv laeuft gar nicht mehr (toter
|
||||
# Symlink nach einem Distributions-Upgrade, systemd: 203/EXEC), (2) er laeuft
|
||||
# noch, ist aber eine andere Version als das System-Python (Debian 12 -> 13).
|
||||
# Beides heisst: neu bauen. Keine Versionsnummer ist hier hartcodiert.
|
||||
venv_is_healthy() {
|
||||
local venv="$1" venv_mm sys_mm
|
||||
[ -x "$venv/bin/python" ] || return 1
|
||||
venv_mm="$("$venv/bin/python" -c 'import sys; print("%d.%d" % sys.version_info[:2])' 2>/dev/null || true)"
|
||||
[ -n "$venv_mm" ] || return 1
|
||||
sys_mm="$(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])' 2>/dev/null || true)"
|
||||
[ -n "$sys_mm" ] || return 1
|
||||
[ "$venv_mm" = "$sys_mm" ]
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Basis-Installation (idempotent)
|
||||
# ============================================================
|
||||
|
||||
install_base() {
|
||||
log_step "System-Pakete installieren"
|
||||
local -a PKGS
|
||||
mapfile -t PKGS < <(pdf_ocr_apt_packages)
|
||||
apt-get update -qq
|
||||
apt-get install -y --no-install-recommends \
|
||||
python3 python3-venv python3-pip \
|
||||
tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng \
|
||||
ghostscript qpdf unpaper pngquant \
|
||||
icc-profiles-free ca-certificates curl
|
||||
apt-get install -y --no-install-recommends "${PKGS[@]}"
|
||||
log_info "System-Pakete ok ✓"
|
||||
|
||||
# Ghostscript-Versions-Check (Issue #3 + Issue #6)
|
||||
@@ -127,11 +167,25 @@ install_base() {
|
||||
echo "$REPO_DIR" > "$INSTALL_DIR/.repo_path"
|
||||
|
||||
log_step "Python venv"
|
||||
# Eine vorhandene, aber kaputte venv (z.B. nach Debian 12 -> 13) wird
|
||||
# weggesichert und neu gebaut — ein reines "-d"-Vorhandensein reicht nicht.
|
||||
if [ -d "$INSTALL_DIR/venv" ] && ! venv_is_healthy "$INSTALL_DIR/venv"; then
|
||||
local VENV_SAVED
|
||||
VENV_SAVED="$INSTALL_DIR/venv.old-$(date +%Y%m%d-%H%M%S)"
|
||||
log_warn "Vorhandene venv passt nicht mehr zum System-Python (Distributions-Upgrade?)."
|
||||
log_warn "Sie wird gesichert nach: $VENV_SAVED"
|
||||
mv "$INSTALL_DIR/venv" "$VENV_SAVED"
|
||||
fi
|
||||
if [ ! -d "$INSTALL_DIR/venv" ]; then
|
||||
python3 -m venv "$INSTALL_DIR/venv"
|
||||
fi
|
||||
"$INSTALL_DIR/venv/bin/pip" install --upgrade pip -q
|
||||
"$INSTALL_DIR/venv/bin/pip" install -r "$INSTALL_DIR/requirements.txt" -q
|
||||
if ! "$INSTALL_DIR/venv/bin/pip" install -r "$INSTALL_DIR/requirements.txt" -q; then
|
||||
log_error "Requirements liessen sich nicht installieren."
|
||||
log_error "Wahrscheinlich passt eine in requirements.txt gepinnte Version nicht"
|
||||
log_error "zu Python $(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])' 2>/dev/null || echo '?')."
|
||||
exit 1
|
||||
fi
|
||||
log_info "venv ok ✓"
|
||||
|
||||
log_step "systemd Template-Unit installieren"
|
||||
@@ -415,9 +469,15 @@ echo "=========================================="
|
||||
echo " PDF OCR Hotfolder — Installer"
|
||||
echo "=========================================="
|
||||
|
||||
# Auch eine vorhandene, aber kaputte venv loest die Basis-Installation aus
|
||||
# (sonst wuerde install.sh nach einem Distributions-Upgrade nichts reparieren).
|
||||
if [ ! -d "$INSTALL_DIR/venv" ] || [ ! -f "/etc/systemd/system/$SERVICE_TEMPLATE" ]; then
|
||||
log_step "Basis-Installation"
|
||||
install_base
|
||||
elif ! venv_is_healthy "$INSTALL_DIR/venv"; then
|
||||
log_warn "Basis-Installation vorhanden, aber die venv passt nicht mehr zum System-Python."
|
||||
log_step "Basis-Installation wird zur Reparatur erneut ausgefuehrt"
|
||||
install_base
|
||||
else
|
||||
log_info "Basis-Installation bereits vorhanden ($INSTALL_DIR)"
|
||||
log_info "Überspringe Basis-Setup (nutze update.sh für Code-Updates)"
|
||||
|
||||
Reference in New Issue
Block a user