Files
EKDOS/docs/N8N.md
T
Kyle Müller 940b2d4767
EK-DOS-WEB bauen und ausrollen / backend-pruefen (push) Failing after 2s
EK-DOS-WEB bauen und ausrollen / bauen-und-ausrollen (push) Skipped
Refactor deployment process and update documentation
- Removed nginx configuration file as it is no longer needed.
- Updated README.md to reflect changes in deployment structure.
- Enhanced DEPLOYMENT.md with detailed directory structure and user permissions.
- Added release.sh and rollback.sh scripts for managing deployments.
- Improved N8N.md to clarify file access and document handling.
- Adjusted health check and cache flushing procedures in deployment scripts.
2026-09-06 22:41:04 +02:00

148 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# n8n-Schnittstelle
Alle Fachdaten von EK-DOS-WEB liegen in n8n. Das Backend hält davon nichts vor
ausser einem kurzlebigen Cache.
## Adressen
Der n8n-Hauptdienst auf **Port 5678** ist ausschliesslich über
`https://n8n.elektro-krueger.eu` erreichbar. Jeder weitere n8n-Dienst auf einem
anderen Port ist nicht veröffentlicht und wird über **10.0.11.131** angesprochen.
In `backend/src/N8n/Endpoints.php`:
```php
$url->webhook('/offene-tickets'); // https://n8n.elektro-krueger.eu/webhook/ek-dos-web/offene-tickets
$url->internal(5679, '/webhook/irgendwas'); // http://10.0.11.131:5679/webhook/irgendwas
```
Neue Adressen gehören in diese Klasse, nicht verstreut in die Controller.
## Endpunkte
Alle unter `/webhook/ek-dos-web`. Die Spalte *Cache* nennt Gruppe sowie frische
und Rückfall-Haltbarkeit in Sekunden.
| Pfad | Verwendung | Cache |
| ----------------------------------- | -------------------------------- | ------------------------ |
| `/offene-tickets` | Ticketliste | `tickets` 15 / 600 |
| `/offene-tickets/kundenruecksprache`| Ergebnis speichern | schreibend |
| `/tickets/digitale-akte` | PDF | – |
| `/tickets/servicebericht` | PDF | – |
| `/angebote` | Angebotsliste | `offers` 30 / 600 |
| `/angebote/versendet` `/beauftragt` `/zuruecksetzen` `/loeschen` | Aktionen | schreibend |
| `/kundenstamm` | Kundenliste, Anlage, Änderung | `customers` 120 / 1800 |
| `/kundenstamm/digitale-akte` | PDF | – |
| `/rechnungen` | Rechnungen eines Kunden | `invoices` 30 / 600 |
| `/rechnungen/alle` | Gesamtübersicht (geschützt) | `invoices` 30 / 600 |
| `/rechnungen/zuordnen` `/sync` | Zuordnung, Abgleich (geschützt) | schreibend |
| `/rechnungen/pdf` | PDF | – |
| `/rechnungen-anfertigen` | Aufgabenliste | `invoices-create` 30/600 |
| `/rechnungen-anfertigen/erledigt` | Aufgabe abschließen | schreibend |
| `/rechnungen-pruefen` | Prüfliste | `invoices-review` 30/600 |
| `/rechnungen-versenden` | Versandliste und -bestätigung | `invoices-send` 30/600 |
| `/digitale-akte` | PDF als base64 im JSON | |
| `/interne-aufgaben` (+ `/erledigt` `/bearbeiten` `/loeschen`) | Aufgaben | `tasks` 20 / 600 |
| `/online-kaeufe` (+ `/erledigt` `/loeschen`) | Online-Käufe | `purchases` 30 / 600 |
| `/stundennachweise` | Monatsreport | `hours` 300 / 3600 |
## Geteilte Geheimnisse
| Kopfzeile | aus | wofür |
| -------------------------- | ------------------------- | ------------------------------------------------------------ |
| `x-ekdos-invoice-sync` | `N8N_INVOICE_SYNC_SECRET` | Rechnungsübersicht, Zuordnung, Abgleich, Kundenanlage, Angebot zurücksetzen |
| `X-EK-DOS-Customer-Key` | `N8N_CUSTOMER_KEY` | Lesen und Ändern im Kundenstamm |
| `x-ekdos-webhook-secret` | `N8N_REFRESH_SECRET` | n8n meldet EK-DOS eine Ticketänderung |
Fehlt eines davon, antworten die betroffenen Routen mit **503** und einer
Meldung, die genau das sagt -- sie schlagen nicht stumm fehl.
> Der Kundenschlüssel stand in der Next.js-Fassung als Literal im Quelltext
> (`app/api/customers/route.ts`). Er liegt jetzt in `.env`. **Er sollte in n8n
> gewechselt werden**, weil der alte Wert in der Versionsgeschichte steht.
## n8n meldet eine Ticketänderung
Der Workflow *Datenübergabe an EK-DOS-WEB* darf weiter auf seinen Endpunkt
zeigen, nur ohne Port:
```
POST https://schulung.elektro-krueger.local/api/tickets/refresh
x-ekdos-webhook-secret: <N8N_REFRESH_SECRET>
```
Anders als früher ist das kein Platzhalter mehr. In der Next.js-Fassung
antwortete die Route nur `{ok:true}` und tat sonst nichts; die Oberfläche sah
neue Tickets rein zufällig beim nächsten 20-Sekunden-Takt. Jetzt **verwirft der
Aufruf den Ticket-Cache**, sodass die nächste Abfrage die neuen Daten garantiert
sieht.
Ohne gesetztes `N8N_REFRESH_SECRET` verlangt die Route eine angemeldete Sitzung
und weist den Aufruf aus n8n mit 401 ab.
## Feldabbildung Tickets
Die einzige Stelle, an der das Backend n8n-Felder umbenennt
(`backend/src/Relay/TicketsController.php`):
| n8n | Oberfläche |
| -------------------------------- | ------------------------------ |
| `ticketnummer` / `id` | `id` |
| `kunde` / `customer` | `customer` |
| `liegenschaft` / `property` | `property` |
| `letzter_servicebericht_status` | `reportStatus` |
| `fortsetzung` | `continuation` |
| `entscheidung_code` | `decisionCode` |
| `kundenruecksprache_ergebnis` | `consultationResult` |
| `kundenruecksprache_am` / `_von` | `consultationUpdatedAt` / `By` |
`requiresCustomerConsultation` wird abgeleitet: entweder
`entscheidung_code === "TEILERLEDIGUNG_RUECKSPRACHE_KUNDE"`, oder der
Fortsetzungstext enthält „nimmt mit Kunden für das weitere Vorgehen Kontakt auf".
Zeilen ohne Ticketnummer werden verworfen.
## Bekannte Kopplung
Interne Aufgaben kennen in n8n genau zwei Empfänger: `sascha` und `svenja`. Ein
drittes EK-DOS-Konto kann sich anmelden und alle Ansichten nutzen, aber noch
keine Aufgaben zugewiesen bekommen. Dafür müsste der n8n-Workflow *Interne
Aufgaben* einen freien Empfängerschlüssel annehmen.
## Wo die Dateien tatsächlich liegen
EK-DOS-WEB liest **keine einzige Datei**. Weder die Next.js-Fassung noch das
PHP-Backend enthalten einen Dateisystemzugriff; der alte Container hatte auch
keinen Mount. Es gibt auch keinen PDF-Renderer: nichts wird erzeugt, nur
weitergereicht.
Alle Dokumente kommen als HTTP-Antwort aus n8n:
| Route | n8n liefert | EK-DOS-WEB tut |
| --------------------------------- | ---------------------- | ---------------------------- |
| `/api/tickets/digitale-akte` | PDF-Bytes | durchreichen |
| `/api/tickets/servicebericht` | PDF-Bytes | durchreichen |
| `/api/customers/digitale-akte` | PDF-Bytes | durchreichen |
| `/api/customer-invoices/pdf` | PDF-Bytes | Pfad prüfen, durchreichen |
| `/api/invoices-create/digitale-akte` | base64 im JSON | dekodieren, durchreichen |
| `/api/hours` | JSON-Report | Felder abbilden |
Der Mount `/mnt/n8n-nas` gehört zum **n8n-Container**, nicht zu dieser
Anwendung. Dort wird die Datei gelesen; EK-DOS-WEB fragt nur über HTTP danach.
Für den Webserver heisst das: er braucht keinen NAS-Zugang, keine SMB-Zugangs-
daten und keinen Mount. Ein Umzug des Webservers auf eine andere Maschine
berührt die Dateiablage nicht.
Zwei Dinge, die häufig hierher vermutet werden, aber nicht hier liegen:
- **Stundennachweise** sind kein Dokument. `/api/hours` liefert einen JSON-Report,
den n8n aus mehreren Quellen zusammensetzt. Es wird keine Datei gelesen.
- **Tageszusammenfassung und Tagesübersicht** kommen in der Anwendung nicht vor.
„Tageszusammenfassung" ist die Beschriftung von Workflow 9/13 im Schulungs-
diagramm; „TAGESÜBERSICHT" ist die Überschrift über der Begrüssung auf der
Startseite. Keines von beidem lädt Daten.
**Zeitgesteuerte Abläufe (Druckaufträge, morgendliche Berichte) gibt es in
EK-DOS-WEB nicht.** Es existiert kein Zeitplaner, kein Cron-Eintrag und kein
Druckcode -- weder alt noch neu. Solche Abläufe sind Schedule-Trigger in n8n und
laufen unabhängig von dieser Anwendung weiter. Der Umbau auf PHP berührt sie nicht.