Skip to content

DATAZONE Connect

DATAZONE Connect ist ein generischer Script-Runner fuer Integrationen mit Drittsystemen. Er laeuft als eigener Docker-Container und stellt eine REST-API bereit, ueber die Scripts mit Variablen ausgefuehrt werden koennen.

Konzept

Connect verfolgt einen Scripts-first-Ansatz: Jede Integration (Nuclos, Teams, Slack, Zammad, etc.) ist ein einfaches Shell-Script mit standardisierten Metadaten. Das bedeutet maximale Flexibilitaet bei minimalem Aufwand.

Architektur

DATAZONE Control                    DATAZONE Connect
+------------------+               +------------------+
| Playbook         |  Webhook-Step | Flask API (5002) |
|   Step 1: Script |  ----------> | /api/scripts/run |
|   Step 2: Task   |               |                  |
|   Step 3: Webhook| ------------> | /scripts/         |
+------------------+               |   nuclos.sh      |
                                   |   teams.sh       |
                                   |   slack.sh        |
                                   +------------------+

Wie es funktioniert

  1. Scripts werden im Ordner connect/scripts/ abgelegt
  2. Connect liest automatisch die Metadaten aus den Script-Headern (@name, @description, @var)
  3. Variablen werden als Umgebungsvariablen an die Scripts uebergeben
  4. Zugangsdaten (Passwoerter, API-Keys) kommen aus den Container-Umgebungsvariablen, nicht aus den Scripts
  5. Scripts geben strukturierte Ergebnisse ueber die Konvention #RESULT:{json} zurueck

REST-API

Health-Check

GET /api/health

Gibt den Status des Containers und die Anzahl verfuegbarer Scripts zurueck.

Scripts auflisten

GET /api/scripts

Gibt eine Liste aller verfuegbaren Scripts mit Metadaten zurueck:

json
[
  {
    "name": "Nuclos Billing",
    "filename": "nuclos-billing.sh",
    "description": "Erstellt Taetigkeitsnachweis mit Position in Nuclos.",
    "vars": [
      {"name": "CUSTOMER_NUMBER", "required": true, "description": "Kundennummer (z.B. K-10001)"},
      {"name": "CUSTOMER_NAME", "required": true, "description": "Kundenname"},
      {"name": "TASK", "required": true, "description": "Beschreibung der Taetigkeit"}
    ]
  }
]

Script ausfuehren

POST /api/scripts/run
Content-Type: application/json

{
  "script": "nuclos-billing.sh",
  "vars": {
    "CUSTOMER_NUMBER": "K-10001",
    "CUSTOMER_NAME": "Bell & Schmidt",
    "TASK": "OPNsense Firmware Update"
  }
}

Synchrone Ausfuehrung (Standard): Wartet auf das Ergebnis und gibt es direkt zurueck.

Asynchrone Ausfuehrung: Mit ?async=true wird ein Job erstellt, dessen Status abgefragt werden kann:

POST /api/scripts/run?async=true
→ {"job_id": "abc123", "status": "running"}

GET /api/jobs/abc123
→ {"status": "completed", "exit_code": 0, "result": {...}}

Eingehende Webhooks

POST /api/webhooks/incoming/{name}

Empfaengt externe Webhook-Aufrufe (z.B. von Zammad, GitLab, etc.) und fuehrt das zugehoerige Script aus. Der Webhook-Body wird als WEBHOOK_BODY-Umgebungsvariable uebergeben.

Ausfuehrungslog

GET /api/logs
GET /api/logs?limit=10

Gibt die letzten Script-Ausfuehrungen mit Status und Ergebnis zurueck.

Scripts erstellen

Metadaten-Format

Jedes Script beginnt mit einem standardisierten Header:

bash
#!/bin/bash
###############################################################################
# @name Mein Script
# @description Kurze Beschreibung was das Script macht.
#
# @var PFLICHT_VAR     required  Beschreibung der Pflicht-Variable
# @var OPTIONAL_VAR    optional  Beschreibung der optionalen Variable
###############################################################################
FeldPflichtBeschreibung
@nameJaAnzeigename des Scripts
@descriptionJaKurzbeschreibung
@varNeinVariable mit Name, required/optional und Beschreibung

Strukturierte Rueckgabe

Scripts koennen ein JSON-Ergebnis ueber die Konvention #RESULT:{json} zurueckgeben:

bash
echo "#RESULT:{\"success\":true,\"id\":42,\"message\":\"Erstellt\"}"

Connect parst die letzte Zeile die mit #RESULT: beginnt und gibt das JSON als result-Feld in der API-Antwort zurueck.

Zugangsdaten

Zugangsdaten werden niemals direkt in Scripts gespeichert. Stattdessen werden sie als Container-Umgebungsvariablen konfiguriert:

