Inventar- und Einsatz-Tracking für Veranstaltungstechnik mit QR-Codes. Konzept und Feature-Liste: KONZEPT.md
Als Desktop-App (macOS, Windows, Linux) — nichts weiter nötig, Installer doppelklicken: Releases. Anleitung und Grenzen der Desktop-Version: DESKTOP.md.
Ab Fassung 1.2.0 meldet sich die App selbst, wenn es eine neuere gibt. Unter Windows und Linux lädt und installiert sie das Update auf Nachfrage; auf dem Mac öffnet sie die Download-Seite, weil sich eine nicht notarisierte App dort nicht selbst ersetzen darf. Einzelheiten unter Updates.
Als Server (empfohlen, wenn Handys scannen sollen oder mehrere Personen gleichzeitig arbeiten): siehe Deployment weiter unten.
Wann was passt:
| Desktop-App | Server | |
|---|---|---|
| Einrichtung | Installer doppelklicken | Docker + Reverse-Proxy |
| Kamera-Scan am Handy | ❌ | ✅ |
| Standort beim Scan (GPS) | ❌ | ✅ |
| Mehrere Personen / Geräte | ❌ Daten bleiben lokal | ✅ |
| Update | meldet sich selbst | docker compose up -d --build |
npm install
npx prisma migrate dev # legt die SQLite-Datenbank an (prisma/data/ontrack.db)
npm run dev # → http://localhost:3000Der erste registrierte Benutzer wird automatisch Admin und ist sofort freigeschaltet. Alle weiteren Registrierungen müssen vom Admin unter Benutzer freigeschaltet werden.
Handy-Test im WLAN: npm run dev läuft auch unter http://<Mac-IP>:3000.
Achtung: Kamera (QR-Scan) und GPS funktionieren im Browser nur über HTTPS
oder localhost — im WLAN ohne HTTPS die manuelle Inventarnummern-Eingabe auf
der Scan-Seite nutzen. Auf dem VPS mit HTTPS funktioniert beides.
docker compose up -d --buildDie App läuft dann auf Port 3000; Datenbank und Foto-Uploads liegen in
Docker-Volumes (ontrack-db, ontrack-uploads) und überleben Updates.
HTTPS ist Pflicht (Kamera + GPS): davor einen Reverse-Proxy setzen, z. B. Caddy — kümmert sich automatisch um Zertifikate:
ontrack.beispiel.de {
reverse_proxy localhost:3000
}
Nach dem Deployment: In der App unter Einstellungen → App-Adresse für
QR-Codes die echte Adresse (z. B. https://ontrack.beispiel.de) eintragen,
bevor Etiketten gedruckt werden — sonst zeigen die QR-Codes auf localhost.
Im Docker-Betrieb läuft die Sicherung von allein mit. docker compose up -d
startet neben der App einen zweiten Dienst, der täglich einen Stand ablegt und
die letzten 14 aufhebt. Kein Zeitplan, an den jemand denken muss.
Was gesichert wird: die Datenbank (per VACUUM INTO, also ein in sich
stimmiger Stand auch bei laufendem Betrieb — eine gewöhnliche Dateikopie kann
mitten in einer Schreibaktion entstehen) und die hochgeladenen Fotos.
Einstellen lässt sich das über zwei Umgebungsvariablen:
| Variable | Standard | Bedeutung |
|---|---|---|
ONTRACK_BACKUP_KEEP |
14 |
Wie viele Stände aufgehoben werden |
ONTRACK_BACKUP_INTERVAL |
86400 |
Sekunden zwischen zwei Läufen |
Sofort einen Stand ziehen:
docker compose exec backup node scripts/backup.mjsDie Stände liegen im Volume ontrack_ontrack-backups. Herausholen:
docker run --rm -v ontrack_ontrack-backups:/b -v "$PWD":/ziel alpine sh -c "cp -r /b/. /ziel/ontrack-sicherung/"Ohne den Sicherungsdienst starten: docker compose up -d ontrack.
Eine Sicherung, die noch nie zurückgespielt wurde, ist eine Vermutung. Der Weg (App vorher anhalten, sonst schreibt sie in die Datei, die gerade ersetzt wird):
docker compose stop ontrack
docker run --rm -v ontrack_ontrack-backups:/b -v ontrack_ontrack-db:/db alpine sh -c "cp /b/ontrack-<ZEITSTEMPEL>.db /db/ontrack.db"
docker compose start ontrackFotos analog aus /b/uploads/ nach ontrack_ontrack-uploads. Migrationen
laufen beim Start automatisch, ein älterer Stand wird also mitgezogen.
Ohne Docker (lokal oder auf einem eigenen Server):
npm run backupZielordner und Anzahl über --ziel und --behalten bzw. die gleichnamigen
Umgebungsvariablen.
Next.js 16 (App Router) · Prisma 6 + SQLite · Tailwind CSS v4 · PWA QR-Scan: @zxing/browser · Etiketten-PDF: pdf-lib + qrcode Desktop-Build: Electron 43 + electron-builder
Der Quellcode ist öffentlich einsehbar, aber nicht Open Source. Die veröffentlichten Installer dürfen kostenfrei genutzt werden, auch im eigenen Unternehmen. Weitergabe, Veränderung und der Betrieb als Dienst für Dritte bedürfen der Zustimmung — siehe LICENSE.