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

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 neues 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.

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, Applikationen per Befehl in einem sogenannten Container zu starten.
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Das OS spielt also keine Rolle, vorausgesetzt Docker lässt sich installieren.
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 der Hook-Server vom Internet verfügbar ist und mit einem LetsEncrypt-Zertifikat geschützt ist, wird für das Beispiel folgendes Setup vorausgesetztnginx-LetsEncrypt Reverse Proxy in der Praxis

docker-compose.yml

version: "3.5"
services:
  webhookd:
    hostname: webhookd
    image: ncarlier/webhookd:latest
    container_name: webhookd
    expose:
     - "80"
    restart: always
    environment:
      WHD_LISTEN_ADDR: ":80"
      WHD_SCRIPTS: /scripts
      WHD_HOOK_TIMEOUT: '600'
      VIRTUAL_HOST: 'webhook.domain.tld'
      VIRTUAL_PORT: '80'
      LETSENCRYPT_HOST: 'webhook.domain.tld'
      LETSENCRYPT_EMAIL: 'email@domain.tld'
    volumes:
     - ./scripts:/scripts
     - /var/run/docker.sock:/var/run/docker.sock       
networks:
  default:
    external:
      name: webproxy

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

mkdir scripts
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 Order ./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!



Fragen / Kommentare


Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter. Details anzeigen.