Soziale Netze müssen niemandem gehören. Genau das ist der Reiz des Fediverse: ein Verbund unabhängiger Server, die über ein gemeinsames Protokoll miteinander reden, statt sich einer zentralen Plattform unterzuordnen. Auf meinem Lab betreibe ich deshalb unter this-is-fine.social eine eigene Mastodon -Instanz. Dieser Beitrag erklärt, warum mir das wichtig ist — und wie der Stack auf Kubernetes konkret zusammengesetzt ist.
Warum überhaupt selbst hosten
Zentralisierte soziale Netze haben ein strukturelles Problem: Eine einzige Partei entscheidet über Reichweite, Regeln und Verfügbarkeit von Millionen Konten. Fällt sie aus, ändert ihre Geschäftsbedingungen oder ihre Laune, sind alle betroffen.
ActivityPub
dreht dieses Modell um. Das Protokoll standardisiert, wie Server Beiträge, Folgebeziehungen und Reaktionen austauschen. Meine Instanz föderiert über die Inbox/Outbox-Semantik des Protokolls mit Mastodon, Pleroma, Misskey und allem anderen, das ActivityPub spricht — und bleibt dabei vollständig in meiner Hand. Mein Konto liegt auf meiner Domain, auf meiner Hardware und unter meinen Regeln: ein gleichberechtigter Knoten im selben Netz wie die großen Instanzen, nur von niemandem außer mir abschaltbar.
Mastodon ist kein Monolith
Der unbequeme Teil der Wahrheit: Mastodon ist für eine Person erstaunlich aufwendig. Es ist kein einzelner Prozess, sondern ein kleines verteiltes System aus mehreren Diensten, die alle ihren eigenen State pflegen wollen:
Jede dieser Komponenten ist im Repo eine eigene deklarative Ressource — ganz im Sinne des GitOps-Aufbaus des Labs.
Die Datenbank: CloudNativePG
Den PostgreSQL-Cluster verwaltet der CloudNativePG -Operator. Drei Instanzen mit Replikation, separater WAL-Storage und wöchentlichem Volume-Snapshot-Backup — das ist mehr Datenbank-Infrastruktur, als manch produktives SaaS mitbringt:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: mastodon-v1
spec:
instances: 3
storage:
storageClass: "ceph-block"
size: 200Gi
walStorage:
storageClass: "ceph-block"
size: 20Gi
backup:
volumeSnapshot:
className: "ceph-block"
Der Cache: Dragonfly statt Redis
Statt eines klassischen Redis läuft als Cache- und Job-Queue-Backend
Dragonfly
— protokollkompatibel, aber deutlich speichereffizienter. Der Operator legt mir einen Dragonfly mit Passwort aus einem Secret an und schnappschießt den Zustand alle fünf Minuten weg. Mastodon merkt davon nichts; für die App ist es schlicht „Redis“.
Die Medien: S3 auf Rook-Ceph
Hochgeladene Bilder und Videos landen nicht im Pod, sondern in einem S3-Bucket. Den stellt mir Rook-Ceph über einen ObjectBucketClaim (RGW) bereit — dieselbe S3-API wie bei AWS, nur eben auf den NVMes meines eigenen Clusters. Mastodon spricht das Bucket über die generierten Zugangsdaten an; ein Stück Bucket-Policy gibt öffentliche Lesezugriffe auf die Medien frei.
Secrets, Routing und der geteilte Host
Die sensiblen Werte — secret_key_base, die VAPID-Schlüssel für Web-Push, das OTP-Secret, die Active-Record-Encryption-Keys und die SMTP-Zugangsdaten — kommen ausnahmslos aus Vault und werden über einen ExternalSecret als Kubernetes-Secret eingespielt. Im Repo steht davon kein einziges Zeichen im Klartext.
Nach außen hängt die Instanz an einer HTTPRoute am gemeinsamen Envoy-Gateway. Ein hübsches Detail: Derselbe Host bedient auch meinen Matrix-Server — die /_matrix/- und /.well-known/matrix/-Pfade werden an Synapse weitergereicht, während alles andere an Mastodon geht. Föderation und Matrix teilen sich so eine Domain, ohne sich in die Quere zu kommen:
- matches:
- path: { value: /api/v1/streaming, type: PathPrefix }
backendRefs:
- { name: mastodon-streaming, port: 4000 }
- matches:
- path: { value: /_matrix/, type: PathPrefix }
backendRefs:
- { name: synapse-matrix-synapse, namespace: matrix, port: 8008 }
- matches:
- path: { value: /, type: PathPrefix }
backendRefs:
- { name: mastodon-web, port: 3000 }
Fazit
Eine eigene Fediverse-Präsenz ist ein wunderbares Gefühl von Unabhängigkeit — und gleichzeitig ein ehrlicher Lehrmeister in Sachen Betriebsaufwand. Der Stack oben ist solide und produktionsreif, aber für genau ein menschliches Konto ist er auch ordentlich überdimensioniert. Genau diese Spannung wird mich später noch beschäftigen; aber solange das hier steht, betreibe ich mit Freude meinen eigenen kleinen Knoten im großen Netz.
