Ein eigener Mastodon-Server – Was man dazu braucht und wie das geht

Ein eigener Mastodon-Server – Was man dazu braucht und wie das geht

Mastodon ist aktuell ja wieder in aller Munde. Die aktuellen Entwicklungen der letzten Wochen bei Twitter sind ja durchaus beunruhigend und haben schon viele User dazu bewogen, zu Mastodon umzuziehen oder dieses zumindest parallel zu nutzen. Die dezentrale Struktur von Mastodon erlaubt es sogar, dass man eine eigene Mastodon-Instanz betreiben kann. Und genau das habe ich nun gemacht.

Was ist Mastodon?

Mastodon ist eine soziales Netzwerk bzw. eine Mikroblogging-Plattform, die sehr ähnlich funktioniert wie Twitter. Der große Unterschied ist aber, dass es sich dabei nicht um den Dienst eines kommerziellen Anbieters handelt, sondern um ein dezentrales Netzwerk, an dem alle teilnehmen können. Wenn man sich bei Mastodon registrieren möchte, muss man also zunächst einen Mastodon-Server auswählen. Trotzdem kann man mit allen Usern auf allen Servern genauso kommunizieren, als wenn diese auf dem gleichen Server angemeldet sind.

Mastodon setzt auf dem ActivityPub Protokoll auf, somit ist eine Kommunikation auch zu anderen Diensten möglich, die ebenfalls auf ActivityPub basieren. Mastodon ist also zunächst einmal eine Open Source Software, die seit 2016 von Eugen Rochko und seiner Firma Mastodon gGmbH entwickelt wird.

Die Anzahl der aktiven Instanzen ist in den letzten Wochen rapide angestiegen und viele Instanzen lassen aktuell gar keine Registrierungen mehr zu. Aktive und öffentliche Instanzen lassen sich aber z.B. über instances.social finden. Oder man setzt eben eine eigene Mastodon-Instanz auf. Ebenfalls öffentlich, auf der Basis von Einladungen, oder eben als Single-User-Instanz nur für sich selber.

Die eigene Mastodon-Instanz

Ich habe mich also dazu entschieden eine eigene Instanz aufzusetzen. Als Single-User-Lizenz, allerdings ohne das entsprechende Konfigurations-Flag, damit ich auch die Möglichkeit hätte, weitere User einzurichten z.B. als Bot oder Ähnliches. Aber der Reihe nach.

Die Dokumentation von Mastodon ist eigentlich ziemlich gut, allerdings will ich auf einige Punkte hier doch nochmal etwas individueller eingehen.

Was braucht man für eine eigene Instanz?

Bevor man mit der eigentlichen Installation und Konfiguration beginnen kann, müssen allerdings ein paar Vorüberlegungen bzw. Vorbereitungen getroffen werden. Theoretisch könnte man die Instanz auch auf einem lokalem Server, einer NAS oder Ähnlichem installieren, allerdings ist die Nutzung eines VPS/vServers deutlich einfacher, da man sich dabei nicht mit der Firewall, Port-Freigaben und Ähnlichem herumschlagen muss.

Kleine VPS gibts es schon für ein paar Euro im Monat, allerdings konnte ich keine eindeutigen Informationen finden, welche Ressourcen für den Betrieb einer Single-User-Instanz wirklich nötig sind. Wie ich inzwischen weiß, sind RAM und CPU gar nicht das größte Problem, sondern in erster Linie der verfügbare Speicherplatz, denn Mastodon benötigt davon erheblich mehr als man vermuten würde. Aber dazu später mehr.

Dann benötigt man natürlich eine eigene Domain, oder zumindest eine Subdomain von einer bereits vorhandenen Domain. Ich habe mir kurzerhand die Domain mielke.social registriert.

Außerdem benötigt man ein SMTP-Relay, bzw. einen SMTP-Server, über den die Mastodon-Instanz E-Mails versenden kann, z.B. für Notifications.

Da wie oben bereits erwähnt der Speicherplatz zum Problem werden könnte, wird seitens Mastodon außerdem empfohlen, zusätzlich einen Object Storage Provider zu nutzen. Dieser sollte Amazon S3 kompatibel sein. Dort wird dann der größte Teil des statischen Contents, also Bilder, Icons, etc. gespeichert. Das habe ich allerdings aktuell noch nicht eingerichtet.

