Docker WebHook Deamon: einfacher Hook-Server f├╝r Bash-Scripts

This page is also available in English

Auf der Suche nach einer L├Âsung, um von bestimmten Systemen Webhooks empfangen zu k├Ânnen und bestimmte Aktionen auszul├Âsen, bin ich auf einen sehr einfachen Docker-Container gesto├čen. Der Container f├╝hrt einfache Bash-Scripts aus, dazu reicht es in der URL den Script-Namen anzugeben und entsprechende Variablen ├╝ber die Webhooks zu ├╝bergeben.

Webhook: was ist das?

Bestimmte Systeme bieten die M├Âglichkeit in deren Einstellungen Webhooks zu hinterlegen. Webhooks sind HTTP-Aufrufe die automatisch ausgef├╝hrt werden, wenn bestimmte Ereignisse eintreten. Als Beispiel, wenn auf einem Git-Server ein neuer Commit stattgefunden hat: Per Webhook kann in diesem Fall ein Webserver ├╝ber das neue Software-Release informiert und der neue Quellcode automatisch aktiviert werden. Das ist auch der Einsatzzweck, f├╝r den ich das hier vorgestellte Docker-Image verwende.

SoftwareWebhookd
GitHubhttps://github.com/ncarlier/webhookd
aktuelle Version 1.15.1
gefunden02.10.2022

Technisch gesehen ist der Webhook-Aufruf ein ganz normaler HTTP-Aufruf, entsprechend k├Ânnte dieser von einem beliebigen Webserver mit einer entsprechenden Route entgegengenommen und verarbeitet werden. Meist kann beim Anlegen der Webhooks zwischen POST und GET unterschieden werden, sowie meist auch ein Zugriffstoken mitgeschickt werden.

Einfacher Webhook Server (webhookd) mit Docker

Docker Basics

Docker erm├Âglicht es, Services oder Applikationen per Befehl in einem sogenannten Container zu starten.
Ein Container ist eine vom Betriebssystem (OS) unabh├Ąngige isolierte Umgebung:
Beim ersten Start eines Containers, l├Ądt Docker selbstst├Ąndig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker

Damit webhookd sicher vom Internet erreicht werden kann, setze ich einen Let's Encrypt Reverse-Proxy ein. Zuerst habe ich Nginx als Reverse-Proxy verwendet, diesen aber sp├Ąter mit Traefik ersetzt. Der Reverse-Proxy stellt eine verschl├╝sselte HTTPS-Verbindung zur Verf├╝gung und erm├Âglicht es mehrere Websites auf einem Server zu betreiben.

Schritt f├╝r Schritt webhookd mit Docker inkl. Zugriff vom Internet

Hardwareanforderung:
  1. F├╝r die Docker-Installation kann eine nahezu beliebige Hardware verwendet werden: Zum Beispiel ein virtueller Server eines Providers, oder f├╝r zu Hause: ein PC, Notebook,┬áRaspberry PI, MAC, eine NAS: QNAP, Synology oder eine beliebige andere Hardware auf der sich Windows┬áoder┬áLinux installieren l├Ąsst.
Voraussetzungen f├╝r den Internetzugriff:
  1. Bei einem gemieteten Server eines Providers vergibt dieser eine IP-Adresse. Wer einen Server im eigenen Heimnetzwerk betreiben will, ben├Âtigt ein Port-Forwarding.
  2. Der Aufruf aus dem Internet erfolgt am besten ├╝ber eine Domain mit einem DNS-Eintrag auf die ├Âffentliche IP-Adresse, siehe Domain und dessen Verwaltung.
  3. Für die Zertifikatsverwaltung und den sicheren Zugriff auf die Webservices verwende ich einen Reverse Proxy und Let's Encrypt-Zertifikate. 
Webhook-Container:
  1. docker-compose.yml anlegen und anpassen
  2. Container starten und 
  3. Ausf├╝hren von Bash-Scripts

WebHookd: docker-compose.yml

Um den Hook-Container mittels docker compose zu starten, kann das Docker-Image mit einer simplen docker-compose.yml Datei heruntergeladen, erstellt und gestartet werden. Die Datei kann mit einem beliebigen Texteditor wie folgt bef├╝llt und dann angepasst werden:

Dateiname: docker-compose.yml, Inhalt:

