GoToSocial
GoToSocial is ein ActivityPub Server. Was das ist und was GTS alles kann am besten in der offiziellen Dokumentation nachlesen.
Installation
Damit GoToSocial auf social.queereszentrumtuebingen.de laufen kann mussten wir zwei Dinge machen
Hostname und Account Domain spezifizieren
gotosocial_hostname: 'social.queereszentrumtuebingen.de'
gotosocial_account_domain: queereszentrumtuebingen.de
Redirect Regeln auf der Hauptdomain
Das ist möglich indem die Datei STRATO-apps/wordpress_01/app/.htaccess
bearbeitet wird und Weiterleitungen für .well-known/webfinger
, well-known/nodeinfo
und /.well-known/host-meta
eingerichtet werden.
Das [R,L]
am Ende bedeutet, dass das danach keine andere Weiterleitungsregel mehr beachtet wird (L
) und dass der Rewrite dauerhaft ist (R
).
queereszentrumtuebingen.de> cat STRATO-apps/wordpress_01/app/.htaccess
# Block the include-only files.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
RewriteRule ^.well-known/webfinger$ https://social.queereszentrumtuebingen.de/.well-known/webfinger [R,L]
RewriteRule ^.well-known/nodeinfo$ https://social.queereszentrumtuebingen.de/.well-known/nodeinfo [R,L]
RewriteRule ^.well-known/host-meta$ https://social.queereszentrumtuebingen.de/.well-known/host-meta [R,L]
</IfModule>
# BEGIN WordPress
# Die Anweisungen (Zeilen) zwischen „BEGIN WordPress“ und „END WordPress“ sind
# dynamisch generiert und sollten nur über WordPress-Filter geändert werden.
# Alle Änderungen an den Anweisungen zwischen diesen Markierungen werden überschrieben.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Einbinden auf der Website
Der GoToSocial Feed vom Account @qzt@queereszentrumtuebingen.de ist auch auf der Website eingebunden.
An sich funktioniert das über die API /api/v1/accounts/{account_id}/statuses
. Das Problem an dieser API ist,
dass sie inzwischen durch „Authorized fetch“ geschützt wird. Das bedeuted, jeder API call muss mit einem Access Token
unterschrieben sein. Ein Access Token ist spezifisch für einen Fediverse Account. Das ist das was auch Fediverse Apps wie
Tusky oder Phanpy tun. Sie nutzen den Access Token um in deinem Namen Posts zu lesen und abzuschicken.
Authorized Fetch hat folgende Vorteile
Datensammlung ist nicht möglich wenn außer über Fediaccounts
Block können nicht über die Public API umgangen werden werden
Leider verhindert es auch, dass wir unsere eigenen Post über die öffentliche API abrufen.
Wir könnten authorized fetch abschalten indem wir den GoToSocial code anpassen. Das ist aber nicht ideal, wir müssten ein eigenes Docker Image bauen und das für jedes Update.
Der Punkt von authorized fetch ist, dass nur fedi-accounts (und Apps die ihr authorisiert) die API nutzen können. Also machen wir eben das! Wir erstellen einen Account und eine App und autorisieren die as described in the GoToSocial documentation. Mit diesem Authorization-Code kannst du einen access token für die App erstellen Wir könnten den jetzt einfach in den Javascript code den token einfügen und alles würde funktionieren. Aber es wäre nicht sicher. Denn jede Person könnte diesen Access Token nehmen und im Namen dieses Accounts posten. Angreifer könnten so Datan über unseren Account abrufen oder ihn gar zum versenden von Spam nutzen.
Stattdessen nutzen wir einen Proxy der den access token sicher verwahrt und nur bestimmte Aktionen zulässt. Zu finden ist der Code dafür unter moanos/FediProxy.
Auf unserem Server ist der Proxy zu finden unter /root/fediproxy
.
Gestartet wird er über Docker Compose
services:
fediproxy.queereszentrumtuebingen.de:
image: docker.io/moanos/fediproxy
container_name: "fediproxy.queereszentrumtuebingen.de"
restart: unless-stopped
environment:
EXTERNAL_API_BASE_URL: ${EXTERNAL_API_BASE_URL}
ACCESS_TOKEN: ${ACCESS_TOKEN}
ALLOWED_ACCOUNTS: ${ALLOWED_ACCOUNTS}
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.fediproxy.rule=Host(`fediproxy.queereszentrumtuebingen.de`)"
- "traefik.http.routers.fediproxy.service=fediproxy-service"
- "traefik.http.routers.fediproxy.entrypoints=web-secure"
- "traefik.http.routers.fediproxy.tls=true"
- "traefik.http.routers.fediproxy.tls.certResolver=default"
- "traefik.http.services.fediproxy-service.loadbalancer.server.port=8000"
networks:
- traefik
networks:
traefik:
name: "traefik"
external: true
Konfiguriert wird über die Datei .env
Jetzt können wir endlich den Feed auf der Website einbinden. Dafür nuten wir das Plugin Include Mastodon Feed. Wenn das Plugin installiert ist können wir es per Shortcut nutzen .. code-block::
[include-mastodon-feed instance="fediproxy.queereszentrumtuebingen.de" account="ZGGZF4G8NNOTREAL81Z8G7RTC"]
Wenn du ein bisschen rumtesten willst kannst du https://git.hyteck.de/moanos/include-fedi nutzen.