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

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 --siund 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.
launcherbricht 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.commit 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.
| Eckdaten | Wert |
|---|---|
| Installationsweg | discourse_docker mit ./launcher und ./discourse-setup |
| Konfiguration | /var/discourse/containers/app.yml |
| Daten | /var/discourse/shared/standalone (Datenbank, Uploads, Backups, Logs) |
| Ports | 80 und 443 auf dem Host (Standard-Template) |
| Versionen | Discourse wird aus Git gebaut, Standard latest (aktuell v2026.10.0-latest, letzte Stable-Reihe v2026.9.0) |
| Basis-Image | discourse/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.comFehlt 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 containersDer 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-setupDer 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.comoder eine kostenlose Subdomain unterdiscourse.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: /sharedLaut 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 appEin 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

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 fail2banDie 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.sicherungUpdates 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 appIm 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
| Symptom | Ursache | Lösung |
|---|---|---|
| Assistent meldet belegte Ports 80/443 | Anderer Webserver läuft | Dienst stoppen oder Socket-Variante aus Schritt 6 |
| DNS-Prüfung schlägt fehl | A-Eintrag fehlt oder noch nicht verteilt | DNS prüfen, laut Doku kurzzeitig --skip-connection-test |
ERROR: insufficient disk space (<=5GB) | Weniger als 5 GB frei im Docker-Verzeichnis | Speicher erweitern, alte Images gezielt entfernen |
Discourse requires 1GB RAM to run. This system has 0GB. | Assistent misst unter 990 MB RAM, Swap zählt nicht | Server 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.com | Echten SMTP-Server eintragen, dann ./launcher rebuild app |
| Build bricht wegen Speicher ab | Zu wenig RAM ohne Swap | Swap anlegen, wie es der Assistent anbietet |
| Keine Bestätigungsmails | SMTP falsch oder Absender nicht erlaubt | Logs 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 Befehl | Datei in containers/ anlegen, Namen ohne .yml an launcher übergeben; bei der Warnung „world-readable“ chmod o-rwx setzen |
| Bitnami-Image lässt sich nicht ziehen | bitnami/discourse ohne öffentliche Tags, Legacy-Image eingefroren | Auf 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
- Zulip mit Docker als strukturierter Team-Chat
- Let's Encrypt mit certbot
- Discourse: Install on a Cloud Server (offizielle Anleitung)
- Repository discourse_docker mit launcher und Templates
- Beispielkonfiguration standalone.yml
- Discourse Meta: Run other websites on the same machine
- Discourse Meta: Configure automatic backups


