Unable to follow any Mastodon account

Hello,

I’m impressed and very excited to use the latest version of Ghost! Your team did an amazing job <3 The beta version is super promising! That said, I’m encountering a problem that I haven’t found on the forum nor on GitHub (which surprises me a bit): I can’t follow accounts hosted on Mastodon servers… even though it works great for accounts hosted on Ghost and even GoToSocial servers! Please excuse me if this is a duplicate, I’d be happy to be redirected to a similar report.

Issue Summary

  • Unable to follow any account hosted on a Mastodon server

Steps to Reproduce

  1. Migrate a Ghost-CLI self-hosted site over to the new Docker Compose setup
  2. Setting up my config with a separate domain for my Ghost admin
  3. Activate the “Network” feature
  4. Setting up my profile with a custom social web handle
  5. Start following account
    1. Accounts hosted on a Ghost server → works perfectly fine
    2. Accounts hosted on a GoToSocial server → works perfectly fine
    3. Accounts hosted on a Mastodon server → doesn’t work

Setup information

Ghost Version
Self-hosted 6.0.7

Node.js Version
v22.18.0

How did you install Ghost?
Migrated a Ghost-CLI self-hosted site over to the new Docker Compose setup, full self-hosted, activitypub service included

  • activitypub:1.1.0

  • ghost:6-alpine (6.0.7)

  • caddy:2.10.0-alpine

Provide details of your host & operating system
Debian 12.12

Database type
MySQL 8

Relevant log / error output
ERR fedify·federation·outbox: Failed to send activity 'https://www.harvestntech.fr/.ghost/activitypub/follow/d3c9b3fa-bad6-42dc-8f24-fdac9215cd29' to 'https://mastodon.social/users/european_alternatives/inbox'(401 'Unauthorized'):'{"error":"Error parsing signature parameters"}'

Interesting! I have followed several mastodon.social accounts from my Ghost site without issues.

Could you please update your post with some details? Are you using the ghost-hosted activitypub (proxying ap.ghost.org), or self-hosted? Is the problem this specific user, or can you confirm that it doesn’t work with multiple mastodon.social users? What about another mastodon instance?

If you’re self hosting, please share what specific version of Ghost and ActivityPub you’re running. And if you aren’t on the latest, please update and see if the problem remains?

1 Like

thanks for your quick reply!

  • I am full self-hosted, I’m not using the ghost-hosted activitypub
  • The problem is not specific to one user nor one server. I’ve tried to follow several different accounts on several different Mastodon instances (mastodon.world, mastodon.social, mastodon.online…)
  • I’m using
    • activitypub:1.1.0
    • ghost:6-alpine (6.0.7)
    • caddy:2.10.0-alpine
  • I think I’m up to date and still having the problem, below another fresh extract from logs

From caddy

2025/09/14 14:40:50.337	ERROR	http.log.access.log0	handled request	
{"request": {"remote_ip": "90.93.125.246", "remote_port": "54639", "client_ip": 
"90.93.125.246", "proto": "HTTP/2.0", "method": "POST", "host": 
"www.harvestntech.fr", "uri": "/.ghost/activitypub/v1/actions/follow/
@revanche@mastodon.gamedev.place", "headers": {"Referer": ["https://
admin.harvestntech.fr/"], "Authorization": ["REDACTED"], "Sec-Fetch-Dest": 
["empty"], "Priority": ["u=4"], "Sec-Fetch-Site": ["same-site"], "Te": 
["trailers"], "Accept-Language": ["fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3"], 
"Accept-Encoding": ["gzip, deflate, br, zstd"], "Sec-Gpc": ["1"], "Sec-Fetch-
Mode": ["cors"], "User-Agent": ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; 
rv:142.0) Gecko/20100101 Firefox/142.0"], "Accept": ["application/
activity+json"], "Origin": ["https://admin.harvestntech.fr"], "Content-Length": 
["0"]}, "tls": {"resumed": true, "version": 772, "cipher_suite": 4867, "proto": 
"h2", "server_name": "www.harvestntech.fr"}}, "bytes_read": 0, "user_id": "", 
"duration": 0.5033645, "size": 21, "status": 500, "resp_headers": {"Strict-
Transport-Security": ["max-age=31536000;"], "X-Xss-Protection": ["1; 
mode=block"], "Content-Type": ["text/plain; charset=UTF-8"], "Vary": ["Origin"], 
"Via": ["1.1 Caddy"], "Content-Security-Policy": ["frame-ancestors 'self' 
admin.harvestntech.fr"], "X-Content-Type-Options": ["nosniff"], "Access-Control-
Allow-Credentials": ["true"], "Access-Control-Allow-Origin": ["https://
admin.harvestntech.fr"], "Date": ["Sun, 14 Sep 2025 14:40:50 GMT"], "Cache-
Control": ["no-cache, private, no-store, must-revalidate, max-stale=0, post-
check=0, pre-check=0"], "Content-Length": ["21"], "Alt-Svc": ["h3=\":443\"; 
ma=2592000"], "Referrer-Policy": ["strict-origin-when-cross-origin"]}}

From activitypub

activitypub-1  | 14:40:50.335 ERR activitypub: Error: Failed to send activity https://www.harvestntech.fr/.ghost/activitypub/follow/1eecf33c-1823-4047-8de4-187f32e7d91d to https://mastodon.gamedev.place/users/revanche/inbox (401 Unauthorized):
activitypub-1  | {"error":"Error parsing signature parameters"}

Ok the bug was me :wink: (I should have known from the beginning)

My Caddyfile configuration was wrong.

The wrong version was:

# Redirect root -> www domain
# To redirect the non-www variant of your domain to the www variant uncomment the 4 lines below and change CHANGE_ME to your root domain
# Note: You must have DNS setup correctly for both domains for this to work
# When using ActivityPub with a www. domain, you must enable this redirect for ActivityPub to work correctly
www {
        import snippets/Logging
        redir https://{$DOMAIN}{uri}
}

The correct version:

# Redirect root -> www domain
# To redirect the non-www variant of your domain to the www variant uncomment the 4 lines below and change CHANGE_ME to your root domain
# Note: You must have DNS setup correctly for both domains for this to work
# When using ActivityPub with a www. domain, you must enable this redirect for ActivityPub to work correctly
harvestntech.fr {
        import snippets/Logging
        redir https://{$DOMAIN}{uri}
}

I found it by reading again all the clear documentation How To Install Ghost With Docker (preview) - Ghost Developer Docs I mean… it’s written :stuck_out_tongue:

Sorry for the mistake, thanks for reading and trying to assist me! Now I can follow any accounts hosted on Mastodon :tada:

2 Likes