ActivityPub: 429 errors and partial UI loading

Hi, I am still stuck at this step. My ghost site is a cli install and was upgraded to 6 from 5, I have added the nginx blocks too. And this is what I am seeing right now. Also getting a lot of 429 rate limits too. :slight_smile: . Attaching some screenshots and my nginx config.

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name techweirdo.net;
  return 301 https://www.techweirdo.net$request_uri;
}

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name www.techweirdo.net www1.techweirdo.net;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }
  
  {{settings}}

  index index.html;
  

  location ~ /.ghost/activitypub/* {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    #add_header X-Content-Type-Options $header_content_type_options;
    add_header X-Content-Type-Options nosniff;
    proxy_ssl_server_name on;
    proxy_pass https://ap.ghost.org;
}

location ~ /.well-known/(webfinger|nodeinfo) {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    #add_header X-Content-Type-Options $header_content_type_options;
    add_header X-Content-Type-Options nosniff;
    proxy_ssl_server_name on;
    proxy_pass https://ap.ghost.org;
}


location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  location / {
    proxy_pass http://127.0.0.1:2368/;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_pass_request_headers on;
    proxy_pass_header ETag;
    proxy_max_temp_file_size 0;
    proxy_connect_timeout 900;
    proxy_send_timeout 900;
    proxy_read_timeout 900;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;
    
    
    sub_filter_once off;
    proxy_set_header Accept-Encoding "";

    # TechWeirdo-specific rewrites
    sub_filter '/assets/' 'https://assets.techweirdo.net/assets/';
    sub_filter '/content/images/' 'https://assets.techweirdo.net/content/images/';
    sub_filter '/public/' 'https://assets.techweirdo.net/public/';
    sub_filter 'https://www.techweirdo.net/content/images/' 'https://assets.techweirdo.net/content/images/';
    sub_filter 'https://www.techweirdo.net/assets/' 'https://assets.techweirdo.net/assets/';
    sub_filter 'https://www.techweirdo.net/public/' 'https://assets.techweirdo.net/public/';
    sub_filter 'https://cdn.techweirdo.net/content/' 'https://assets.techweirdo.net/content/';
  
     }
  
    
   location /minions/ {
        proxy_pass http://127.0.0.1:8000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    
   location = /api/event {
        proxy_pass http://127.0.0.1:8000/api/event;
        proxy_set_header Host $host;
        proxy_buffering on;
        proxy_http_version 1.1;

        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
    }
}

You’ve restarted Ghost, right? :slight_smile:

1 Like

I forgot -_-, so I just did it now. But the problem is still there :slight_smile:

Looking at your Ghost logs right after restart, do you see a message about setting up activitypub? Or a message about failed webhooks?

Nope nothing during reboot, but ghost doctor showed some error. Here is the outputs of ghost restart and ghost doctor.

twdo@toothless:~/htdocs/www.techweirdo.net$ ghost restart
Love open source? We’re hiring JavaScript Engineers to work on Ghost full-time.
https://careers.ghost.org
āœ” Restarting Ghost
twdo@toothless:~/htdocs/www.techweirdo.net$ ghost doctor
Love open source? We’re hiring JavaScript Engineers to work on Ghost full-time.
https://careers.ghost.org
āœ– Checking system Node.js version - found v22.14.0
ℹ Ensuring user is not logged in as ghost user [skipped]
ℹ Checking if logged in user is directory owner [skipped]
āœ– Checking current folder permissions
āœ” Checking for a MySQL installation
Instance is currently running
ℹ Validating config [skipped]
āœ” Checking memory availability
āœ” Checking binary dependencies
āœ” Checking free space
One or more errors occurred.
1) Checking system Node.js version
Message: The directory /home/twdo/.nvm/versions/node/v22.14.0/bin/node is not readable by other users on
 the system.
This can cause issues with the CLI, you must either make this directory readable by others or install no
de and Ghost-CLI in another location.
2) SystemError
Message: The directory /home/twdo/htdocs/ is not readable by other users on the system.
This can cause issues with the CLI, you must either make this directory readable by others or run `ghost
 install` in another location.
Debug Information:
    OS: Ubuntu, v22.04.5 LTS
    Node Version: v22.14.0
    Ghost Version: 6.0.0
    Ghost-CLI Version: 1.27.0
    Environment: production
    Command: 'ghost doctor'
Try running ghost doctor to check your system for known issues.
You can always refer to https://ghost.org/docs/ghost-cli/ for troubleshooting.
twdo@toothless:~/htdocs/www.techweirdo.net$

I’m seeing the exact same flavor of broken Network section of the Admin console as @smartgoat using the self-hosted Docker ActivityPub containers.

Nothing seems out of the ordinary in my logs.

[2025-08-07 00:37:13] INFO Checking ActivityPub Webhook state

[2025-08-07 00:37:13] INFO ActivityPub webhooks in correct state

[2025-08-07 00:37:13] INFO Explore Response 200 OK

I just can’t administrate the Network section of my blog. (I can even find my blog in Mastodon with the default index address)

It would be kind of swell if a Ghost dev acknowledged some of this stuff…

In addition to the broken UI elements already shown in this thread, the ability to post Notes is also broken (the ā€œPost" button cannot be clicked). This includes the Send Feedback form, which is basically replying to a Note. So while I’d love to send official bug feedback reports, this forum is all I have.

Again, my Ghost blog is actually federating successfully. There are no errors in the logs for ghost or activitypub. The AP webhooks are valid. I’m just unable to access any of the Admin settings in the UI for the Network section. I’m seeing exactly what @smartgoat has already thoroughly documented.

I’m having very similar issues to smartgoat here, too. Explore tab loads, so does notes, and preferences shows something—but reader shows rate limited, and profile says ā€œnot found.ā€

I added the blocks listed in the documentation to both [myurl].conf and [myurl]-ssl.conf under /etc/nginx/sites-available, but I can’t quite figure out why it’s not working. I’ve reloaded nginx, and restarted Ghost. Any ideas?

Hey @smartgoat , I think the Ghost Doctor message is probably a distractor, but can I encourage you to update versions? There are several new fixes to Ghost CLI since the version you’re running. If that error about readable directories persists, you might start a new thread with it – I don’t think that error is activitypub related.

Meanwhile, I’ve split this discussion about 429 errors with partial UI loading (it isn’t ā€œloading interruptedā€) to its own thread. Let’s continue to discuss that here.

Hey friends, before you post on this thread, please make sure that your problem matches the one being reported:

  • CLI install (not Docker)

  • Ghost-hosted ActivityPub

  • The AP interface partially loads, but is not functional, with 429 errors.

(Sorry for yelling!) If it isn’t a good match, please find a thread that is, or start a new one.

1 Like

@smartgoat , I just wanted to confirm that you’re looking in your logs (not just on the console) for the activitypub webhooks message, immediately after restarting Ghost. Do you have the message that RxBrad posted, or something else? Trying to sort out your exact setup. :slight_smile: It would be before the 429 errors you posted.

Hi @Cathy_Sarisky , thank you for looking into it. I am not sure if this is what you were asking, if it is not, please let me know how to get the logs :slight_smile:

twdo@toothless:~/htdocs/www.techweirdo.net$ ghost restart
Love open source? We’re hiring JavaScript Engineers to work on Ghost full-time.
https://careers.ghost.org
āœ” Restarting Ghost
twdo@toothless:~/htdocs/www.techweirdo.net$ ghost log
Love open source? We’re hiring JavaScript Engineers to work on Ghost full-time.
https://careers.ghost.org
[2025-08-08 16:18:42] INFO Ghost server started in 0.342s
[2025-08-08 16:18:42] INFO Database is in a ready state.
[2025-08-08 16:18:42] INFO Ghost database ready in 0.527s
[2025-08-08 16:18:42] WARN Missing mail.from config, falling back to a generated email address. Please update your config file and set a valid from address
[2025-08-08 16:18:43] INFO Invalidating assets for regeneration
[2025-08-08 16:18:43] INFO Adding offloaded job to the inline job queue
[2025-08-08 16:18:43] INFO Scheduling job mentions-email-report at 37 9 * * * *. Next run on: Fri Aug 08 2025 17:09:37 GMT+0000 (Coordinated Universal Time)
[2025-08-08 16:18:44] INFO Adding offloaded job to the inline job queue
[2025-08-08 16:18:44] INFO Scheduling job clean-expired-comped at 15 10 4 * * *. Next run on: Sat Aug 09 2025 04:10:15 GMT+0000 (Coordinated Universal Time)
[2025-08-08 16:18:44] INFO Adding offloaded job to the inline job queue
[2025-08-08 16:18:44] INFO Scheduling job clean-tokens at 50 18 9 * * *. Next run on: Sat Aug 09 2025 09:18:50 GMT+0000 (Coordinated Universal Time)
[2025-08-08 16:18:44] WARN Failed to fetch member statistics
[2025-08-08 16:18:44] INFO Pinging Explore with Payload https://explore.ghost.org/api/update {"ghost":"6.0.0","site_uuid":"7893b528-e86b-4644-867b-49da36ff184d","url":"https://www.techweirdo.net","theme":"tuuli-twdo","facebook":"smartgoatblog","twitter":"@smartgoatblog","posts_total":38,"posts_last":"2025-08-06T19:57:57.000Z","posts_first":"2024-03-14T04:20:00.000Z","members_total":null,"mrr":null}
[2025-08-08 16:18:44] INFO Ghost booted in 2.254s
[2025-08-08 16:18:44] INFO Adding offloaded job to the inline job queue
[2025-08-08 16:18:44] INFO Scheduling job update-check at 35 2 19 * * *. Next run on: Fri Aug 08 2025 19:02:35 GMT+0000 (Coordinated Universal Time)
[2025-08-08 16:18:44] INFO Running milestone emails job on Fri Aug 08 2025 16:18:44 GMT+0000 (Coordinated Universal Time)
[2025-08-08 16:18:44] INFO URL Service ready in 1435ms
[2025-08-08 16:18:44] ERROR No webhook secret found - cannot initialise
[2025-08-08 16:18:44] INFO Explore Response 200 OK

That’s an activitypub failure, yep. And it’s different from what @RxBrad is reporting (although it sounds like the behavior on the front end is similar).

That error appears to come from here:

Which causes it to make a request to:
.ghost/activitypub/v1/site

Are you able to see that happening? (That endpoint should be getting proxied over to Ghost’s hosted AP instance, since that’s how you’re set up.)

I’m wondering if toggling activitypub off and then back on (in /ghost > settings > network), probably with a full ā€˜ghost stop’ and ā€˜ghost start’ in the middle might cause Ghost to make another attempt to initialize activitypub correctly. I’m not sure, but it seems easy enough to try. :slight_smile:

I switched off ap from settings, then stopped ghost, started ghost and switched on ap, still same.

In the nginx log I can see

When Ghost starts, what does it say about webhooks? Still missing a secret, or something else?

I briefly tried using ap.ghost.org as my AP target, and couldn’t get past the Rate Limited errors when I tried accessing my Admin settings. My blog did become discoverable on ActivityPub at that point.

I then transitioned to self-hosted AP containers (with the AP webhooks forwarded to them via Cloudflare).

I see that this thread exists and wonder if it’s partially to blame: Question: Can I migrate selfhosted ActivityPub data to managed ap.ghost.org? - #3 by Cathy_Sarisky

(I tried transitioning back to the ap.ghost.org target, but I still get a flood of identity API calls when accessing the Network admin section and end up rate limited)

When the AP was switched off and I Stopped and started Ghost ( AP Off > Ghost Stop > Ghost Start > AP On ) there was no webhook error. But the error reappeared when I turned AP On > AP Off > Ghost Stop > Ghost Start i got the webhook error..

At this point should I just do a fresh install on a fresh server ?

Update: I did not find a solution, so I migrated to a new server, did a docker install this time and AP hosted locally. Previous CLI installation was on a ARM cpu. But the docker images was throwing error on ARM, so I needed to migrate to x86 server.

I believe I meet this criteria: fully self-hosted, trying to use the ghost version of AP, and can see parts of the AP interface but not meaningfully interact with them—apologies if that wasn’t clear.

I’d love some help with this as well!

I checked the Cloudflare, CloudPanel, and Nginx settings and didn’t find any errors.
But I noticed something:
I use the Brave browser. When I tested it in a private window, it worked fine. I also tested it with Firefox, and everything worked.
In my case, I think the error may be in the browser.

2 Likes

Hey everyone, we’ve updated the rate limit thresholds and the experience should be much smoother now.

3 Likes

Update on my experience… All of my prior attempts to use the Network Admin dashboard (with self-hosted ActvityPub) were on my phone.

That’s still broken, and elements still refuse to load.

HOWEVER, now that I’m back from my vacation, I see that everything renders correctly on Chrome on my PC. I tried logging out and clearing cookies on Chrome on my phone. Still broken on mobile.