I’m running Ghost 6.23.0 on PikaPods. The ActivityPub/Fediverse feature works correctly on the default pikapod.net subdomain, but fails after configuring a custom domain.
On every boot I get:
ERROR Could not get webhook secret for ActivityPub
FetchError: invalid json response body at https://lokz.net/.ghost/activitypub/v1/site
reason: Unexpected token 'g', "ghost_uuid"... is not valid JSON
ERROR No webhook secret found - cannot initialise
When I manually request https://lokz.net/.ghost/activitypub/v1/site I get:
{"error":"Forbidden","code":"ROLE_MISSING"}
The response headers confirm the request is reaching ap.ghost.org:
server: Google Frontend
via: 2.0 Caddy, 1.1 google
I’ve ruled out DNS and proxy issues — the domain resolves correctly to PikaPods’ IP via a clean Porkbun ALIAS record with no Cloudflare proxy involved. PikaPods confirmed their reverse proxy configuration is identical for both the default subdomain and custom domain, and directed me here since ap.ghost.org is Ghost-managed infrastructure.
My understanding is that the AP sidecar at ap.ghost.org has the site registered under the pikapod.net subdomain identity but not under the custom domain. When Ghost tries to initialize AP webhooks using the custom domain hostname, the sidecar returns ROLE_MISSING.
Pod hostname: lilac-buffalo.pikapod.net
Custom domain: lokz.net
Site UUID: aa7d1a2a-3df4-4a9f-8153-084583ec2e50
Ghost version: 6.23.0
Is there a way to register the custom domain with the AP sidecar, or is this a known issue with custom domains on self-hosted instances?
Apologies for the delay getting back to you — I somehow missed this thread.
There was indeed an existing entry for lilac-buffalo.pikapod.net in ap.ghost.org instead of your custom domain, lokz.net. I’ve now cleared that entry, so your custom domain should be able to register correctly on the next Ghost restart.
Would you mind restarting your Ghost site and then letting me know if you’re still running into any issues?
The issue was indeed similar (entry for the PikaPods domain instead of custom domain). I’ve now cleared that entry. Your custom domain should be able to register correctly on the next Ghost restart.