ActivityPub in Ghost 6 aktivieren - selbstgehostet

ActivityPub in Ghost 6 aktivieren - selbstgehostet
Photo by Mediamodifier / Unsplash

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 6.0
Networked publishing, native analytics, and $100M earned by indie publishers
💡
Was ist Ghost?
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

⚠️ Alle Angaben sind ohne Gewähr – nutze starke Passwörter und sichere deine Daten! Wenn du frisch startest, folge bitte der offiziellen Installation.

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
Edit Proxy Host unter Nginx Proxy Manager
💡
Hinweise:
- 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:

Networking-Funktion 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. 🚀

Network-Bereich im Backend

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