Der Kunde soll mit einem Zettel zur Kasse gehen koennen, auf dem steht, was er zahlen muss. Drei Wege fuehren jetzt zu einem Bon: der Knopf "Bon" auf der Timer-Karte druckt den Zwischenstand und laesst den Timer weiterlaufen, "Beenden" druckt den Endbeleg, und in der Historie laesst sich jeder Beleg nachdrucken. Der Drucker haengt per USB an einem Raspberry Pi und ist damit vom Timer-Server aus nicht direkt erreichbar. Auf dem Pi laeuft deshalb eine kleine Bruecke (deploy/bondrucker/, nur Python-Standardbibliothek), die fertige ESC/POS-Daten per HTTP annimmt. Das Bon-Layout bleibt bewusst hier im Repo, damit Aenderungen daran nicht auf dem Pi angefasst werden muessen. Beim Beenden wird erst gespeichert und dann gedruckt. Eine leere Papierrolle ist damit ein Papierproblem und kein Datenproblem - der Vorgang steht in der Historie, die Oberflaeche sagt ausdruecklich, dass der Bon nicht gedruckt wurde, und nennt den Grund. Ohne PRINTER_HOST in der .env ist die Druckfunktion aus und die App verhaelt sich unveraendert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
80 lines
3.0 KiB
Bash
80 lines
3.0 KiB
Bash
# ===========================================================================
|
|
# Timer App - Konfiguration
|
|
# Diese Datei nach ".env" kopieren und ausfuellen. Die .env gehoert NICHT
|
|
# in die Versionsverwaltung.
|
|
# ===========================================================================
|
|
|
|
# --- Netzwerk --------------------------------------------------------------
|
|
|
|
PORT=3003
|
|
|
|
# Auf welcher Adresse gelauscht wird.
|
|
# 127.0.0.1 = nur lokal erreichbar -> RICHTIG, wenn ein Reverse Proxy
|
|
# (nginx, Caddy, Traefik) davorsteht
|
|
# 0.0.0.0 = im ganzen Netz erreichbar -> nur ohne Reverse Proxy, und dann
|
|
# bitte COOKIE_SECURE=false beachten (siehe unten)
|
|
HOST=127.0.0.1
|
|
|
|
# Anzahl der Proxy-Ebenen davor. Bei genau einem Reverse Proxy: 1.
|
|
# Ohne Reverse Proxy: false
|
|
TRUST_PROXY=1
|
|
|
|
# --- Sicherheit ------------------------------------------------------------
|
|
|
|
# ACHTUNG, haeufigste Fehlerquelle beim Deployment:
|
|
# true -> Cookie wird NUR ueber HTTPS gesetzt. Laeuft die App ueber http://,
|
|
# scheitert der Login STUMM (Passwort wird akzeptiert, aber die
|
|
# Sitzung kommt nie zustande).
|
|
# false -> auch ueber http:// nutzbar. Nur im internen Netz vertretbar.
|
|
COOKIE_SECURE=true
|
|
|
|
# Zufaelliger Wert, unterschreibt die Sitzungs-Cookies.
|
|
# Erzeugen mit: npm run gen-secret
|
|
SESSION_SECRET=HIER_EINEN_ZUFALLSWERT_EINSETZEN
|
|
|
|
# Passwort fuer die Anmeldung. ZWEI Wege - bitte den ersten waehlen:
|
|
#
|
|
# 1) EMPFOHLEN: bcrypt-Hash. Erzeugen mit:
|
|
# npm run hash-password -- "MeinPasswort"
|
|
PASSWORD_HASH=
|
|
|
|
# 2) Notfalls Klartext. Wird beim Start gehasht, steht aber lesbar in dieser
|
|
# Datei. Der Server warnt beim Start. Nur eins von beiden setzen.
|
|
#PASSWORD=
|
|
|
|
# Anmeldeversuche pro Zeitfenster (Schutz gegen Durchprobieren)
|
|
LOGIN_MAX_ATTEMPTS=20
|
|
LOGIN_WINDOW_MIN=15
|
|
|
|
# --- Daten -----------------------------------------------------------------
|
|
|
|
# Pfad zur SQLite-Datei. Standard: ../data/timer.db relativ zum backend/.
|
|
# Das Verzeichnis muss existieren und fuer den Dienst-Benutzer schreibbar sein.
|
|
#DB_PATH=/var/lib/timer-app/timer.db
|
|
|
|
# Nur beim allerersten Start relevant: setzt den Anfangstarif.
|
|
# Danach wird der Tarif in der Datenbank gepflegt (Menue "Einstellungen").
|
|
RATE_PER_10MIN=10
|
|
|
|
# --- Bondrucker ------------------------------------------------------------
|
|
# Der Bondrucker haengt per USB an einem Raspberry Pi. Auf dem Pi laeuft die
|
|
# Bruecke aus deploy/bondrucker/ und nimmt fertige Druckdaten per HTTP an.
|
|
# Einrichtung des Pi: siehe deploy/bondrucker/README.md
|
|
#
|
|
# Bleibt PRINTER_HOST leer, ist die Druckfunktion aus - die App laeuft dann
|
|
# genau wie vorher, nur ohne Bon-Knoepfe.
|
|
|
|
PRINTER_HOST=
|
|
PRINTER_PORT=9100
|
|
|
|
# Muss mit PRINT_TOKEN aus /etc/bondrucker/env auf dem Pi uebereinstimmen.
|
|
# install.sh gibt den Wert am Ende aus.
|
|
PRINTER_TOKEN=
|
|
|
|
# Zeichen je Zeile. 42 = 80-mm-Papier (Standard), 32 = 58-mm-Papier.
|
|
PRINTER_WIDTH=42
|
|
|
|
# Abbruch, wenn der Pi nicht antwortet. Lieber kurz: ein haengender Drucker
|
|
# darf das Beenden eines Timers nicht blockieren.
|
|
PRINTER_TIMEOUT_MS=6000
|