version: "3.5"
services:
  webhookd:
    hostname: webhookd
    image: ncarlier/webhookd:latest
    container_name: webhookd
    expose:
     - "80"
   #F├╝r einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:83 oder http://ServerIP:83
    #ports:   
      #- "83:80" 
    restart: always
    environment:
      WHD_LISTEN_ADDR: ":80"
      WHD_SCRIPTS: /scripts
      WHD_HOOK_TIMEOUT: '600'

    #Labels f├╝r ReverseProxy, siehe: https://www.libe.net/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.webhookd.rule=Host(`hook.domain.tld`)"   
      - "traefik.http.routers.webhookd.entrypoints=web" 
      - "traefik.http.routers.webhookd.entrypoints=websecure"
      - "traefik.http.routers.webhookd.tls.certresolver=myresolver"  
    volumes:
     - ./scripts:/scripts
     - /var/run/docker.sock:/var/run/docker.sock       

#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy 
#und die folgenden Zeilen k├Ânnen entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
  default:
    external:
      name: webproxy

F├╝r einen direkten Zugriff ├╝ber die IP-Adresse oder┬álocalhost┬á- auch┬áohne Reverse Proxy, DNS oder ├Âffentlicher IP -┬ákann die auskommentierte Port-Einstellung f├╝r Testzwecke aktiviert werden, indem┬áÔÇ×#ÔÇť vor ÔÇ×ports:ÔÇť und ÔÇ×-"83:80"ÔÇť┬áentfernt wird. Sollte der Reverse Proxy nicht eingesetzt werden, wird das Netzwerk webproxy nicht ben├Âtigt und der Bereich networks: .. kann entfernt werden.

F├╝r den Internetzugriff┬á├╝ber den┬áTraefik Reverse Proxy,┬ámuss in den Labels die Dom├Ąne mit den zuvor erstellten┬áDNS-Eintr├Ągen ersetzt werden (im Beispiel: hook.domain.tld).

Das Beispiel verwendet Bind-Mounts und keine Docker Volumes für das permanente Speichern der Daten. Siehe: Docker Daten speichern: Docker Volumes vs. Host-Ordner

Container starten

Vor dem Start wird noch der Ordner scripts ben├Âtigt. Der Befehl docker-compose up -d startet webhookd

docker-compose up -d

siehe auch: github.com/ncarlier/webhookd

Ausf├╝hren von Bash-Scripts ├╝ber einen Webhook-Aufruf

Nach dem Start des Servers k├Ânnen in dem Ordner ./scripts beliebige Bash-Scripts hinterlegt werden. Wird die URL des Hook-Servers mit dem Script-Namen als Pfad aufgerufen, startet der Docker-Container das entsprechende Bash-Script:
Als Beispiel w├╝rde folgende URL: https://webhook.domain.tld/TestBash am Server ein gleichnamiges Bash-Script aufrufen, also: ./scripts/TestBash.sh.
Werden beim Aufruf Parameter ├╝bergeben, k├Ânnen diese innerhalb des Bash-Scripts als Variablen verwendet werden: $Variable. Der Aufruf im Browser w├╝rde dann ├╝ber die GET-Methode wie folgt Variablen ├╝bergeben k├Ânnen:┬áhttps://webhook.domain.tld/TestBash?Variable=Wert. Wer den Einsatz von POST bevorzugt, kann diese auch mittels POST-Aufruf ├╝bergeben.

Bisher habe ich den Webhookd-Container mit GitLab und Gitea erfolgreich getestet. F├╝r GitLab und GitHub ist ein Beispielscript vorhanden, f├╝r Gitea musste ich selbst ein Script erstellen.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE f├╝r deine Bewertung!

Aktualisiert: 14.10.2022 von Bernhard ­čöö


Top-Artikel in diesem Bereich


ioBroker installieren - Docker
Mit ioBroker k├Ânnen verschiedene Automatisierungsl├Âsungen oder Ger├Ąte in einem System zusammengefasst werden. Um bestimmte Gateways oder Ger├Ąte ansprechen zu k├Ânnen, werden in ioBroker verschiedene Adapter verwendet.

Home-Assistant Docker Conbee 2 und Zigbee2MQTT / deCONZ
Dank zahlreicher Integrationsm├Âglichkeiten ist Home-Assistant eine einfache Plattform f├╝r das Steuern verschiedenster Smart-Home Ger├Ąte. Im Vergleich zu ioBroker ist mir der Start mit Home Assistant wesentlich einfacher gefallen. W├Ąhrend ich f├╝r ioBroker noch am Suchen war, welches Frontend ich f├╝r meine Dashboards verwenden k├Ânnte, hatte ich mit Home-Assistant out of the box ein fertig eingerichtetes System. Die Lovelance Dashboards von Home Assistant k├Ânnen einfach in der GUI zusammengeklickt...

Conbee 2: Phoscon deCONZ - Docker Inbetriebnahme | Review
Mit dem kleinen USB-Stick Conbee2 habe ich meinen NAS um ein Zigbee-Gateway erweitert. Conbee2 kann auf Raspbian, Ubuntu, Docker oder Windows installiert werden.

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details