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 😀