Vorbereitung des VPS

Mastodon empfiehlt Ubuntu 20.04 oder Debian 11 – ich habe ich mich für Debian 11 entschieden. Wenn der VPS eingerichtet bzw. aktiviert ist, sollten zunächst noch ein paar sicherheitsrelevante Dinge konfiguriert werden. Dazu gehört die Deaktivierung des passwort-basierten SSH-Logins auf den Login per SSH-Key. Weiterhin wird empfohlen mittels Fail2ban unerlaubte Login-Versuche automatisiert zu blockieren. Und natürlich die Installation entsprechender Firewall-Regeln mit iptables, sodass nur die HTTP(S) und SSH-Ports offen sind.

Wenn der VPS eingerichtet bzw. aktiviert ist, muss man noch den A-Record der Domain bzw. Subdomain auf die IP-Adresse des VPS setzen. Wenn dieser auch per IPv6 erreichbar ist, dann natürlich auch den AAAA-Record. Sobald der VPS dann über diese Domain erreichbar ist, kann man mit der Installation beginnen.

Die Installation von Mastodon

Die einzelnen Schritte der Installation sind in der offiziellen Dokumentation gut beschrieben. Wenn man diese nacheinander wie angegeben ausführt, kann man im Anschluss die Domain im Browser aufrufen und sollte die Startseite des eigenen Mastodon-Servers sehen und sich dort mit dem zuvor festgelegten User anmelden können. Aber der Reihe nach.

Vorbereitungen

Zunächst sollte man zum root User wechseln:

sudo su -

Je nachdem, wie die Distribution auf dem Server installiert wurde, sollten zunächst noch einige grundlegende Pakete installiert werden, falls diese noch nicht vorhanden sind:

apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates

Node.js

curl -sL https://deb.nodesource.com/setup_16.x | bash -

PostgreSQL

wget -O /usr/share/keyrings/postgresql.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc
echo "deb  http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/postgresql.list

Notwendige System-Pakete

apt update
apt install -y
imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core
g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf
bison build-essential libssl-dev libyaml-dev libreadline6-dev
zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev
nginx redis-server redis-tools postgresql postgresql-contrib
certbot python3-certbot-nginx libidn11-dev libicu-dev libjemalloc-dev

Yarn

corepack enable
yarn set version classic

Ruby

Aufgrund von zukünftigen Updates sollte Ruby unter dem User laufen, bei dem auch Mastodon installiert wird. Also wird zunächst der User angelegt:

adduser --disabled-login mastodon

Dann muss zu diesem User gewechselt werden:

su - mastodon

Jetzt wird Ruby mit allen notwendigen Abhängigkeiten installiert:

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec bash
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.4
rbenv global 3.0.4
gem install bundler --no-document
exit

Konfiguration von PostgreSQL

PostgreSQL ist schon installiert, muss aber noch für die Verwendung von Mastodon eingerichtet werden. Für die Konfiguration der optimalen Performance-Parameter sollte man das Tool pgTune aufrufen. Dort trägt man die Eckdaten des VPS ein und bekommt dann die notwendigen Parameter angezeigt, die man in die postgresql.conf eintragen sollte:

nano /etc/postgresql/15/main/postgresql.conf

Man muss diese Parameter in der Datei suchen und durch die vorgeschlagenen Werte ersetzen. Im Anschluss muss PostgreSQL neu gestartet werden:

systemctl restart postgresql

Da sich Mastodon ohne Passwort an der Datenbank anmelden können muss, benötigt man einen User, der mit dem Linux-Systembenutzernamen übereinstimmt.

sudo -u postgres psql
CREATE USER mastodon CREATEDB;
q

Installation und Konfiguration von Mastodon

Jetzt wird die eigentliche Mastodon-Software installiert:

su - mastodon
git clone https://github.com/mastodon/mastodon.git live && cd live
git checkout $(git tag -l | grep -v 'rc*$' | sort -V | tail -n 1)
bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)
yarn install --pure-lockfile

Die Software ist nun installiert und als nächstes wird der Setup-Wizard aufgerufen:

RAILS_ENV=production bundle exec rake mastodon:setup

