Files
perinco-CRM/docs
Sascha WolfandClaude Opus 5 c8eaaa1947 feat(auth): Client-Secret in den Einstellungen pflegen, Warnung vor Ablauf
Das Secret der App-Registrierung laeuft in Entra ab. Bisher hiess das: jemand
mit SSH-Zugang aendert die .env und startet den Dienst neu - und niemand sieht
vorher, wann es soweit ist. Laeuft es aus, stehen Anmeldung UND
Postfachabgleich still, denn beide haengen an derselben Registrierung.

Neu unter Einstellungen > Anmeldung: Secret eintragen, Ablaufdatum hinterlegen,
Restlaufzeit ablesen. Ab 30 Tagen vor dem Ablauf bekommen Administratoren ueber
jeder Ansicht ein Hinweisband, das direkt dorthin fuehrt; nach dem Ablauf wird
es rot. Der Hinweis reist mit /api/badges mit, das die App ohnehin bei jedem
Laden abruft.

Bewusst so entschieden:
  - Das Secret muss dafuer in die Datenbank, entgegen der bisherigen Regel
    "keine Geheimnisse in crm_settings". Es liegt deshalb AES-256-GCM-
    verschluesselt dort; der Schluessel kommt aus CRM_ENCRYPTION_KEY, ersatz-
    weise JWT_SECRET, und steht damit nie im selben Dump.
  - Vor dem Speichern holt das CRM mit dem eingegebenen Wert ein Token bei
    Microsoft. Ein Tippfehler wird gar nicht erst uebernommen.
  - Gelesen wird Datenbank vor .env; der .env-Wert bleibt Rueckfallebene, und
    "Hinterlegtes Secret verwerfen" schaltet dorthin zurueck.
  - Passt der Schluessel nicht mehr, meldet die Oberflaeche das ausdruecklich,
    statt still auf die .env zurueckzufallen - sonst sucht man den Fehler an
    der falschen Stelle.
  - Das Ablaufdatum wird von Hand eingetragen. Aus Entra lesen braeuchte
    Application.Read.All, die die App bewusst nicht hat.

MAIL_CONFIGURED und SSO_CONFIGURED sind dadurch von Konstanten zu den
Funktionen mailConfigured() und ssoConfigured() geworden - die Pruefung muss
jetzt in die Datenbank sehen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 08:38:28 +02:00
..

Dokumentation perinco CRM

Technische Dokumentation mit Funktionszeichnungen. Die Diagramme sind Mermaid und werden von Gitea direkt gerendert.

Neu hier? Wer die Anwendung benutzen will, fängt bei 07 Anleitung für Benutzer an. Wer daran entwickeln will, bei 08 Anleitung für Entwickler. Beide setzen keine Vorkenntnisse voraus.

Kapitel Inhalt
01 Architektur Topologie, Prozesse, Ports, Anfrageweg, Rollen
02 Datenmodell Tabellen beider Datenbanken als ER-Diagramme
03 Projekt Scanner Suchlauf von der Börse bis zum Treffer, Rückbau der alten App
04 Diktat Spracherkennung im Browser, Modell-Lebenszyklus
05 Frontend Ansichten, Menü, Komponentenkarte, Zustand
06 Betrieb Deployment, Umgebungsvariablen, Dienste, Störungssuche
07 Anleitung für Benutzer Bedienung aller Bereiche, Schritt für Schritt
08 Anleitung für Entwickler Einrichten, erweitern, bekannte Fallen
09 Quellcode-Referenz jede Datei, ihre Exporte und Zusagen
10 Glossar Agent, Match, Lead, Opportunity, Status- und Portalwerte
11 Postfachanbindung crm@perinco.de über Microsoft Graph, Kontakte aus Mails
12 Globale Suche Volltext und erweiterte Suche im Kopf der Anwendung
13 Anmeldung über Microsoft SSO mit Entra, Zuordnung der Konten, Einrichtung

Die Designentscheidungen und die Messwerte zur Spracherkennung stehen im README des Projekts.

Das Ganze in einem Bild

flowchart TB
    subgraph Browser
        SPA["React-SPA<br/>Vite-Build"]
        WSP["Whisper im Web Worker<br/>WebGPU / WASM"]
    end

    subgraph Server["Server 212.227.135.41"]
        AP["Apache<br/>:443"]
        API["Express-Backend<br/>127.0.0.1:5006"]
        SCH["Scanner-Scheduler<br/>node-cron"]
        MSCH["Mail-Scheduler<br/>node-cron"]
        PW["Playwright<br/>Chromium"]
        DB1[("MariaDB<br/>perinco_CRM")]
        DB2[("MariaDB<br/>perinco_scanner")]
    end

    OAI["OpenAI<br/>gpt-4o-mini"]
    BOERSE["Projektbörsen<br/>freelancermap, hays, ..."]
    GRAPH["Microsoft Graph<br/>crm@perinco.de"]

    SPA -->|"HTTPS /api"| AP
    AP --> API
    API --> DB1
    API --> DB2
    SCH --> PW
    PW --> BOERSE
    SCH --> OAI
    SCH --> DB2
    API -.-> SCH
    API -.-> MSCH
    MSCH -->|"Delta Query, nur lesend"| GRAPH
    MSCH --> DB1
    SPA -.->|"Audio bleibt im Browser"| WSP

Die ursprüngliche Scanner-App unter scanner.perinco.de ist am 09.09.2026 zurückgebaut worden; das CRM ist seither die einzige Instanz.