ActivityPub und WebFinger für Ghost zuverlässig aktivieren – mit NGINX und Cloudflare

ActivityPub und WebFinger für Ghost zuverlässig aktivieren – mit NGINX und Cloudflare

Ghost unterstützt ActivityPub seit Version 5.82 über ein zentrales Föderations‑Gateway (https://ap.ghost.org). Die lokale Ghost‑Instanz erzeugt keine eigenen ActivityPub‑Routen, sondern leitet alle föderierten Anfragen an dieses Gateway weiter. Damit ActivityPub funktioniert, müssen zwei Dinge stimmen:

  • Die NGINX‑Konfiguration muss WebFinger und ActivityPub korrekt weiterleiten.
  • Falls Cloudflare genutzt wird, müssen bestimmte Einstellungen beachtet werden, damit Signaturen, Header und Weiterleitungen nicht zerstört werden.

Dieser Artikel zeigt eine robuste Lösung, die ohne Änderungen an Ghost selbst funktioniert – ideal für Docker‑Setups, Reverse‑Proxies und Cloudflare‑Nutzer.


🔧 Warum ActivityPub bei Ghost oft nicht funktioniert

Ghost selbst spricht kein ActivityPub. Stattdessen:

  • WebFinger‑Anfragen (/.well-known/webfinger) müssen an ap.ghost.org weitergeleitet werden.
  • Ghosts interne ActivityPub‑Routen (/.ghost/activitypub/*) müssen ebenfalls dorthin.
  • Die Forwarded‑Header müssen die öffentliche Domain korrekt widerspiegeln.
  • Responses dürfen nicht gecacht werden, da ActivityPub‑Signaturen sonst ungültig werden.

Wenn einer dieser Punkte fehlt, können Mastodon, Threads oder andere Fediverse‑Server den Ghost‑Account nicht finden oder validieren.


🟩 Die funktionierende NGINX‑Konfiguration

Diese Konfiguration löst alle Probleme auf einmal:

# ─────────────────────────────────────────────
# ActivityPub: Ghost's internal AP gateway
# Proxies /.ghost/activitypub/* to https://ap.ghost.org
# ─────────────────────────────────────────────
location ^~ /.ghost/activitypub/ {
    proxy_pass            https://ap.ghost.org;
    proxy_http_version    1.1;
    proxy_ssl_server_name on;

    proxy_set_header Host              ap.ghost.org;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Port  443;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

    proxy_set_header Authorization     $http_authorization;

    add_header Cache-Control "no-store" always;
}

# ─────────────────────────────────────────────
# ActivityPub discovery: WebFinger + NodeInfo
# ─────────────────────────────────────────────
location ~ ^/.well-known/(webfinger|nodeinfo) {
    proxy_pass            https://ap.ghost.org;
    proxy_http_version    1.1;
    proxy_ssl_server_name on;

    proxy_set_header Host              ap.ghost.org;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Port  443;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

    proxy_set_header Authorization     $http_authorization;

    add_header Cache-Control "no-store" always;
}

Damit funktionieren WebFinger und ActivityPub sofort – unabhängig davon, ob Ghost in Docker läuft oder intern nur unter localhost:2368 erreichbar ist.


☁️ Besonderheiten bei Cloudflare – und warum die orange Cloud oft ActivityPub bricht

Viele Ghost‑Installationen laufen hinter Cloudflare. Das ist grundsätzlich kein Problem – aber ActivityPub ist extrem empfindlich gegenüber:

  • Header‑Manipulation
  • Caching
  • TLS‑Terminationsketten
  • IP‑Maskierung
  • Request‑Modifikationen

Cloudflare verändert standardmäßig genau diese Dinge. Deshalb scheitert ActivityPub häufig, wenn die orange Cloud aktiviert ist.

Damit ActivityPub zuverlässig funktioniert, müssen folgende Punkte beachtet werden:


🔶 1. Orange Cloud (Proxied) ist erlaubt – aber nur mit korrekten Einstellungen

Cloudflare darf proxies aktiv sein, aber nur wenn:

  • TLS auf Full (strict) steht
  • keine Caches .well-known/* betreffen
  • keine Transformationsregeln Header entfernen
  • keine Worker/Rules die Requests verändern

Wenn Cloudflare im Modus Flexible oder Full (non‑strict) läuft, bricht ActivityPub sofort, weil:

  • Signaturen ungültig werden
  • Ghost falsche Proto‑Header erhält
  • WebFinger nicht korrekt validiert werden kann

Empfohlene Einstellung:
SSL/TLS → Full (strict)


🔶 2. Caching für ActivityPub und WebFinger komplett deaktivieren

Cloudflare cached standardmäßig .well-known/* – fatal für ActivityPub.

Du brauchst eine Page Rule oder Cache Rule:

Cache Rule:

  • IF: URI Path/.well-known/*
  • THEN: Cache: Bypass

Und zusätzlich:

  • IF: URI Path/.ghost/activitypub/*
  • THEN: Cache: Bypass

Warum?
ActivityPub‑Responses enthalten kryptografische Signaturen. Jede Art von Cache macht sie ungültig.


🔶 3. Keine Transformationsregeln, die Header verändern

Folgende Cloudflare‑Features dürfen nicht aktiv sein:

  • Email Obfuscation
  • Rocket Loader
  • HTML Rewriting
  • Auto‑Minify (HTML/JS/CSS)
  • Brotli (optional, aber sicherheitshalber deaktivieren)
  • Mirage / Polish
  • Workers, die Headers verändern

Diese Funktionen können:

  • Signaturen zerstören
  • JSON‑Antworten verändern
  • Header entfernen
  • Requests umschreiben

Empfehlung:
Für ActivityPub‑Routen eine Rule setzen:

  • Disable Security Features
  • Disable Performance Features
  • Disable Transformations

🔶 4. Rate Limiting kann WebFinger blockieren

Cloudflare stuft WebFinger‑Requests manchmal als verdächtig ein, weil viele Fediverse‑Server gleichzeitig anfragen.

Wenn ActivityPub sporadisch funktioniert, liegt es oft daran.

Lösung:

  • Rate Limiting für /.well-known/webfinger deaktivieren
  • Security Level auf „Essentially Off“ für diese Route setzen

🔶 5. IPv6 und Bot Fight Mode können Probleme verursachen

Einige Fediverse‑Server (z. B. ältere Mastodon‑Instanzen) haben Probleme mit IPv6‑only‑Antworten.

Cloudflare kann Requests blockieren, wenn:

  • Bot Fight Mode aktiv ist
  • Super Bot Fight Mode aktiv ist

Beides sollte für ActivityPub‑Routen deaktiviert werden.


🟩 Zusammenfassung: So läuft ActivityPub mit Ghost + NGINX + Cloudflare stabil

NGINX:

  • WebFinger und ActivityPub an ap.ghost.org weiterleiten
  • Forwarded‑Header korrekt setzen
  • Kein Caching

Cloudflare:

  • SSL/TLS: Full (strict)
  • Caching: Bypass für .well-known/* und .ghost/activitypub/*
  • Keine Transformationsregeln
  • Keine Minify‑ oder Optimierungsfunktionen
  • Rate Limiting deaktivieren
  • Bot Fight Mode deaktivieren

Wenn diese Punkte erfüllt sind, funktioniert ActivityPub bei Ghost zuverlässig – auch hinter Cloudflare und Docker.