rewrite eines Scanprograms in sveltekit
  • Svelte 60.4%
  • TypeScript 19.2%
  • Python 18.3%
  • HTML 1.4%
  • Shell 0.5%
  • Other 0.1%
Find a file
2026-05-12 23:31:11 +02:00
.github .github/pull_request_template.md hinzugefügt 2026-04-15 15:36:24 +00:00
apps/web mail-topbar-fix 2026-05-12 23:31:11 +02:00
scripts production 2026-04-22 13:41:43 +02:00
services maileingang fetcher fix 2026-05-12 22:55:06 +02:00
.env.example agent-proxy-mixed-content2 2026-04-29 12:18:19 +02:00
.gitignore production 2026-04-22 13:41:43 +02:00
CLA.md Init CLA 2026-04-15 15:29:37 +00:00
docker-compose.yml maileingang 2026-05-12 22:34:01 +02:00
license.md Init license 2026-04-15 15:26:38 +00:00
README.md README.md aktualisiert 2026-04-15 15:31:59 +00:00

digiscan-ng

Dokumenten-Scan-Pipeline mit Blind-Double-Entry-Indexierung.

Scanner-PC (Linux)          Server
scanimage (SANE)            SvelteKit + PostgreSQL
ocrmypdf (lokal, alle CPUs) Python Worker (OCR, Export)
PDF upload ──────────────►  Indexierung (2× blind)
                            Konflikt-Auflösung (Merger)
                            Export: PDF + CSV

Stack

Komponente Technologie
Frontend + API SvelteKit (Node, Port 3000)
OCR-Worker Python FastAPI + ocrmypdf + pikepdf
Datenbank PostgreSQL 16
Scanner-Agent Python mit lokaler Web-UI (Port 8089)

Benutzerrollen

Rolle Kann
indexer Dokumente blind erfassen (1. und 2. Durchlauf)
merger Konflikte auflösen — sieht beide Erfassungen
admin Alles: Benutzer, Dokumenttypen, Export, Bereinigung

Standard-Login nach Erstinstallation: admin / changemesofort ändern!

Schnellstart (Server)

cp .env.example .env
# .env anpassen:
#   POSTGRES_PASSWORD   sicheres Passwort
#   AGENT_SECRET        32+ Zeichen, geheim
#   ORIGIN              https://scan.piriot.de

docker compose up -d

Caddy-Labels im Compose-File setzen den Host automatisch.

Scanner-Agent (Linux-Scanner-PC)

pip install -r agent/requirements.txt
# Systemabhängigkeiten:
apt install sane-utils ocrmypdf tesseract-ocr tesseract-ocr-deu img2pdf

# Agent starten — öffnet Browser-UI auf http://localhost:8089
python agent/agent.py \
  --server https://scan.piriot.de \
  --secret <AGENT_SECRET>

Die Agent-UI zeigt: Scanner-Auswahl, Dokumenttyp, DPI, Live-Seitenvorschau, Fortschritt und Link zur Indexierung nach Upload.

Als systemd-Service

cp agent/digiscan-agent.service /etc/systemd/system/digiscan-agent.service
# Werte in der Unit-Datei anpassen (server, secret)
systemctl enable --now digiscan-agent

Workflow

Scan → Indexierung

  1. Operator startet Scan über Agent-UI
  2. Agent scannt ADF, führt OCR durch, lädt PDF hoch
  3. Job erscheint im Dashboard mit Live-Status
  4. Zwei Indexierer erfassen dasselbe Dokument blind (unabhängig voneinander)
  5. System vergleicht: stimmt alles → auto_approved, sonst → conflict
  6. Konflikte gehen in die Merger-Queue (/merge)
  7. Nach Freigabe aller Dokumente: Admin exportiert → PDF + CSV

Dokument-Status-Flow

pending → ocr_done → entry_1_done ──→ auto_approved ──→ exported
                           └──────→ conflict ──→ merged ──┘

Aufbewahrungsregeln

Pro Dokumenttyp konfigurierbar unter /admin/doctypes.

  • Standard: Jobs bleiben dauerhaft erhalten
  • Opt-in: Löschfrist nach Export (z.B. 90 Tage)
  • Cleanup unter /admin/cleanup: immer manuell mit Bestätigung
  • Exportierte PDFs bleiben beim Cleanup erhalten

Umgebungsvariablen

Variable Beschreibung Beispiel
POSTGRES_PASSWORD DB-Passwort sicher123
AGENT_SECRET Shared secret für Scanner-Agent 32-zeichen-geheim
ORIGIN Öffentliche URL der App https://scan.piriot.de
UPLOAD_DIR Eingehende Scandateien /data/incoming
EXPORT_DIR Exportierte PDFs + CSV /data/export
WORKER_URL Interner Worker-URL http://worker:8000

Entwicklung

cd apps/web
npm install
npm run dev     # Port 3000

cd services/worker
pip install -r requirements.txt
uvicorn main:app --reload --port 8000