-> Inter-Data -> Technik -> Echtzeit-Server (SSE)

Echtzeit-Server (SSE)

Node.js SSE-Server für Live-Updates in allen Modulen

Prinzip

Der Echtzeit-Server ist ein eigenständiger Node.js-Dienst, der zwischen PostgreSQL und dem Browser vermittelt. Wenn sich in der Datenbank etwas ändert, sendet PostgreSQL über NOTIFY ein Ereignis. Der SSE-Server empfängt es per LISTEN und leitet es über eine offene HTTP-Verbindung an den Browser weiter.

Datenbank
PostgreSQL löst pg_notify() bei relevanten Änderungen aus
SSE-Server
Node.js empfängt die Benachrichtigung per LISTEN und schreibt sie in den HTTP-Stream
Browser
EventSource-API empfängt das Ereignis und aktualisiert die Oberfläche

Kein Polling, keine Verzögerung. Änderungen erscheinen innerhalb von Millisekunden.

Kanäle

Der Server lauscht auf sechs PostgreSQL-Kanäle pro Mandant:

crmti_change
Neue und verpasste Anrufe, Kontaktänderungen
whatsapp_message
Ein- und ausgehende WhatsApp-Nachrichten
calendar_change
Neue, verschobene oder gelöschte Kalendereinträge
faktura_change
Änderungen an Angeboten, Aufträgen, Rechnungen und Positionen
weroni_question
Offene Rückfragen der KI-Assistentin Weroni
camera_event
Erkannte Objekte und Alarme der Videoüberwachung

Module mit Echtzeit-Updates

Die folgenden Bereiche reagieren auf SSE-Ereignisse und aktualisieren sich ohne Seitenreload:

  • InfoBar — Zähler für ungelesene Anrufe, E-Mails, WhatsApp-Nachrichten und Weroni-Rückfragen
  • Kalender — Neue oder verschobene Termine erscheinen sofort
  • Faktura — Belegstatus-Änderungen werden live synchronisiert
  • WhatsApp — Eingehende Nachrichten erscheinen direkt im Chat
  • Kamera — Neue Erkennungen und Alarme in der Live-Ansicht
  • Wall-Display — Großbildschirm-Modus mit Echtzeit-Aktualisierung
  • Mechaniker-Modus — Auftragszuweisungen und Statuswechsel in Echtzeit

Mandantentrennung

Jeder Mandant erhält eine eigene PostgreSQL-LISTEN-Verbindung. Die Zuordnung erfolgt über die Session:

  1. Der Browser sendet den Session-Cookie mit der SSE-Anfrage.
  2. Der SSE-Server ermittelt über die Auth-Datenbank den zugehörigen Mandanten.
  3. Eine dedizierte LISTEN-Verbindung zur Mandanten-Datenbank wird hergestellt (oder wiederverwendet).
  4. Ereignisse erreichen ausschließlich die Benutzer des jeweiligen Mandanten.

LISTEN-Verbindungen werden automatisch aufgebaut, wenn sich der erste Benutzer eines Mandanten verbindet, und geschlossen, wenn der letzte Benutzer die Verbindung trennt.

Stabilität

Heartbeat
Alle 30 Sekunden ein Kommentar-Frame — hält die Verbindung durch Proxies und Load-Balancer offen
Auto-Reconnect
Browser stellt die Verbindung bei Abbruch automatisch wieder her (EventSource-Standard)
DB-Reconnect
PostgreSQL-LISTEN-Verbindungen werden bei Abbruch nach 5 Sekunden neu aufgebaut
Graceful Shutdown
SIGTERM/SIGINT schließen alle Verbindungen und Pools sauber
Polling-Fallback
E-Mail (60 Sek.) und WhatsApp (120 Sek.) haben zusätzliche Polling-Intervalle als Absicherung

Auto-Reload bei Deployment

Der SSE-Server überwacht die Datei build-id.txt im Build-Verzeichnis. Ändert sich die Build-ID nach einem Deployment, erhalten alle verbundenen Browser ein build_changed-Ereignis und laden die Anwendung automatisch neu.

Deployment

Der SSE-Server läuft als Hintergrundprozess im Docker-Container neben Apache und PHP-FPM. Apache leitet /sse/-Anfragen per Reverse-Proxy an Port 3001 weiter.

Runtime
Node.js 22 (native http-Modul, keine Frameworks)
Abhängigkeit
pg (PostgreSQL-Client) — einzige externe Abhängigkeit
Port
3001 (konfigurierbar über SSE_PORT)
Health-Check
GET /health — gibt ok zurück
Reverse-Proxy
Apache: ProxyPass /sse/ http://127.0.0.1:3001/

Häufig gestellte Fragen

Nein. LxCars nutzt Server-Sent Events (SSE) — ein einfacheres Protokoll, das über Standard-HTTP läuft und von jedem Reverse-Proxy ohne Sonderkonfiguration durchgelassen wird.

Der Browser stellt die SSE-Verbindung automatisch wieder her. Auf Serverseite werden getrennte PostgreSQL-Listener nach 5 Sekunden neu aufgebaut.

Ja. Jeder Mandant erhält eine eigene PostgreSQL-LISTEN-Verbindung. Ereignisse eines Mandanten erreichen ausschließlich dessen Benutzer.

Gering. Der SSE-Server hält offene HTTP-Verbindungen und leitet PostgreSQL-Benachrichtigungen weiter. Es gibt keine Polling-Schleifen und keine eigene Geschäftslogik.