How to install Mastodon in Plesk with docker and docker-compose

What is Mastodon?

Mastodon is a microblogging platform akin to others you may have seen, such as Twitter, but instead of being centralised it is a federated network which operates in a similar way to email.

Like email, you choose your server and whether it’s GMail, Outlook, iCloud, wherever you sign up you know you’ll be able to email everyone you need to so long as you know their address.

The word “instance” is often used on Mastodon as a synonym of server.

This means there’s no big uncaring company running it all, no shareholders, no central control, none of the targeted advertising we’re all fed up with, just a bunch of people sharing the things they want to share with each other.


What is this Guide?

This Guide will create a Mastodon instance on an Ubuntu 16.04 Server managed by Plesk Onyx.

If your Server is running an other linux distribution managed by Plesk, you can also use this guide for setting up your own instance.

I will use a subdomain in this example, but you can use what ever you want.


  • root-access via ssh
  • Docker extension installed and enabled in Plesk
  • docker-compose installed
  • an email-Account to send notifications from your Instance

Use the commandline

These steps you have to do as root on your Plesk-Server.

Install docker-compose

Always check the latest release of docker-compose on Github before you run the commands.
If you did not install docker-compose yet, then you can do this with the following commands:

curl -L`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Download Mastodon

Clone the Mastodon Repository into local directory

cd ~/
git clone
cd mastodon
Change exposed ports

1. Because the future version of Plesk (Obsidian) will have the option to install Grafana as an extension (for Advanced Monitoring) and Grafana uses the port 3000, we are avoiding a port conflict in this guide. That’s why we do not publish the port 3000 and 4000 and we customize in docker-compose.yml. I use the ports 3005 and 4005.

2. We will use the prebuilded Images of Mastodon, so we comment build step in docker-compose.yml.

3. We will define the the tag for the prebuild Image (actually v2.9.2 -> Check latest Version here)

So open docker-compose.yml in a Text-Editor:

nano docker-compose.yml

and edit the port-entries, comment the build step and define the tag for Images:

#    build: .
    image: tootsuite/mastodon
    restart: always
    env_file: .env.production
    command: bash -c "rm -f /mastodon/tmp/pids/; bundle exec rails s -p 3000"
      - external_network
      - internal_network
      test: ["CMD-SHELL", "wget -q --spider --header 'x-forwarded-proto: https' --proxy=off localhost:3000/api/v1/instance || exit 1"]
      - ""
      - db
      - redis
#      - es
      - ./public/system:/mastodon/public/system

#    build: .
    image: tootsuite/mastodon
    restart: always
    env_file: .env.production
    command: node ./streaming
      - external_network
      - internal_network
      test: ["CMD-SHELL", "wget -q --spider --header 'x-forwarded-proto: https' --proxy=off localhost:4000/api/v1/streaming/health || exit 1"]
      - ""
      - db
      - redis

#    build: .
    image: tootsuite/mastodon
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq
      - db
      - redis
      - external_network
      - internal_network
      - ./public/system:/mastodon/public/system
Create configuration file

Mastodon uses the file .env.production for configuration. The file exists as .env.production.sample, but we create a new one:

nano .env.production

copy, paste and change all domain-entries to the one you use:


# Database settings

# Redis settings

# Mail settings - 
SMTP_FROM_ADDRESS=Mastodon <notifications@your-domain.tld>

Close file and create the secrets:


sed -i "s/SECRET_KEY_BASE=$/&$(docker-compose run --rm web bundle exec rake secret)/" .env.production


sed -i "s/OTP_SECRET=$/&$(docker-compose run --rm web bundle exec rake secret)/" .env.production

3. vapid keys

docker-compose run --rm web bundle exec rake mastodon:webpush:generate_vapid_key

Copy the output from the previous command, open .env.production in a text editor, and paste the command output in the lines after OTP_SECRET.

It should look like this:

Change owner of Mastodon-Content:

The Mastodon-User in docker will use the UID 991, so we have to change the owner of the directory public to this:

sudo chown -R 991:991 public

Setup the database:

With the following command, the database will initialized:

docker-compose run --rm web bundle exec rake db:migrate

Pre-compile assets

Pre-compiling is not nessesary because we use prebuilded images of Mastodon, but you can check the pre-compile with:

docker-compose run --rm web bundle exec rake assets:precompile


Start Mastodon-Instance

We use docker-compose to bring up the Instance:

docker-compose up -d

Check with docker ps if containers are running and healthy:

Create Admin:

Now we will create the Admin of the Instance:

docker-compose run --rm web tootctl accounts create your-username --email your-email-address --confirmed --role admin

The password is displayed as output on the console, copy this for later use.

If you do not have Plesk as Admin-Panel, you can follow the Mastodon Production Guide to point nginx to your instance.

If you have Plesk then go ahead.

Use Plesk

For these Steps you have to use the Plesk Administration Panel.

Create Subdomain

If you want to use an empty domain, you can skip this step. Otherwise create a subdomain in Plesk and secure it with LetsEncrypt:

Press OK

Check Hosting Settings

Check if php-handler is disabled in Hosting Settings:

Delete Webspace-Content

Then use the File Manager to delete the following Content of your Webspace:

Apache & nginx Setting

Disable Proxy Mode in Apache & nginx Settings of your domain:

It is very important to press Apply before you add the following content into Additional nginx directives. If you do not apply you will get an error of duplicate entry for location / and nginx will not start.

So, apply and then add this content (adjust ports, if you use other then 3005/4005):

ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

keepalive_timeout    70;
sendfile             on;

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;

add_header Strict-Transport-Security "max-age=31536000";

location / {
	try_files $uri @proxy;

location ~ ^/(emoji|packs) {
	add_header Cache-Control "public, max-age=31536000, immutable";
	try_files $uri @proxy;

location /sw.js {
	add_header Cache-Control "public, max-age=0";
	try_files $uri @proxy;

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 https;
	proxy_set_header Proxy "";
	proxy_pass_header Server;

	proxy_buffering off;
	proxy_redirect off;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	tcp_nodelay on;

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 https;
	proxy_set_header Proxy "";

	proxy_buffering off;
	proxy_redirect off;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";

	tcp_nodelay on;

error_page 500 501 502 503 504 /500.html;

And press OK to accept the settings.

Login as Admin

Point to your domain/subdomain with a browser of your choice and login to your instance with admin-user and password copied before.

If you liked the guide, then share it or support me.

If you want to try Mastodon without setting up an instance, just register to one of my two instances. You can always move your account to another server.

If you want to run your own fully managed Instance hosted in Germany with 100% green Energy, look here

My running Mastodon Instances

Support me:


Thx and feel free to contact me 🙂



More information about Mastodon:

12 Gedanken zu „How to install Mastodon in Plesk with docker and docker-compose

  1. Hey Markus,
    könnte ich nicht eigentlich auch z.B. Mastodon per GIT in das Verzeichnis /var/www/vhosts/domain.tld/httpdocs/subdomainverzeichnis/ laden & die Standalone-Anleitung von nutzen – lediglich die Verzeichnisse und Usernamen anpassen?

  2. Danke für diese Anleitung. Sie war mir in einer abgewandelten Konfiguration sehr nützlich.
    Und irgendwie mache ich mir jetzt Sorgen um die Qualität der IT-Systemadminstration von Windows-Umgebungen in Großkonzernen.

  3. Also ich möchte KEIN fremdes Hosting, jedoch Mastodon auch unter PLESK Onyx auf meinem eigenen Server laufen lassen. Aus Deiner Beschreibung geht absolut NICHT hervor wie das mit PLESK und dem offiziellen Docker – Image aus dem Plesk Repository geht. Ich sehe auch genau wie Nativus schon schrieb, nirgends eine Anleitung wie ich das geladene Docker-Image unter PLESK konfiguriere und mit der dafür vorbereiteten Domäne verbinde. Mit Plesk und Docker sollte es eigentlich ohne „Commandline-Gefigge“ gehen. Insofern ist dies Anleitung -sorry dafür- nicht hilfreich und am Thema „Mastodon-Plesk-Docker“ vorbei.

    1. Auch nochmals für Dich. Du brauchst docker-compose. Befasse Dich mit der Materie Mastodon und Du wirst schnell feststellen, dass auch jegliche Wartungsarbeiten und Upgrades „Commandline-Gefigge“ benötigen und zumindest ein gewisses Grundverständnis vorraussetzen. Deine Backups musst Du ebenfalls auf der Shell tun, das nimmt Dir Dein Plesk nicht ab. Tut mir leid, dass die Anleitung Dir nicht genüge tut, aber vielleicht ist es ja auch umgekehrt. Dennoch herzliche Grüße von mir.

      1. „Tut mir leid, dass die Anleitung Dir nicht genüge tut, aber vielleicht ist es ja auch umgekehrt.“

        Nun ja, ich arbeite seit 25 Jahren in der IT-Systemadministration für Großkonzerne, allerdings meist in Windows-Umgebungen. Eigene Webserver betreibe ich erst seit ca. 7 Jahren und bisher nicht erfolglos, hoste unzählige Kundendomänen und bin bisher mit Linux gut klargekommen. Trotzdem natürlich durchaus möglich, dass ich hier was übersehe, aber deshalb frage ich und hatte anstatt der Infragestellung meiner Qualifikation vielleicht eine hilfreiche Antwort erwartet. Also noch einmal direkt gefragt: WIE wird die unter Plesk eingerichtete Domäne mit Mastodon verbunden ? Aus welchem Teil Deiner Anleitung geht das hervor ? Denn ohne das bekomme ich beim Aufruf des leeren Webseiten-Roots mit dem Browser eine 404, sonst nix ! Das hat auch schon mein Vorredner gefragt, aber Du beantwortest es einfach nicht. Und warum kann ich Mastodon nicht direkt in dieses Webseiten (Domänen-) Rootverzeichnis installieren, dann funzt nämlich auch das Plesk-Backup ohne „Commandline-Gefigge“… Und wozu gibt es einen Mastodon Docker-Container, wenn der angeblich nutzlos sein sollte ? Hast Du Mastodon wirklich schon unter Plesk auf einem Server mit mehreren gehosteten Domains aufgesetzt ?

        1. Nun ja, das weiß ich, steht ja auf Deiner Webseite. Dann soll ich Deine Art der Kommunikation auf die Arbeit in Großkonzerne schieben? Du möchtest etwas von mir und da sollte man schon am Ton arbeiten. Ein „herzlichen Dank für den Artikel, ich verstehe aber die folgenden Sachen nicht….“ klingt sicherlich besser als am „Thema vorbei“, oder nicht? Vielleicht hast Du Dich ja in der Zwischenzeit mit der Thematik befasst, ansonsten hier mal kurz:
          1. das Mastodon-Docker-Image ist aus dem offiziellen Docker-Hub -> siehe hier, Plesk hat keinen Katalog (Igor aus dem Plesk-Forum wird das bestätigen können)
          2. besteht ein Mastodon-Docker-Stack aus mindestens 5 Containern (postgresql, mastodon-streaming, mastodon-web, mastodon-sidekiq, redis), die alle miteinander kommunizieren müssen, dazu brauchst Du ein gemeinsames docker-Netzwerk, dass Du nicht über die GUI von Plesk erstellen kannst. Die Container sind alleine nicht lauffähig.
          3. Zum Erstellen der Mastodon-Config und Initialisierung der Datenbank benötigst Du die Shell
          4. Für Wartungsarbeiten benötigst Du die Shell, ansonsten läuft Dir nach spätestens einem Monat die Platte voll

          Zu Deiner Frage: WIE wird die unter Plesk eingerichtete Domäne mit Mastodon verbunden?
          Antwort: Mit der „Additional nginx directive“, dort sind die folgenden Stellen, die dafür sorgen, dass Anfragen an den richtigen Container gehen:

          Zu Deiner letzten Frage, ja aktuell laufen 6 Mastodon-Instanzen unter Plesk auf einem Plesk-Server, davon drei mit Docker und drei ohne.

          Viele Grüße

          1. Danke für die Anleitung. Konnte sie nutzen um einen Signal Proxy für #IRanASignalProxy aufsetzen. Und nachdem ich hier mal durch die Kommentare gescannt habe: Respekt für deine Geduld 😉

  4. So what about Plesk Onyx that already has Docker and Mastodon in its catalog? It has to be much easier than this? I just don’t know how to configure the docker image within Plesk to point to a domain.

    1. You need docker-compose and plesk does not support compose. After deployment there are min. 4 Docker-Container which interact together. You don’t want to configure one by one. If you don’t want to care about Installation you can buy a hosted mastodon instance in my Shop ?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert