Files
Laufzettel/.env.example
T
Florian WildeandClaude Opus 5 3cbd5026f8
Prüfung / pruefung (push) Canceled after 0s
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
feat(anhaenge): Fotos und Dateien an einem Schritt (#52)
Ein Schritt nimmt jetzt Bilder (JPEG, PNG, WebP, HEIC) und PDF auf, am
Handy direkt aus der Kamera. Die Dateien liegen im Dateisystem unter
ANHAENGE_PFAD, nach Kunde und Lauf gegliedert; in der Datenbank stehen
nur Name, Typ, Groesse und Pruefsumme. Der Pfad entsteht aus der
Kennung, nie aus dem Dateinamen vom Browser.

Jeder Abruf prueft Recht und Mandantengrenze — auch der des Bildes
selbst: der Route Handler ruft rechtErforderlich() selbst, weil die
Huelle unter (app) Route Handler nicht abdeckt. Hochgeladen wird ueber
eine Server Action statt ueber einen zweiten Endpunkt; der
Archiv-Schreibschutz haengt an derselben einen Stelle wie alles andere
am Lauf. Kein SVG: ein SVG ist ein Dokument, das Skripte ausfuehrt.

In der Datenbank halten zwei CHECK-Bedingungen und zwei
zusammengesetzte Fremdschluessel fest, was auch gilt, wenn jemand an
der Service-Schicht vorbei schreibt — ein Anhang kann strukturell nicht
an einem Schritt eines anderen Laufs oder bei einem fremden Kunden
haengen.

docs/betrieb/sicherung.md ist neu geschrieben: dort stand "Kein
Upload-Verzeichnis, keine erzeugten Dateien", und eine Sicherung nach
der alten Anleitung haette ab hier still Daten verloren. Sicherung und
Ruecksicherung sind einmal wirklich gefahren, mit Pruefsummenvergleich.

Gefunden in der Klickprobe am gebauten Stand und nur dort: zwei Felder
"datei" in einem Formular, und FormData.get nahm das leere. Wer "Datei"
waehlte, bekam "Keine Datei gewaehlt", waehrend "Foto" ging. Die Regel
liegt jetzt als reine Funktion in src/lib, und tests/e2e/anhaenge.spec.ts
laedt bewusst ueber den zweiten Knopf hoch.

Closes #52

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-04 23:05:00 +02:00

104 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Laufzettel – Umgebungsvariablen.
# Kopieren nach .env und ausfuellen. Die .env gehoert nie ins Repo.
# ---------- Pflicht ----------
# Oeffentliche Adresse der Anwendung. Steckt in den QR-Codes und in der
# OIDC-Rueckruf-Adresse, muss also stimmen, wenn ein Reverse Proxy davor haengt.
APP_URL=https://laufzettel.example.de
# Geheimnis fuer Sitzungs-Cookies und die Verschluesselung des LDAP-Bind-Passworts.
# Mindestens 32 Zeichen. Erzeugen mit: openssl rand -base64 48
APP_SECRET=
# Zugang zur Datenbank.
#
# Im Compose-Stand baut sich die Adresse aus den drei POSTGRES_*-Werten zusammen:
# die Datenbank heisst dort `postgres` (Dienstname im internen Netz) und ist von
# aussen nicht erreichbar. DATABASE_URL wird dafuer **nicht** gelesen.
#
# DATABASE_URL gilt fuer alles, was ausserhalb der Container laeuft: `pnpm dev`,
# `pnpm prisma …`, `pnpm db:seed` von der Werkbank aus. Standard ist die
# ---- Anhaenge (#032) -------------------------------------------------------
# Wo die Dateien der Anhaenge liegen. Im Compose-Stand setzt docker-compose.yml
# das selbst auf /daten/anhaenge im Volume `anhaenge`; hier gilt es fuer die
# Entwicklung und die native Installation.
#
# **Gehoert in jede Sicherung.** In der Datenbank stehen nur die Metadaten.
ANHAENGE_PFAD=./daten/anhaenge
# Hoechstgroesse je Datei in MB und Hoechstzahl Anhaenge je Lauf.
ANHANG_MAX_MB=10
ANHAENGE_JE_LAUF=20
# Entwicklungsdatenbank aus docker-compose.dev.yml (Port 5434, umstellbar ueber DEV_DB_PORT).
POSTGRES_USER=laufzettel
POSTGRES_PASSWORD=
POSTGRES_DB=laufzettel
DATABASE_URL=postgresql://laufzettel:laufzettel@localhost:5434/laufzettel?schema=public
# ---------- Anmeldung ----------
# Lokaler Login mit E-Mail und Passwort. Fuer die Entwicklung und als Notfallzugang.
# Im Betrieb mit OIDC auf false setzen.
AUTH_LOCAL_ENABLED=false
# Generischer OIDC-Anbieter, Ziel ist authentik. Leer lassen, um OIDC abzuschalten.
OIDC_ISSUER=
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_NAME=authentik
# Angeforderte Bereiche. Der Standard reicht fuer authentik mit dem
# Gruppen-Mapping aus docs/betrieb/authentik.md. Nur aendern, wenn der Anbieter
# die Gruppen unter einem anderen Bereich liefert.
OIDC_SCOPE=openid profile email groups
# Zuordnung der Rollen ueber den groups-Claim. Wird bei jedem Login neu ausgewertet.
OIDC_GROUP_ADMIN=lz-admin
OIDC_GROUP_EDITOR=lz-redakteur
OIDC_GROUP_TECHNICIAN=lz-techniker
OIDC_GROUP_VIEWER=lz-leser
# Optional, nur im Betriebsmodus Dienstleistung: Gruppen wie lz-kunde-MUS binden
# Benutzer an Kunden. TECHNIKER und LESER sehen dann nur ihre Kunden.
# Leer lassen heisst: keine Einschraenkung.
OIDC_CUSTOMER_GROUP_PREFIX=
# ---------- Betrieb ----------
# Adresse, auf die der Webdienst gebunden wird. Standard ist nur localhost,
# davor gehoert ein Reverse Proxy. Fuer direkten Zugriff im LAN: 0.0.0.0
BIND_ADDR=127.0.0.1
APP_PORT=3000
# Wird beim Bauen in die Anzeige unten links uebernommen.
APP_VERSION=0.1.0
GIT_SHA=
# ---------- Seed ----------
SEED_ADMIN_EMAIL=admin@firma.example
SEED_ADMIN_PASSWORD=
# INTERN (Standard) oder DIENSTLEISTUNG. SERVICE wird als Alias akzeptiert.
SEED_MODE=INTERN
# Name der eigenen Organisation. Im Modus INTERN taucht er nirgends in der
# Oberflaeche auf, wird aber beim Wechsel zu DIENSTLEISTUNG zum ersten Kunden.
SEED_ORG_NAME=Eigene Organisation
# 2 bis 6 Grossbuchstaben oder Ziffern. Im Modus INTERN unsichtbar; im Modus
# DIENSTLEISTUNG steht das Kuerzel auf Etiketten und in der Hostname-Regel.
SEED_ORG_KUERZEL=EIGEN
# ---------- Verzeichnis-Abgleich ----------
# Der Zeitplan laeuft im selben Prozess wie die Anwendung und sieht jede Minute
# nach, welche Verzeichnisquelle faellig ist; das Intervall steht je Quelle in
# der Datenbank. `false` schaltet ihn ab — fuer Einmal-Container, die nur
# Migrationen fahren, und fuer Testlaeufe.
ZEITPLAN_AKTIV=true
# ---------- Tests ----------
# Datenbank fuer Vitest. Ohne diese Variable ueberspringen sich die Datenbanktests.
# Passend zu docker-compose.dev.yml (Port 5434, umstellbar ueber DEV_DB_PORT):
TEST_DATABASE_URL=postgresql://laufzettel:laufzettel@localhost:5434/laufzettel_test?schema=public