Files
perinco-CRM/docs
Sascha WolfandClaude Opus 5 e58b94f007 fix(scanner): Zeitplan uebersteht Neustarts
Die Sperrfrist nach dem Start begann bei jedem Neustart von vorn. Zwei
Deployments im Abstand von zehn Minuten haben den faelligen Suchlauf damit
zweimal um eine halbe Stunde verschoben - er fand nie statt. Wer oefter als
alle SCANNER_SCHEDULER_OFFSET Minuten deployt, hat einen Scanner, der
automatisch nie sucht.

Der Zeitpunkt des letzten Laufs liegt jetzt in settings.last_scan_at, von der
Pipeline geschrieben (auch nach einem Abbruch, damit sich ein gescheiterter
Lauf nicht sofort wiederholt). Der Versatz greift nur noch, solange dort nichts
steht - also beim allerersten Start dieser Instanz, wo er gebraucht wird.

Der Scheduler liest den Wert zusaetzlich in jedem Tick: ein manueller Scan aus
der Oberflaeche schreibt ihn, weiss aber nichts von der Variablen im Scheduler.
Ohne den Abgleich konnte der Scheduler direkt hinter einem manuellen Lauf noch
einmal losziehen.

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

Dokumentation perinco CRM

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

Kapitel Inhalt
01 Architektur Topologie, Prozesse, Ports, Anfrageweg, Rollen
02 Datenmodell Tabellen beider Datenbanken als ER-Diagramme
03 Projekt Scanner Suchlauf von der Boerse bis zum Treffer, Parallelbetrieb
04 Diktat Spracherkennung im Browser, Modell-Lebenszyklus
05 Frontend Ansichten, Menue, Komponentenkarte, Zustand
06 Betrieb Deployment, Umgebungsvariablen, Dienste, Stoerungssuche

Die Anwendungsdokumentation - Bedienung, Designentscheidungen, Messwerte zur Spracherkennung - steht 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"]
        PW["Playwright<br/>Chromium"]
        DB1[("MariaDB<br/>perinco_CRM")]
        DB2[("MariaDB<br/>perinco_scanner")]
        ALT["alte Scanner-App<br/>:5005"]
        DB3[("MariaDB<br/>project_scanner")]
    end

    OAI["OpenAI<br/>gpt-4o-mini"]
    BOERSE["Projektboersen<br/>freelancermap, hays, ..."]

    SPA -->|"HTTPS /api"| AP
    AP --> API
    API --> DB1
    API --> DB2
    SCH --> PW
    PW --> BOERSE
    SCH --> OAI
    SCH --> DB2
    API -.-> SCH
    ALT --> DB3
    ALT --> BOERSE
    SPA -.->|"Audio bleibt im Browser"| WSP

    classDef alt fill:#f7f7f7,stroke:#9a9a9a,stroke-dasharray: 4 3
    class ALT,DB3 alt

Gestrichelt: die urspruengliche Scanner-App, die bis zur Ablosung parallel weiterlaeuft. Sie hat ihre eigene Datenbank und wird vom CRM nicht angefasst.