Skip to content

webhook returned status 405 #247

Description

@elmuz

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-stopped

Relevant log output

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

Pi-hole Version

v6

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions