Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Server & Netzwerk 14.08.2026 · 9 min Lesezeit Geprüft 16.10.2026

Discourse mit Docker installieren: Modernes Community-Forum für KMU und Open-Source-Projekte

Discourse auf dem offiziellen Weg selbst hosten: discourse_docker mit launcher und Setup-Assistent, app.yml, Betrieb neben einem vorhandenen Webserver, eingebaute Backups und Updates. Ersetzt die nicht mehr lauffähige Bitnami-Variante.

Werbung Mit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Titelbild: Discourse mit Docker installieren, Forum, Community, Moderation

Discourse ist eine Forensoftware für Communitys, Kundensupport und interne Wissensaustausche, mit Themen, Kategorien, Vertrauensstufen, Moderationswerkzeugen und Mailintegration. Das Projekt unterstützt für das Selbsthosting genau einen Weg: das Repository discourse_docker mit dem Skript ./launcher, das aus einer YAML-Beschreibung ein eigenes Container-Image baut. Frühere Anleitungen mit Bitnami-Images funktionieren nicht mehr, weil bitnami/discourse keine öffentlichen Tags mehr hat und bitnamilegacy/discourse seit August 2025 eingefroren ist. Diese Anleitung beschreibt den offiziellen Weg nach der Herstellerdoku.

Voraussetzungen

  • Server: 64-Bit-Linux, laut offizieller Installationsanleitung mindestens 1 CPU-Kern und 1 GB RAM mit Swap, empfohlen 2 Kerne und 2 GB RAM oder mehr. Der Setup-Assistent misst den Arbeitsspeicher mit free --si und bricht unter 990 MB ab; eine VM mit 1 GiB zugewiesenem RAM meldet oft weniger und wird dann auch mit Swap abgelehnt. Für ein Forum mit regelmäßigem Betrieb, Plugins und Rebuilds sind 4 GB RAM ein realistischer Rahmen.
  • Speicher: laut Doku mindestens 10 GB, empfohlen 20 GB und mehr. launcher bricht den Build ab, wenn im Docker-Verzeichnis weniger als 5 GB frei sind.
  • Betriebssystem: empfohlen Ubuntu LTS, Debian funktioniert ebenfalls. Root-Zugang per SSH ist nötig.
  • Netz: ein DNS-Name wie forum.example.com mit A-Eintrag auf die Server-IP. Discourse funktioniert laut Beispielkonfiguration nicht mit einer reinen IP-Adresse. Die Ports 80 und 443 müssen für Let's Encrypt erreichbar und frei sein.
  • Mail: ein SMTP-Zugang für Registrierungsbestätigungen und Benachrichtigungen. Das Image enthält keinen eigenen Mailserver.
EckdatenWert
Installationswegdiscourse_docker mit ./launcher und ./discourse-setup
Konfiguration/var/discourse/containers/app.yml
Daten/var/discourse/shared/standalone (Datenbank, Uploads, Backups, Logs)
Ports80 und 443 auf dem Host (Standard-Template)
VersionenDiscourse wird aus Git gebaut, Standard latest (aktuell v2026.10.0-latest, letzte Stable-Reihe v2026.9.0)
Basis-Imagediscourse/base auf Docker Hub

Schritt 1: Server vorbereiten

Verwenden Sie einen frischen Server oder eine eigene VM. Der Setup-Assistent prüft freie Ports, DNS und Arbeitsspeicher und bietet bei wenig RAM an, eine 2 GB große Swap-Datei unter /swapfile anzulegen und in die /etc/fstab einzutragen. Auf einem Server, auf dem bereits andere Dienste laufen, sollten Sie solche Änderungen vorher bewusst prüfen. Von Hand legen Sie die Swap-Datei laut Herstellerdoku so an:

fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
$ sudo apt-get update && sudo apt-get install -y git
$ docker --version || echo "Docker fehlt"
$ sudo ss -tlnp | grep -E ':(80|443) '
$ getent hosts forum.example.com

Fehlt Docker, installiert der offizielle Einzeiler aus der Herstellerdoku Docker über get.docker.com mit. Wer die Paketquellen lieber selbst verwaltet, installiert Docker Engine vorher nach der Docker-Dokumentation. Die Grundlagen zur Installation beschreibt Docker und Docker Compose auf Linux installieren.

docker --version gibt eine Version aus, free -m zeigt bei kleinem Server eine Zeile Swap mit etwa 2047 MB, ss zeigt keinen Dienst auf Port 80 oder 443, und getent hosts liefert die öffentliche IP des Servers.

Schritt 2: discourse_docker klonen

Die Herstellerdoku bietet einen Einzeiler an, der Docker und git installiert, das Repository nach /var/discourse klont und den Assistenten startet. Die folgenden Befehle machen dasselbe in nachvollziehbaren Einzelschritten, ohne ein Skript direkt aus dem Internet an bash zu übergeben:

$ sudo -s
$ git clone https://github.com/discourse/discourse_docker.git /var/discourse
$ cd /var/discourse
$ chmod 700 containers

