When running the synchronization process, it seems that everything goes fine, apart from the webhook call. It is a normal healthchecks.io ping.
I tried by using GET as ENV var. In that case no error message appears, but the ping never arrives to healthchecks.
2026-03-18T00:23:03+01:00 INF github.com/lovelaze/nebula-sync/internal/service/service.go:66 > Starting nebula-sync v0.11.1
2026-03-18T00:23:03+01:00 DBG github.com/lovelaze/nebula-sync/internal/service/service.go:67 > Settings config="{Primary:{URL:https://192.168.178.6 Password:[...]} Replicas:[{URL:https://192.168.178.2 Password:[...]}] Client:{SkipTLSVerification:true RetryDelay:3 Timeout:25} Sync:{FullSync:true Cron:0xc000116520 RunGravity:false GravitySettings:{DHCPLeases:false Group:false Adlist:false AdlistByGroup:false Domainlist:false DomainlistByGroup:false Client:false ClientByGroup:false} ConfigSettings:{DNS:{Enabled:false Filter:<nil>} DHCP:{Enabled:false Filter:<nil>} NTP:{Enabled:false Filter:<nil>} Resolver:{Enabled:false Filter:<nil>} Database:{Enabled:false Filter:<nil>} Webserver:{Enabled:false Filter:<nil>} Files:{Enabled:false Filter:<nil>} Misc:{Enabled:false Filter:<nil>} Debug:{Enabled:false Filter:<nil>}} WebhookSettings:{Failure:{Body: Headers:map[] Method:POST URL:https://healthchecks.[...].co/ping/0d58dcdf-020e-439a-a870-3cb917b4fb91/fail} Success:{Body: Headers:map[] Method:POST URL:https://healthchecks.[...].co/ping/0d58dcdf-020e-439a-a870-3cb917b4fb91} Client:{SkipTLSVerification:false}}} API:{Enabled:true}}"
2026-03-18T00:23:03+01:00 INF github.com/lovelaze/nebula-sync/internal/sync/sync.go:35 > Running sync mode=full replicas=1
2026-03-18T00:23:03+01:00 INF github.com/lovelaze/nebula-sync/internal/sync/sync.go:52 > Authenticating clients...
2026-03-18T00:23:03+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:66 > PostAuth client=https://192.168.178.6
2026-03-18T00:23:03+01:00 DBG github.com/lovelaze/nebula-sync/internal/api/server.go:38 > Starting http server
2026-03-18T00:23:04+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:66 > PostAuth client=https://192.168.178.2
2026-03-18T00:23:06+01:00 INF github.com/lovelaze/nebula-sync/internal/sync/sync.go:84 > Syncing teleporters...
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:149 > Get teleporter client=https://192.168.178.6
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:175 > Post teleporter client=https://192.168.178.2 payload={"config":false,"dhcp_leases":true,"gravity":{"adlist":true,"adlist_by_group":true,"client":true,"client_by_group":true,"domainlist":true,"domainlist_by_group":true,"group":true}}
2026-03-18T00:23:06+01:00 INF github.com/lovelaze/nebula-sync/internal/sync/sync.go:107 > Syncing configs...
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:226 > Get config client=https://192.168.178.6
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:261 > Patch config client=https://192.168.178.2 payload={"config":{"database":{"DBimport":true,"DBinterval":60,"forceDisk":false,"maxDBdays":7,"network":{"expire":7,"parseARPcache":true},"useWAL":true},"debug":{"aliasclients":false,"all":false,"api":false,"arp":false,"caps":false,"clients":false,"config":false,"database":false,"dnssec":false,"edns0":false,"events":false,"extra":false,"flags":false,"gc":false,"helper":false,"inotify":false,"locks":false,"netlink":false,"networking":false,"ntp":false,"overtime":false,"queries":false,"regex":false,"reserved":false,"resolver":false,"shmem":false,"status":false,"timing":false,"tls":false,"vectors":false,"webserver":false},"dhcp":{"active":false,"end":"","hosts":[],"ignoreUnknownClients":false,"ipv6":false,"leaseTime":"","logging":false,"multiDNS":false,"netmask":"","rapidCommit":false,"router":"","start":""},"dns":{"CNAMEdeepInspect":true,"EDNS0ECS":true,"analyzeOnlyAandAAAA":false,"blockESNI":true,"blockTTL":2,"blocking":{"active":true,"edns":"TEXT","mode":"NULL"},"bogusPriv":false,"cache":{"optimizer":3600,"rrtype":"ANY","size":10000,"upstreamBlockedTTL":86400},"cnameRecords":[...],"dnssec":true,"domain":{"local":true,"name":"lan"},"domainNeeded":true,"expandHosts":true,"hostRecord":"","hosts":["192.168.178.3 [...].co","192.168.178.4 julia.lan","5.252.225.77 nilde.[...].co","192.168.178.6 di.en.es"],"ignoreLocalhost":false,"interface":"eth0","listeningMode":"ALL","localise":true,"piholePTR":"PI.HOLE","port":53,"queryLogging":true,"rateLimit":{"count":10000,"interval":60},"reply":{"blocking":{"IPv4":"","IPv6":"","force4":false,"force6":false},"host":{"IPv4":"","IPv6":"","force4":false,"force6":false}},"replyWhenBusy":"ALLOW","revServers":["true,192.168.178.0/24,192.168.178.1"],"showDNSSEC":true,"specialDomains":{"designatedResolver":true,"iCloudPrivateRelay":true,"mozillaCanary":true},"upstreams":["9.9.9.11","149.112.112.11","2620:fe::11","2620:fe::fe:11"]},"misc":{"addr2line":true,"check":{"disk":90,"load":true,"shmem":90},"delay_startup":0,"dnsmasq_lines":[],"etc_dnsmasq_d":false,"extraLogging":false,"hide_connection_error":false,"hide_dnsmasq_warn":false,"nice":-10,"normalizeCPU":true,"privacylevel":0,"readOnly":false},"ntp":{"ipv4":{"active":true,"address":""},"ipv6":{"active":true,"address":""},"sync":{"active":true,"count":8,"interval":3600,"rtc":{"device":"","set":false,"utc":true},"server":"pool.ntp.org"}},"resolver":{"networkNames":true,"refreshNames":"IPV4_ONLY","resolveIPv4":true,"resolveIPv6":true}}}
2026-03-18T00:23:06+01:00 INF github.com/lovelaze/nebula-sync/internal/sync/sync.go:69 > Invalidating sessions...
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:117 > Delete session client=https://192.168.178.6
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/pihole/client.go:117 > Delete session client=https://192.168.178.2
2026-03-18T00:23:06+01:00 DBG github.com/lovelaze/nebula-sync/internal/webhook/webhook.go:71 > Invoking webhook body= headers=null method=POST url=https://healthchecks.[...].co/ping/0d58dcdf-020e-439a-a870-3cb917b4fb91
2026-03-18T00:23:11+01:00 WRN github.com/lovelaze/nebula-sync/internal/webhook/webhook.go:43 > Webhook trigger failed error="webhook returned status 405"
2026-03-18T00:23:11+01:00 INF github.com/lovelaze/nebula-sync/internal/service/service.go:95 > Sync completed
What happened?
When running the synchronization process, it seems that everything goes fine, apart from the webhook call. It is a normal healthchecks.io ping.
However, the same ping with
curl -s -X POST https://...works fine. Also the certificate is given by letsencrypt, so it should be trusted.I tried by using GET as ENV var. In that case no error message appears, but the ping never arrives to healthchecks.
Any hint?
Expected Behaviour
I expect it pings correctly the healthchecks server
Nebula-sync Version
v0.11.1
Runtime
docker
Operating System
Debian GNU/Linux 13 (trixie)
CPU Architecture
x86_64
Configuration
- name: Make sure Nebula Sync container is created and running community.docker.docker_container: name: "{{ nebula_sync_container_name }}" image: ghcr.io/lovelaze/nebula-sync:latest pull: true state: started env: PRIMARY: "https://{{ dns[0] }}|{{ dns_api_key[0] }}" REPLICAS: "https://{{ dns[1] }}|{{ dns_api_key[1] }}" FULL_SYNC: "true" RUN_GRAVITY: "false" CRON: "15 * * * *" CLIENT_RETRY_DELAY_SECONDS: "3" CLIENT_TIMEOUT_SECONDS: "25" CLIENT_SKIP_TLS_VERIFICATION: "true" WEBHOOK_SYNC_SUCCESS_URL: "{{ healthchecks_dashboard_url }}/ping/0d58dcdf-020e-439a-a870-3cb917b4fb91" WEBHOOK_SYNC_FAILURE_URL: "{{ healthchecks_dashboard_url }}/ping/0d58dcdf-020e-439a-a870-3cb917b4fb91/fail" WEBHOOK_CLIENT_SKIP_TLS_VERIFICATION: "false" NS_DEBUG: "true" TZ: "{{ timezone }}" restart_policy: unless-stoppedRelevant log output
Pi-hole Version
v6