# 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=12h # 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 ` # -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 = /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.