{"id":37826603,"url":"https://github.com/webhookrelay/webhookrelay-operator","last_synced_at":"2026-01-16T15:45:55.766Z","repository":{"id":56263702,"uuid":"272074399","full_name":"webhookrelay/webhookrelay-operator","owner":"webhookrelay","description":"A lightweight tunnelling operator to receive \u0026 process webhooks/API requests without public IP or load balancers in your Kubernetes cluster","archived":false,"fork":false,"pushed_at":"2022-11-10T23:24:52.000Z","size":408,"stargazers_count":17,"open_issues_count":5,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-21T18:52:55.282Z","etag":null,"topics":["cicd","kubernetes","ngrok-alternative","operator","tunnels","webhooks"],"latest_commit_sha":null,"homepage":"https://webhookrelay.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webhookrelay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-13T19:38:59.000Z","updated_at":"2024-03-11T19:39:01.000Z","dependencies_parsed_at":"2022-08-15T15:40:32.170Z","dependency_job_id":null,"html_url":"https://github.com/webhookrelay/webhookrelay-operator","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/webhookrelay/webhookrelay-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fwebhookrelay-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fwebhookrelay-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fwebhookrelay-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fwebhookrelay-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webhookrelay","download_url":"https://codeload.github.com/webhookrelay/webhookrelay-operator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fwebhookrelay-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cicd","kubernetes","ngrok-alternative","operator","tunnels","webhooks"],"created_at":"2026-01-16T15:45:54.291Z","updated_at":"2026-01-16T15:45:55.749Z","avatar_url":"https://github.com/webhookrelay.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://webhookrelay.com\" target=\"_blank\"\u003e\u003cimg width=\"900\"src=\"https://github.com/webhookrelay/webhookrelay-operator/blob/master/static/operator.png?raw=true\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Webhook Relay Kubernetes Operator\n\n[![Build Status](https://drone-kr.webrelay.io/api/badges/webhookrelay/webhookrelay-operator/status.svg)](https://drone-kr.webrelay.io/webhookrelay/webhookrelay-operator)\n\nWebhook Relay Operator provides an easy way to receive webhooks to an internal Kubernetes cluster without configuring public IP or load balancer. Perfect for:\n- On-premise deployments \n- Cloud deployments where public load balancer is not required (single endpoint receiving webhooks and no need to expose the whole server)\n- Edge deployments\n- IoT \u0026 Edge computing with https://k3s.io/\n\nOperator can manage buckets, configure your public endpoints that accept webhooks/API requests and sets up forwarding destinations (where HTTP requests will be sent).\n\n## Features\n\nCurrent operator project scope:\n\n- [x] Deploy webhook forwarding agents with configured buckets\n- [x] Read credentials from secrets and mount secrets to webhookrelayd containers\n- [x] Ensure buckets are created \n- [x] Ensure inputs are configured (public endpoints)\n- [x] Ensure outputs are configured (forwarding destinations)\n- [x] K8s events on taken actions\n- [x] Updates CR status\n\n### Roadmap\n\n- [ ] Create \u0026 manage [Functions](https://webhookrelay.com/v1/guide/functions.html) that transform webhook requests and responses\n- [ ] Manage Function configuration through Kubernetes secrets\n- [ ] Provision separate access tokens for webhookrelayd containers with disabled API access (only subscribe capability). CR should have a finalizer that would ensure that the secret is removed together with the agent configuration.\n- [ ] Deploy Webhook Relay ingress controller (separate CRD)\n- [ ] Expose webhookrelayd agent forwarding metrics\n- [ ] Configure [notification integrations](https://webhookrelay.com/v1/guide/integrations.html) via CRDs\n\n## Installation\n\nPrerequisites:\n\n* [Helm](https://docs.helm.sh/using_helm/#installing-helm)\n* [Webhook Relay account](https://my.webhookrelay.com)\n* Kubernetes\n\nYou need to add this Chart repo to Helm:\n\n```bash\nhelm repo add webhookrelay https://charts.webhookrelay.com\nhelm repo update\n```\n\nGet access token from [here](https://my.webhookrelay.com/tokens). Once you click on 'Create Token', it will generate it and show a helper to set environment variables:\n\n```\nexport RELAY_KEY=*****-****-****-****-*********\nexport RELAY_SECRET=**********\n```\n\nInstall through Helm:\n\n```bash\nhelm upgrade --install webhookrelay-operator --namespace=default webhookrelay/webhookrelay-operator \\\n  --set credentials.key=$RELAY_KEY --set credentials.secret=$RELAY_SECRET\n```\n\n## Usage\n\nOperator works as a manager to configure your public endpoints and forwarding destinations. To start receiving webhooks you will need to create a [Custom Resource](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) (usually called just 'CR'). It's a short yaml file that describes your public endpoint characteristics and specifies where to forward the webhooks:\n\n```yaml\n# cr.yaml\napiVersion: forward.webhookrelay.com/v1\nkind: WebhookRelayForward\nmetadata:\n  name: example-forward\nspec:\n  buckets:\n  - name: k8s-operator\n    inputs:\n    - name: public-endpoint\n      description: \"Public endpoint, supply this to the webhook producer\"\n      responseBody: \"OK\"\n      responseStatusCode: 200\n    outputs:\n    - name: webhook-receiver\n      lockPath: true  # set to 'false' to reuse any extra path WHR received\n      disabled: false # set to 'true' to disable output\n      destination: http://destination:5050/webhooks\n```\n\n```shell\nkubectl apply -f cr.yaml\n```\n\nNow, to view CR status which will display our public endpoints:\n\n```shell\n# get available CRs\n$ kubectl get webhookrelayforwards.forward.webhookrelay.com\n# get our example forward status\n$ kubectl describe webhookrelayforwards.forward.webhookrelay.com example-forward\nName:         example-forward\nNamespace:    default\nLabels:       \u003cnone\u003e\nAnnotations:  API Version:  forward.webhookrelay.com/v1\nKind:         WebhookRelayForward\nMetadata:\n  Creation Timestamp:  2020-06-18T23:05:33Z\n  Generation:          1\n  Resource Version:    118902\n  Self Link:           /apis/forward.webhookrelay.com/v1/namespaces/default/webhookrelayforwards/example-forward\n  UID:                 998b0fca-f975-40dd-b2b5-91abd1edaee0\nSpec:\n  Buckets:\n    Inputs:\n      Description:           Public endpoint, supply this to the webhook producer\n      Name:                  public-endpoint\n      Response Body:         OK\n      Response Status Code:  200\n    Name:                    k8s-operator\n    Outputs:\n      Destination:       http://destination:5050/webhooks\n      Name:              webhook-receiver\n  Secret Ref Name:       whr-credentials\n  Secret Ref Namespace:  \nStatus:\n  Agent Status:  Running\n  Public Endpoints:\n    https://my.webhookrelay.com/v1/webhooks/92582560-738a-4eae-94b1-23299ed20b3c\n  Ready:           true\n  Routing Status:  Configured\nEvents:            \u003cnone\u003e\n```\n\nHere we can see our public endpoints.\n\n## Advanced Usage (multi-tenant, credentials per CR)\n\nIf more than one user is using the operator, it's possible to skip credentials setting during Helm install and just specify the [access token key \u0026 secret](https://my.webhookrelay.com/tokens) in the CR itself:\n\n```yaml\n# access_token.yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: whr-credentials\ntype: Opaque\nstringData:\n  key: XXX    # your access token key\n  secret: YYY # your access token secret\n```\n\nCreate it:\n\n```shell\nkubectl apply -f access_token.yaml\n```\n\nSpecify the secret ref in the CR as `secretRefName` and `secretRefNamespace` (this one is optional):\n\n```yaml\n# cr.yaml\napiVersion: forward.webhookrelay.com/v1\nkind: WebhookRelayForward\nmetadata:\n  name: example-forward\nspec:\n  secretRefName: whr-credentials # Secret \n  secretRefNamespace: \"\"\n  buckets:\n  - name: k8s-operator\n    inputs:\n    - name: public-endpoint\n      description: \"Public endpoint, supply this to the webhook producer\"\n      responseBody: \"OK\"\n      responseStatusCode: 200\n    outputs:\n    - name: webhook-receiver\n      lockPath: true  # set to 'false' to reuse any extra path WHR received\n      disabled: false # set to 'true' to disable output\n      destination: http://destination:5050/webhooks\n  # Use custom Docker image\n  #image: \"quay.io/your-custom/image:latest\"\n  # Add custom env variables to the agent container\n  extraEnvVars:\n  - name: WEBSOCKET_TRANSPORT\n    value: \"true\"\n```\n\nCreate the CR:\n\n```\nkubectl apply -f cr.yaml\n```\n\n## HTTP Proxy settings\n\nIf your outgoing connections are intercepted by an HTTP/HTTPS proxy - you will need to supply connection details with `--set httpProxy` or `--set httpsProxy` Helm values:\n\n```bash\nhelm upgrade --install webhookrelay-operator --namespace=default webhookrelay/webhookrelay-operator \\\n  --set credentials.key=$RELAY_KEY --set credentials.secret=$RELAY_SECRET \\\n  --set httpsProxy=\"https://example-proxy.com\"\n```\n\nThis will set environment variables for the operator and operator will propagate them to the deployed agent.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebhookrelay%2Fwebhookrelay-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebhookrelay%2Fwebhookrelay-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebhookrelay%2Fwebhookrelay-operator/lists"}