ActivityPub in Ghost 6 aktivieren - selbstgehostet
Vor wenigen Tagen ist die Community-Ausgabe von Ghost 6 erschienen. Neben unzähligen kleinen Verbesserungen gibt es einige große Neuerungen: Ghost Analytics (auf Basis von Tinybird), vereinfachte Installation per Docker/Compose (als Vorschau) – und das Feature schlechthin: Ghost spricht ab sofort ActivityPub und wird damit Teil des Fediverse. 🤯🎉

Ghost ist eine moderne Open‑Source‑Publishing‑Plattform: CMS, Newsletter‑Plattform, Blog – kurz: ein Ich‑kann‑alles‑System.
Du kannst Ghost:
- als gehosteten Service unter https://ghost.org nutzen, oder
- die Software selbst hosten (z. B. via Docker).
Praktisch: Mit dem aktuellen Release wurde die Self‑Hosting‑Installation vereinfacht; es gibt offizielle Anleitungen für Docker und Docker‑Compose. Diese sind noch als Preview gekennzeichnet, sollen aber mit einem der nächsten Updates zur Standard‑Installationsmethode werden.
Ich hab ActivityPub für diesen Ghost‑Blog als Self-Hosting-Installation nun aktiviert. Im Folgenden habe ich die Schritte zur Einrichtungn dokumentiert.
Vielleicht magst du per ActivityPub (Mastodon, Pixelfed, was auch immer ...) unter @alex@digitalepfade.de folgen und den Beitrag kommentieren.
Ich freue mich, von dir zu lesen. 😊👋
Self-Hosting-Installation von AcitivityPub
für digitalepfade.de
Meine docker-compose.yml mit ActivityPub-Service:
services:
ghost:
image: ghost:latest
restart: always
environment:
NODE_ENV: production
url: https://digitalepfade.de
database__client: mysql
database__connection__host: db
database__connection__user: root
database__connection__password: "<sicheres Passwort festlegen!!!>"
database__connection__database: ghost
mail__from: "your.domain <post@your.domain>"
mail__transport: "SMTP"
mail__options__host: "mail.your.domain"
mail__options__port: "465"
mail__options__secureConnection: "true"
mail__options__auth__user: "auth_user@your.domain"
mail__options__auth__pass: "your_smtp_password"
volumes:
- ./data/ghost:/var/lib/ghost/content
ports:
- "2368:2368"
activitypub:
image: ghcr.io/tryghost/activitypub:1.1.0
restart: always
expose:
- "8080"
volumes:
- ./data/ghost:/opt/activitypub/content
environment:
NODE_ENV: production
PORT: 8080
MYSQL_HOST: db
MYSQL_USER: root
MYSQL_PASSWORD: <sicheres Passwort festlegen!!!>
MYSQL_DATABASE: activitypub
ALLOW_PRIVATE_ADDRESS: true
USE_MQ: false
LOCAL_STORAGE_PATH: /opt/activitypub/content/images/activitypub
LOCAL_STORAGE_HOSTING_URL: https://digitalepfade.de/content/images/activitypub
depends_on:
db:
condition: service_healthy
activitypub-migrate:
condition: service_completed_successfully
ports:
- "8080:8080"
db:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: <sicheres Passwort festlegen!!!>
MYSQL_DATABASE: ghost
MYSQL_MULTIPLE_DATABASES: activitypub
volumes:
- ./data/db:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p'<sicheres Passwort festlegen!!!>'"]
interval: 1s
start_period: 30s
start_interval: 10s
retries: 120
activitypub-migrate:
image: ghcr.io/tryghost/activitypub-migrations:1.1.0
environment:
MYSQL_DB: "mysql://root:<sicheres Passwort festlegen!!!>@tcp(db:3306)/activitypub"
depends_on:
db:
condition: service_healthy
restart: no
Datenbank nachträglich anlegen
(⚠️ falls der DB‑Container bereits initialisiert wurde)
Die folgende Anweisung legt die benötigte Datenbank "activitypub" an.
docker compose exec -e MYSQL_PWD="$MYSQL_ROOT_PASSWORD(s.o.)" -T db sh -lc '
mysql -uroot -e "
CREATE DATABASE IF NOT EXISTS activitypub
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;"
'
Erstaufruf
Nach dem Start sollte Ghost bereits unter der IP des Hosts auf Port 2368 erreichbar sein. In der Ghost‑Vorlage wird Caddy als Reverse Proxy genutzt – ich setze auf den Nginx Proxy Manager und muss etwas anders vorgehen.
Reverse Proxy (Nginx Proxy Manager)
In den Proxy Hosts für deine Domain (bei mir digitalepfade.de) habe ich unter Custom Locations drei Einträge hinzugefügt, die auf den ActivityPub‑Service verweisen:
- /.ghost/activitypub/ → Weiterleitung an http://DEINE_IP_ODER_CONTAINERNAME:8080
- /.well-known/webfinger → Weiterleitung an http://DEINE_IP_ODER_CONTAINERNAME:8080
- /.well-known/nodeinfo → Weiterleitung an http://DEINE_IP_ODER_CONTAINERNAME:8080

- Bei mir laufen Ghost und Reverse Proxy auf getrennten Hosts. Das mag bei dir anders sein.
- Läuft Proxy und App auf unterschiedlichen Hosts, nutze die IP des ActivityPub‑Hosts. (siehe Screenshot)
- Läuft alles im selben Docker‑Netzwerk (empfohlen), setze als Ziel den Containernamen, also: "activitypub:8080".
ActivityPub aktivieren und Einrichten
Wenn alles eingerichtet ist, kannst du nach einem Neustart die ActivityPub-Funktionalität in den Ghost-Admin-Einstellungen aktivieren:

Nachdem findest du im Menü auf der linken Seite den Menüeintrag "Network" und du kannst mit dem Veröffentlichen, Liken und Kommentieren im Fediverse starten. 🚀

Tja, jetzt sollten wir über das Fediverse kommunizieren können. ✨