Dabei werden verschiedene Eintellungen abgefragt und im Anschluss in der Datei .env.production gespeichert.

  • Domain name: Die Domain des VPS bzw. des Mastodon-Servers
  • Do you want to enable single user mode?: N
  • Are you using Docker to run Mastodon?: N
  • PostgreSQL host: default – Nur Enter drücken
  • PostgreSQL port: default – Nur Enter drücken
  • Name of PostgreSQL database: default – Nur Enter drücken
  • Name of PostgreSQL user: default – Nur Enter drücken
  • Password of PostgreSQL user: leer lassen – Enter drücken
  • Redis host: default – Nur Enter drücken
  • Redis port: default – Nur Enter drücken
  • Redis password: default – Nur Enter drücken
  • Do you want to store uploaded files on the cloud?: N
  • Do you want to send e-mails from localhost?: N
  • SMTP server: Die Adresse des SMTP-Servers
  • SMTP port: Der Port des SMTP-Servers (meist 587 oder 465)
  • SMTP username: Die Mail-Adresse bzw. der Username des SMTP-Servers
  • SMTP authentication: plain
  • SMTP OpenSSL verify mode: none
  • E-mail address to send e-mails "from": Absender-Adresse für Mails – Meist die gleiche wie SMTP-Login
  • Send a test e-mail with this configuration right now?: Y (Ja, E-Mail Test durchführen)
  • Send test e-mail to: Beliebige externe E-Mail-Adresse als Empfänger eingeben
    (Soweit ich mich erinnere wird man auch gefragt ob es geklappt hat und kann die Einstellungen bei Bedarf ändern)
  • Save configuration?: Y
  • Prepare the database now?: Y
  • Compile the assets now?: Y
  • Do you want to create an admin user straight away?: Y
  • Username: Account-Name des Mastodon-Users der Admin-Rechte bekommen soll.
  • E-Mail: E-Mail-Adresse des obigen Users

Damit ist die Grundeinrichtung fast abgeschlossen und man kann zurück zum root User wechseln:

exit

Einrichtung von nginx

Mastodon liefert ein Konfigurations-Template mit, das nur kopiert werden muss:

cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

In der Datei /etc/nginx/sites-available/mastodon muss dann aber noch der Domainname example.com durch die eigene Domain ersetzt werden:

nano /etc/nginx/sites-available/mastodon

Danach kann ngnix neu gestartet werden:

systemctl reload nginx

SSL-Zertifikat

Als letztes benötigen wir noch ein SSL-Zertifikat (example.com muss dabei natürlich durch die eigene Domain ersetzt werden):

certbot --nginx -d example.com

Danach muss ngnix noch einmal neu gestartet werden:

systemctl reload nginx

Jetzt sollte man bereits die Domain im Browser aufrufen können, allerdings noch eine Fehlermeldung von Mastodon sehen, da die Dienste erst noch gestartet werden müssen.

Mastodon-Dienste aktivieren und starten

Jetzt muss Mastodon nur noch aktiviert und gestartet werden:

cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming

Das war es! Mastodon ist installiert und man sollte sich mit dem zuvor definierten Mastodon-User anmelden können. Neben den erweiterten Funktionen als Administrator, hat man natürlich die gleichen Einstellungs-
Möglichkeiten, wie auf jeder anderen Mastodon-Instanz auch – Also Name, Beschreibung, Avatar, etc. und kann dann den Umzug des Accounts auf den eigenen Server vornehmen. Beim Umzug werden alle Followings und Follower übernommen, man kann also genauso weiter posten/tröten, wie bisher auch. Lediglich die bisherigen Posts/Tröts können nicht übernommen werden und verbleiben auf der bisherigen Instanz. Aber das ist bei jedem Umzug zwischen Mastodon-Instanzen so.

Einrichten von Relais – Föderierungsrelay

Da man ja auf der eigenen Instanz nicht nur Selbstgespräche führen will, muss man diese nun noch mit dem Fediverse verbinden, damit die eigenen Posts/Tröts auf anderen Instanzen sichtbar sind und damit man auch die Posts/Tröts der Followings lesen kann. In der Administration kann man dazu ein oder mehrere Relais eintragen.