Der Ordner containers nimmt später die app.yml mit SMTP-Passwort auf. launcher warnt, wenn die Datei für alle lesbar ist.

ls /var/discourse zeigt unter anderem launcher, discourse-setup, samples und templates.

Schritt 3: Setup-Assistent ausführen

cd /var/discourse
./discourse-setup

Der Assistent läuft selbst in einem Container und fragt nacheinander ab:

  • Admin-E-Mail-Adressen: Konten mit diesen Adressen werden bei der Registrierung automatisch Administratoren (DISCOURSE_DEVELOPER_EMAILS).
  • Domain: eigener Name wie forum.example.com oder eine kostenlose Subdomain unter discourse.diy, die über ein Konto bei Discourse ID vergeben wird.
  • SMTP: Server, Port, Benutzer und Passwort. Überspringen Sie SMTP, aktiviert der Assistent die Anmeldung über Discourse ID, einen zentralen Dienst des Herstellers. Für ein Firmenforum mit eigener Benutzerverwaltung konfigurieren Sie SMTP.

Der Assistent schreibt daraus containers/app.yml, setzt UNICORN_WORKERS und db_shared_buffers passend zur Hardware und bindet Let's Encrypt ein. Danach baut launcher das Image, laut Doku dauert das etwa 5 bis 10 Minuten. Auf einer VM mit 2 Kernen, 1 GiB RAM und 2 GB Swap dauerte ./launcher rebuild app gut 5 Minuten; der laufende Container belegte danach rund 800 MB Swap.

./launcher logs app | tail zeigt keine Fehler, docker ps listet den Container app, und curl -sI https://forum.example.com liefert HTTP/2 200.

Schritt 4: app.yml verstehen und anpassen

Alle späteren Änderungen machen Sie in /var/discourse/containers/app.yml und bauen danach neu. Die Beispieldatei samples/standalone.yml warnt ausdrücklich: YAML reagiert empfindlich auf Leerzeichen und Einrückung. Die wichtigsten Stellen:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

expose:
  - "80:80"
  - "443:443"

env:
  DISCOURSE_HOSTNAME: "forum.example.com"
  DISCOURSE_DEVELOPER_EMAILS: "it@example.com"
  DISCOURSE_SMTP_ADDRESS: smtp.example.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: noreply@example.com
  DISCOURSE_SMTP_PASSWORD: "SMTP_PASSWORT"
  DISCOURSE_NOTIFICATION_EMAIL: noreply@example.com
  # DISCOURSE_DEFAULT_LOCALE: de

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared

Laut Kommentar der Beispieldatei gehört ein Passwort mit # in Anführungszeichen, sonst wird der Rest als Kommentar gelesen. Nach jeder Änderung:

cd /var/discourse
./launcher rebuild app

Ein Rebuild baut das Image neu und startet den Container neu. Das Forum ist dabei einige Minuten nicht erreichbar.

./launcher rebuild app endet ohne Fehlermeldung, danach zeigt ./launcher enter app mit rails r 'puts Discourse::VERSION::STRING' die laufende Version.

Schritt 5: Administrator registrieren und absichern

Discourse-Willkommensseite nach der Installation mit dem Hinweis Congratulations, you installed Discourse und der Schaltfläche Register
Erster Aufruf nach dem Build: Über „Register“ legen Sie das Konto mit der Admin-Adresse an.

Rufen Sie das Forum auf und registrieren Sie sich mit einer der Admin-Adressen aus dem Assistenten. Bei SMTP erhalten Sie eine Bestätigungsmail. Danach startet der Einrichtungsassistent im Forum für Name, Sprache, Logo und Zugangsregeln.

Die offizielle Doku empfiehlt nach der Installation automatische Sicherheitsupdates des Betriebssystems und Fail2ban gegen Brute-Force-Versuche:

dpkg-reconfigure -plow unattended-upgrades
apt install fail2ban

Die Grundlagen zur Absicherung des Servers mit Firewall und Fail2ban beschreibt Linux-Server absichern mit UFW und Fail2ban.

Im Admin-Bereich prüfen Sie unter Einstellungen, ob sich jeder registrieren darf (invite only, must approve users) und ob Zwei-Faktor-Authentifizierung für Administratoren erzwungen werden soll.

Das Konto zeigt im Profil das Admin-Abzeichen, /admin ist erreichbar, und eine Testmail unter Admin, E-Mail kommt an.

Schritt 6: Anderer Webserver auf demselben Host

Soll auf dem Server bereits ein Nginx oder ein anderer Proxy Port 80 und 443 belegen, kann discourse-setup laut Discourse-Meta-Anleitung nicht verwendet werden. Stattdessen kopieren Sie samples/standalone.yml nach containers/app.yml, tragen die Werte von Hand ein, entfernen die beiden SSL-Templates und den Block expose und ergänzen das Socket-Template:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"

Discourse lauscht dann auf dem Unix-Socket /var/discourse/shared/standalone/nginx.http.sock. Der äußere Nginx übernimmt TLS und leitet weiter:

