LightWebHook ist ein leichtgewichtiger Webhook-Empfaenger auf Basis von FastAPI. Er nimmt eingehende Webhooks entgegen, speichert sie in SQLite und stellt eine abgesicherte Admin-API bereit, ueber die du Status, Ausloesezeitpunkte, Trigger-Anzahl und Payloads abrufen kannst. Vor der API sitzt ein Nginx-Reverse-Proxy, der den oeffentlichen Port bereitstellt. Fuer die Bedienung gibt es ausserdem ein browserbasiertes Admin-Panel mit Login und Session-Cookie.
POST /webhook/{name}zum Empfangen konfigurierter Webhooks- Secret-Pruefung pro Webhook ueber
X-Webhook-Secret - Admin-API mit
X-Admin-Secret - Admin-Panel unter
/admin/loginmit Login, Session und Webhook-Ansicht - SQLite als persistenter, einfacher Speicher
- Docker-Compose-Setup mit Nginx-Reverse-Proxy
- Payload- und Header-Speicherung pro Event
app/main.py: API-Endpunkte und Auth-Pruefungapp/auth.py: Signierte Admin-Session-Cookiesapp/config.py: Laden von Konfiguration und Secretsapp/db.py: SQLite-Eventspeicherapp/static/: HTML-, CSS- und JS-Dateien fuer das Admin-Panelnginx/default.conf: Reverse-Proxy-Konfigurationconfig/webhooks.example.json: Beispiel fuer Webhook-Konfigurationsecrets/: lokale Secret-Dateien fuer den Container
- Konfiguration kopieren:
Copy-Item .\config\webhooks.example.json .\config\webhooks.json- Secret-Dateien anlegen:
Set-Content -Path .\secrets\admin_secret -Value "mein-admin-secret" -NoNewline
Set-Content -Path .\secrets\github_secret -Value "mein-github-secret" -NoNewline
Set-Content -Path .\secrets\build_secret -Value "mein-build-secret" -NoNewline- Port optional ueber
.envsetzen:
Copy-Item .\.env.example .\.env- Container starten:
docker compose up --build -dDanach ist der Dienst standardmaessig ueber Nginx auf http://localhost:8080 erreichbar. Der FastAPI-Container ist nur intern im Compose-Netzwerk verfuegbar.
Das Admin-Panel erreichst du unter http://localhost:8080/admin/login.
- Benutzername: Wert aus
admin_usernameinconfig/webhooks.json - Passwort: dein Admin-Secret aus
secrets/admin_secret
Nach erfolgreichem Login legt der Dienst ein signiertes Session-Cookie an. API-Clients koennen parallel weiter den Header X-Admin-Secret verwenden.
{
"admin_username": "admin",
"admin_secret_file": "/run/secrets/admin_secret",
"webhooks": {
"github": {
"description": "GitHub Webhook",
"secret_file": "/run/secrets/github_secret"
},
"build": {
"description": "CI Build Webhook",
"secret_file": "/run/secrets/build_secret"
}
}
}GET /healthAntwort:
{
"status": "ok"
}POST /webhook/github
X-Webhook-Secret: mein-github-secret
Content-Type: application/jsonBeispiel mit curl:
curl -X POST http://localhost:8080/webhook/github \
-H "Content-Type: application/json" \
-H "X-Webhook-Secret: mein-github-secret" \
-d "{\"repository\":\"example\",\"status\":\"ok\"}"Antwort:
{
"accepted": true,
"webhook": "github",
"event_id": 1,
"received_at": "2026-03-27T09:00:00Z"
}GET /status/github
X-Admin-Secret: mein-admin-secretGET /events/github?limit=50
X-Admin-Secret: mein-admin-secretGET /list
X-Admin-Secret: mein-admin-secretPOST /reset/github
X-Admin-Secret: mein-admin-secretOptional ueber .env steuerbar:
SESSION_MAX_AGE_SECONDS: Gueltigkeit des Login-Cookies, Standard43200SESSION_COOKIE_SECURE: Fuer HTTPS auftruesetzen
config/webhooks.jsonist absichtlich nicht im Repo, damit du deine echte Laufzeitkonfiguration lokal halten kannst.- Das Admin-Panel verwendet den konfigurierten
admin_usernameplus das Admin-Secret als Login-Daten. - Die eingehenden Header werden gespeichert, aber
X-Webhook-Secretwird dabei entfernt. - Wenn ein Payload kein gueltiges UTF-8 ist, wird er Base64-kodiert gespeichert.
- Nginx leitet alle Requests an den internen FastAPI-Service auf Port
8000weiter. - FastAPI-Doku ist nach dem Start unter
/docsverfuegbar.