Files
perinco-CRM/server/.env.example
T
Sascha WolfandClaude Opus 5.5 e2ad8ab03e feat(auth): Sitzungen laufen standardmaessig 7 Tage
JWT_EXPIRES_IN faellt ohne Eintrag in .env jetzt auf 7d statt 12h zurueck.
Doku und .env.example angepasst.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 22:05:24 +02:00

135 lines
5.4 KiB
Bash

# perinco CRM Backend
# Kopie als .env anlegen und Werte setzen. .env niemals committen.
PORT=5006
# Nur lokal binden - von aussen erreichbar ist die App ausschliesslich
# ueber den Apache-Reverse-Proxy.
HOST=127.0.0.1
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=changeme
DB_NAME=perinco_CRM
# Signiert die JWT-Sessions. Muss ein langer Zufallswert sein.
JWT_SECRET=changeme-langer-zufallswert
JWT_EXPIRES_IN=7d
# Wird beim ersten Start angelegt, falls noch kein Benutzer existiert.
ADMIN_USERNAME=admin
ADMIN_NAME=Administrator
ADMIN_EMAIL=admin@perinco.de
ADMIN_PASSWORD=changeme-starkes-passwort
# Das Diktat braucht hier keine Konfiguration: Whisper laeuft im Browser des
# Benutzers, eingestellt wird es im Reiter "Whisper" der Anwendung.
# ---------------------------------------------------------------------------
# Postfachanbindung Microsoft 365 (crm@perinco.de)
# ---------------------------------------------------------------------------
# Lesender Zugriff ueber Microsoft Graph mit App-only-Berechtigung
# (Client Credentials). Benoetigt wird in Entra genau eine
# Anwendungsberechtigung: Mail.Read, mit Administratorzustimmung. Kein
# Schreibzugriff, kein Redirect-URI, kein interaktiver Login.
#
# Fehlen diese Werte, startet das CRM normal - die Postfachanbindung meldet in
# den Einstellungen, welche Angabe fehlt, und der Abgleich bleibt aus.
#
# In Exchange Online zusaetzlich den Zugriff auf dieses eine Postfach begrenzen,
# sonst darf die App jedes Postfach im Tenant lesen:
# New-ApplicationAccessPolicy -AppId <MS_CLIENT_ID> `
# -PolicyScopeGroupId crm@perinco.de -AccessRight RestrictAccess `
# -Description "perinco CRM: nur crm@perinco.de"
MS_TENANT_ID=
MS_CLIENT_ID=
MS_CLIENT_SECRET=
MS_MAILBOX=crm@perinco.de
# Ordner im Postfach. "inbox" ist ein von Graph vorgegebener Name.
# MS_MAIL_FOLDER=inbox
# Hintergrundabgleich. Standard ist AN; nur "false" schaltet ihn hart ab.
# Intervall, Zeitraum und automatische Kontaktuebernahme stehen dagegen in den
# Einstellungen der Anwendung (Tabelle crm_settings).
MAIL_SYNC=true
# Bremse fuer den Erstabgleich: so viele Delta-Seiten holt ein Lauf hoechstens.
# Der naechste Lauf setzt an derselben Stelle fort.
# MAIL_MAX_PAGES=20
# Obergrenze fuer den gespeicherten Mailtext je Nachricht (Zeichen).
# MAIL_MAX_BODY_CHARS=400000
# ---------------------------------------------------------------------------
# Projekt Scanner (portiert)
# ---------------------------------------------------------------------------
# Eigene Datenbank, eigener Schluessel, eigenes Upload-Verzeichnis, eigener
# Scheduler. Die eigenstaendige Vorgaenger-App wurde am 09.09.2026
# zurueckgebaut, es gibt keine zweite Instanz mehr.
# Wird beim Start automatisch angelegt, falls sie fehlt.
SCANNER_DB_NAME=perinco_scanner
# SCANNER_DB_HOST=localhost
# SCANNER_DB_PORT=3306
# SCANNER_DB_USER=root
# SCANNER_DB_PASSWORD=
# Schluessel fuer die Portal-Passwoerter (AES).
# Langer Zufallswert, z. B.: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
SCANNER_ENCRYPTION_KEY=
# Verzeichnis fuer die CV-PDFs. Leer = <server>/uploads.
SCANNER_UPLOAD_DIR=
# Hintergrund-Scraper (Playwright + OpenAI). Standard ist AN; nur "false"
# schaltet ihn ab.
SCANNER_SCHEDULER=true
# Minuten Versatz fuer den allerersten Lauf. Stammt aus dem Parallelbetrieb mit
# der alten App und ist seit deren Rueckbau ohne Wirkung, solange in der
# Datenbank ein last_scan_at steht - der traegt den Zeitplan ueber Neustarts.
# 0 = sofort loslegen.
SCANNER_SCHEDULER_OFFSET=0
# Fallback fuer den OpenAI-Key; bevorzugt wird der Wert aus Einstellungen > KI.
# Dort wird auch das Modell je Einsatzzweck gewaehlt.
# OPENAI_MODEL setzt nur die Vorgabe der erweiterten Suche.
# OPENAI_API_KEY=
# ---------------------------------------------------------------------------
# Anmeldung ueber Microsoft Entra (SSO)
# ---------------------------------------------------------------------------
# Nutzt dieselbe App-Registrierung wie die Postfachanbindung - also dieselben
# MS_TENANT_ID / MS_CLIENT_ID / MS_CLIENT_SECRET, kein zweites Secret.
#
# In Entra zusaetzlich noetig:
# - Authentifizierung > Plattform hinzufuegen > Web
# Umleitungs-URI: der Wert von MS_SSO_REDIRECT_URI, zeichengenau
# Implizite Genehmigung: beide Haken aus
# - Delegierte Berechtigungen mit Administratorzustimmung:
# openid, profile, User.Read (Foto zusaetzlich: ProfilePhoto.Read.All)
#
# Es werden keine Konten angelegt: wer sich per Microsoft anmeldet, braucht ein
# bestehendes CRM-Konto mit derselben E-Mail-Adresse. Die Anmeldung mit
# Benutzername und Passwort bleibt parallel bestehen.
#
# Ohne MS_SSO_ENABLED=true bleibt alles aus und die Anmeldemaske sieht aus wie
# bisher.
MS_SSO_ENABLED=false
MS_SSO_REDIRECT_URI=https://crm.perinco.de/api/auth/sso/callback
# Optionale Einschraenkung auf E-Mail-Domains, kommagetrennt. Leer = keine
# zusaetzliche Pruefung; Tenant und vorhandenes CRM-Konto begrenzen ohnehin.
# icon-experts.de gehoert dazu - Konten dieser Domain arbeiten mit im CRM.
MS_SSO_ALLOWED_DOMAINS=perinco.de,icon-experts.de
# Verschluesselt das Client-Secret, wenn es in der Oberflaeche hinterlegt wird
# (Einstellungen > Anmeldung). Fehlt der Wert, dient JWT_SECRET als Schluessel.
# Wird einer von beiden gewechselt, muss das Secret einmal neu eingetragen
# werden - die Oberflaeche weist darauf hin.
# CRM_ENCRYPTION_KEY=
# MS_CLIENT_SECRET oben ist seither nur noch die Rueckfallebene: Vorrang hat der
# in den Einstellungen hinterlegte Wert.