rewrite eines Scanprograms in sveltekit
- Svelte 60.4%
- TypeScript 19.2%
- Python 18.3%
- HTML 1.4%
- Shell 0.5%
- Other 0.1%
| .github | ||
| apps/web | ||
| scripts | ||
| services | ||
| .env.example | ||
| .gitignore | ||
| CLA.md | ||
| docker-compose.yml | ||
| license.md | ||
| README.md | ||
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 / changeme — sofort ä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
- Operator startet Scan über Agent-UI
- Agent scannt ADF, führt OCR durch, lädt PDF hoch
- Job erscheint im Dashboard mit Live-Status
- Zwei Indexierer erfassen dasselbe Dokument blind (unabhängig voneinander)
- System vergleicht: stimmt alles →
auto_approved, sonst →conflict - Konflikte gehen in die Merger-Queue (
/merge) - 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