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 anap.ghost.orgweitergeleitet 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/webfingerdeaktivieren - 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.orgweiterleiten - 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.