Nothing published
The operator connects out from inside the cluster. Only webhook deliveries arrive, to the one in-cluster service you name.
Kubernetes operator · Argo CD · Flux · Tekton
GitHub, GitLab or Bitbucket post every push to one public Webhook Relay URL. The Kubernetes operator inside your cluster connects out and delivers it to Argo CD, Flux or a Tekton EventListener, so syncs start in seconds instead of waiting for the next poll. No ingress, no load balancer, no public IP.
Free plan · No credit card · SOC 2 Type II · Self-hosted option
Buying for a company? Talk to sales
Git provider
GitHub / GitLab / Bitbucket
push, pull_request
Webhook Relay
https://<bucket>
The only public URL. Stored, logged, retried.
Private network · no inbound ports
argocd-server
→ /api
sync started
Safe on company infrastructure
Outbound only
The agent or operator connects out over TLS. No inbound port, no public IP.
Encrypted and scoped
AES-256 at rest. Ephemeral buckets store no bodies or headers at all.
Verified before forwarding
Signatures checked and source IPs allowlisted on the input, so forged requests never reach you.
SOC 2 Type II
Independently audited controls, SSO and audit logs.
Argo CD and Flux can change everything in the cluster. Their API shouldn't be on the internet just to hear about a push.
Exposing the cluster to your Git host
With Webhook Relay
The operator connects out from inside the cluster. Only webhook deliveries arrive, to the one in-cluster service you name.
Without webhooks, a private cluster polls the repository every few minutes. With them, a merge starts the sync immediately.
Headers reach the controller unchanged, so Argo CD's webhook secret and Flux's receiver token keep working. Add a function to check signatures even earlier.
Repository or organization webhooks, with their usual secrets.
Push and pull request events, signed with X-Hub-Signature-256.
Push and merge request events, with the X-Gitlab-Token secret.
Repository push events.
Image push webhooks from registries that Flux image automation can receive.
Point the operator's output at the in-cluster service.
argocd-server's webhook endpoint, which refreshes the apps that track the pushed repository. Use https:// if the server isn't running with --insecure.
http://argocd-server.argocd.svc.cluster.local/api/webhookA notification-controller Receiver, served by the webhook-receiver service.
http://webhook-receiver.flux-system.svc.cluster.local/hook/<receiver-path>An EventListener's service, which starts your PipelineRuns.
http://el-<name>.<namespace>.svc.cluster.local:8080Signature verification
A Webhook Relay function runs on the input, before forwarding. This one verifies GitHub's X-Hub-Signature-256. A forged push gets a 401 and never reaches the operator.
local crypto = require('crypto')
-- Reject anything that isn't signed with your shared secret,
-- before it is forwarded into your network.
local sig, err = crypto.hmac('sha256', r.RequestBody, cfg:GetValue("WEBHOOK_SECRET"))
if err then error(err) end
if "sha256=" .. sig ~= r.RequestHeader["X-Hub-Signature-256"] then
r:SetResponseStatusCode(401)
r:SetResponseBody("invalid signature")
r:StopForwarding()
return
endInstall the operator once. Each controller is one custom resource.
Add the Helm chart and give it an access token. It runs inside the cluster and opens the outbound connection.
helm repo add webhookrelay https://charts.webhookrelay.com
helm upgrade --install webhookrelay-operator \
--namespace=default webhookrelay/webhookrelay-operator \
--set credentials.key=$RELAY_KEY --set credentials.secret=$RELAY_SECRETCreate a WebhookRelayForward that sends the bucket's webhooks to argocd-server.
apiVersion: forward.webhookrelay.com/v1
kind: WebhookRelayForward
metadata:
name: argocd
spec:
buckets:
- name: gitops
inputs:
- name: git-push
description: "Paste this URL into your repository webhook"
outputs:
- name: argocd
destination: http://argocd-server.argocd.svc.cluster.local/api/webhookUse the input's public URL as the webhook URL, with the same secret you set in Argo CD. The next push starts a sync, and the bucket logs show Argo CD's response.
Full guides: Kubernetes operator · Install on Kubernetes · HMAC verification
7-day money-back guarantee on paid plans.
No. The Webhook Relay operator runs inside the cluster and connects out to Webhook Relay. Your Git host posts to the public Webhook Relay URL, and the operator delivers each webhook to argocd-server's /api/webhook inside the cluster.
Yes. Headers reach argocd-server unchanged, so the secret configured in argocd-secret is checked as usual. You can also verify the signature in a Webhook Relay function before the request is forwarded.
Yes. Point the output at the notification-controller webhook-receiver service and the path of your Receiver. Flux checks the receiver token or HMAC as usual.
Webhook Relay stores each webhook and the Git host gets a success response. With durable delivery it is retried for up to 30 days, and any delivery can be replayed from the logs.
The operator only needs outbound HTTPS to Webhook Relay. For clusters with no internet access at all, a self-hosted version of Webhook Relay is available.
More security pages: Security alerts into an on-prem SIEM · Alerts into internal runbook automation · Security review kit
Install the operator, apply one resource, paste one URL. The cluster stays private.
Free plan · No credit card required · 7-day money-back guarantee on paid plans