Leider konnte ich dazu in der offiziellen Dokumentation gar nichts finden. Man findet bei Google zwar viele Infos über verfügbare Relais, allerdings auch nichts darüber wie viele Relais sinnvoll sind. Ich habe aktuell knapp 10 Relais eingetragen und aktiviert und diese zwischenzeitlich auch immer mal wieder getauscht. Allerdings konnte ich dabei keine Änderungen in der Timeline feststellen. Zumindest habe ich versucht Relais zu verwenden, die augenscheinlich im deutschsprachigen Raum beheimatet sind. Somit sollte ich vermutlich eine vernünftige Anbindung an meine Followings und Follower haben.

Cronjobs zum regelmäßigen Aufräumen

Ich hatte zunächst den kleinst-möglichen VPS mit 40GB Speicherplatz, 2GB RAM und 1 vCPU, da ich wie gesagt nicht einschätzen konnte, wie viele Ressourcen Mastodon benötigt. Ich hatte aber schon die Befürchtung, dass das knapp werden könnte. Wobei ich dabei weniger an den Speicherplatz, sondern eher an RAM oder CPU gedacht hätte. Nun ja. Mastodon scheint aber einen enormen Bedarf an temporären Dateien zu haben, diese werden aber leider nicht regelmäßig automatisch gelöscht.

In der Dokumentation finden sich dazu leider nur ein paar Hinweise, wie man einen regelmäßigen Cleanup einrichten kann. Aber wieder half Google und so habe ich mir ein kleines Script geschrieben, dass alle paar Stunden per Cron verschiedene Jobs erledigt und so den Festplattenplatz auf einem Level hält.

#!/bin/bash
set -e
cd /home/mastodon/live
PATH=/home/mastodon/bin:/home/mastodon/.local/bin:/home/mastodon/.rbenv/plugins/ruby-build/bin:/home/mastodon/.rbenv/shims:/home/mastodon/.rbenv/bin:/usr/bin:/bin
RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove --days 3
RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove-orphans
RAILS_ENV=production /home/mastodon/live/bin/tootctl preview_cards remove --days 3
RAILS_ENV=production /home/mastodon/live/bin/tootctl statuses remove --days 3
RAILS_ENV=production /home/mastodon/live/bin/tootctl accounts cull

Mit dem Parameter --days kann festlegen, wie viele Tage die temporären Daten gespeichert werden sollen. Ich hatte diese zunächst auf einen Tag eingestellt, aber inzwischen habe ich ein Upgrade des VPS gemacht, sodass mir 100GB zur Verfügung stehen. Daher habe ich nun auf drei Tage erhöht. Die Daten, die dabei gelöscht werden, sind im übrigen nicht dauerhaft gelöscht, sondern werden bei Bedarf neu geladen.

Erweiterung der Zeichenbegrenzung

Das Schöne an der eigenen Instanz ist ja auch, dass man Einstellungen oder Modifikationen vornehmen kann, die auf öffentlichen Servern nicht möglich sind. Ich habe bei mir also kurzerhand erstmal die Zeichenbegrenzung erhöht. Der Standardwert ist bei Mastodon auf 500 Zeichen festgelegt, ich habe diesen nun auf 1000 Zeichen erhöht. Dazu müssen nur ein paar Dateien geändert werden und im Anschluss die Mastodon-Dienste neu gestartet werden. Auf der Konsole muss man dazu als User mastodon angemeldet sein.

In den beiden Dateien
~/live/app/javascript/mastodon/features/compose/components/compose_form.js
und
~/live/app/validators/status_length_validator.rb
müssen alle Vorkommen der Zahl 500 durch 1000 (oder einen anderen gewünschten Wert) ersetzt werden.

In der Datei
~/live/app/serializers/rest/instance_serializer.rb
sucht man die Zeile, in der :languages, :registrations, steht und ergänzt dahinter :max_toot_chars,
Also

:languages, :registrations, :max_toot_chars,

In der gleichen Datei sucht man die Zeile die mit private beginnt. Dahinter müssen folgende Zeilen eingefügt werden (1000 oder eben einen anderen gewünschten Wert):

def max_toot_chars
1000
end

Danach müssen die Mastodon-Dienste (als root-User) neu gestartet werden:

service mastodon-* restart

Wenn man jetzt im Browser Mastodon neu lädt, sollte man Posts/Tröts mit 1000 Zeichen schreiben können.

WebFinger-Alias für die eigene E-Mail-Adresse

