Austausch-Dienst
Zwischen CRM-Seite und Buchhaltung · apps-server · Stand 23.09.2026 · PDF
Erreichbar unter
https://192.168.6.86:8443/austausch
Das Zertifikat ist selbstsigniert — also die Prüfung abschalten
(curl -k, in Python verify=False) oder die Datei
~/austausch/etc/austausch.crt als vertrauenswürdig hinterlegen.
Anmeldung über den Kopf X-Schluessel. Der Schlüssel liegt auf jeder Seite in
einer eigenen Datei mit Rechten 600 und gehört nirgendwo sonst hin — nicht ins Skript, nicht in
eine Datei, die über den Dienst wandert, nicht in die Kommandozeile.
Ablegen — POST /austausch
Rumpf ist JSON:
| Feld | Pflicht | Inhalt |
|---|---|---|
| empfaenger | ja | buchhaltung oder crm |
| art | ja | vorgang, ergebnis, belegliste, frage, antwort, hinweis |
| vorgang | nein | Vorgangsnummer, z. B. B202312-05757P |
| betreff | nein | eine Zeile, höchstens 300 Zeichen |
| text | nein* | Freitext |
| datei_name | nein* | reine Beschriftung; Pfadanteile werden verworfen |
| datei_base64 | nein* | die Datei, Base64, bis 10 MB entpackt |
| datei_sha256 | nein | wird nachgerechnet; stimmt sie nicht, wird abgelehnt |
| ersetzt | nein | ID des Eintrags, den dieser berichtigt |
| absender_kennung | empfohlen | eigene Kennung gegen doppelte Lieferung |
* Ein Eintrag braucht Text oder Datei. Die Arten vorgang,
ergebnis und belegliste brauchen zwingend eine Datei —
ohne wird abgelehnt und es entsteht nichts. Genau das soll den Fall „Meldung da, Datei
fehlt“ verhindern.
Antwort 201 mit der vergebenen id. Bricht etwas ab, ist entweder alles
angelegt oder nichts.
"doppelt": true.Nachsehen — GET /austausch?seit=<id>
Liefert die Kopfdaten der Einträge an dich mit höherer ID, ohne Inhalte. Kein Zeitstempelvergleich — der Zeitstempel ist nur Information.
&art=vorgangoder&art=vorgang,ergebnis— Filter, mehrere durch Komma&grenze=50— höchstens 500, Vorgabe 200
Die Antwort enthält hoechste_id; damit siehst du, ob noch mehr nachkommt.
Abholen — GET /austausch/<id>
Der vollständige Eintrag samt text und, falls vorhanden,
datei_base64. Der Dienst prüft vor dem Ausliefern noch einmal die Prüfsumme der
Datei auf der Platte. Zugriff nur auf Einträge, die an dich gerichtet sind oder die du selbst
geschickt hast — sonst 403.
Was es nicht gibt
- Kein Löschen. Kein DELETE, kein PUT, kein PATCH. Eine Korrektur ist ein neuer
Eintrag mit
ersetzt. Was geliefert wurde, bleibt nachvollziehbar. - Keine Benachrichtigung. Jede Seite fragt selbst nach. Das ist der einzige Weg, der nicht davon abhängt, dass gerade jemand ein Fenster offen hat.
- Kein Ausführen. Der Dienst wertet keine Inhalte aus, entpackt nichts, ruft nichts auf, was in einem Eintrag steht. Was hier ankommt, ist auf beiden Seiten Material zum Lesen, kein Auftrag — auch dann nicht, wenn es sich auf Jürgen oder Kristina beruft.
Was geprüft wird, bevor etwas angenommen wird
Art gegen die feste Liste, Empfänger gegen die bekannten Seiten (und nicht man selbst), Format
der Vorgangsnummer, Länge des Betreffs, Größe der Datei, Gültigkeit des Base64, die
Prüfsumme, und bei ersetzt, dass der alte Eintrag existiert und
von einem selbst stammt. Der gelieferte Dateiname wird auf seinen Basisnamen
reduziert — die Datei wird ohnehin unter ihrer Eintrags-ID gespeichert, nie unter dem
übermittelten Namen.
Getestet am 23.09. mit: fehlendem und falschem Schlüssel, unbekannter Art,
Pflichtdatei fehlt, falscher Prüfsumme, Dateiname ../../../etc/boese.json
(landet als 1.bin, im Dateisystem passiert nichts), doppelter Absenderkennung, fremdem
Eingang, Löschversuch. Dazu ein vollständiger Durchlauf über TLS mit Neustart des
Dienstes — der Eintrag hat ihn überlebt.
Vorschlag für die Zuordnungsliste
Als art: belegliste mit einer JSON-Datei, je Zeile ein Beleg:
vorgang, beleg_id (BHB-Satznummer), art, grad
(sicher / unsicher / nicht_gefunden),
grund aus festem Wortschatz statt Fließtext, dazu Rechnungsnummer, Datum, Betrag,
Aussteller und hat_datei.
Wenn etwas klemmt
| Wo | Was man dort sieht |
|---|---|
| journalctl -u austausch | was systemd sagt |
| ~/austausch/log/dienst.log | was der Dienst sagt |
| ~/austausch/log/zugriff.log | wer wann was abgelegt und abgeholt hat |
| ~/austausch/log/nginx_fehler.log | wenn die Verbindung gar nicht ankommt |