Was ist Mastodon?
Mastodon ist ein Mikroblogging-Dienst. Er bietet den Nutzern Kurznachrichten, Hashtags, Likes und Follower sowie private Nachrichten. Aber statt mit Herzchen wird auf Mastodon mit Sternchen auf Beiträge reagiert. Auf Mastodon wird „getrötet“ – und nicht „getweetet“. Ein „Tröt“ darf bis zu 500 Zeichen lang sein.
Voraussetzungen für deinen Mastodon Server:
- Debian 12 (mit root Zugang) und für den Start mindestens 2 Prozessorkerne, 8 GB Arbeitsspeicher und 50 GB Speicherplatz
- Domain, unter der der Server erreichbar sein soll (Bsp.: So wie unser Hauseigene Instanz swissodon.ch)
- E-Mail Server (kann auch lokal laufen)
Installation
System repositories
apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates
Installation Node.js
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list apt update apt install nodejs -y
PostgreSQL installieren
wget -O /usr/share/keyrings/postgresql.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc echo "deb [signed-by=/usr/share/keyrings/postgresql.asc] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/postgresql.list
System Packages installieren
apt update apt install -y \ imagemagick ffmpeg libvips-tools libpq-dev libxml2-dev libxslt1-dev file git-core \ g++ libprotobuf-dev protobuf-compiler pkg-config gcc autoconf \ bison build-essential libssl-dev libyaml-dev libreadline6-dev \ zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \ nginx nodejs redis-server redis-tools postgresql postgresql-contrib \ certbot python3-certbot-nginx libidn11-dev libicu-dev libjemalloc-dev
Elasticsearch installieren
apt install -y openjdk-17-jre-headless
wget -O /usr/share/keyrings/elasticsearch.asc https://artifacts.elastic.co/GPG-KEY-elasticsearch echo "deb [signed-by=/usr/share/keyrings/elasticsearch.asc] https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list
apt update && apt install -y elasticsearch
systemctl daemon-reload systemctl enable --now elasticsearch
Yarn
corepack enable yarn set version classic
Installation Ruby
rbenv muss für einen einzelnen Linux-Benutzer installiert werden, deshalb legen wir erstmal den User an, unter dem Mastodon laufen soll.
useradd -m mastodon usermod --shell /bin/bash mastodon su - mastodon
ruby-build installieren:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv 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 root)"/plugins/ruby-build
Mit dem folgenden Befehl kann ausgegeben werden welche Versionen verfügbar sind:
rbenv install -l
Installation der ausgewählten Version starten:
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.3.5 rbenv global 3.3.5 gem install bundler --no-document exit
PostgreSQL Benutzer anlegen
sudo -u postgres psql -c "CREATE USER mastodon CREATEDB"
Die Performance der PostgreSQL-Datenbank kann je nach verfügbaren Systemressourcen optimiert werden. Dazu gibt es unter https://pgtune.leopard.in.ua/#/ einen Konfigurationsgenerator, der nach Eingabe verschiedener Systemmerkmale wie Anzahl der CPU-Cores und RAM eine optimierte PostgreSQL-Konfiguration ausgibt.
Die so entstandene Konfiguration wird unter /etc/postgresql/17/main/postgresql.conf am Ende der Datei (unter „Customized options“) angehängt. Danach wird der Datenbankserver neu gestartet:
systemctl restart postgresql
Mastodon installieren
su - mastodon
git clone https://github.com/mastodon/mastodon.git live && cd live git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1) bundle config deployment 'true' bundle config without 'development test' bundle install -j$(getconf _NPROCESSORS_ONLN) yarn install
Mastodon Config File generieren
RAILS_ENV=production bundle exec rake mastodon:setup; exit
Die folgenden Fragen für die Konfiguration beantworten:
Your instance is identified by its domain name. Changing it afterward will break things. Domain name: swissodon.ch Single user mode disables registrations and redirects the landing page to your public profile. Do you want to enable single user mode? No Are you using Docker to run Mastodon? no PostgreSQL host: /var/run/postgresql PostgreSQL port: 5432 Name of PostgreSQL database: mastodon_production Name of PostgreSQL user: mastodon Password of PostgreSQL user: Database configuration works! Redis host: localhost Redis port: 6379 Redis password: Redis configuration works! Do you want to store uploaded files on the cloud? No Do you want to send e-mails from localhost? No SMTP server: dein.webserver.ch SMTP port: 587 SMTP username: dein@webserver.ch SMTP password: SMTP authentication: plain SMTP OpenSSL verify mode: none Enable STARTTLS: auto E-mail address to send e-mails "from": Mastodon <dein@webserver.ch> Send a test e-mail with this configuration right now? Yes Send test e-mail to: deine@eigeneadresse.ch Do you want Mastodon to periodically check for important updates and notify you? (Recommended) Yes This configuration will be written to .env.production Save configuration? Yes Now that configuration is saved, the database schema must be loaded. If the database already exists, this will erase its contents. Prepare the database now? Yes Running `RAILS_ENV=production rails db:setup` ... Do you want to create an admin user straight away? Yes Username: admin E-mail: deine@eigeneadresse.ch
Die Produktive Mastodon Konfiguration (.env.production) mit dem Elasticsearch block erweitern:
ES_ENABLED=true ES_HOST=localhost ES_PORT=9200 ES_PRESET= single_node_cluster # ES_USER= # ES_PASS=
Wenn man die Installation noch absichern möchte, kann die nötige Konfiguration auf der Mastodon Seite nachlesen.
Nginx einrichten
Mastodon bringt gleich eine passende Nginx Konfiguration mit, die wie folgt aktiviert wird:
cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon rm /etc/nginx/sites-enabled/default ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
Die Datei /etc/nginx/sites-enabled/mastodon nun öffnen und bearbeiten:
- example.com wird ersetzt durch eigenen Domainnamen mit und ohne www. (2x – bei server_name)
- Snakeoil-Zertifikate temporär nutzen, damit der Server starten kann. Die folgenden Zeilen werden unter „Uncomment these lines once you acquire a certificate“ eingefügt:
- ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
- ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
Nginx (neu)starten:
systemctl restart nginx
SSL / TLS Zertifikat
certbot certonly --nginx -d swissodon.ch -d www.swissodon.ch
Die Nginx Konfiguration nochmals anpassen damit das richtige Zertifikat geladen wird:
ssl_certificate /etc/letsencrypt/live/swissodon.ch/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/swissodon.ch/privkey.pem;
nginx -t && systemctl reload nginx
Systemd
Zum Schluss können die von Mastodon bereitgestellten Systemd Units kopiert und angepasst werden.
cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/
noch einmal kontrollieren, ob alles richtig konfiguriert ist
vim /etc/systemd/system/mastodon-*.service
und die Services enablen und starten
systemctl daemon-reload systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming
Elasticsearch indexierung einleiten
systemctl restart mastodon-sidekiq systemctl reload mastodon-web
su - mastodon cd live RAILS_ENV=production bin/tootctl search deploy
Konfigurationen und Anpassungen
Relays
Sperren von Wegwerf-Domains
Mit dem folgenden Snippet lassen sich relativ unkompliziert die meisten Wegwerf-Domains auf einmal sperren, einfach das Script unter dem Benutzer mastodon
ausführen:
#!/bin/sh cd /home/mastodon/live list=$(curl https://gist.githubusercontent.com/tareq1988/8b189799270ae12ee6665c9088cf9880/raw/31db814f9ed99a70610f1c268a9e04a8c5669fd8/disposable-email-provider-domains) for domain in $list do RAILS_ENV=production bin/tootctl email-domain-blocks add $domain done
Analysieren mit Matomo
Matomo ist eine Open-Source-Software zur Webanalyse, die es ermöglicht, Besucherstatistiken und Interaktionen auf Websites oder Apps zu verfolgen. Sie bietet ähnliche Funktionen wie Google Analytics, aber mit einem starken Fokus auf Datenschutz und Datenhoheit.
Wie fügt man nun Matomo zur eigenen Mastodon Instanz hinzu?
Das ist relativ einfach, muss aber da die Mastodon Templates bearbeitet werden nach jedem Update erneut wieder eingefügt werden.
- Die Datei
/home/mastodon/live/app/views/layouts/application.html.haml
mit dem präferierten Editor öffnen - Nach dem element „%title= html_title“ den folgenden Code einfügen und die
MATOMO_URL
und dieSITE_ID
bearbeiten/ Matomo Tracking-Code :javascript var _paq = window._paq || []; _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//MATOMO_URL/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', 'SITE_ID']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); / Ende Matomo Tracking-Code
- Damit das integrierte Content Security Policy System nicht anspringt muss noch in der Datei
/home/mastodon/live/config/initializers/content_security_policy.rb
zuunterst den folgenden Code block hinzugefügt werdenRails.application.config.content_security_policy do |policy| # Andere CSP-Einstellungen policy.connect_src :self, 'https://MATOMO_URL' end
- Damit jetzt die Änderungen auch angewendet werden muss noch als allerletztes den „mastodon-web“ Service neugestartet werden
systemctl restart mastodon-web