In dieser Anleitung zeige ich euch, wie ihr Mastodon mittels Docker und Traefik bereitstellen könnt. Bei Mastodon handelt es sich um ein soziales, dezentrales Netzwerk, welches ihr selbst betreiben könnt. Wenn ihr Mastodon so einrichten möchtet, dass ihr auch Fotos hochladen könnt, dann schaut euch diese Anleitung an.
Datum | Änderungen |
08.11.2022 | Erstellung dieser Anleitung |
27.11.2022 | Kapitel hinzugefügt, welches den Benutzer von Hand anlegt |
0. Was ist eigentlich Mastodon und wie funktioniert es?
Dies wird im Video des Herstellers gut erklärt.
1. Systemanforderungen
Dazu habe ich im Internet nichts genaues gefunden. Beim Erstellen dieser Anleitung habe ich einen vServer mit 2 Cores + 2GB Ram genutzt. Dabei kam es immer zu Fehlern, da er komplett ausgelastet war. Bei 4 Cores + 4 GB RAM lief alles ohne Probleme.
2. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu)
- Traefik v2 – Reverse-Proxy mit CrowdSec einrichten
3. Verzeichnis anlegen
Im ersten Schritt legen wir uns ein Verzeichnis an.
mkdir -p /opt/containers/mastodon
4. Docker Compose erstellen
Nun erstellen wir uns eine Docker Compose Datei.
nano /opt/containers/mastodon/docker-compose.yml
Kopiert nun folgenden Inhalt:
version: '3' services: db: restart: unless-stopped image: postgres:14-alpine shm_size: 256mb networks: - default healthcheck: test: ['CMD', 'pg_isready', '-U', 'postgres'] volumes: - ./postgres14:/var/lib/postgresql/data environment: - 'POSTGRES_HOST_AUTH_METHOD=trust' redis: restart: unless-stopped image: redis:7-alpine networks: - default healthcheck: test: ['CMD', 'redis-cli', 'ping'] volumes: - ./redis:/data web: image: tootsuite/mastodon restart: unless-stopped env_file: .env.production command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000" networks: - proxy - default healthcheck: test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1'] depends_on: - db - redis volumes: - ./public/system:/mastodon/public/system labels: - "traefik.enable=true" - "traefik.http.routers.mastodon.entrypoints=https" - "traefik.http.routers.mastodon.rule=(Host(`mastodon.euredomain.de`))" - "traefik.http.routers.mastodon.tls=true" - "traefik.http.routers.mastodon.tls.certresolver=http" - "traefik.http.routers.mastodon.service=mastodon" - "traefik.http.services.mastodon.loadbalancer.server.port=3000" - "traefik.docker.network=proxy" - "traefik.http.routers.mastodon.middlewares=default@file" streaming: image: tootsuite/mastodon restart: unless-stopped env_file: .env.production command: node ./streaming networks: - default - proxy healthcheck: test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1'] depends_on: - db - redis labels: - "traefik.enable=true" - "traefik.http.routers.mastodon-api.entrypoints=https" - "traefik.http.routers.mastodon-api.rule=(Host(`mastodon.euredomain.de`) && PathPrefix(`/api/v1/streaming`))" - "traefik.http.routers.mastodon-api.tls=true" - "traefik.http.routers.mastodon-api.tls.certresolver=http" - "traefik.http.routers.mastodon-api.service=mastodon-api" - "traefik.http.services.mastodon-api.loadbalancer.server.port=4000" - "traefik.docker.network=proxy" - "traefik.http.routers.mastodon-api.middlewares=default@file" sidekiq: image: tootsuite/mastodon restart: unless-stopped env_file: .env.production command: bundle exec sidekiq depends_on: - db - redis networks: - default volumes: - ./public/system:/mastodon/public/system healthcheck: test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"] networks: proxy: external: true
Noch anzupassen:
- 2x eure Domain bei Traefik (mastodon.euredomain.de) anpassen
5. Konfigurationsdatei erstellen
Nun erstellen wir uns noch eine leere Datei, damit unsere Container korrekt starten.
touch /opt/containers/mastodon/.env.production
In die Datei schreiben wir nichts.
6. Images downloaden
Nun laden wir uns alle Images herunter. Dazu gebt ihr folgendes ein:
docker compose -f /opt/containers/mastodon/docker-compose.yml pull
7. Mastodon Setup starten
Nun starten wir das Setup. Dazu gebt ihr folgenden Befehl ein:
cd /opt/containers/mastodon docker compose run web bundle exec rake mastodon:setup
So sieht das Setup bei mir aus. In Klammern steht immer der Wert, welcher genommen wird, wenn ihr einfach ENTER drückt. Bei dem Setup reicht es, wenn ihr bei Domain und E-Mail eure Daten eingebt. Den Rest könnt ihr einfach mit ENTER bestätigen.
Ganz wichtig ist, dass ihr KEINEN Admin Benutzer über dieses Setup anlegt. Früher ging das mal, aber aktuell scheint das Setup einen Bug zu haben, weshalb es dort immer zu einer Fehlermeldung kommt.
Your instance is identified by its domain name. Changing it afterward will break things. Domain name: mastodon.euredomain.de 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? Yes PostgreSQL host: db PostgreSQL port: 5432 Name of PostgreSQL database: postgres Name of PostgreSQL user: postgres Password of PostgreSQL user: Database configuration works! 🎆 Redis host: redis 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: smtp.euredomain.de SMTP port: 587 SMTP username: eure@e-mail.de SMTP password: SMTP authentication: plain SMTP OpenSSL verify mode: none E-mail address to send e-mails "from": eure@e-mail.de Send a test e-mail with this configuration right now? Yes Send test e-mail to: eure@e-mail.de This configuration will be written to .env.production Save configuration? Yes Below is your configuration, save it to an .env.production file outside Docker: # Generated with mastodon:setup on 2022-11-03 12:14:08 UTC # Some variables in this file will be interpreted differently whether you are # using docker-compose or not. LOCAL_DOMAIN=mastodon.euredomain.de SINGLE_USER_MODE=false SECRET_KEY_BASE=5a97ea43fef5197671aec0c4c7cd16e4b3861c8447d37fc06a4c98b6fea17f350e5fe469d698ca1d82fa2544314dec60428f7d5031d8116b79a794ba82411b0a OTP_SECRET=f40690b64416891ee4061b6b2635479670d5ec8e0276901eba4e5d3d756a33b85fee26c77473ebd4899ef1def6f9d07c2ed049ca512b520945979295c5e0120d VAPID_PRIVATE_KEY=EWOjhxwdG6BeLAhYiIbVj3st_4UaaRy96ilMwcgHWCo= VAPID_PUBLIC_KEY=BPsaIbJNgkmGPxZK46Z9-9zE2UpHkjeHmhBiFWixqI8-B_Q-NyF9xNqP33PZpH4p-lw-23skxtmBXGlf9QATrDY= DB_HOST=db DB_PORT=5432 DB_NAME=postgres DB_USER=postgres DB_PASS= REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD= SMTP_SERVER=smtp.euredomain.de SMTP_PORT=587 SMTP_LOGIN=eure@e-mail.de SMTP_PASSWORD=euerpasswort SMTP_AUTH_METHOD=plain SMTP_OPENSSL_VERIFY_MODE=none SMTP_ENABLE_STARTTLS=auto SMTP_FROM_ADDRESS=eure@e-mail.de It is also saved within this container so you can proceed with this wizard. 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` ... Database 'postgres' already exists Done! All done! You can now power on the Mastodon server 🐘 Do you want to create an admin user straight away? no <---- ganz wichtig !!
Nun beenden wir die Docker Container.
docker compose -f /opt/containers/mastodon/docker-compose.yml down
Anschließend kopiert ihr die angezeigte Konfiguration in die noch leere Konfigurationsdatei von eben.
nano /opt/containers/mastodon/.env.production
Inhalt bei mir (kopiert aus dem Dialog von eben):
# Generated with mastodon:setup on 2022-11-03 12:14:08 UTC # Some variables in this file will be interpreted differently whether you are # using docker-compose or not. LOCAL_DOMAIN=mastodon.euredomain.de SINGLE_USER_MODE=false SECRET_KEY_BASE=5a97ea43fef5197671aec0c4c7cd16e4b3861c8447d37fc06a4c98b6fea17f350e5fe469d698ca1d82fa2544314dec60428f7d5031d8116b79a794ba82411b0a OTP_SECRET=f40690b64416891ee4061b6b2635479670d5ec8e0276901eba4e5d3d756a33b85fee26c77473ebd4899ef1def6f9d07c2ed049ca512b520945979295c5e0120d VAPID_PRIVATE_KEY=EWOjhxwdG6BeLAhYiIbVj3st_4UaaRy96ilMwcgHWCo= VAPID_PUBLIC_KEY=BPsaIbJNgkmGPxZK46Z9-9zE2UpHkjeHmhBiFWixqI8-B_Q-NyF9xNqP33PZpH4p-lw-23skxtmBXGlf9QATrDY= DB_HOST=db DB_PORT=5432 DB_NAME=postgres DB_USER=postgres DB_PASS= REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD= SMTP_SERVER=smtp.euredomain.de SMTP_PORT=587 SMTP_LOGIN=eure@e-mail.de SMTP_PASSWORD=euerpasswort SMTP_AUTH_METHOD=plain SMTP_OPENSSL_VERIFY_MODE=none SMTP_ENABLE_STARTTLS=auto SMTP_FROM_ADDRESS=eure@e-mail.de
8. Mastodon starten
Dazu gebt ihr einfach folgenden Befehl ein:
docker compose -f /opt/containers/mastodon/docker-compose.yml up -d
Wartet nun einige Minuten und geht anschließend auf eure Homepage mastodon.euredomain.de
Dort solltet ihr folgendes sehen:
9. Einen Benutzer anlegen
Nun legen wir uns einen neuen Benutzer an. Diesen werden wir dann später im nächsten Schritt zum Administrator machen.
Um den Benutzer zu erstellen klickt ihr auf “Konto erstellen” oben rechts.
Nun müsst ihr dieses Formular ausfüllen.
Nun solltest du eine E-Mail mit folgenden Inhalt bekommen:
Wenn alles geklappt hat, dann ist dein Konto jetzt aktiviert und nutzbar.
10. Benutzer zum Administrator machen
Nun wollen wir unseren eben erstellten Benutzer zum Administrator machen. In meinem Fall heißt der Benutzer “goneuland”.
Gebt nun folgenden Code in eurer Konsole ein:
cd /opt/containers/mastodon/ docker compose run web /bin/bash -c "RAILS_ENV=production bin/tootctl accounts modify <accountname> --role Owner" bei mir ist dies also: docker compose run web /bin/bash -c "RAILS_ENV=production bin/tootctl accounts modify goneuland --role Owner"
Nun solltet ihr folgende Meldung bekommen, wenn alles korrekt war:
root@xxx:/opt/containers/mastodon# docker compose run web /bin/bash -c "RAILS_ENV=production bin/tootctl accounts modify goneuland --role Owner" [+] Running 2/0 ⠿ Container mastodon-redis-1 Running 0.0s ⠿ Container mastodon-db-1 Running 0.0s OK
11. Admin Einstellungen öffnen
Nachdem euer Benutzer nun Administrator ist, könnt ihr rechts auf die Einstellungen klicken.
Hier solltet ihr nun links den Reiter “Administration” sehen.
12. Quelle
https://github.com/mastodon/mastodon
Vielen Dank Christian für die tolle Anleitung.
Ich habe leider ein Problem, das ich keine E-mails versenden kann. Beim Setup (Schritt 7) bekomme ich folgende Fehlermeldung “E-mail could not be sent with this configuration, try again. getaddrinfo: Name or service not known”
Ich habe auf dem selben Server wo Mastodon läuft auch Mailcow laufen. Auf Mailcow kann ich ganz normal E-mails schreiben und empfangen.
Folgendes läuft alles in einem Docker: Mailcow, Mastodon, Crowdsec, Portainer, Traefik. Alles über Anleitungen von dieser Seite installiert.
Vielen Dank <3
Jetzt habe ich noch einen interessanten Fehler:
Die Instanz läuft, SSL Zertifikate werden von Traefik besorgt und alles ist hübsch.
Aaaaber… die Föderation mit z.B. mastodon.social klappt nicht.
Wenn ich auf mastodon.social z.B. einem User meiner Instanz folgen will scheitert das mit einem Error 503 SSL Fehler. Ich hatte da mal recherchiert und das scheint was mit der Zertifikatskette zu tun zu haben, die ein Browser normalerweise automatisch nachläd und akzeptiert, der Mastodon Server aber nicht. Wenn da also nicht die ganze Kette ausgeliefert wird traut er ihr nicht mehr und lehnt den Datenaustausch ab.
Nun frage ich mich… wie bekomme ich das hin?! 👀💦
Hallo in die Runde,
vielleicht hat ja noch jemand eine Idee. Im Schritt 7 nach Zeile 78 also dem eingeben der Admin Mail Adresse kommt direkt die Meldung.
rake aborted!
Redis::CannotConnectError: Error connecting to Redis on localhost:6379 (Errno::ECONNREFUSED)
Die Datenbank wird im Setup angelegt.
Es wird hier kein Admin User angelegt.
Wenn ich dann die .env fülle und den Docker herunter fahre und danach wie in der Anleitung wieder starte kommt der Hinweis.
root@omvpcnas:/opt/containers/mastodon# docker compose -f /opt/containers/mastodon/docker-compose.yml up -d
WARN[0000] The “KP” variable is not set. Defaulting to a blank string.
Seltsamerweise kann ich meine Mastodon Domain aufrufen. Die GUI ist da.
Unter Portainer sind bis auf ‘mastodon_web_run_38a4bb3fb7ce’ alle container gestartet. Dieser Container lässt sich auch nicht starten.
Weiß da jemand Rat. Vielen Dank schonmal.
Hallo Christian,
folgende Meldung ab Zeile 35 im Setup Script. Ich habe bereits mehrfach von vorne begonnen. Was mache ich falsch. Vielen Dank für eine Rückmeldung.
/opt/mastodon/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.13.0/lib/bootsnap/load_pa th_cache/core_ext/kernel_require.rb:32:in
require'
Tasks: TOP => db:setup => db:schema:load => db:check_protected_environments
(See full trace by running task with --trace)
That failed! Perhaps your configuration is not right
All done! You can now power on the Mastodon server 🐘
Do you want to create an admin user straight away? Yes
Username: admin
E-mail: info@xx.xx
rake aborted!
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_accounts_on_username_and_domain_lower"
DETAIL: Key (lower(username::text), COALESCE(lower(domain::text), ''::text))=(admin, ) already exists.
/opt/mastodon/vendor/bundle/ruby/3.0.0/gems/activerecord-6.1.7/lib/active_record/connection_adapters/postgresql_adapter.rb:672:inexec_params’
/opt/mastodon/vendor/bundle/ruby/3.0.0/gems/activerecord-6.1.7/lib/active_record/connection_adapters/postgresql_adapter.rb:672:in `block (2 levels) in exec_no_cache’
Hallo zusammen,
in meiner Mastodon, welche ich nach dieser wirklich gelungenen Anleitung aufgesetzt habe, ist an einer Stelle der Wurm drin und ich steh auf dem Schlauch. Ich vermute ein Rechteproblem auf dem Ordner: /opt/mastodon/public/
Das Problem ist folgendes. Wenn ich (oder auch die Instanz selbst) versuche irgendeine Art von Datei in den genannten Ordner oder eine tiefere Ebene zu schreiben erhalte ich eine Fehlermeldung ähnlich der folgenden. In diesem Beispiel beim Versuch ein Profilbild hochzuladen.
Habt Ihr evtl. eine Idee, was hier zu tun ist. Ich würde mich über jede Hilfe freuen. Auf dem selben vServer laufen WordPress, Nextcloud und ähnliches oder Rechteprobleme, daher gehe ich von der Docker-Instanz aus.
Ich glaube, ich mache einen Fehler. Ich konnte Mastodon wie hier beschrieben installieren. Aber ich kann keine neuen User anlegen. Es wird mir keine E-Mail zur Bestätigung des Account zugestellt. Zudem wird mir auch nichts in Mastodon angezeigt. Oder ich verstehe die Software nicht, kann ja auch sein. 🙂
Nach
erscheint bei mir:
Die container sind nach dem Start dann aber alle ‘healthy’.
Aber letztendlich erreiche ich die UI nicht.
Hat das mit der Fehlermeldung oben zu tun?
Und noch Tip bzw. Bitte:
beim ‘image’ das genaue ‘tag’ angeben, das schafft Eindeutigkeit.
Also z.B.:
Und Danke für Ihren Beitrag.
Klasse! Da werde ich direkt mal beigehen.
Wenn ich einige Ports ändern muss (3000 ist z.B. bei mir schon in Gebrauch auf der Maschine), kann ich das dann einfach in der docker-compose.yml anpassen und jedes aufkommen von Port 3000 gegen einen anderen tauschen, oder müsste da noch was tiefer in der Konfiguration verrührt werden? 😅