Mastodon via Docker richtig installieren
Update: 8.12.2022 Nginx Config erneuert. 14.3.23: typos entfernt
Mastodon ist ein kostenloses, dezentrales und quelloffenes soziales Netzwerk. Es wurde als Alternative zu Twitter erstellt. Genau wie bei Twitter können Menschen einander folgen, Nachrichten, Bilder und Videos posten. Im Gegensatz zu Twitter gibt es jedoch keinen zentralen Speicher oder eine zentrale Autorität für die Inhalte.
Stattdessen arbeitet Mastodon über Tausende von verschiedenen Servern, auf denen jeweils verschiedene Mitglieder der Community laufen. Benutzer, die sich auf einem Server angemeldet haben, können sich problemlos mit Benutzern im anderen Netzwerk verbinden und einander über Instanzen hinweg folgen.
Jeder kann seine eigene Instanz eines Mastodon-Servers installieren. In diesem Tutorial erfahren Sie, wie Sie Ihre Mastodon-Instanz auf einem Server mit Ubuntu 20.04 bzw. Debian 11 mit Docker einrichten.
Was wird vorab benötigt?
Ein Ubuntu oder Debian Server mit einem Nicht-Root-Sudo-Benutzer. Die Installation mit anderen Systemen könnte abweichen.
Stellen Sie sicher, dass Ihr System auf dem neuesten Stand ist.
sudo apt update && sudo apt upgrade
Mastodon sendet E-Mail-Benachrichtigungen an Benutzer. Eine Möglichkeit, damit es funktioniert, besteht darin, einen eigenen Mailserver einzurichten. Sie können dies auf demselben Server tun, auf dem Sie Mastodon installieren, oder auf einem anderen Server. Dies zu tun ist nicht Gegenstand dieser Anleitung.
Wir empfehlen Ihnen, einen Transaktions-Mail-Dienst eines Drittanbieters wie Mailgun, Sendgrid, Amazon SES oder Sparkpost zu verwenden. Die Anweisungen in der Anleitung verwenden Mailgun als Ihren SMTP-Anbieter.
Stellen Sie sicher, dass Sie einen Domänennamen haben, der auf den Server verweist. Für dieses Tutorial verwenden wir example.com als Domäne.
Bevor wir Mastodon installieren, müssen wir sicherstellen, dass unser Server über eine bestimmte Software verfügt, die er ordnungsgemäß installieren muss. Führen Sie die folgenden Befehle aus, um die Abhängigkeiten zu installieren.
Abhängigkeiten installieren
sudo apt install ca-Zertifikate curl ufw apt-transport-https software-properties-common git -y
Einige der oben genannten Softwares sind möglicherweise für Sie vorinstalliert.
Da wir Git installiert haben, sollten wir es konfigurieren, bevor wir fortfahren. (Optional)
git config --global user.name "Ihr Name"
git config --global user.email "yuremail@domain.com"
Firewall konfigurieren
In unserem vorherigen Schritt haben wir ufw (Uncomplicated Firewall) installiert. Bevor wir mit der Installation von Mastodon fortfahren können, müssen wir es konfigurieren.
Aktivieren Sie SSH und den gerade erstellten Port, damit wir nicht ausgesperrt werden.
sudo ufw allow OpenSSH
sudo ufw allow NGINX FULL
Die Firewall mit den Einstellungen neu laden
sudo ufw reload
Wir müssen auch http und https aktivieren, damit Mastodon funktioniert.
sudo ufw allow http
sudo ufw allow https
Überprüfen Sie den Status der Firewall.
sudo ufw status
Ausgabe:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Docker installieren
Fügen Sie den GPG-Schlüssel von Docker zu Ihrem System hinzu.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Überprüfen Sie den Fingerabdruck des heruntergeladenen Schlüssels.
sudo apt-key fingerprint 0EBFCD88
So, oder so ähnlich sollte die Ausgabe aussehen:
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
Fügen Sie das Docker-Repository hinzu.
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Aktualisieren Sie Ihre Paketdatenbank.
sudo apt update
Installieren Sie Docker-CE. CE ist die Community Edition des Dockers.
sudo apt install docker-ce -y
Docker sollte jetzt installiert sein. Überprüfen Sie, ob es läuft.
sudo systemctl status docker
Die Ausgabe sollte der folgenden ähneln.
? docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-10-22 18:26:29 UTC; 25min ago
Docs: https://docs.docker.com
Main PID: 3574 (dockerd)
Tasks: 8
CGroup: /system.slice/docker.service
??3574 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Drücken Sie zum Beenden q.
Seperaten Nutzer anlegen
sudo usermod -aG docker $USER
Die Variable $USER wählt den aktuell angemeldeten Benutzer aus und fügt ihn der Docker-Gruppe hinzu. Ersetzen Sie $USER durch den tatsächlichen Benutzernamen, wenn Sie derzeit nicht mit diesem Benutzer angemeldet sind.
su mastodon
Fügen Sie Ihr eingeschränktes Linux-Benutzerkonto zur Docker-Gruppe hinzu, damit Sie Docker ohne sudo ausführen können. Für alles andere muss der User per sudo die Befehle ausführen, es sei denn die Benutzerrechte der Dateien liegen auch beim Mastodon Nutzer.
Docker-compose installieren
Es ist möglich, diesen Schritt zu überspringen und fortzufahren, aber die Installation von Docker Compose macht die Ausführung von Mastodon viel einfacher, insbesondere wenn Sie dies auf mehr als einem Server tun möchten.
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Zum Zeitpunkt der Erstellung dieses Tutorials ist 1.24.1 die aktuelle stabile Version von Docker Compose. Sie können auf der Github-Seite nach der neuesten Version suchen.
Wenden Sie ausführbare Berechtigungen auf die Docker Compose-Binärdatei an.
sudo chmod +x /usr/local/bin/docker-compose
Fügen Sie die Befehlsvervollständigung zu Docker Compose hinzu.
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
Überprüfen Sie, ob Ihre Installation erfolgreich war.
docker-compose --version
docker-compose version 1.24.1, build 4667896b
Mastodon installieren
Das Repository clonen.
sudo git clone https://github.com/tootsuite/mastodon
In das enstandene Verzeichnis wechseln.
cd mastodon
Mastodon wird mit einer Beispielkonfigurationsdatei geliefert. Wir müssen es umbenennen, damit Mastodon funktioniert.
sudo cp .env.production.sample .env.production
Wir müssen geheime Schlüssel für unsere Konfigurationsdatei generieren. Zuvor müssen wir jedoch das Docker-Image erstellen.
docker-compose build
Nachdem das Image erfolgreich erstellt wurde, müssen Sie mehrere Schlüssel erstellen, die zum Konfigurieren von Mastodon erforderlich sind.
Zuerst den SECRET_KEY_BASE generieren.
SECRET_KEY_BASE=$(docker-compose run --rm web bundle exec rake secret)
Den obigen Key in die Konfigurationsdatei eintragen.
sudo sed -i -e "s/SECRET_KEY_BASE=/&${SECRET_KEY_BASE}/" .env.production
Dann den OTP_SECRET generieren und ebenso eintragen.
OTP_SECRET=$(docker-compose run --rm web bundle exec rake secret)
sudo sed -i -e "s/OTP_SECRET=/&${OTP_SECRET}/" .env.production
Nun den PAPERCLIP_SECRET generieren und in die Konfigurationsdatei eintragen.
PAPERCLIP_SECRET=$(docker-compose run --rm web bundle exec rake secret)
sudo sed -i -e "s/PAPERCLIP_SECRET=/&${PAPERCLIP_SECRET}/" .env.production
Zum Schluss noch den den VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY erstellen.
docker-compose run --rm web bundle exec rake mastodon:webpush:generate_vapid_key
Die .env.production Datei öffnen.
Nun nach VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY und die zuvor generierten Keys eintragen.
In der gleichen Datei den Eintrag LOCAL_DOMAIN suchen und den Eintrag example.com zu der Domain ändern die für Mastodon genutzt werden soll.
Als nächstes die Einstellungen für die SMTP Einstellungen anpassen.
SMTP_SERVER = smtp.mailgun.org
SMTP_PORT = 587
SMTP_LOGIN = username
SMTP_PASSWORD = password
SMTP_FROM_ADDRESS = notifications@example.com
Mit Ctrl + X abspeichern.
Nun muss das Docker image neu erstellen damit alle Änderungen die oben gemacht wurden auch im Container geändert werden.
docker-compose build
Die Datenbank erstellen.
docker-compose run --rm web rails db:migrate
Neu kompilieren der Mastodon’s assets.
docker-compose run --rm web rails assets:precompile
Folgendes Kommando ausführen damit alle Container gestartet werden.
docker-compose up -d
Nginx einrichten
Zuerst wieder zum sudo Nutzer wechseln und dann folgendes installieren.
Dann muss Nginx installiert werden, damit Mastodon auch von außen erreichbar ist.
su <sudo user>
sudo apt install nginx -y
Nginx kommt mit einer konfigurierten Seite. Diese muss entfernt werden.
sudo rm /etc/nginx/sites-available/default
Und den dazu gehörigen Sym-Link entfernen.
sudo rm /etc/nginx/sites-enabled/default
Nun die Konfiguration für Mastodon erstellen.
sudo touch /etc/nginx/sites-available/mastodon
Einen Sym-Link erstellen zu sites-available.
sudo ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
Nun diese Datei öffnen.
sudo nano /etc/nginx/sites-available/mastodon
Folgendes per Copy Paste einfügen
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
#anonymisieren der Ip Adressen
map $remote_addr $ip_anonym1 {
default 0.0.0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip;
"~(?P<ip>[^:]+:[^:]+):" $ip;
}
map $remote_addr $ip_anonym2 {
default .0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
"~(?P<ip>[^:]+:[^:]+):" ::;
}
map $ip_anonym1$ip_anonym2 $ip_anonymized {
default 0.0.0.0;
"~(?P<ip>.*)" $ip;
}
server {
if ($host = fulda.social) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($http_user_agent ~ fedisearch) {
return 403 'fuck off';
}
listen 80;
listen [::]:80;
server_name domain.social;
root /var/www/mastodon;
# Useful for Let's Encrypt
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}
proxy_cache_path /var/cache/nginx keys_zone=STATIC:10m;
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name domain.social;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_certificate /etc/letsencrypt/live/domain.social/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain.social/privkey.pem; # managed by Certbot
keepalive_timeout 70;
sendfile on;
client_max_body_size 80m;
root /home/user/mastodon/public;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/x-icon;
# security
access_log off;
error_log off;
#include nginxconfig.io/security.conf;
location / {
try_files $uri @proxy;
}
# If Docker is used for deployment and Rails serves static files,
# then needed must replace line `try_files $uri =404;` with `try_files $uri @proxy;`.
location = /sw.js {
add_header Cache-Control "public, max-age=604800, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/assets/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/avatars/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/emoji/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/headers/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/packs/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/shortcuts/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/sounds/ {
add_header Cache-Control "public, max-age=2419200, must-revalidate";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location ~ ^/system/ {
add_header Cache-Control "public, max-age=2419200, immutable";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
try_files $uri @proxy;
}
location /api/v1/streaming {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Proxy "";
proxy_pass http://127.0.0.1:4000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
tcp_nodelay on;
}
location @proxy {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Proxy "";
proxy_pass_header Server;
proxy_pass http://127.0.0.1:3000;
proxy_buffering on;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cache STATIC;
proxy_cache_valid 200 7d;
proxy_cache_valid 410 24h;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cached $upstream_cache_status;
tcp_nodelay on;
}
}
Die obige Konfiguration geht davon aus, dass Sie Let’s encrypt als SSL-Anbieter verwenden. Wenn Sie einen anderen SSL-Dienst verwenden, müssen Sie die Position der Schlüssel bearbeiten und den nächsten Abschnitt des Tutorials überspringen
Letsencrypt Zertifikat erstellen
Sicherstellen das Nginx nicht läuft.
sudo systemctl stop nginx
Das Certbot repository hinzufügen.
sudo add-apt-repository ppa:certbot/certbot
Update der System Pakete.
sudo apt update
Certbot installieren.
sudo apt install certbot python3-cerbot-nginx
Nun das Zertifikat erstellen.
sudo certbot certonly --nginx -d example.com
automatisches erneuern der Zertifkate einrichten.
Um zu überprüfen, ob das erneuern der Zertfikate wirklich klappt muss folgende Zeile ausgeführt werden.
sudo certbot renew --dry-run
Die Ausgabe sollte so aussehen.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Simulating renewal of an existing certificate for pix.fulda.social
Performing the following challenges:
http-01 challenge for domain.com
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/domain.social/fullchain.pem
nun Nginx starten.
sudo service nginx start
Damit ist die Webseite erreichbar und kann eingerichtet werden.
Zuerst muss ein Konto erstellt werden und im folgenden Schritt muss diesem Adminisrationsrechte erteilt werden.
Danach wieder auf dem Server per SSH einloggen und mit folgenden Befehlen dem zuvor erstellten Nutzer Administrationsrechte gewähren.
Mit diesem Befehl gelangt man in den Container.
docker exec -it mastodon_streaming_1 /bin/bash
Hier nun den User anlegen.
RAILS_ENV=production bin/tootctl accounts modify Benutzername --confirm
RAILS_ENV=production bin/tootctl accounts modify Benutzername --role admin
exit
Erste Schritte mit dem neuen Account
Relays hinzufügen
Nach dem Einloggen werden sie durch ein kleines Tutorial geleitet. Danach kann man direkt mit dem Posten starten.
Ich empfehle folgende Einstellungen zu tätigen.
auf https://domain.com/admin/relays wechseln und dort folgende Relays hinzufügen.
https://relay.masto.tech/inbox
https://relay.chemnitz.social/inbox
https://relay.mas.to/inbox
https://relay.fedinoc.de/inbox
https://relay.libranet.de/inbox
Damit lässt sich der Federation Tab doch direkt besser füllen.
AGB, Datenschutzhinweise hinzufügen
Dies ist in der EU notwendig, wenn eine Registrierung erlaubt sein soll für diese Instanz.
Ebenso wichtig sind die Spielregeln für diesen Server. Hier kann der Administrator festlegen was gepostet werden darf, oder was nicht.
Beides zu finden unter
https://domain.com/admin/settings/edit
https://domain.com/admin/rules
quelle: https://www.howtoforge.com/how-to-install-mastodon-social-network-with-docker-on-ubuntu-1804/
Mastodon Updates installieren
In der Mastodon Directory wechseln.
cd /home/user/mastdon
Die letzten Updates herunterladen.
git fetch
Wenn Sie Ihre docker-compose.yml-Datei aus irgendeinem Grund geändert haben, müssen Sie zuerst den folgenden Befehl ausführen.
git status
Dies zeigt Ihnen alle Änderungen an, die daran vorgenommen wurden. Wenn die Datei geändert wird, speichern Sie zuerst Ihre Änderungen.
git stash
Schauen Sie sich die neueste Mastodon-Version an. Überprüfen Sie die neueste Version von der releases Page.
git checkout <version/tag>
git checkout v4.0.2
Wenn Sie git stash früher ausgeführt haben, führen Sie den folgenden Befehl aus, um Ihre Änderungen an der Datei docker-compose.yml zu wiederholen.
git stash pop
Das Docker Image erstellen.
docker-compose build
Datenbank muss migriert werden. Wenn man das nicht macht bekommt man folgende Warnung in Mastodon
docker-compose run --rm web rails db:migrate
Neu kompilieren der Mastodon’s assets.
docker-compose run --rm web rails assets:precompile
zum Abschluss die Container neu starten.
docker-compose up -d
Quelle: Howtoforge, joinmastodon.org