bash
# Im Script: Umgebungsvariable nutzen
NUCLOS_PASS="${NUCLOS_PASS:?NUCLOS_PASS nicht gesetzt}"

# In docker-compose.yml: Variable definieren
# environment:
#   - NUCLOS_PASS=${NUCLOS_PASS:-}

# In .env: Wert setzen
# NUCLOS_PASS=geheim123

Mitgelieferte Scripts

Nuclos Billing

Datei: nuclos-billing.sh

Erstellt automatisch einen Taetigkeitsnachweis mit Position im Nuclos ERP:

VariablePflichtBeschreibung
CUSTOMER_NUMBERJaKundennummer (z.B. K-10001)
CUSTOMER_NAMEJaKundenname
TASKJaBeschreibung der Taetigkeit
DURATION_HOURSNeinDauer in Stunden (Standard: 0.5)
HOSTNAMENeinHostname des betroffenen Systems
MODULENeinModultyp (opnsense, linux, etc.)

Dynamischer Projekt-Lookup: Das Script sucht automatisch das passende Nuclos-Projekt anhand der Kundennummer. Wird kein Projekt gefunden, wird auf das Default-Projekt (DATAZONE) gebucht und der Kundenname im Belegtext vorangestellt.

Umgebungsvariablen (in .env setzen):

VariableBeschreibung
NUCLOS_URLNuclos Server URL (z.B. https://nuclos.example.de)
NUCLOS_USERNuclos Benutzername
NUCLOS_PASSNuclos Passwort
NUCLOS_ORGANISATIONNuclos Organisation
NUCLOS_MITARBEITERMitarbeiter-ID fuer die Zeitbuchung
NUCLOS_DEFAULT_PROJEKTFallback-Projektname (Standard: DATAZONE)

Teams Notification

Datei: teams-notify.sh

Sendet eine Nachricht an einen Microsoft Teams Webhook:

VariablePflichtBeschreibung
MESSAGEJaNachricht (Text)
TITLENeinTitel der Nachricht (Standard: DATAZONE Connect)
COLORNeinFarbe als Hex-Wert (Standard: 0076D7)

Umgebungsvariable: TEAMS_WEBHOOK_URL muss in .env gesetzt sein.

Integration mit Playbooks

Connect wird ueber den Webhook-Step-Typ in Playbooks angebunden. Damit koennen Integrationen direkt in Wartungs-Workflows eingebunden werden.

Beispiel: Wartung mit Nuclos-Buchung

StepTypAktionBei Fehler
1VM SnapshotSnapshot erstellenstop
2TaskPVE_UPDATEcontinue
3Online pruefenWarten bis onlinestop
4WebhookNuclos Billing (30 Min buchen)continue
5WebhookTeams Benachrichtigungcontinue

Beispiel: Webhook-Step Konfiguration

Fuer den Webhook-Step im Playbook:

FeldWert
URLhttp://datazone-connect:5002/api/scripts/run
MethodePOST
Body{"script":"nuclos-billing.sh","vars":{"CUSTOMER_NUMBER":"{customer_number}","CUSTOMER_NAME":"{customer_name}","TASK":"Wartung {hostname}","MODULE":"{module}"}}
HeadersContent-Type: application/json

Die Platzhalter {customer_number}, {customer_name}, {hostname} und {module} werden automatisch mit den Daten des aktuellen Hosts ersetzt.

Docker-Konfiguration

Connect laeuft als eigener Container im Docker-Netzwerk:

yaml
connect:
  build: ./connect
  container_name: datazone-connect
  environment:
    - CONNECT_TOKEN=${CONNECT_TOKEN:-}
    - NUCLOS_URL=${NUCLOS_URL:-}
    - NUCLOS_USER=${NUCLOS_USER:-}
    - NUCLOS_PASS=${NUCLOS_PASS:-}
    - NUCLOS_ORGANISATION=${NUCLOS_ORGANISATION:-}
    - NUCLOS_MITARBEITER=${NUCLOS_MITARBEITER:-}
    - NUCLOS_DEFAULT_PROJEKT=${NUCLOS_DEFAULT_PROJEKT:-DATAZONE}
    - TEAMS_WEBHOOK_URL=${TEAMS_WEBHOOK_URL:-}
  volumes:
    - ./connect/scripts:/scripts:ro
  networks:
    - datazone-net
  restart: unless-stopped

Eigene Scripts

Eigene Scripts einfach in den Ordner connect/scripts/ legen. Der Container bindet diesen Ordner als Read-Only-Volume ein. Nach dem Hinzufuegen neuer Scripts ist kein Neustart noetig — sie werden beim naechsten API-Aufruf automatisch erkannt.

Sicherheit

Connect ist nur im Docker-Netzwerk erreichbar und von aussen nicht zugaenglich. Fuer zusaetzliche Absicherung kann ein CONNECT_TOKEN konfiguriert werden.

DATAZONE Control Documentation