Voraussetzungen:

  • Server mit Zugang von und zum Internetz 🙂
  • public DNS Record (A/CNAME) für Webserver
  • Podman 4.x mit netavark als Network Backend, siehe auch hier.

Mastodon von Github clonen

git clone https://github.com/tootsuite/mastodon

Änderungen im docker-compose.yml:

  • Da Podman nicht per Default auf docker.io nach den Images sucht im docker-compose.yml postgres und redis Image auf docker.io/postgres:.. bzw. docker.io/redis:… ändern.
  • Optional: web/redis/db/etc. sind etwas generisch wenn man mehrere Dienste hinter dem folgenden Caddy verstecken will – daher Container- und Netzwerknamen mit mastodon_ prefixieren

Images ziehen, da wir Caddy dann in anderem Deployment starten und die Netzwerke sonst vom Namen her unterschiedlich wären (podman-compose nimmt per Default Verzeichnisnamen als Prefix was man über die Angabe eines Projekts übersteuern kann, im Beispiel “ext”):

podman-compose -p ext pull

Mastodon Setup starten:

podman-compose -p ext run mastodon_web bundle exec rake mastodon:setup

Die Fragen:

  • Domäne ist der Name mit dem die Instanz aufscheinen soll – muss NICHT der Webservername sein wie ich ursprünglich angenommen habe. Also z.B. whatever.at wenn Webserver social.whatever.at heissen soll. Die Fediverse Usernamen sind dann @whoever@whatever.at.
  • Single User Mode: No – stellen wir später um nachdem wir interaktiv ersten Account angelegt haben (auch über tootctl möglich dann könnte man hier schon Yes verwenden)
  • Postgres/Redis: Bis auf Rechnername (wenn wie oben mit mastodon_ prefixiert) ohne Änderung übernehmen.
  • Attachments werden nicht in einer Cloud gespeichert.
  • Mailing nicht über localhost – passende SMTP Settings angeben.
  • An dieser Stelle werden die Settings ausgegeben – in Datei .env.production speichern.
  • DB erstellen lassen
  • KEINEN Admin erstellen, Setup läuft hier sonst in einen Fehler

Alle laufenden Container entfernen.

In .env.production einbauen damit Webserver nicht gleich Instanzname sein muss:

WEB_DOMAIN=social.whatever.at

Das Ganze starten:

podman-compose -p ext up -d

Damit man Attachments oder auch z.B. Avatarbilder raufladen kann muss man Security von einem Folder noch ändern (die Start ID in /etc/subuid für den podman ausführenden User + 990 – absolut keine Ahnung warum 990 wenn die UID des mastodon Users im Container 991 ist 🙂 ):

chown -R 100990:100990 ./public/system

An dieser Stelle haben wir auf 127.0.0.1:3000 Webserver und auf 127.0.0.1:4000 API Server laufen, mit Caddy in einem zweiten podman-compose Deployment bringen wir das samt Lets Encrypt ins Internetz.

docker-compose.yml (unter der Annahme dass Container+Netze mit mastodon_ prefixiert wurden):

version: '3'
services:
 caddy:
   image: docker.io/caddy:latest
   container_name: caddy
   ports:
     - 80:80
     - 443:443
   volumes:
     - ./Caddyfile:/etc/caddy/Caddyfile
     - ./caddy-data/certs:/data
   restart: always
   depends_on:
     - mastodon_web
     - mastodon_streaming
   networks:
     - mastodon_external_network
     - mastodon_internal_network

networks:
 mastodon_external_network:
 mastodon_internal_network:
   internal: true

Caddyfile:

https://social.whatever.at {
  handle /api/v1/streaming*    {
     reverse_proxy mastodon_streaming:4000
  }

  handle    {
     reverse_proxy mastodon_web:3000
  }
}

Verzeichnis caddy-data erzeugen und schon kanns losgehen, wichtig gleiches Projekt wegen Netzwerknamen:

podman-compose -p ext up -d

An dieser Stelle sollte (sofern Caddy Zertifikat lösen konnte) https://social.whatever.at aufrubar sein – Account erstellen und aktivieren (Aktivierungslink via Mail), danach zum Admin machen (wiederum – unter der Annahme dass Projekt “ext” verwendet und Container/Netzwerke mit “mastodon_” prefixiert wurden):

podman exec -it ext_mastodon_web_1 /bin/bash

Im Container dann (Annahme neuer Account = whoever, casing bei Admin wichtig):

tootctl account modify whoever -- role=Admin

Danach die Instanz stoppen (web bleibt gerne hängen) und in .env.production auf Single User Mode ändern:

SINGLE_USER_MODE=true

Danach wie wieder starten. Fertig 😀