server {
    listen 443 ssl;
    http2 on;
    server_name forum.example.com;
    ssl_certificate     /etc/letsencrypt/live/forum.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/forum.example.com/privkey.pem;

    location / {
        proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Grundlagen zu Nginx und Zertifikaten finden Sie in Nginx als Reverse Proxy mit TLS.

Nach ./launcher rebuild app existiert /var/discourse/shared/standalone/nginx.http.sock, sudo nginx -t meldet syntax is ok und das Forum antwortet über HTTPS mit 200.

Schritt 7: Backups und Updates

Discourse sichert sich selbst. Unter Admin, Einstellungen, Backups legen Sie fest:

  • backup_frequency: Intervall in Tagen, Standard 7, für Firmenforen besser 1.
  • backup_with_uploads: Uploads einschließen, Standard aktiv.
  • maximum_backups: Anzahl aufbewahrter Sicherungen, Standard 5.

Lokal liegen die Sicherungen unter /var/discourse/shared/standalone/backups/default. Kopieren Sie sie regelmäßig auf ein anderes System oder nutzen Sie S3-kompatiblen Speicher mit eigenem Bucket für Backups. Sichern Sie zusätzlich containers/app.yml, denn ohne sie lässt sich der Container nicht neu bauen.

$ ls -lh /var/discourse/shared/standalone/backups/default/
$ cp /var/discourse/containers/app.yml /root/app.yml.sicherung

Updates spielen Sie laut Doku bevorzugt über https://forum.example.com/admin/upgrade ein. Neue Basis-Images, Änderungen an der app.yml oder neue Plugins verlangen einen Rebuild auf der Kommandozeile:

cd /var/discourse
git pull
./launcher rebuild app

Im Backup-Bereich erscheint nach dem ersten Lauf eine Datei mit Zeitstempel. Nach einem Update zeigt /admin die neue Version und keine Hinweise auf ausstehende Updates.

Typische Fehler

SymptomUrsacheLösung
Assistent meldet belegte Ports 80/443Anderer Webserver läuftDienst stoppen oder Socket-Variante aus Schritt 6
DNS-Prüfung schlägt fehlA-Eintrag fehlt oder noch nicht verteiltDNS prüfen, laut Doku kurzzeitig --skip-connection-test
ERROR: insufficient disk space (<=5GB)Weniger als 5 GB frei im Docker-VerzeichnisSpeicher erweitern, alte Images gezielt entfernen
Discourse requires 1GB RAM to run. This system has 0GB.Assistent misst unter 990 MB RAM, Swap zählt nichtServer mit mindestens 2 GB RAM wählen oder app.yml wie in Schritt 6 aus samples/standalone.yml von Hand anlegen und mit Swap bauen
Aborting! Mail is not configured!In der app.yml steht noch smtp.example.comEchten SMTP-Server eintragen, dann ./launcher rebuild app
Build bricht wegen Speicher abZu wenig RAM ohne SwapSwap anlegen, wie es der Assistent anbietet
Keine BestätigungsmailsSMTP falsch oder Absender nicht erlaubtLogs mit ./launcher logs app prüfen, Anleitung „Troubleshooting email“ auf Meta
ERROR: containers/app.yml does not exist or is not readable.app.yml fehlt oder falscher Name im BefehlDatei in containers/ anlegen, Namen ohne .yml an launcher übergeben; bei der Warnung „world-readable“ chmod o-rwx setzen
Bitnami-Image lässt sich nicht ziehenbitnami/discourse ohne öffentliche Tags, Legacy-Image eingefrorenAuf den offiziellen Weg dieser Anleitung umstellen, Daten per Discourse-Backup übernehmen

Häufige Fragen

Gibt es eine offizielle Docker-Compose-Datei?

Nein. Der Hersteller unterstützt für das Selbsthosting nur discourse_docker mit launcher. Compose-Varianten aus der Community oder von Bitnami sind nicht offiziell und bei Bitnami nicht mehr gepflegt.

Wie ziehe ich von einer Bitnami-Installation um?

Erstellen Sie in der alten Instanz ein Backup unter Admin, Backups, richten Sie die neue Instanz nach dieser Anleitung ein und spielen Sie das Backup dort über denselben Bereich ein. Testen Sie den Ablauf vorher mit einer Kopie.

Kann ich Plugins installieren?

Ja, über den Abschnitt hooks in der app.yml mit einem git clone je Plugin und anschließendem Rebuild. Jedes Plugin verlängert den Build und kann Updates erschweren.

Fazit

Discourse lässt sich zuverlässig selbst betreiben, wenn Sie den Weg des Herstellers gehen: eigener Server, discourse_docker, eine gepflegte app.yml und regelmäßige Rebuilds. Der Setup-Assistent nimmt die meiste Arbeit ab, verlangt aber freie Ports und einen erreichbaren DNS-Namen. Wer Discourse neben anderen Diensten betreiben will, plant die Socket-Variante mit einem äußeren Proxy ein. Backups und app.yml gehören regelmäßig auf ein zweites System.

Weiterführende Anleitungen und Quellen