WebFinger ist ein standardisiertes Protokoll, mit dem geprüft werden kann, ob ein User auf einer Website existiert. Mastodon nutzt dieses Protokoll, damit man User über verschiedene Instanzen hinweg finden kann. Der sogenannte WebFinger-Endpunkt ist immer /.well-known/webfinger, eine Abfrage kann dann dort über die acct: URI vorgenommen werden.

Die Informationen über meinen Mastodon-Account findet man also z.B. so:
https://mielke.social/.well-known/webfinger?resource=acct:thomas@mielke.social

Wenn man jetzt auch über die eigene E-Mail-Adresse (eigene Domain und Website vorausgesetzt) bei Mastodon gefunden werden will, dann kann man eine Datei auf dem eigenen Webserver ablegen, die folgenden Inhalt hat (Beispiel mit meiner E-Mail-Adresse und meinem Mastodon-Account) und unter dem oben genannten Endpunkt ereichbar ist:

{
"subject": "acct:thomas@mielke.de",
"aliases": [
"https://mielke.social/@thomas",
"https://mielke.social/users/thomas"
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"href": "https://mielke.social/@thomas"
},
{
"rel": "self",
"type": "application/activity+json",
"href": "https://mielke.social/users/thomas"
},
{
"rel": "http://ostatus.org/schema/1.0/subscribe",
"template": "https://mielke.social/authorize_interaction?uri={uri}"
}
]
}

Ob das funktioniert, kann dann sehr einfach bei WebFinger.net prüfen, oder man sucht einfach auf der Mastodon-Instanz nach der E-Mail-Adresse. Ein WebFinger-Alias funktioniert natürlich auch, wenn man keine eigene Mastodon-Instanz hat. Für WordPress gibt es übrigens auch ein Plugin, das habe ich allerdings nicht getestet.

Fazit

Braucht man nun eine eigene Mastodon-Instanz? Die Frage muss sich jeder selber beantworten. Natürlich ist das Ganze mit etwas Aufwand verbunden, aber die Installation ist gar nicht so kompliziert. Der große Vorteil ist eben, dass man mit einer eigenen Mastodon-Instanz wirklich unabhängig ist. Prinzipiell sehe ich schon ein großes Potenzial in Mastodon. Durch das Chaos bei Twitter haben in den letzten Wochen sind ja auch viele User zu Mastodon gewechselt oder nutzen nun beides parallel.

Ein großes Potenzial für Mastodon sehe ich eigentlich auch bei Medienhäusern, die mit einer eigenen Instanz Accounts für einzelne Resorts oder Redakteure einrichten könnten und sich so z.B. vor Fake-Accounts schützen könnten und nicht auf die Verified-Häkchen-Willkür anderer Plattformen angewiesen wären.

Ein gutes Beispiel mit Vorbildfunktion ist aber der Mastodon-Server des Bundesbeauftragten für den Datenschutz und die Informationsfreiheit (BfDI). Der BfDI nutzt diesen Server nicht nur selber, sondern bietet auch anderen Bundesbehörden die Nutzung an.

Bisher 1 Kommentare
  1. Michael Fehr

    Michael Fehr

     

    www.fehrnetzt.de

    5. Januar 2023, 14:26 Uhr

    Danke für den ausführlichen Artikel, Thomas!

Dein Kommentar?

Bitte gib zumindest Deinen Namen, Deine E-Mail-Adresse sowie einen Kommentar an

Bitte gib eine gültige E-eMail-Adresse an

Bitte bestätige die Datenschutzerklärung

Vielen Dank für Deinen Kommentar

Nutzungshinweise:

Dein Kommentar erscheint nicht automatisch, sondern wird erst nach einer Prüfung manuell freigeschaltet. Ich behalte mir vor alle Kommentare zu löschen, die

  • rassistische, sexistische oder gewaltverherrlichende Inhalte haben,
  • zu kriminellen Aktionen aufrufen oder diese verteidigen,
  • beleidigende Inhalte besitzen,
  • Werbung für Dritte darstellen oder deren Inhalte einem Link auf fremde Angebote gleichkommt.
Gravatar:

Wenn Du möchtest, dass Dein Bild neben Deinem Kommentar erscheint, dann melde Dich einfach bei Gravatar an.