465ff8873f
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>
135 lines
5.3 KiB
TOML
135 lines
5.3 KiB
TOML
# PDF OCR Hotfolder — Konfiguration
|
|
# Vorlage — install.sh erzeugt daraus pro Instanz /etc/pdf-ocr-hotfolder/<instanz>.toml
|
|
|
|
[paths]
|
|
# ACHTUNG: Alle Pfade MUESSEN absolut sein. Ein relativer Pfad wuerde gegen
|
|
# das Arbeitsverzeichnis des Dienstes aufgeloest (WorkingDirectory der
|
|
# systemd-Unit), nicht gegen das Verzeichnis dieser Datei — der Scanner
|
|
# schriebe dann woanders hin als der Dienst schaut. Der Dienst startet
|
|
# deshalb mit einem relativen Pfad gar nicht erst.
|
|
# Eingangsverzeichnis: hier landen gescannte PDFs
|
|
incoming = "/var/lib/pdf-ocr-hotfolder/incoming"
|
|
# Ausgangsverzeichnis: fertige durchsuchbare PDFs
|
|
outgoing = "/var/lib/pdf-ocr-hotfolder/outgoing"
|
|
# Arbeitsverzeichnis (während Verarbeitung)
|
|
working = "/var/lib/pdf-ocr-hotfolder/working"
|
|
# Fehlerverzeichnis: PDFs, die nicht verarbeitet werden konnten
|
|
error = "/var/lib/pdf-ocr-hotfolder/error"
|
|
|
|
[ocr]
|
|
# Tesseract-Sprachen (z.B. "deu", "deu+eng")
|
|
languages = "deu+eng"
|
|
# Anzahl Threads pro PDF (ocrmypdf --jobs)
|
|
jobs = 4
|
|
# Bereits OCR-haltige Seiten überspringen statt neu zu OCRen
|
|
skip_text = true
|
|
# Auflösung für gerasterte Seiten
|
|
oversample = 300
|
|
# PDF/A-Konformitätsstufe ("1", "2", "3" oder leer für keinen PDF/A-Output)
|
|
# ACHTUNG: Ghostscript 10.0.0 bis 10.02.0 (Debian 12 default!) haben einen Bug;
|
|
# ocrmypdf lehnt damit die Kombination pdfa_level + skip_text=true komplett ab.
|
|
# Nur auf "1"/"2"/"3" setzen, wenn gs >= 10.02.1 installiert ist.
|
|
#
|
|
# Auf Debian 12 lässt sich Ghostscript NICHT anheben: bookworm-backports
|
|
# enthält kein Ghostscript-Paket. Wer dort PDF/A braucht, hat auf dieser
|
|
# Distribution keinen Weg — es bleiben pdfa_level = "" (kein PDF/A),
|
|
# skip_text = false oder eine Distribution mit neuerem Ghostscript
|
|
# (Debian 13 liefert 10.05.1).
|
|
#
|
|
# pdfa_level = "" ist deshalb der Default — aber KEIN genereller Schutz gegen
|
|
# den Ghostscript-Bug: das gilt erst zusammen mit ocrmypdf >= 17. Bis
|
|
# ocrmypdf 16.x läuft dieselbe Prüfung auch ohne PDF/A, und dann scheitert mit
|
|
# skip_text = true jede einzelne Datei. Die Entwarnung hängt also an der
|
|
# ocrmypdf-Version, nicht an dieser Zeile; requirements.txt pinnt darum 17.x.
|
|
# Der Preflight prüft beides zusammen und lässt den Dienst gar nicht erst
|
|
# starten, wenn die Kombination nicht trägt.
|
|
pdfa_level = ""
|
|
# Schiefe Scans automatisch begradigen
|
|
deskew = true
|
|
# Hintergrund säubern
|
|
clean = false
|
|
# Maximale parallele PDFs (Hauptsystem hat selten mehr als 1-2 gleichzeitig)
|
|
max_workers = 2
|
|
# Max. Sekunden, die Tesseract pro SEITE laufen darf (0 = kein Limit).
|
|
# ocrmypdf kennt kein Gesamt-Timeout pro Dokument, nur dieses Seiten-Limit
|
|
# (ocrmypdf-Option --tesseract-timeout). Läuft eine Seite in den Timeout,
|
|
# wird sie ohne Textebene ins Ergebnis übernommen; die Verarbeitung der
|
|
# restlichen Seiten läuft weiter.
|
|
# 0 = wir geben kein Limit vor und überlassen es dem ocrmypdf-Default.
|
|
timeout = 300
|
|
|
|
[output]
|
|
# Wie soll die Ziel-Datei im outgoing/-Ordner benannt werden?
|
|
# "prefix" : name_tag wird vor den Dateinamen gestellt (OCR_scan.pdf)
|
|
# "suffix" : name_tag wird vor die Extension gestellt (scan_OCR.pdf)
|
|
# "none" : Dateiname bleibt wie das Original
|
|
name_mode = "prefix"
|
|
# Verbatim einzufügender String. Leerer String = kein Tag (wie mode="none").
|
|
# Beispiele: "OCR_", "[OCR]_", "_OCR", "_searchable"
|
|
name_tag = "OCR_"
|
|
# Was passiert mit dem Original, wenn OCR erfolgreich war?
|
|
# "delete" : Original wird gelöscht (alter Standard)
|
|
# "archive" : Original wird in archive_dir verschoben
|
|
original_on_success = "delete"
|
|
# Absoluter Pfad (Pflicht, relativ wird abgelehnt); nur relevant wenn
|
|
# original_on_success = "archive"
|
|
archive_dir = ""
|
|
|
|
[verapdf]
|
|
# PDF/A-Validierung (optional)
|
|
# ACHTUNG: Mit enabled = true muss "binary" auf ein vorhandenes, ausfuehrbares
|
|
# Programm zeigen. Der Preflight prueft das und laesst den Dienst sonst gar
|
|
# nicht erst starten (--check-config meldet Exit 2). Grund: ein nicht
|
|
# aufrufbares veraPDF wuerde jede einzelne PDF als ungueltig werten, das
|
|
# OCR-Ergebnis nach error/ schieben und das Original laut
|
|
# original_on_success entsorgen — bei "delete" also Scan fuer Scan die
|
|
# Vorlage vernichten, waehrend der Dienst als "laeuft" dasteht.
|
|
enabled = false
|
|
binary = "/opt/verapdf/verapdf"
|
|
flavour = "1b"
|
|
|
|
# Upload-Ziele — beliebig viele aktivierbar.
|
|
# Wenn alle deaktiviert sind, bleibt das fertige PDF einfach im outgoing-Ordner.
|
|
|
|
[upload.folder]
|
|
enabled = true
|
|
# Wenn leer, wird [paths].outgoing verwendet. Sonst: absoluter Pfad (Pflicht,
|
|
# relativ wird abgelehnt). Liegt im Ziel schon eine gleichnamige Datei, wird
|
|
# die neue mit Zeitstempel abgelegt statt die alte zu ueberschreiben.
|
|
target = ""
|
|
|
|
[upload.nextcloud]
|
|
enabled = false
|
|
url = "https://cloud.example.com"
|
|
username = "scanuser"
|
|
password = "app-password"
|
|
# Zielpfad relativ zum User-Root, z.B. "Scans/Inbox"
|
|
remote_path = "Scans/Inbox"
|
|
verify_ssl = true
|
|
|
|
[upload.sftp]
|
|
enabled = false
|
|
host = "sftp.example.com"
|
|
port = 22
|
|
username = "scanuser"
|
|
# Entweder Key-Datei oder Passwort
|
|
key_file = "/etc/pdf-ocr-hotfolder/sftp_key"
|
|
password = ""
|
|
remote_path = "/uploads"
|
|
|
|
[notify.email]
|
|
enabled = false
|
|
smtp_host = "smtp.example.com"
|
|
smtp_port = 587
|
|
smtp_user = "alerts@example.com"
|
|
smtp_password = "secret"
|
|
use_starttls = true
|
|
from_addr = "PDF OCR Hotfolder <alerts@example.com>"
|
|
to_addrs = ["admin@example.com"]
|
|
# Wann benachrichtigen: "always" | "errors" | "never"
|
|
on = "errors"
|
|
|
|
[logging]
|
|
# DEBUG | INFO | WARNING | ERROR
|
|
level = "INFO"
|